diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..6e87a003 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.github/workflows/push_request_check.yml b/.github/workflows/push_request_check.yml index b31d2cbf..72b6696c 100644 --- a/.github/workflows/push_request_check.yml +++ b/.github/workflows/push_request_check.yml @@ -6,7 +6,7 @@ on: pull_request: branches: [ '**' ] paths-ignore: - - 'documentation/decisions/**' + - '../../_legacy/documentation/decisions/**' jobs: build: diff --git a/.gitignore b/.gitignore index ce2279ef..81b3ff0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,47 @@ -# Outputs -src/**/*.js -src/**/*.js.map -src/**/*.d.ts - -# IDEs -.idea/ -jsconfig.json -.vscode/ - -# Misc -jest-stare/ -.yalc/ -node_modules/ -.npm -npm-debug.log* -yarn-error.log* -*wizard.config.json - -# Mac OSX Finder files. -**/.DS_Store +# See https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# compiled output +dist +tmp +out-tsc +libs/schematic/.tmp-generators + +# 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 +.cursor/rules/nx-rules.mdc +.github/instructions/nx.instructions.md + +.angular diff --git a/.nxignore b/.nxignore new file mode 100644 index 00000000..dec90c36 --- /dev/null +++ b/.nxignore @@ -0,0 +1,2 @@ +# Ignore the legacy workspace so Nx plugins don't attempt to process it +_legacy/** diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..113709c9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +# Add files here to ignore them from prettier formatting +/dist +/coverage +/.nx/cache +/.nx/workspace-data +.angular diff --git a/.prettierrc b/.prettierrc index d4e3781a..60ed1624 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,7 +2,7 @@ "printWidth": 140, "singleQuote": true, "useTabs": false, - "tabWidth": 4, + "tabWidth": 2, "semi": true, "bracketSpacing": false, "arrowParens": "avoid" diff --git a/.verdaccio/config.yml b/.verdaccio/config.yml new file mode 100644 index 00000000..f74420f2 --- /dev/null +++ b/.verdaccio/config.yml @@ -0,0 +1,28 @@ +# path to a directory with all packages +storage: ../tmp/local-registry/storage + +# 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 +log: + type: stdout + format: pretty + level: warn + +publish: + allow_offline: true # set offline to true to allow publish offline diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..db03eda7 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "nrwl.angular-console", + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "firsttris.vscode-jest-runner", + "ms-playwright.playwright" + ] +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..656104d9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,13 @@ + + + +# General Guidelines for working with Nx + +- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly +- You have access to the Nx MCP server and its tools, use them to help the user +- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable. +- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies +- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration +- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors + + \ No newline at end of file diff --git a/README.md b/README.md index cc496f0d..4400c9dd 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,7 @@ and [Modeling Events](https://eclipse-esmf.github.io/ame-guide/modeling/event.ht ### Howto generate a table component with the schematics command -[Link to readme](src/ng-generate/components/table/README.md) +[Link to readme](_legacy/src/ng-generate/components/table/README.md) --- @@ -308,7 +308,7 @@ the [angular material package](https://v19.material.angular.io/components/card/o ### Howto generate a card component with the schematics command -[Link to readme](src/ng-generate/components/card/README.md) +[Link to readme](_legacy/src/ng-generate/components/card/README.md) --- @@ -328,7 +328,7 @@ The form schematics can be used for form generation. ### How to generate a form component with the schematics command -[Link to readme](src/ng-generate/components/form/README.md) +[Link to readme](_legacy/src/ng-generate/components/form/README.md) --- diff --git a/.dcignore b/_legacy/.dcignore similarity index 100% rename from .dcignore rename to _legacy/.dcignore diff --git a/.eslintignore b/_legacy/.eslintignore similarity index 100% rename from .eslintignore rename to _legacy/.eslintignore diff --git a/.eslintrc b/_legacy/.eslintrc similarity index 100% rename from .eslintrc rename to _legacy/.eslintrc diff --git a/_legacy/.gitignore b/_legacy/.gitignore new file mode 100644 index 00000000..d4dde010 --- /dev/null +++ b/_legacy/.gitignore @@ -0,0 +1,22 @@ +# Outputs +src/**/*.js +src/**/*.js.map +src/**/*.d.ts + +# IDEs +../.idea/ +jsconfig.json +.vscode/ + +# Misc +jest-stare/ +.yalc/ +node_modules/ +.npm +npm-debug.log* +yarn-error.log* +*wizard.config.json + +# Mac OSX Finder files. +**/.DS_Store +.DS_Store diff --git a/.npmignore b/_legacy/.npmignore similarity index 100% rename from .npmignore rename to _legacy/.npmignore diff --git a/_legacy/.prettierrc b/_legacy/.prettierrc new file mode 100644 index 00000000..d4e3781a --- /dev/null +++ b/_legacy/.prettierrc @@ -0,0 +1,9 @@ +{ + "printWidth": 140, + "singleQuote": true, + "useTabs": false, + "tabWidth": 4, + "semi": true, + "bracketSpacing": false, + "arrowParens": "avoid" +} diff --git a/babel.config.js b/_legacy/babel.config.js similarity index 100% rename from babel.config.js rename to _legacy/babel.config.js diff --git a/_legacy/jest.config.ts b/_legacy/jest.config.ts new file mode 100644 index 00000000..30065a42 --- /dev/null +++ b/_legacy/jest.config.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export default { + bail: true, + clearMocks: true, + coverageDirectory: 'coverage', + testMatch: ['**/*.spec.ts'], +}; diff --git a/_legacy/package-lock.json b/_legacy/package-lock.json new file mode 100644 index 00000000..b13af38c --- /dev/null +++ b/_legacy/package-lock.json @@ -0,0 +1,9117 @@ +{ + "name": "@esmf/semantic-ui-schematics", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@esmf/semantic-ui-schematics", + "license": "mpl-2.0", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "@schematics/angular": "19.2.8", + "@types/cli-spinner": "^0.2.3", + "cli-spinner": "^0.2.10", + "fs": "0.0.1-security", + "inquirer": "8.2.5", + "inquirer-fuzzy-path": "2.3.0", + "inquirer-prompt-suggest": "0.1.0", + "inquirer-search-list": "^1.2.6", + "ora": "^5.4.1", + "path": "^0.12.7", + "prettier": "2.8.8", + "rxjs": "7.x", + "typescript": "5.8.3" + }, + "devDependencies": { + "@angular/cdk": "19.2.14", + "@babel/core": "7.26.10", + "@babel/preset-env": "7.26.9", + "@babel/preset-typescript": "7.27.0", + "@types/inquirer": "^9.0.7", + "@types/inquirer-fuzzy-path": "2.3.9", + "@types/jest": "29.5.14", + "@types/node": "^22.15.3", + "@types/prettier": "^2.7.3", + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "eslint": "8.57.0", + "jest": "29.7.0", + "jest-stare": "2.5.2", + "locale-codes": "^1.3.1", + "ts-node": "10.9.2" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "@angular/animations": "19.x", + "@angular/common": "19.x", + "@angular/forms": "19.x", + "@angular/material": "19.x", + "@angular/platform-browser": "19.x", + "@angular/platform-browser-dynamic": "19.x", + "@jsverse/transloco": "7.x", + "ngx-i18n-combine": "1.x", + "rxjs": "7.x" + } + }, + "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/core": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.8.tgz", + "integrity": "sha512-kcxUHKf5Hi98r4gAvMP3ntJV8wuQ3/i6wuU9RcMP0UKUt2Rer5Ryis3MPqT92jvVVwg6lhrLIhXsFuWJMiYjXQ==", + "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/core/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/@angular-devkit/schematics": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.8.tgz", + "integrity": "sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "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/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/@angular/animations": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.9.tgz", + "integrity": "sha512-Xg/JD8GyeUpBwno51iuK/iJnbSVc6A+THyP+2ScNVdWFdLyuCiEr9EbIHdeGDnhK1f/MVjRKbkrN6OElkxCx8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.9", + "@angular/core": "19.2.9" + } + }, + "node_modules/@angular/cdk": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.14.tgz", + "integrity": "sha512-VRTvSRCJYrlywT0mtUZTqA6zb8beWNqr9xl7d/vaPjopzJMSdmIpNmPiN+WshLeQhRYnXOPmhUbhULAwThnetg==", + "license": "MIT", + "peer": true, + "dependencies": { + "parse5": "^7.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/common": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.9.tgz", + "integrity": "sha512-4Lio3nRp13sTU15hsVcv8Zkj+7OKZ6Pc6CIIkQYHs9KisSwwvwmRZDU1wFhKlH+ogebLgOcNurIPdqeYWWnLjQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.9.tgz", + "integrity": "sha512-K6wtAsJhQeD2OjoupV03gWHBqnqhEP9llzFzlnQoXAAZzM1eIT/KAtQEdNY75NO+BESKxaXvQBAU16Tg/1I6uw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + } + }, + "node_modules/@angular/core": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.9.tgz", + "integrity": "sha512-73WMvxWll8/nQiAbigDhR27dQ+GjciODY5JVADdneNBSEwcQxi0HirlGzm5wy1TonOu4eTTWkvgV/3YlTOmo4A==", + "license": "MIT", + "peer": true, + "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.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.9.tgz", + "integrity": "sha512-RKzShsMf9X7LQd4qsfx1ShSPF0qODS7HWBPz/khFvfpscDYAqXvqzfXS2yvu0PaCwyNneR7vZKYMCN564SK7hw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.9", + "@angular/core": "19.2.9", + "@angular/platform-browser": "19.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.14.tgz", + "integrity": "sha512-jx9DGWwc/FuPbujG4SCZgrwvcdsqxTjpWaof1h3vR+9o01t0G0ugQebYiTEAVg+tuYMoq16stxtKo18BrYCI1Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": "19.2.14", + "@angular/common": "^19.0.0 || ^20.0.0", + "@angular/core": "^19.0.0 || ^20.0.0", + "@angular/forms": "^19.0.0 || ^20.0.0", + "@angular/platform-browser": "^19.0.0 || ^20.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.9.tgz", + "integrity": "sha512-vMBgCj/R2OxVX7YAqBTOsBiEUbwB3sJoZSy+E05vJovC0QhPWTiR4QiBXB1nlCoAZ8HTv79j7j8AYl10pqlPfQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "19.2.9", + "@angular/common": "19.2.9", + "@angular/core": "19.2.9" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.9.tgz", + "integrity": "sha512-llyjP1d3f6NDP6GwfHVNKZmkHlKpRKR/nYvP60Xl5vt90Gw2H5MJ+JHlzAHMt4O4paQHaYH1+b+2bio5/VSxjQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "19.2.9", + "@angular/compiler": "19.2.9", + "@angular/core": "19.2.9", + "@angular/platform-browser": "19.2.9" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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.27.1", + "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.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", + "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@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.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@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.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.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.26.3", + "@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.26.6", + "@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.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@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.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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.27.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", + "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "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/@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/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "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/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/@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/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/@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/@esmf/aspect-model-loader": { + "version": "2.3.3", + "resolved": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "integrity": "sha512-vlTEj1NJobiWLbORPsnNEaMUs4Ya6iE9JvWmYlGWtkd/TKqAN5Za73o2Zm3pjhuqi/rS+8xLxcVcQpLf/Yfg+g==", + "dependencies": { + "buffer": "^6.0.3", + "locale-codes": "1.3.1", + "n3": "1.17.2", + "rxjs": "7.x", + "tslib": "2.6.2", + "util": "0.12.5" + }, + "engines": { + "node": ">=12.18.0" + } + }, + "node_modules/@esmf/aspect-model-loader/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "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/config-array/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/@humanwhocodes/config-array/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/@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/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "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/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/@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/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "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/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/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/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==" + }, + "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/@jsverse/transloco": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@jsverse/transloco/-/transloco-7.6.1.tgz", + "integrity": "sha512-hFFKJ1pVFYeW2E4UFETQpOeOn0tuncCSUdRewbq3LiV+qS9x4Z2XVuCaAaFPdiNhy4nUKHWFX1pWjpZ5XjUPaQ==", + "license": "MIT", + "dependencies": { + "@jsverse/transloco-utils": "^7.0.0", + "fs-extra": "^11.0.0", + "glob": "^10.0.0", + "lodash.kebabcase": "^4.1.1", + "ora": "^5.4.1", + "replace-in-file": "^7.0.1", + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0" + } + }, + "node_modules/@jsverse/transloco-utils": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@jsverse/transloco-utils/-/transloco-utils-7.0.2.tgz", + "integrity": "sha512-zud1M68mMC/Pu6irEba+Z2SzmwmmPzUPnBzMKlcGdIhzUe1z41cqQutK1M0QaQpY4h4yhumXcNaY/Ot6piv6QQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@jsverse/transloco/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==", + "license": "ISC", + "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/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "dev": true + }, + "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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@schematics/angular": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.8.tgz", + "integrity": "sha512-oE/RzC9a0kS6+T72zX08Qkh42tbHlPZxFx1lm3saIzU9mifxlQRT9Od4PK+yksDBvxvtr+TcM2KVOqxCujpHXg==", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "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/@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/@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/@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/@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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "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.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cli-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/cli-spinner/-/cli-spinner-0.2.3.tgz", + "integrity": "sha512-TMO6mWltW0lCu1de8DMRq9+59OP/tEjghS+rs8ZEQ2EgYP5yV3bGw0tS14TMyJGqFaoVChNvhkVzv9RC1UgX+w==", + "dependencies": { + "@types/node": "*" + } + }, + "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/inquirer": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "dev": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/inquirer-autocomplete-prompt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-2.0.2.tgz", + "integrity": "sha512-Y7RM1dY3KVg11JnFkaQkTT+2Cgmn9K8De/VtrTT2a5grGIoMfkQuYM5Sss+65oiuqg1h1cTsKHG8pkoPsASdbQ==", + "dev": true, + "dependencies": { + "@types/inquirer": "^8" + } + }, + "node_modules/@types/inquirer-autocomplete-prompt/node_modules/@types/inquirer": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", + "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", + "dev": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/inquirer-fuzzy-path": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.9.tgz", + "integrity": "sha512-hOzDXaPDENzAioMYM520CCe09GnKQQ417v8wU95YNft0hiaL1sKJVtoyWqOODqD6CTq54b5ddSewuK3LJAvg0g==", + "dev": true, + "dependencies": { + "@types/inquirer": "^8", + "@types/inquirer-autocomplete-prompt": "^2" + } + }, + "node_modules/@types/inquirer-fuzzy-path/node_modules/@types/inquirer": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", + "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", + "dev": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "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/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" + }, + "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/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "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/@typescript-eslint/eslint-plugin": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "debug": "^4.3.4" + }, + "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.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" + }, + "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": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "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.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", + "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": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "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.1" + }, + "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.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" + }, + "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.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "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/visitor-keys/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/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "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==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-parser": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.11.tgz", + "integrity": "sha512-HeEwCVf/pI9qQUVaTkoDBl9U/QU4RvWJ+Trg1jNSNvDzFsBAId6fHv6VLiC7HzwrOiL8uOEkO5T1eTgpnTFQfQ==", + "dev": true + }, + "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/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "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/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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-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-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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==" + }, + "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/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/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/bl/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bootstrap": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", + "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "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" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "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/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, + "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/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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/caniuse-lite": { + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chart.js": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", + "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "dev": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true + }, + "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==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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/core-js-compat": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": 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/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "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/diff2html": { + "version": "3.4.51", + "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.51.tgz", + "integrity": "sha512-/rVCSDyokkzSCEGaGjkkElXtIRwyNDRzIa3S8VUhR6pjk25p6+AMnb1s2zGmhjl66D5m/HnV3IeZoxnWsvTy+w==", + "dev": true, + "dependencies": { + "diff": "^7.0.0", + "hogan.js": "3.0.2" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "highlight.js": "11.9.0" + } + }, + "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/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.149", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", + "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": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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-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/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, + "peer": 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-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-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/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/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/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/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4.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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "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/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/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/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "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==", + "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/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/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-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.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, + "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==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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==" + }, + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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==", + "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/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/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/glob/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/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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "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==" + }, + "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/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dev": true, + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/holderjs": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/holderjs/-/holderjs-2.9.9.tgz", + "integrity": "sha512-ceWPz1MrR3dxOoZXiom+G48+l1VPG3TcjBw9fq5iwCiZAMvYX8Aia13GOxT7DoV/AcSyTH7Vvr11ygjZP9qn4w==", + "dev": true + }, + "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/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/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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.", + "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==" + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "peer": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", + "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "figures": "^3.2.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/inquirer-fuzzy-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz", + "integrity": "sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg==", + "dependencies": { + "ansi-styles": "^3.2.1", + "fuzzy": "^0.1.3", + "inquirer": "^6.0.0", + "inquirer-autocomplete-prompt": "^1.0.2", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/inquirer-fuzzy-path/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "node_modules/inquirer-fuzzy-path/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/inquirer-prompt-suggest": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/inquirer-prompt-suggest/-/inquirer-prompt-suggest-0.1.0.tgz", + "integrity": "sha512-RC5XKDeBSsf0nBOQ380NloJcI+WTbGNo049aJsXRZXxxnRDCL5PqvftIe81zUPSUqF8hI0UxR+v77L74xJB40w==", + "dependencies": { + "chalk": "^2.4.1", + "inquirer": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/inquirer-prompt-suggest/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "node_modules/inquirer-prompt-suggest/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", + "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", + "dependencies": { + "chalk": "^2.3.0", + "figures": "^2.0.0", + "fuzzy": "^0.1.3", + "inquirer": "^3.3.0" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, + "node_modules/inquirer-search-list/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/inquirer-search-list/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-search-list/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/inquirer-search-list/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-search-list/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-search-list/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer-search-list/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "node_modules/inquirer-search-list/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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": "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/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==", + "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-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==", + "engines": { + "node": ">=8" + } + }, + "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-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": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "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-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iso639-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", + "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==", + "engines": { + "node": ">=8" + } + }, + "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-instrument/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "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==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "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-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "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-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-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.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-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-snapshot/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-stare": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jest-stare/-/jest-stare-2.5.2.tgz", + "integrity": "sha512-dvxHXOsiJlvBi0n2dK9pz6RWFTdPB6njc2ZoMpyjmWI+aIL+X1W8OW5mTm1pkv/quy2ocKO/G+GsTe7Bv07xkQ==", + "dev": true, + "dependencies": { + "@jest/reporters": "^29.0.0", + "@jest/test-result": "^29.0.0", + "@jest/types": "^29.0.0", + "@types/jest": "^29.0.0", + "ansi-parser": "^3.2.10", + "bootstrap": "^5.0.0", + "chalk": "^4.1.0", + "chart.js": "^4.1.2", + "diff2html": "^3.4.40", + "holderjs": "^2.9.7", + "jquery": "^3.5.1", + "moment": "^2.27.0", + "mustache": "^4.0.0", + "pkg-up": "^3.0.0", + "popper.js": "^1.16.1", + "yargs": "^17.0.0" + }, + "bin": { + "jest-stare": "lib/jest-stare.js" + }, + "engines": { + "node": ">=6.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/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "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/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": "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/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==" + }, + "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-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==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/langs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", + "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==" + }, + "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/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/locale-codes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", + "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "dependencies": { + "iso639-codes": "^1.0.1", + "langs": "^2.0.0", + "windows-locale": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "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.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==", + "license": "MIT" + }, + "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/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==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.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-dir/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "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/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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/n3": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.17.2.tgz", + "integrity": "sha512-BxSM52wYFqXrbQQT5WUEzKUn6qpYV+2L4XZLfn3Gblz2kwZ09S+QxC33WNdVEQy2djenFL8SNkrjejEKlvI6+Q==", + "dependencies": { + "queue-microtask": "^1.1.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "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/ngx-i18n-combine": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ngx-i18n-combine/-/ngx-i18n-combine-1.2.0.tgz", + "integrity": "sha512-0A15+uyeBovFbm6MpD76UpRBgFL3dH5JOlaT7QvUeVHNyqGwQHzJsczgTbwUkRKde5ALgtQwnlKAkq2uzkmp9A==", + "license": "MIT", + "dependencies": { + "app-root-path": "^3.0.0", + "glob": "7.2.0", + "picocolors": "^1.0.0", + "sort-keys": "^4.2.0", + "yargs": "17.3.1" + }, + "bin": { + "ngx-i18n-combine": "bin/cli.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/ngx-i18n-combine/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/ngx-i18n-combine/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/ngx-i18n-combine/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ngx-i18n-combine/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ngx-i18n-combine/node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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-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/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "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/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/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==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "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-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/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==", + "license": "BlueOak-1.0.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/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "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==", + "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==", + "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==", + "license": "BlueOak-1.0.0", + "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==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/path/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "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": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "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/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/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/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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/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/replace-in-file": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.2.0.tgz", + "integrity": "sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "glob": "^8.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/replace-in-file/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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-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/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": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "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/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "peer": true, + "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==", + "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==", + "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==" + }, + "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/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "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/sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "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/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/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/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/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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": "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/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "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-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/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==", + "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/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/test-exclude/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/test-exclude/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/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/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "peer": 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/ts-node/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/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/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + }, + "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/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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/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/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/windows-locale": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.1.3.tgz", + "integrity": "sha512-0OlMOPNGj7GTB6C7WmqS3o4eydjnoYj0uwot2KJf7E0JUucwYwzkcvCWQwnuOV60WqDMeGJpSankgveNMj5r0g==", + "engines": { + "node": ">=v10.24.1" + } + }, + "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": "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/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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/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/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/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/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==", + "license": "MIT", + "peer": true + } + } +} diff --git a/_legacy/package.json b/_legacy/package.json new file mode 100644 index 00000000..2a13f23d --- /dev/null +++ b/_legacy/package.json @@ -0,0 +1,78 @@ +{ + "name": "@esmf/semantic-ui-schematics", + "version": "", + "description": "Official ESMF schematic for the Angular CLI to leverage Aspect models for generating Angular components.", + "scripts": { + "build": "tsc -p tsconfig.json", + "build-watch": "tsc -p tsconfig.json --watch", + "prettier": "prettier --config .prettierrc --write './src/**/*{.ts,.js,.json}'", + "test": "jest --reporters default jest-stare", + "test:prettier": "prettier --config .prettierrc --list-different './src/**/*{.ts,.js,.json}'", + "test:coverage": "jest --coverage --reporters default jest-stare", + "lint": "eslint .. --ext .ts", + "lint:fix": "eslint .. --ext .ts --fix" + }, + "keywords": [ + "schematic" + ], + "files": [ + "src/**", + ".prettierrc" + ], + "author": "", + "license": "mpl-2.0", + "schematics": "./src/collection.json", + "dependencies": { + "@angular-devkit/core": "19.2.8", + "@angular-devkit/schematics": "19.2.8", + "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "@schematics/angular": "19.2.8", + "@types/cli-spinner": "^0.2.3", + "cli-spinner": "^0.2.10", + "fs": "0.0.1-security", + "inquirer": "8.2.5", + "inquirer-fuzzy-path": "2.3.0", + "inquirer-prompt-suggest": "0.1.0", + "inquirer-search-list": "^1.2.6", + "ora": "^5.4.1", + "path": "^0.12.7", + "prettier": "2.8.8", + "rxjs": "7.x", + "typescript": "5.8.3" + }, + "devDependencies": { + "@angular/cdk": "19.2.14", + "@babel/core": "7.26.10", + "@babel/preset-env": "7.26.9", + "@babel/preset-typescript": "7.27.0", + "@types/inquirer": "^9.0.7", + "@types/inquirer-fuzzy-path": "2.3.9", + "@types/jest": "29.5.14", + "@types/node": "^22.15.3", + "@types/prettier": "^2.7.3", + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "eslint": "8.57.0", + "jest": "29.7.0", + "jest-stare": "2.5.2", + "locale-codes": "^1.3.1", + "ts-node": "10.9.2" + }, + "peerDependencies": { + "@angular/animations": "19.x", + "@angular/common": "19.x", + "@angular/forms": "19.x", + "@angular/material": "19.x", + "@angular/platform-browser": "19.x", + "@angular/platform-browser-dynamic": "19.x", + "@jsverse/transloco": "7.x", + "ngx-i18n-combine": "1.x", + "rxjs": "7.x" + }, + "engines": { + "node": ">=18.13.0" + }, + "ng-add": { + "save": "devDependencies" + } +} diff --git a/src/collection.json b/_legacy/src/collection.json similarity index 100% rename from src/collection.json rename to _legacy/src/collection.json diff --git a/src/ng-add/index.ts b/_legacy/src/ng-add/index.ts similarity index 100% rename from src/ng-add/index.ts rename to _legacy/src/ng-add/index.ts diff --git a/src/ng-generate/components/card/README.md b/_legacy/src/ng-generate/components/card/README.md similarity index 100% rename from src/ng-generate/components/card/README.md rename to _legacy/src/ng-generate/components/card/README.md diff --git a/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/card/generators/components/card/index.ts b/_legacy/src/ng-generate/components/card/generators/components/card/index.ts similarity index 98% rename from src/ng-generate/components/card/generators/components/card/index.ts rename to _legacy/src/ng-generate/components/card/generators/components/card/index.ts index ef371e3b..dc4301fc 100644 --- a/src/ng-generate/components/card/generators/components/card/index.ts +++ b/_legacy/src/ng-generate/components/card/generators/components/card/index.ts @@ -14,7 +14,7 @@ import {apply, applyTemplates, chain, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; import {strings} from '@angular-devkit/core'; import {Property} from '@esmf/aspect-model-loader'; -import {generateChipList, generateCommandBar} from '../../../../shared/generators'; +import {generateChipList, generateCommandBar} from '../../../../shared/generators/index'; import {getEnumProperties, getEnumPropertyDefinitions} from '../../../../shared/utils'; import {Schema} from '../../../../shared/schema'; import {templateInclude} from '../../../../shared/include'; diff --git a/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/card/generators/components/export-dialog/index.ts b/_legacy/src/ng-generate/components/card/generators/components/export-dialog/index.ts similarity index 100% rename from src/ng-generate/components/card/generators/components/export-dialog/index.ts rename to _legacy/src/ng-generate/components/card/generators/components/export-dialog/index.ts diff --git a/src/ng-generate/components/card/index.ts b/_legacy/src/ng-generate/components/card/index.ts similarity index 99% rename from src/ng-generate/components/card/index.ts rename to _legacy/src/ng-generate/components/card/index.ts index f7c39fe1..d2238826 100644 --- a/src/ng-generate/components/card/index.ts +++ b/_legacy/src/ng-generate/components/card/index.ts @@ -30,7 +30,7 @@ import { setTemplateOptionValuesRule, } from '../shared/index'; import {ComponentType, Schema} from '../shared/schema'; -import {generateCardComponent} from './generators/components/card'; +import {generateCardComponent} from './generators/components/card/index'; import {generateExportCardDialog} from './generators/components/export-dialog/index'; export default function (cardSchema: CardSchema): Rule { diff --git a/src/ng-generate/components/card/schema.json b/_legacy/src/ng-generate/components/card/schema.json similarity index 100% rename from src/ng-generate/components/card/schema.json rename to _legacy/src/ng-generate/components/card/schema.json diff --git a/src/ng-generate/components/card/schema.ts b/_legacy/src/ng-generate/components/card/schema.ts similarity index 100% rename from src/ng-generate/components/card/schema.ts rename to _legacy/src/ng-generate/components/card/schema.ts diff --git a/src/ng-generate/components/form/README.md b/_legacy/src/ng-generate/components/form/README.md similarity index 100% rename from src/ng-generate/components/form/README.md rename to _legacy/src/ng-generate/components/form/README.md diff --git a/src/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/form-field-strategies.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/form-field-strategies.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/form-field-strategies.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/form-field-strategies.ts diff --git a/src/ng-generate/components/form/generators/components/fields/index.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/index.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/index.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/index.ts diff --git a/src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts similarity index 95% rename from src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts index ae6a5ca3..b5ea12d1 100644 --- a/src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts +++ b/_legacy/src/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts @@ -19,7 +19,7 @@ export class ListFormFieldStrategy extends FormFieldStrategy { hasChildren = false; isList = true; - child: DefaultList | DefaultCollection | DefaultSet | DefaultSortedSet; + declare child: DefaultList | DefaultCollection | DefaultSet | DefaultSortedSet; static isTargetStrategy(child: Characteristic): boolean { return ( diff --git a/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/form/generators/components/form/index.ts b/_legacy/src/ng-generate/components/form/generators/components/form/index.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/form/index.ts rename to _legacy/src/ng-generate/components/form/generators/components/form/index.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts diff --git a/src/ng-generate/components/form/generators/components/validators/constraint/index.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/constraint/index.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/constraint/index.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/constraint/index.ts diff --git a/src/ng-generate/components/form/generators/components/validators/validatorsTypes.ts b/_legacy/src/ng-generate/components/form/generators/components/validators/validatorsTypes.ts similarity index 100% rename from src/ng-generate/components/form/generators/components/validators/validatorsTypes.ts rename to _legacy/src/ng-generate/components/form/generators/components/validators/validatorsTypes.ts diff --git a/src/ng-generate/components/form/index.ts b/_legacy/src/ng-generate/components/form/index.ts similarity index 99% rename from src/ng-generate/components/form/index.ts rename to _legacy/src/ng-generate/components/form/index.ts index 20c5dc93..0920f957 100644 --- a/src/ng-generate/components/form/index.ts +++ b/_legacy/src/ng-generate/components/form/index.ts @@ -40,7 +40,7 @@ import { generateGeneralStyle, generateSharedModule, generateTranslationModule, -} from '../shared/generators'; +} from '../shared/generators/index'; import {generateFormArrayReusable} from '../shared/generators/utils/form-array-reusable/index'; import {wrapBuildComponentExecution} from '../../../utils/angular'; import {generateTranslationFiles} from '../../../utils/aspect-model'; diff --git a/src/ng-generate/components/form/schema.json b/_legacy/src/ng-generate/components/form/schema.json similarity index 100% rename from src/ng-generate/components/form/schema.json rename to _legacy/src/ng-generate/components/form/schema.json diff --git a/src/ng-generate/components/form/schema.ts b/_legacy/src/ng-generate/components/form/schema.ts similarity index 100% rename from src/ng-generate/components/form/schema.ts rename to _legacy/src/ng-generate/components/form/schema.ts diff --git a/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.html.template b/_legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.html.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.html.template rename to _legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.html.template diff --git a/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.scss.template b/_legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.scss.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.scss.template rename to _legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.scss.template diff --git a/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.ts.template b/_legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.ts.template rename to _legacy/src/ng-generate/components/shared/generators/components/chip-list/files/__name@dasherize__-chip-list.component.ts.template diff --git a/src/ng-generate/components/shared/generators/components/chip-list/index.ts b/_legacy/src/ng-generate/components/shared/generators/components/chip-list/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/components/chip-list/index.ts rename to _legacy/src/ng-generate/components/shared/generators/components/chip-list/index.ts diff --git a/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template b/_legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template rename to _legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template diff --git a/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template b/_legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template rename to _legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template diff --git a/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template b/_legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template rename to _legacy/src/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template diff --git a/src/ng-generate/components/shared/generators/components/command-bar/index.ts b/_legacy/src/ng-generate/components/shared/generators/components/command-bar/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/components/command-bar/index.ts rename to _legacy/src/ng-generate/components/shared/generators/components/command-bar/index.ts diff --git a/src/ng-generate/components/shared/generators/components/index.ts b/_legacy/src/ng-generate/components/shared/generators/components/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/components/index.ts rename to _legacy/src/ng-generate/components/shared/generators/components/index.ts diff --git a/src/ng-generate/components/shared/generators/constants/index.ts b/_legacy/src/ng-generate/components/shared/generators/constants/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/constants/index.ts rename to _legacy/src/ng-generate/components/shared/generators/constants/index.ts diff --git a/src/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template b/_legacy/src/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template rename to _legacy/src/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template diff --git a/src/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts b/_legacy/src/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts rename to _legacy/src/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts diff --git a/src/ng-generate/components/shared/generators/directives/horizontal-overflow/files/__name@dasherize__.directive.ts.template b/_legacy/src/ng-generate/components/shared/generators/directives/horizontal-overflow/files/__name@dasherize__.directive.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/directives/horizontal-overflow/files/__name@dasherize__.directive.ts.template rename to _legacy/src/ng-generate/components/shared/generators/directives/horizontal-overflow/files/__name@dasherize__.directive.ts.template diff --git a/src/ng-generate/components/shared/generators/directives/horizontal-overflow/index.ts b/_legacy/src/ng-generate/components/shared/generators/directives/horizontal-overflow/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/directives/horizontal-overflow/index.ts rename to _legacy/src/ng-generate/components/shared/generators/directives/horizontal-overflow/index.ts diff --git a/src/ng-generate/components/shared/generators/directives/index.ts b/_legacy/src/ng-generate/components/shared/generators/directives/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/directives/index.ts rename to _legacy/src/ng-generate/components/shared/generators/directives/index.ts diff --git a/src/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template b/_legacy/src/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template rename to _legacy/src/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template diff --git a/src/ng-generate/components/shared/generators/directives/validate-input/index.ts b/_legacy/src/ng-generate/components/shared/generators/directives/validate-input/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/directives/validate-input/index.ts rename to _legacy/src/ng-generate/components/shared/generators/directives/validate-input/index.ts diff --git a/src/ng-generate/components/shared/generators/index.ts b/_legacy/src/ng-generate/components/shared/generators/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/index.ts rename to _legacy/src/ng-generate/components/shared/generators/index.ts diff --git a/src/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template b/_legacy/src/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template similarity index 100% rename from src/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template rename to _legacy/src/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template diff --git a/src/ng-generate/components/shared/generators/language/index.ts b/_legacy/src/ng-generate/components/shared/generators/language/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/language/index.ts rename to _legacy/src/ng-generate/components/shared/generators/language/index.ts diff --git a/src/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template b/_legacy/src/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template rename to _legacy/src/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template diff --git a/src/ng-generate/components/shared/generators/modules/form-fields/index.ts b/_legacy/src/ng-generate/components/shared/generators/modules/form-fields/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/modules/form-fields/index.ts rename to _legacy/src/ng-generate/components/shared/generators/modules/form-fields/index.ts diff --git a/src/ng-generate/components/shared/generators/modules/index.ts b/_legacy/src/ng-generate/components/shared/generators/modules/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/modules/index.ts rename to _legacy/src/ng-generate/components/shared/generators/modules/index.ts diff --git a/src/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template b/_legacy/src/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template rename to _legacy/src/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template diff --git a/src/ng-generate/components/shared/generators/modules/shared/index.ts b/_legacy/src/ng-generate/components/shared/generators/modules/shared/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/modules/shared/index.ts rename to _legacy/src/ng-generate/components/shared/generators/modules/shared/index.ts diff --git a/src/ng-generate/components/shared/generators/modules/translation/index.ts b/_legacy/src/ng-generate/components/shared/generators/modules/translation/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/modules/translation/index.ts rename to _legacy/src/ng-generate/components/shared/generators/modules/translation/index.ts diff --git a/src/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template b/_legacy/src/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template rename to _legacy/src/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template diff --git a/src/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template b/_legacy/src/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template rename to _legacy/src/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template diff --git a/src/ng-generate/components/shared/generators/pipes/index.ts b/_legacy/src/ng-generate/components/shared/generators/pipes/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/pipes/index.ts rename to _legacy/src/ng-generate/components/shared/generators/pipes/index.ts diff --git a/src/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template b/_legacy/src/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template rename to _legacy/src/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template diff --git a/src/ng-generate/components/shared/generators/pipes/show-description/index.ts b/_legacy/src/ng-generate/components/shared/generators/pipes/show-description/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/pipes/show-description/index.ts rename to _legacy/src/ng-generate/components/shared/generators/pipes/show-description/index.ts diff --git a/src/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template b/_legacy/src/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template rename to _legacy/src/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template diff --git a/src/ng-generate/components/shared/generators/services/custom/index.ts b/_legacy/src/ng-generate/components/shared/generators/services/custom/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/services/custom/index.ts rename to _legacy/src/ng-generate/components/shared/generators/services/custom/index.ts diff --git a/src/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template b/_legacy/src/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template rename to _legacy/src/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template diff --git a/src/ng-generate/components/shared/generators/services/filter/index.ts b/_legacy/src/ng-generate/components/shared/generators/services/filter/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/services/filter/index.ts rename to _legacy/src/ng-generate/components/shared/generators/services/filter/index.ts diff --git a/src/ng-generate/components/shared/generators/services/general/files/__name@dasherize__.service.ts.template b/_legacy/src/ng-generate/components/shared/generators/services/general/files/__name@dasherize__.service.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/services/general/files/__name@dasherize__.service.ts.template rename to _legacy/src/ng-generate/components/shared/generators/services/general/files/__name@dasherize__.service.ts.template diff --git a/src/ng-generate/components/shared/generators/services/general/index.ts b/_legacy/src/ng-generate/components/shared/generators/services/general/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/services/general/index.ts rename to _legacy/src/ng-generate/components/shared/generators/services/general/index.ts diff --git a/src/ng-generate/components/shared/generators/services/index.ts b/_legacy/src/ng-generate/components/shared/generators/services/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/services/index.ts rename to _legacy/src/ng-generate/components/shared/generators/services/index.ts diff --git a/src/ng-generate/components/shared/generators/services/paginator-select-config/files/paginator-select-config.provider.ts.template b/_legacy/src/ng-generate/components/shared/generators/services/paginator-select-config/files/paginator-select-config.provider.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/services/paginator-select-config/files/paginator-select-config.provider.ts.template rename to _legacy/src/ng-generate/components/shared/generators/services/paginator-select-config/files/paginator-select-config.provider.ts.template diff --git a/src/ng-generate/components/shared/generators/services/paginator-select-config/index.ts b/_legacy/src/ng-generate/components/shared/generators/services/paginator-select-config/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/services/paginator-select-config/index.ts rename to _legacy/src/ng-generate/components/shared/generators/services/paginator-select-config/index.ts diff --git a/src/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/shared/generators/styles/general/index.ts b/_legacy/src/ng-generate/components/shared/generators/styles/general/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/styles/general/index.ts rename to _legacy/src/ng-generate/components/shared/generators/styles/general/index.ts diff --git a/src/ng-generate/components/shared/generators/styles/index.ts b/_legacy/src/ng-generate/components/shared/generators/styles/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/styles/index.ts rename to _legacy/src/ng-generate/components/shared/generators/styles/index.ts diff --git a/src/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template b/_legacy/src/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template rename to _legacy/src/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template diff --git a/src/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts rename to _legacy/src/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts diff --git a/src/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template b/_legacy/src/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template rename to _legacy/src/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template diff --git a/src/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts rename to _legacy/src/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts diff --git a/src/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template b/_legacy/src/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template rename to _legacy/src/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template diff --git a/src/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts rename to _legacy/src/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts diff --git a/src/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template b/_legacy/src/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template rename to _legacy/src/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template diff --git a/src/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts rename to _legacy/src/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts diff --git a/src/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template b/_legacy/src/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template rename to _legacy/src/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template diff --git a/src/ng-generate/components/shared/generators/utils/form-validators/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/form-validators/index.ts similarity index 100% rename from src/ng-generate/components/shared/generators/utils/form-validators/index.ts rename to _legacy/src/ng-generate/components/shared/generators/utils/form-validators/index.ts diff --git a/_legacy/src/ng-generate/components/shared/generators/utils/index.ts b/_legacy/src/ng-generate/components/shared/generators/utils/index.ts new file mode 100644 index 00000000..c2d22977 --- /dev/null +++ b/_legacy/src/ng-generate/components/shared/generators/utils/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './form-control-reusable/index'; +export * from './form-group-reusable/index'; +export * from './form-validators/index'; +export * from './destroyed-subject/index'; diff --git a/src/ng-generate/components/shared/include.ts b/_legacy/src/ng-generate/components/shared/include.ts similarity index 100% rename from src/ng-generate/components/shared/include.ts rename to _legacy/src/ng-generate/components/shared/include.ts diff --git a/src/ng-generate/components/shared/index.ts b/_legacy/src/ng-generate/components/shared/index.ts similarity index 99% rename from src/ng-generate/components/shared/index.ts rename to _legacy/src/ng-generate/components/shared/index.ts index c4852c85..be7641df 100644 --- a/src/ng-generate/components/shared/index.ts +++ b/_legacy/src/ng-generate/components/shared/index.ts @@ -37,10 +37,10 @@ import { generateShowDescriptionPipe, generateTranslationModule, generateValidateInputDirective, -} from './generators'; +} from './generators/index'; import {APP_SHARED_MODULES, cardModules, formModules, tableModules, updateSharedModule} from '../../../utils/modules'; import {WIZARD_CONFIG_FILE} from '../../prompter/index'; -import {generateSemanticExplanation} from './generators/constants'; +import {generateSemanticExplanation} from './generators/constants/index'; export let options: Schema; diff --git a/src/ng-generate/components/shared/methods/export/csv.ts.template b/_legacy/src/ng-generate/components/shared/methods/export/csv.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/export/csv.ts.template rename to _legacy/src/ng-generate/components/shared/methods/export/csv.ts.template diff --git a/src/ng-generate/components/shared/methods/generation/extended-table.html.template b/_legacy/src/ng-generate/components/shared/methods/generation/extended-table.html.template similarity index 100% rename from src/ng-generate/components/shared/methods/generation/extended-table.html.template rename to _legacy/src/ng-generate/components/shared/methods/generation/extended-table.html.template diff --git a/src/ng-generate/components/shared/methods/generation/simple-table.html.template b/_legacy/src/ng-generate/components/shared/methods/generation/simple-table.html.template similarity index 100% rename from src/ng-generate/components/shared/methods/generation/simple-table.html.template rename to _legacy/src/ng-generate/components/shared/methods/generation/simple-table.html.template diff --git a/src/ng-generate/components/shared/methods/interfaces/column.ts.template b/_legacy/src/ng-generate/components/shared/methods/interfaces/column.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/interfaces/column.ts.template rename to _legacy/src/ng-generate/components/shared/methods/interfaces/column.ts.template diff --git a/src/ng-generate/components/shared/methods/interfaces/config.ts.template b/_legacy/src/ng-generate/components/shared/methods/interfaces/config.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/interfaces/config.ts.template rename to _legacy/src/ng-generate/components/shared/methods/interfaces/config.ts.template diff --git a/src/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template b/_legacy/src/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template rename to _legacy/src/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template diff --git a/src/ng-generate/components/shared/methods/remote-handling/imports.ts.template b/_legacy/src/ng-generate/components/shared/methods/remote-handling/imports.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/remote-handling/imports.ts.template rename to _legacy/src/ng-generate/components/shared/methods/remote-handling/imports.ts.template diff --git a/src/ng-generate/components/shared/methods/remote-handling/requestData.ts.template b/_legacy/src/ng-generate/components/shared/methods/remote-handling/requestData.ts.template similarity index 100% rename from src/ng-generate/components/shared/methods/remote-handling/requestData.ts.template rename to _legacy/src/ng-generate/components/shared/methods/remote-handling/requestData.ts.template diff --git a/src/ng-generate/components/shared/schema.ts b/_legacy/src/ng-generate/components/shared/schema.ts similarity index 100% rename from src/ng-generate/components/shared/schema.ts rename to _legacy/src/ng-generate/components/shared/schema.ts diff --git a/src/ng-generate/components/shared/utils.ts b/_legacy/src/ng-generate/components/shared/utils.ts similarity index 100% rename from src/ng-generate/components/shared/utils.ts rename to _legacy/src/ng-generate/components/shared/utils.ts diff --git a/src/ng-generate/components/table/README.md b/_legacy/src/ng-generate/components/table/README.md similarity index 100% rename from src/ng-generate/components/table/README.md rename to _legacy/src/ng-generate/components/table/README.md diff --git a/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template diff --git a/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template b/_legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template similarity index 100% rename from src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template rename to _legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template diff --git a/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/column-menu/index.ts b/_legacy/src/ng-generate/components/table/generators/components/column-menu/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/components/column-menu/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/column-menu/index.ts diff --git a/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.html.template diff --git a/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/config-menu/files/__name@dasherize__-config-menu.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/config-menu/index.ts b/_legacy/src/ng-generate/components/table/generators/components/config-menu/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/components/config-menu/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/config-menu/index.ts diff --git a/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/export-dialog/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/export-dialog/index.ts b/_legacy/src/ng-generate/components/table/generators/components/export-dialog/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/components/export-dialog/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/export-dialog/index.ts diff --git a/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell-link/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/table-cell-link/index.ts b/_legacy/src/ng-generate/components/table/generators/components/table-cell-link/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell-link/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/table-cell-link/index.ts diff --git a/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/table-cell/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/table-cell/index.ts b/_legacy/src/ng-generate/components/table/generators/components/table-cell/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/components/table-cell/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/table-cell/index.ts diff --git a/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template b/_legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template rename to _legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template diff --git a/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template b/_legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template rename to _legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template diff --git a/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template b/_legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template rename to _legacy/src/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template diff --git a/src/ng-generate/components/table/generators/components/table/index.ts b/_legacy/src/ng-generate/components/table/generators/components/table/index.ts similarity index 99% rename from src/ng-generate/components/table/generators/components/table/index.ts rename to _legacy/src/ng-generate/components/table/generators/components/table/index.ts index 1173e8fc..e0a62738 100644 --- a/src/ng-generate/components/table/generators/components/table/index.ts +++ b/_legacy/src/ng-generate/components/table/generators/components/table/index.ts @@ -15,7 +15,7 @@ import {apply, applyTemplates, chain, MergeStrategy, mergeWith, move, Rule, Sche import {strings} from '@angular-devkit/core'; import {camelize, classify, dasherize} from '@angular-devkit/core/src/utils/strings'; import {getAllEnumProps} from '../../../../../../utils/aspect-model'; -import {generateChipList, generateCommandBar} from '../../../../shared/generators'; +import {generateChipList, generateCommandBar} from '../../../../shared/generators/index'; import { getCustomRowActions, getEnumProperties, diff --git a/src/ng-generate/components/table/generators/data-source/files/__name@dasherize__-datasource.ts.template b/_legacy/src/ng-generate/components/table/generators/data-source/files/__name@dasherize__-datasource.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/data-source/files/__name@dasherize__-datasource.ts.template rename to _legacy/src/ng-generate/components/table/generators/data-source/files/__name@dasherize__-datasource.ts.template diff --git a/src/ng-generate/components/table/generators/data-source/index.ts b/_legacy/src/ng-generate/components/table/generators/data-source/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/data-source/index.ts rename to _legacy/src/ng-generate/components/table/generators/data-source/index.ts diff --git a/src/ng-generate/components/table/generators/directives/highlight/files/__name@dasherize__.directive.ts.template b/_legacy/src/ng-generate/components/table/generators/directives/highlight/files/__name@dasherize__.directive.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/directives/highlight/files/__name@dasherize__.directive.ts.template rename to _legacy/src/ng-generate/components/table/generators/directives/highlight/files/__name@dasherize__.directive.ts.template diff --git a/src/ng-generate/components/table/generators/directives/highlight/index.ts b/_legacy/src/ng-generate/components/table/generators/directives/highlight/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/directives/highlight/index.ts rename to _legacy/src/ng-generate/components/table/generators/directives/highlight/index.ts diff --git a/src/ng-generate/components/table/generators/directives/resize/files/__name@dasherize__.directive.ts.template b/_legacy/src/ng-generate/components/table/generators/directives/resize/files/__name@dasherize__.directive.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/directives/resize/files/__name@dasherize__.directive.ts.template rename to _legacy/src/ng-generate/components/table/generators/directives/resize/files/__name@dasherize__.directive.ts.template diff --git a/src/ng-generate/components/table/generators/directives/resize/index.ts b/_legacy/src/ng-generate/components/table/generators/directives/resize/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/directives/resize/index.ts rename to _legacy/src/ng-generate/components/table/generators/directives/resize/index.ts diff --git a/src/ng-generate/components/table/generators/directives/table-cell-tooltip/files/__name@dasherize__.directive.ts.template b/_legacy/src/ng-generate/components/table/generators/directives/table-cell-tooltip/files/__name@dasherize__.directive.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/directives/table-cell-tooltip/files/__name@dasherize__.directive.ts.template rename to _legacy/src/ng-generate/components/table/generators/directives/table-cell-tooltip/files/__name@dasherize__.directive.ts.template diff --git a/src/ng-generate/components/table/generators/directives/table-cell-tooltip/index.ts b/_legacy/src/ng-generate/components/table/generators/directives/table-cell-tooltip/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/directives/table-cell-tooltip/index.ts rename to _legacy/src/ng-generate/components/table/generators/directives/table-cell-tooltip/index.ts diff --git a/src/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template b/_legacy/src/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template similarity index 100% rename from src/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template rename to _legacy/src/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template diff --git a/src/ng-generate/components/table/generators/services/storage/index.ts b/_legacy/src/ng-generate/components/table/generators/services/storage/index.ts similarity index 100% rename from src/ng-generate/components/table/generators/services/storage/index.ts rename to _legacy/src/ng-generate/components/table/generators/services/storage/index.ts diff --git a/src/ng-generate/components/table/index.ts b/_legacy/src/ng-generate/components/table/index.ts similarity index 81% rename from src/ng-generate/components/table/index.ts rename to _legacy/src/ng-generate/components/table/index.ts index 9a5eca12..2a268244 100644 --- a/src/ng-generate/components/table/index.ts +++ b/_legacy/src/ng-generate/components/table/index.ts @@ -27,7 +27,7 @@ import { setComponentNameRule, setCustomActionsAndFiltersRule, setTemplateOptionValuesRule, -} from '../shared'; +} from '../shared/index'; import {ComponentType} from '../shared/schema'; import {generateStorageService} from './generators/services/storage/index'; import {generateColumnMenu} from './generators/components/column-menu/index'; @@ -38,9 +38,9 @@ import {generateTableComponent} from './generators/components/table/index'; import {generateDataSource} from './generators/data-source/index'; import {TableSchema} from './schema'; import {generateExportTableDialog} from './generators/components/export-dialog/index'; -import {generatePaginatorSelectConfigProvider} from '../shared/generators'; -import {generateTableCellTooltipDirective} from './generators/directives/table-cell-tooltip'; -import {generateTableCellComponent} from './generators/components/table-cell'; +import {generatePaginatorSelectConfigProvider} from '../shared/generators/index'; +import {generateTableCellTooltipDirective} from './generators/directives/table-cell-tooltip/index'; +import {generateTableCellComponent} from './generators/components/table-cell/index'; import {generateTableCellLinkComponent} from './generators/components/table-cell-link/index'; export default function (tableSchema: TableSchema): Rule { @@ -70,16 +70,16 @@ export function generateTable(tableSchema: TableSchema): Rule { function tableSpecificGeneration(): Array { return [ generateTableComponent(options), - generateTableCellComponent(options), - generateTableCellLinkComponent(options), + generateTableCellComponent(options), // General + generateTableCellLinkComponent(options), // General generateDataSource(options), - generateStorageService(options), - generateColumnMenu(options), - generateConfigMenu(options), - generateExportTableDialog(options), - generatePaginatorSelectConfigProvider(options), - generateResizeDirective(options), - generateHighlightDirective(options), - generateTableCellTooltipDirective(options), + generateStorageService(options), // General + generateColumnMenu(options), // General + generateConfigMenu(options), // General + generateExportTableDialog(options), // General + generatePaginatorSelectConfigProvider(options), // General + generateResizeDirective(options), // General + generateHighlightDirective(options), // General + generateTableCellTooltipDirective(options), // General ]; } diff --git a/src/ng-generate/components/table/schema.json b/_legacy/src/ng-generate/components/table/schema.json similarity index 100% rename from src/ng-generate/components/table/schema.json rename to _legacy/src/ng-generate/components/table/schema.json diff --git a/src/ng-generate/components/table/schema.ts b/_legacy/src/ng-generate/components/table/schema.ts similarity index 100% rename from src/ng-generate/components/table/schema.ts rename to _legacy/src/ng-generate/components/table/schema.ts diff --git a/src/ng-generate/default-schema.ts b/_legacy/src/ng-generate/default-schema.ts similarity index 100% rename from src/ng-generate/default-schema.ts rename to _legacy/src/ng-generate/default-schema.ts diff --git a/src/ng-generate/i18n/index.ts b/_legacy/src/ng-generate/i18n/index.ts similarity index 99% rename from src/ng-generate/i18n/index.ts rename to _legacy/src/ng-generate/i18n/index.ts index eff42bf3..c777a68a 100644 --- a/src/ng-generate/i18n/index.ts +++ b/_legacy/src/ng-generate/i18n/index.ts @@ -18,7 +18,7 @@ import {NodeDependencyType} from '@schematics/angular/utility/dependencies'; import {TemplateHelper} from '../../utils/template-helper'; import {formatGeneratedFiles} from '../../utils/file'; import ora from 'ora'; -import {generateTranslationModule} from '../components/shared/generators'; +import {generateTranslationModule} from '../components/shared/generators/index'; import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks'; /** diff --git a/src/ng-generate/i18n/schema.json b/_legacy/src/ng-generate/i18n/schema.json similarity index 100% rename from src/ng-generate/i18n/schema.json rename to _legacy/src/ng-generate/i18n/schema.json diff --git a/src/ng-generate/i18n/schema.ts b/_legacy/src/ng-generate/i18n/schema.ts similarity index 100% rename from src/ng-generate/i18n/schema.ts rename to _legacy/src/ng-generate/i18n/schema.ts diff --git a/src/ng-generate/prompter/card/index.ts b/_legacy/src/ng-generate/prompter/card/index.ts similarity index 100% rename from src/ng-generate/prompter/card/index.ts rename to _legacy/src/ng-generate/prompter/card/index.ts diff --git a/src/ng-generate/prompter/card/schema.json b/_legacy/src/ng-generate/prompter/card/schema.json similarity index 100% rename from src/ng-generate/prompter/card/schema.json rename to _legacy/src/ng-generate/prompter/card/schema.json diff --git a/src/ng-generate/prompter/form/index.ts b/_legacy/src/ng-generate/prompter/form/index.ts similarity index 100% rename from src/ng-generate/prompter/form/index.ts rename to _legacy/src/ng-generate/prompter/form/index.ts diff --git a/src/ng-generate/prompter/form/schema.json b/_legacy/src/ng-generate/prompter/form/schema.json similarity index 100% rename from src/ng-generate/prompter/form/schema.json rename to _legacy/src/ng-generate/prompter/form/schema.json diff --git a/src/ng-generate/prompter/index.ts b/_legacy/src/ng-generate/prompter/index.ts similarity index 100% rename from src/ng-generate/prompter/index.ts rename to _legacy/src/ng-generate/prompter/index.ts diff --git a/src/ng-generate/prompter/prompts-questions/card/prompt-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/card/prompt-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/card/prompt-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/card/prompt-questions.ts diff --git a/src/ng-generate/prompter/prompts-questions/form/prompt-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/form/prompt-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/form/prompt-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/form/prompt-questions.ts diff --git a/src/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts diff --git a/src/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts diff --git a/src/ng-generate/prompter/prompts-questions/table/prompt-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/table/prompt-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/table/prompt-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/table/prompt-questions.ts diff --git a/src/ng-generate/prompter/prompts-questions/types/prompt-questions.ts b/_legacy/src/ng-generate/prompter/prompts-questions/types/prompt-questions.ts similarity index 100% rename from src/ng-generate/prompter/prompts-questions/types/prompt-questions.ts rename to _legacy/src/ng-generate/prompter/prompts-questions/types/prompt-questions.ts diff --git a/src/ng-generate/prompter/table/index.ts b/_legacy/src/ng-generate/prompter/table/index.ts similarity index 100% rename from src/ng-generate/prompter/table/index.ts rename to _legacy/src/ng-generate/prompter/table/index.ts diff --git a/src/ng-generate/prompter/table/schema.json b/_legacy/src/ng-generate/prompter/table/schema.json similarity index 100% rename from src/ng-generate/prompter/table/schema.json rename to _legacy/src/ng-generate/prompter/table/schema.json diff --git a/src/ng-generate/prompter/types/index.ts b/_legacy/src/ng-generate/prompter/types/index.ts similarity index 100% rename from src/ng-generate/prompter/types/index.ts rename to _legacy/src/ng-generate/prompter/types/index.ts diff --git a/src/ng-generate/prompter/types/schema.json b/_legacy/src/ng-generate/prompter/types/schema.json similarity index 100% rename from src/ng-generate/prompter/types/schema.json rename to _legacy/src/ng-generate/prompter/types/schema.json diff --git a/src/ng-generate/prompter/utils.ts b/_legacy/src/ng-generate/prompter/utils.ts similarity index 100% rename from src/ng-generate/prompter/utils.ts rename to _legacy/src/ng-generate/prompter/utils.ts diff --git a/src/ng-generate/types/aspect-model-type-generator-visitor.ts b/_legacy/src/ng-generate/types/aspect-model-type-generator-visitor.ts similarity index 100% rename from src/ng-generate/types/aspect-model-type-generator-visitor.ts rename to _legacy/src/ng-generate/types/aspect-model-type-generator-visitor.ts diff --git a/src/ng-generate/types/index.ts b/_legacy/src/ng-generate/types/index.ts similarity index 97% rename from src/ng-generate/types/index.ts rename to _legacy/src/ng-generate/types/index.ts index f65e1867..f3e29709 100644 --- a/src/ng-generate/types/index.ts +++ b/_legacy/src/ng-generate/types/index.ts @@ -19,7 +19,7 @@ import {formatGeneratedFiles, loadAndApplyConfigFile} from '../../utils/file'; import {TemplateHelper} from '../../utils/template-helper'; import {visitAspectModel} from './aspect-model-type-generator-visitor'; import {TypesSchema} from './schema'; -import {generateComponent} from '../components/shared'; +import {generateComponent} from '../components/shared/index'; import {Tree} from '@angular-devkit/schematics/src/tree/interface'; import {ComponentType} from '../components/shared/schema'; diff --git a/src/ng-generate/types/schema.json b/_legacy/src/ng-generate/types/schema.json similarity index 100% rename from src/ng-generate/types/schema.json rename to _legacy/src/ng-generate/types/schema.json diff --git a/src/ng-generate/types/schema.ts b/_legacy/src/ng-generate/types/schema.ts similarity index 100% rename from src/ng-generate/types/schema.ts rename to _legacy/src/ng-generate/types/schema.ts diff --git a/src/types/definition.ts b/_legacy/src/types/definition.ts similarity index 100% rename from src/types/definition.ts rename to _legacy/src/types/definition.ts diff --git a/src/utils/angular.ts b/_legacy/src/utils/angular.ts similarity index 100% rename from src/utils/angular.ts rename to _legacy/src/utils/angular.ts diff --git a/src/utils/aspect-model.ts b/_legacy/src/utils/aspect-model.ts similarity index 100% rename from src/utils/aspect-model.ts rename to _legacy/src/utils/aspect-model.ts diff --git a/src/utils/file.ts b/_legacy/src/utils/file.ts similarity index 100% rename from src/utils/file.ts rename to _legacy/src/utils/file.ts diff --git a/src/utils/modules.ts b/_legacy/src/utils/modules.ts similarity index 100% rename from src/utils/modules.ts rename to _legacy/src/utils/modules.ts diff --git a/src/utils/package-json.ts b/_legacy/src/utils/package-json.ts similarity index 100% rename from src/utils/package-json.ts rename to _legacy/src/utils/package-json.ts diff --git a/src/utils/template-helper.ts b/_legacy/src/utils/template-helper.ts similarity index 100% rename from src/utils/template-helper.ts rename to _legacy/src/utils/template-helper.ts diff --git a/test/models/README.md b/_legacy/test/models/README.md similarity index 100% rename from test/models/README.md rename to _legacy/test/models/README.md diff --git a/test/models/movement.ttl b/_legacy/test/models/movement.ttl similarity index 100% rename from test/models/movement.ttl rename to _legacy/test/models/movement.ttl diff --git a/test/models/test-collection-types.ttl b/_legacy/test/models/test-collection-types.ttl similarity index 100% rename from test/models/test-collection-types.ttl rename to _legacy/test/models/test-collection-types.ttl diff --git a/test/models/test-entity-instances-with-collection-of-langString.ttl b/_legacy/test/models/test-entity-instances-with-collection-of-langString.ttl similarity index 100% rename from test/models/test-entity-instances-with-collection-of-langString.ttl rename to _legacy/test/models/test-entity-instances-with-collection-of-langString.ttl diff --git a/test/models/test-entity-instances-with-langString.ttl b/_legacy/test/models/test-entity-instances-with-langString.ttl similarity index 100% rename from test/models/test-entity-instances-with-langString.ttl rename to _legacy/test/models/test-entity-instances-with-langString.ttl diff --git a/test/models/test-entity-instances.ttl b/_legacy/test/models/test-entity-instances.ttl similarity index 100% rename from test/models/test-entity-instances.ttl rename to _legacy/test/models/test-entity-instances.ttl diff --git a/test/models/test-entity-types.ttl b/_legacy/test/models/test-entity-types.ttl similarity index 100% rename from test/models/test-entity-types.ttl rename to _legacy/test/models/test-entity-types.ttl diff --git a/test/models/test-enumeration-types.ttl b/_legacy/test/models/test-enumeration-types.ttl similarity index 100% rename from test/models/test-enumeration-types.ttl rename to _legacy/test/models/test-enumeration-types.ttl diff --git a/test/models/test-sammc-characteristics.ttl b/_legacy/test/models/test-sammc-characteristics.ttl similarity index 100% rename from test/models/test-sammc-characteristics.ttl rename to _legacy/test/models/test-sammc-characteristics.ttl diff --git a/test/models/test-xsd-core-types.ttl b/_legacy/test/models/test-xsd-core-types.ttl similarity index 100% rename from test/models/test-xsd-core-types.ttl rename to _legacy/test/models/test-xsd-core-types.ttl diff --git a/test/models/test-xsd-floating-point-number-types.ttl b/_legacy/test/models/test-xsd-floating-point-number-types.ttl similarity index 100% rename from test/models/test-xsd-floating-point-number-types.ttl rename to _legacy/test/models/test-xsd-floating-point-number-types.ttl diff --git a/test/models/test-xsd-limited-range-integer-number-types.ttl b/_legacy/test/models/test-xsd-limited-range-integer-number-types.ttl similarity index 100% rename from test/models/test-xsd-limited-range-integer-number-types.ttl rename to _legacy/test/models/test-xsd-limited-range-integer-number-types.ttl diff --git a/test/models/test-xsd-miscellaneous-types.ttl b/_legacy/test/models/test-xsd-miscellaneous-types.ttl similarity index 100% rename from test/models/test-xsd-miscellaneous-types.ttl rename to _legacy/test/models/test-xsd-miscellaneous-types.ttl diff --git a/test/models/test-xsd-time-and-date-types.ttl b/_legacy/test/models/test-xsd-time-and-date-types.ttl similarity index 100% rename from test/models/test-xsd-time-and-date-types.ttl rename to _legacy/test/models/test-xsd-time-and-date-types.ttl diff --git a/test/types/aspect-model-type-generator-visitor.spec.ts b/_legacy/test/types/aspect-model-type-generator-visitor.spec.ts similarity index 100% rename from test/types/aspect-model-type-generator-visitor.spec.ts rename to _legacy/test/types/aspect-model-type-generator-visitor.spec.ts diff --git a/tsconfig.json b/_legacy/tsconfig.json similarity index 88% rename from tsconfig.json rename to _legacy/tsconfig.json index f641d14d..c9c82143 100644 --- a/tsconfig.json +++ b/_legacy/tsconfig.json @@ -32,15 +32,15 @@ ], "typeRoots": [ "./node_modules/@types", - "./src/types" + "./src/types" ] }, "include": [ - "src/**/*", - "src/**/*.json" + "_legacy/src/**/*", + "_legacy/src/**/*.json" ], "exclude": [ - "src/*/files/**/*", + "_legacy/src/*/files/**/*", "node_modules" ] } diff --git a/apps/demo-e2e/eslint.config.mjs b/apps/demo-e2e/eslint.config.mjs new file mode 100644 index 00000000..b2e9fac0 --- /dev/null +++ b/apps/demo-e2e/eslint.config.mjs @@ -0,0 +1,12 @@ +import playwright from 'eslint-plugin-playwright'; +import baseConfig from '../../eslint.config.mjs'; + +export default [ + playwright.configs['flat/recommended'], + ...baseConfig, + { + files: ['**/*.ts', '**/*.js'], + // Override or add rules here + rules: {}, + }, +]; diff --git a/apps/demo-e2e/playwright.config.ts b/apps/demo-e2e/playwright.config.ts new file mode 100644 index 00000000..adc60565 --- /dev/null +++ b/apps/demo-e2e/playwright.config.ts @@ -0,0 +1,68 @@ +import { defineConfig, devices } from '@playwright/test'; +import { nxE2EPreset } from '@nx/playwright/preset'; +import { workspaceRoot } from '@nx/devkit'; + +// For CI, you may want to set BASE_URL to the deployed application. +const baseURL = process.env['BASE_URL'] || 'http://localhost:4200'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + ...nxE2EPreset(__filename, { testDir: './src' }), + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL, + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + /* Run your local dev server before starting the tests */ + webServer: { + command: 'npx nx run demo:serve', + url: 'http://localhost:4200', + reuseExistingServer: true, + cwd: workspaceRoot, + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + // Uncomment for mobile browsers support + /* { + name: 'Mobile Chrome', + use: { ...devices['Pixel 5'] }, + }, + { + name: 'Mobile Safari', + use: { ...devices['iPhone 12'] }, + }, */ + + // Uncomment for branded browsers + /* { + name: 'Microsoft Edge', + use: { ...devices['Desktop Edge'], channel: 'msedge' }, + }, + { + name: 'Google Chrome', + use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + } */ + ], +}); diff --git a/apps/demo-e2e/project.json b/apps/demo-e2e/project.json new file mode 100644 index 00000000..f40d7f50 --- /dev/null +++ b/apps/demo-e2e/project.json @@ -0,0 +1,9 @@ +{ + "name": "demo-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/demo-e2e/src", + "implicitDependencies": ["demo"], + "// targets": "to see all targets run: nx show project demo-e2e --web", + "targets": {} +} diff --git a/apps/demo-e2e/src/example.spec.ts b/apps/demo-e2e/src/example.spec.ts new file mode 100644 index 00000000..9c585110 --- /dev/null +++ b/apps/demo-e2e/src/example.spec.ts @@ -0,0 +1,8 @@ +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('/'); + + // Expect h1 to contain a substring. + expect(await page.locator('h1').innerText()).toContain('ESMF SDK JS Schematic Demo'); +}); diff --git a/apps/demo-e2e/tsconfig.json b/apps/demo-e2e/tsconfig.json new file mode 100644 index 00000000..0b670c67 --- /dev/null +++ b/apps/demo-e2e/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "allowJs": true, + "outDir": "../../dist/out-tsc", + "sourceMap": false, + "module": "commonjs", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "**/*.ts", + "**/*.js", + "playwright.config.ts", + "src/**/*.spec.ts", + "src/**/*.spec.js", + "src/**/*.test.ts", + "src/**/*.test.js", + "src/**/*.d.ts" + ] +} diff --git a/apps/demo/eslint.config.mjs b/apps/demo/eslint.config.mjs new file mode 100644 index 00000000..9b3aa715 --- /dev/null +++ b/apps/demo/eslint.config.mjs @@ -0,0 +1,34 @@ +import nx from '@nx/eslint-plugin'; +import baseConfig from '../../eslint.config.mjs'; + +export default [ + ...baseConfig, + ...nx.configs['flat/angular'], + ...nx.configs['flat/angular-template'], + { + 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', + }, + ], + }, + }, + { + files: ['**/*.html'], + // Override or add rules here + rules: {}, + }, +]; diff --git a/apps/demo/jest.config.ts b/apps/demo/jest.config.ts new file mode 100644 index 00000000..484a182d --- /dev/null +++ b/apps/demo/jest.config.ts @@ -0,0 +1,21 @@ +export default { + displayName: 'demo', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../coverage/apps/demo', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/apps/demo/project.json b/apps/demo/project.json new file mode 100644 index 00000000..3296b192 --- /dev/null +++ b/apps/demo/project.json @@ -0,0 +1,100 @@ +{ + "name": "demo", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/demo/src", + "tags": [], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:browser", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/demo", + "index": "apps/demo/src/index.html", + "main": "apps/demo/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/demo/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "apps/demo/public" + } + ], + "styles": ["apps/demo/src/styles.scss"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kb", + "maximumError": "8kb" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "continuous": true, + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "demo:build:production" + }, + "development": { + "buildTarget": "demo:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "demo:build" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "apps/demo/jest.config.ts", + "tsConfig": "apps/demo/tsconfig.spec.json" + } + }, + "serve-static": { + "continuous": true, + "executor": "@nx/web:file-server", + "options": { + "buildTarget": "demo:build", + "port": 4200, + "spa": true + } + }, + "e2e": { + "executor": "@nx/playwright:playwright", + "options": { + "config": "apps/demo-e2e/playwright.config.ts" + } + } + } +} diff --git a/apps/demo/public/favicon.ico b/apps/demo/public/favicon.ico new file mode 100644 index 00000000..317ebcb2 Binary files /dev/null and b/apps/demo/public/favicon.ico differ diff --git a/apps/demo/src/app/app.config.ts b/apps/demo/src/app/app.config.ts new file mode 100644 index 00000000..d3dcb8ea --- /dev/null +++ b/apps/demo/src/app/app.config.ts @@ -0,0 +1,15 @@ +import { + ApplicationConfig, + provideBrowserGlobalErrorListeners, + provideZoneChangeDetection, +} from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { appRoutes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(appRoutes), + ], +}; diff --git a/apps/demo/src/app/app.html b/apps/demo/src/app/app.html new file mode 100644 index 00000000..8343e08c --- /dev/null +++ b/apps/demo/src/app/app.html @@ -0,0 +1,2 @@ +

ESMF SDK JS Schematic Demo

+ diff --git a/apps/demo/src/app/app.routes.ts b/apps/demo/src/app/app.routes.ts new file mode 100644 index 00000000..8762dfe2 --- /dev/null +++ b/apps/demo/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Route } from '@angular/router'; + +export const appRoutes: Route[] = []; diff --git a/apps/demo/src/app/app.scss b/apps/demo/src/app/app.scss new file mode 100644 index 00000000..e69de29b diff --git a/apps/demo/src/app/app.spec.ts b/apps/demo/src/app/app.spec.ts new file mode 100644 index 00000000..f8e7a845 --- /dev/null +++ b/apps/demo/src/app/app.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents(); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('ESMF SDK JS Schematic Demo'); + }); +}); diff --git a/apps/demo/src/app/app.ts b/apps/demo/src/app/app.ts new file mode 100644 index 00000000..905592fb --- /dev/null +++ b/apps/demo/src/app/app.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@Component({ + imports: [RouterModule], + selector: 'app-root', + templateUrl: './app.html', + styleUrl: './app.scss', +}) +export class App { + protected title = 'demo'; +} diff --git a/apps/demo/src/index.html b/apps/demo/src/index.html new file mode 100644 index 00000000..e2335ce2 --- /dev/null +++ b/apps/demo/src/index.html @@ -0,0 +1,13 @@ + + + + + demo + + + + + + + + diff --git a/apps/demo/src/main.ts b/apps/demo/src/main.ts new file mode 100644 index 00000000..190f3418 --- /dev/null +++ b/apps/demo/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); diff --git a/apps/demo/src/styles.scss b/apps/demo/src/styles.scss new file mode 100644 index 00000000..90d4ee00 --- /dev/null +++ b/apps/demo/src/styles.scss @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/apps/demo/src/test-setup.ts b/apps/demo/src/test-setup.ts new file mode 100644 index 00000000..ea414013 --- /dev/null +++ b/apps/demo/src/test-setup.ts @@ -0,0 +1,6 @@ +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/apps/demo/tsconfig.app.json b/apps/demo/tsconfig.app.json new file mode 100644 index 00000000..46b15b0b --- /dev/null +++ b/apps/demo/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": [ + "jest.config.ts", + "src/test-setup.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "jest.config.cts" + ] +} diff --git a/apps/demo/tsconfig.json b/apps/demo/tsconfig.json new file mode 100644 index 00000000..c614c97b --- /dev/null +++ b/apps/demo/tsconfig.json @@ -0,0 +1,32 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "target": "es2022", + "moduleResolution": "bundler", + "isolatedModules": true, + "emitDecoratorMetadata": false, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/apps/demo/tsconfig.spec.json b/apps/demo/tsconfig.spec.json new file mode 100644 index 00000000..2eb8772e --- /dev/null +++ b/apps/demo/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"], + "moduleResolution": "node10" + }, + "files": ["src/test-setup.ts"], + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/error.log b/error.log new file mode 100644 index 00000000..7850b6c9 --- /dev/null +++ b/error.log @@ -0,0 +1,2 @@ + +/bin/sh: gh: command not found diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..4b3754eb --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,50 @@ +import nx from '@nx/eslint-plugin'; + +export default [ + { + files: ['**/*.json'], + // Override or add rules here + rules: {}, + languageOptions: { + parser: await import('jsonc-eslint-parser'), + }, + }, + ...nx.configs['flat/base'], + ...nx.configs['flat/typescript'], + ...nx.configs['flat/javascript'], + { + ignores: ['**/dist'], + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], + rules: { + '@nx/enforce-module-boundaries': [ + 'error', + { + enforceBuildableLibDependency: true, + allow: ['^.*/eslint(\\.base)?\\.config\\.[cm]?[jt]s$'], + depConstraints: [ + { + sourceTag: '*', + onlyDependOnLibsWithTags: ['*'], + }, + ], + }, + ], + }, + }, + { + files: ['**/*.ts', '**/*.tsx', '**/*.cts', '**/*.mts', '**/*.js', '**/*.jsx', '**/*.cjs', '**/*.mjs'], + // Override or add rules here + rules: {}, + }, + { + files: ['**/package.json', '**/generators.json'], + rules: { + '@nx/nx-plugin-checks': 'error', + }, + languageOptions: { + parser: await import('jsonc-eslint-parser'), + }, + }, +]; diff --git a/jest.config.ts b/jest.config.ts index 30065a42..c49c9a9d 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,19 +1,6 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for - * additional information regarding authorship. - * - * 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 https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ +import type { Config } from 'jest'; +import { getJestProjectsAsync } from '@nx/jest'; -export default { - bail: true, - clearMocks: true, - coverageDirectory: 'coverage', - testMatch: ['**/*.spec.ts'], -}; +export default async (): Promise => ({ + projects: await getJestProjectsAsync(), +}); diff --git a/jest.preset.js b/jest.preset.js new file mode 100644 index 00000000..f078ddce --- /dev/null +++ b/jest.preset.js @@ -0,0 +1,3 @@ +const nxPreset = require('@nx/jest/preset').default; + +module.exports = { ...nxPreset }; diff --git a/libs/schematic/README.md b/libs/schematic/README.md new file mode 100644 index 00000000..22ec6b76 --- /dev/null +++ b/libs/schematic/README.md @@ -0,0 +1,7 @@ +# schematic + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test schematic` to execute the unit tests. diff --git a/libs/schematic/eslint.config.mjs b/libs/schematic/eslint.config.mjs new file mode 100644 index 00000000..19118e83 --- /dev/null +++ b/libs/schematic/eslint.config.mjs @@ -0,0 +1,48 @@ +import nx from '@nx/eslint-plugin'; +import baseConfig from '../../eslint.config.mjs'; + +export default [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'], + }, + ], + }, + languageOptions: { + parser: await import('jsonc-eslint-parser'), + }, + }, + ...nx.configs['flat/angular'], + ...nx.configs['flat/angular-template'], + { + files: ['**/*.ts'], + rules: { + '@angular-eslint/directive-selector': [ + 'error', + { + type: 'attribute', + prefix: 'esmf', + style: 'camelCase', + }, + ], + '@angular-eslint/component-selector': [ + 'error', + { + type: 'element', + prefix: 'esmf', + style: 'kebab-case', + }, + ], + }, + }, + { + files: ['**/*.html'], + // Override or add rules here + rules: {}, + }, +]; diff --git a/libs/schematic/generators/collection.json b/libs/schematic/generators/collection.json new file mode 100644 index 00000000..0b162945 --- /dev/null +++ b/libs/schematic/generators/collection.json @@ -0,0 +1,71 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "description": "Add ui schematics library", + "factory": "./ng-add/index#add" + }, + "table": { + "description": "Create a component that displays data with a data-table", + "factory": "./ng-generate/components/table/index", + "schema": "./ng-generate/components/table/schema.json" + }, + "table-prompter": { + "description": "generate custom prompter", + "factory": "./ng-generate/prompter/table/index" + }, + "table-generation": { + "description": "Executes the table generation", + "factory": "./ng-generate/components/table/index#generateTable", + "schema": "./ng-generate/components/table/schema.json" + }, + "card": { + "description": "Create a component that displays data with a card", + "factory": "./ng-generate/components/card/index", + "schema": "./ng-generate/components/card/schema.json" + }, + "card-prompter": { + "description": "generate custom prompter", + "factory": "./ng-generate/prompter/card/index" + }, + "card-generation": { + "description": "Executes the card generation", + "factory": "./ng-generate/components/card/index#generateCard", + "schema": "./ng-generate/components/card/schema.json" + }, + "form": { + "description": "Create a component that generate a form", + "factory": "./ng-generate/components/form/index", + "schema": "./ng-generate/components/form/schema.json" + }, + "form-prompter": { + "description": "generate custom prompter", + "factory": "./ng-generate/prompter/form/index" + }, + "form-generation": { + "description": "Executes the form generation", + "factory": "./ng-generate/components/form/index#generateForm", + "schema": "./ng-generate/components/form/schema.json" + }, + "i18n": { + "description": "Add i18n strategy to the application", + "factory": "./ng-generate/i18n/index", + "schema": "./ng-generate/i18n/schema.json" + }, + "types": { + "description": "Generate type definitions for an aspect model", + "factory": "./ng-generate/types/index", + "schema": "./ng-generate/types/schema.json" + }, + "types-prompter": { + "description": "generate custom prompter", + "factory": "./ng-generate/prompter/types/index" + }, + "tasks": { + "description": "generate custom prompter", + "run-prettier": { + "implementation": "./prettier-task" + } + } + } +} diff --git a/libs/schematic/generators/ng-add/index.ts b/libs/schematic/generators/ng-add/index.ts new file mode 100644 index 00000000..181e6610 --- /dev/null +++ b/libs/schematic/generators/ng-add/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {chain, Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import {addPackageJsonDependencies, DEFAULT_DEPENDENCIES} from '../utils/package-json'; +import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks'; + +export function add(options: any): Rule { + return (tree: Tree, context: SchematicContext) => { + context.addTask(new NodePackageInstallTask()); + return chain([addPackageJsonDependencies(options.skipImport, options, DEFAULT_DEPENDENCIES)])(tree, context); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/card/README.md b/libs/schematic/generators/ng-generate/components/card/README.md new file mode 100644 index 00000000..c2effa4d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/README.md @@ -0,0 +1,388 @@ +## Table of Contents + +- [Generate a card component with the schematics command](#generate-a-card-component-with-the-schematics-command) + - [Flags and options that can be used in the generation process](#flags-and-options-that-can-be-used-in-the-generation-process) + - [Generate a component with a custom name](#generate-a-component-with-a-custom-name) + - [Exclude one or more properties from the generation](#exclude-one-or-more-properties-from-the-generation) + - [Multi-version support for Aspect Models](#multi-version-support-for-aspect-models) + - [Show customized information in the card with ng-template](#show-customized-information-in-the-card-with-ng-template) + - [Export functionality](#export-functionality) + - [Custom icons for the command bar](#custom-icons-for-the-command-bar) + - [Add translations](#add-translations) + - [Pre-load config file](#pre-load-config-file) + - [Skip Installation](#skip-install) + - [Overwrite](#overwrite) + - [Add material css theme](#Add-material-css-theme) + - [Set View Encapsulation strategy](#Set-View-Encapsulation-strategy) + +# Generate a card component with the schematics command + +```bash +schematics @esmf/semantic-ui-schematics:card +``` + +Generated files will be located under the folder structure as follows: + +1. Multiple version support: `src/app/shared/components///` +2. Without multiple version support: `src/app/shared/components/` + +Files which are also automatically generated, but not included in the component's folder are: + +1. `export-card.dialot.component.ts` under `src/app/shared/export-confirmation-dialog` +2. `general.component.` under `src/assets/scss` + +To be able to view correctly the material icons add the following +link: in the section of +the index.html + +# Flags and options that can be used in the generation process + +--- + +## Generate a component with a custom name + +By default, all the generated components will take the name of the aspect from the provided aspect model. + +By running the command without the '--name flag' + +```bash +ng generate @esmf/semantic-ui-schematics:card --dry-run=false +``` + +this will be the result in the generated component .ts file + +```typescript +@Component({ + selector: 'esmf-sdk-ui-movement-card', + templateUrl: './movement-card.component.html', + styleUrls: ['./movement-card.component.scss'], +}) +export class MovementCardComponent {} +``` + +By running the command with the '--name' flag + +```bash +ng generate @esmf/semantic-ui-schematics:card --dry-run=false --name=custom +``` + +the name of the component will be changed. This will be reflected under folder structure and as well for the component +selector. + +```typescript +@Component({ + selector: 'esmf-sdk-ui-custom-card', // <- provided name reflected in the selector name + templateUrl: './custom-card.component.html', // <- provided name reflected in the component path + styleUrls: ['./custom-card.component.scss'], // <- provided name reflected in the component files +}) +export class CustomCardComponent {} // <- provided name reflected in the component class name +``` + +--- + +## Exclude one or more properties from the generation + +One or more properties of an Aspect Model Element e.g. generating a card can be excluded during the initial setup when +the following question appears: + +```bash +Choose the properties to hide in the card: (Press to select, to toggle all, to invert selection, and to proceed) +>( ) Property moving + ( ) Property speedLimitWarning +``` + +The properties will be automatically read from the provided aspect model, and you can select/deselect which of them +should be removed from the card columns. + +--- + +## Multi-version support for Aspect Models + +Per default, the support for different versions of the Aspect Models is +turned on. It can be disabled using the command line parameter `aspectModelVersionSupport` + +```bash +ng generate @esmf/semantic-ui-schematics:card --dry-run=false --aspectModelVersionSupport=false +``` + +For this kind of multi-version support, the schematics for card UI component +generation creates files in the project's directory structure, as +depicted below: + +In this example, the Aspect Model is named _Movement_, Version is 1.0.0. +You have the following directory structure after applying the +schematic for card UI component generation: + +```text + src + +-- app + | +-- shared + | +-- components + | +-- movement-card + | +-- v100 + | +-- movement-card.component.scss + | +-- movement-card.component.ts + | +-- movement-card.component.html + | +-- movement-card-command-bar.component.ts + | +-- movement-card-command-bar.component.html + | +-- movement-card-chip-list.component.ts + | +-- movement-card-chip-list.component.scss + | +-- movement-card-chip-list.component.html + | +-- movement-card.module.ts + | +-- movement-card.service.ts + | +-- movement-card-filter.service.ts + | + +-- assets + +-- i18n + +-- shared + +-- components + +-- movement-card + +-- v100 + +-- en.movement-card.translation.json +``` + +Next time you use the schematic to create a card UI component from a different +version of the Aspect Model, you will get additional subdirectories for the +component and the language files. + +--- + +## Show customized information in the card with ng-template + +In your parent HTML file, you have the ability to define a custom ng-template. +This template will be integrated directly into the card's content. + +You can either: + +- Utilize the pre-defined elements and their values, or +- Introduce entirely custom content according to your requirements. + +This flexibility allows you to tailor the card's appearance and behavior to fit specific scenarios. + +**_NOTE:_** The "let-element" should be constructed from the component's name, following the pattern +CardValues. +This naming convention can also be directly observed within the child component (refer to the Enum). + +Without versioning: + +```html + + +
+ {{ elem + ".preferredName" | transloco }}: {{ getElementValue(data, elem) }} +
+
+
+``` + +With versioning: + +```html + + +
+ {{ 'movement.v210.' + elem + ".preferredName" | transloco }}: {{ getElementValue(data, elem) }} +
+
+
+``` + +--- + +## Add translations + +In order to see the translations for the generated card we need to run: + +```bash +schematics ..//src/collection.json:i18n --dry-run=false +ng generate @esmf/semantic-ui-schematics:i18n --dry-run=false +``` + +This command will install in demo project the following libraries: "@jsverse/transloco": "^6.x", "ngx-i18n-combine": " +^1.x" +And the translation file will be generated: en.movement-form.translation.json + +## Export functionality + +After generating a card which contains a command bar, the export data button will be present in the right corner of the +toolbar. + +By pressing it, a modal dialog window will appear with multiple options. + +1. If the data is handled on the client side, the following options will appear: + + 1. Export all pages (by default) + Pressing this button will result into a full data export to a csv file. + 2. Export only first page + If this option appears, this will lead to a csv file being exported including only the first page from the view. + +2. If the data is handled remotely, the following options will be visible: + + 1. Export all pages (by default) - option which exports a csv containing the set of data which can be visible on + that + page. + 2. Export only first page + If this option appears, this will lead to a csv file being exported including only the first page from the view. + 3. Export all pages (only if an ExtendedCsvExporter function is passed to the card through bindings) - will result + in exporting the data by calling an external function passed to the generated component through binding by using + the `extendedCsvExporter` attribute. + + ```html + + ``` + + The `csvExporter` function will have a type `ExtendedCsvExporter` exported in the component's service file, and it + will need to implement a function with 2 arguments, the displayed columns and the RQL query which will query the data + from the backend. + + ```typescript + export interface ExtendedCsvExporter { + export(displayedColumns: string[], rqlQuery: string): void; + } + ``` + + If this function is not exposed to the component, this option will not appear in the export dialog window. + +### Custom icons for the command bar + +When running the command + +```bash +ng generate @esmf/semantic-ui-schematics:card --dry-run=false +``` + +the wizard will prompt at some point along the generation process this question: + +```bash +To add custom action buttons on the command bar, enter the names of SVG-files or style classes. SVG files will be looked for in ./assets/icons directory. Use ',' to enter multiple (e.g. edit.svg, schedule): (Use tab for suggestions) +``` + +As prompted in the helper text, you have two options: + +1. Pass in an icon name (including the extension - .svg) which needs to exist in the folder under the path _* + ./assets/icons*_ +2. Pass in a material icon name which exists in + the [material icons library](https://fonts.google.com/icons?selected=Material+Icons). + +--- + +## Pre-load config file + +If you want to use a pre-existing config file, without going through the generation wizard, you may feed the path to the +.json config using the 'configFile' flag by running the command like this: + +```bash +ng generate @esmf/semantic-ui-schematics:card --configFile=-wizard.configs.json +``` + +Example of configuration file: + +[//]: # 'TODO check this is up to date' + +```json +{ + "aspectModelTFiles": ["FOLDER\\Movement.ttl"], + "excludedProperties": [], + "configFile": "wizard.config.json", + "complexProps": [ + { + "prop": "position", + "propsToShow": ["x", "y", "z"] + } + ], + "selectedModelElementUrn": "urn:samm:org.eclipse.esmf.test:1.0.0#Movement", + "jsonAccessPath": "", + "defaultSortingCol": "moving", + "customRowActions": ["schedule"], + "addCommandBar": true, + "enabledCommandBarFunctions": ["addCustomCommandBarActions", "addSearchBar", "addEnumQuickFilters", "addDateQuickFilters"], + "customCommandBarActions": ["edit.svg"], + "enableRemoteDataHandling": true, + "enableVersionSupport": true, + "overwrite": true, + "getOptionalMaterialTheme": false, + "datePickers": [ + { + "propertyUrn": "urn:samm:org.eclipse.test:1.0.0#datePicker", + "datePicker": { + "type": "singleDatePicker" + } + } + ] +} +``` + +--- + +## Skip install + +If you want to skip installation of dependencies you may use the '--skip-install' flag + +```bash +ng generate @esmf/semantic-ui-schematics:card --skip-install +``` + +--- + +## Overwrite + +If you want to overwrite the already existing generated files, you may use the '--overwrite' flag + +```bash +ng generate @esmf/semantic-ui-schematics:card --overwrite +``` + +--- + +## Add material css theme + +If you want to add the indigo pink material theme, you may use the '--getOptionalMaterialTheme' flag + +when the wizard will prompt the question: + +```bash +Do you want to add the Angular Material theme? (Indigo Pink Theme) +``` + +User may choose Yes or No. + +if user did not set --getOptionalMaterialTheme to true but wants to add a material theme to the project, +in angular.json in styles section the following code can be added: + +```bash +{ + "styles": [ + "src/styles.scss", + "node_modules/@angular/material/prebuilt-themes/indigo-pink.css" + ] +} + +``` + +--- + +## Set View Encapsulation strategy + +By default, the view encapsulation for the generated card component is set to None. +If you want to change the View Encapsulation strategy, you may use the '--viewEncapsulation' flag +where user can choose one of the following options: None, Emulated, ShadowDom. + +when the wizard will prompt the question: + +```bash +Do you want to specify view encapsulation strategy? +``` + +User may choose one of the values: None, Emulated, ShadowDom. diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..d2144a76 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.html.template @@ -0,0 +1,31 @@ +
+ <% if (options.addCommandBar) { %> + <<%= dasherize(name) %>-command-bar + [totalItems]="totalItems" + (applyFilters)="applyFilters()" + (reloadFilter)="reloadFilter()" + (exportToCsv)="openExportConfirmationDialog()" + (sorting)="sorting()"> + -command-bar> + <% } %> + + <% if (options.hasFilters) { %> + + <% } %> + + +
+
+ + + +
+ +
+
+ + +
diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..e10a2962 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.scss.template @@ -0,0 +1,12 @@ +/** <%= options.generationDisclaimerText %> **/ +@use 'general.component' as *; + +.data-card { + margin: 15px 0 10px 0; +} + +.data-card-header { + display: flex; + justify-content: space-between; + border-top: 5px solid black; +} diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..dd1052a6 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/card/files/__name@dasherize__.component.ts.template @@ -0,0 +1,381 @@ +/** <%= options.generationDisclaimerText %> **/ +import { + Component, + ElementRef, + EventEmitter, + Input, + <% if (options.enableRemoteDataHandling || options.hasSearchBar) { %>OnDestroy,<% } %> + <% if (options.enableRemoteDataHandling) { %>ChangeDetectorRef,<% } %> + <% if (options.changeDetection !== 'Default') { %>ChangeDetectionStrategy,<% } %> + OnInit, + AfterViewInit, + Output, + ViewChild, + ViewEncapsulation, + ContentChild, + TemplateRef +} from '@angular/core'; +import {TranslocoService} from '@jsverse/transloco'; + +import { + <%= classify(options.selectedModelTypeName) %> + <% if (selectedModelElementUrn !== aspectModelElementUrn && !isCollectionAspect) { %> + , <%= classify(options.aspectModelTypeName) %> + <% } %> + <% if (options.isEnumQuickFilter) { %> + , <%= enumProperties %> + <% } %> +} from '<%= options.typePath %>'; + +import {<%= options.filterServiceName %>, SortCard} from './<%= dasherize(name) %>-filter.service' + +<% if (options.addCommandBar) { %> + import {filter} from "rxjs/operators"; + import {MatDialog} from '@angular/material/dialog'; + import {unparse} from "papaparse"; + import {Action, ExportCardDialogComponent} from '<% if (options.enableVersionSupport) { %>../<% } %>../export-confirmation-dialog/export-card-dialog.component'; +<% } %> + +<% if (options.hasSearchBar || options.enableRemoteDataHandling) { %> + import {takeUntil} from "rxjs/operators"; + import {<% if (options.enableRemoteDataHandling) { %>catchError, finalize, tap, Subscription,<% } %>Subject} from 'rxjs'; +<% } %> + +import {MatPaginator} from "@angular/material/paginator"; +import {MatTableDataSource} from "@angular/material/table"; + +<% if (options.enableRemoteDataHandling) { %> + <%= options.include('/remote-handling/imports.ts.template') %> + <%= options.include('/remote-handling/custom-rql-filter-extensions.ts.template') %> +<% } else { %> + import {<%= classify(name) %>Service} from './<%= dasherize(name) %>.service'; +<% } %> + +export enum <%= classify(name) %>CardValues { + <%= enumPropertyDefinitions %> +} + +@Component({ + selector: '<%= options.selector %>', + templateUrl: './<%= dasherize(name) %>.component.html', + styleUrls: ['./<%= dasherize(name) %>.component.<%= options.style %>'], + standalone: false + <% if (options.changeDetection) { %>, changeDetection: ChangeDetectionStrategy.<%= options.changeDetection %><% } %> + <% if (options.viewEncapsulation) { %>,encapsulation: ViewEncapsulation.<%= options.viewEncapsulation %><% } else { %>,encapsulation: ViewEncapsulation.None<% } %> +}) +export class <%= classify(name) %>Component implements OnInit, AfterViewInit<% if (options.hasSearchBar || options.enableRemoteDataHandling) { %>, OnDestroy<% } %> { + @ContentChild('cardTemplate') cardTemplate!: TemplateRef; + + @Input() data: Array<<%= options.aspectModelTypeName %>> = []; + + <% if (options.hasSearchBar) { %> + @Input() initialSearchString = ''; + @Input() regexValidator: string = ''; + <% } %> + + @Input() minNumberCharacters: number = 2; + @Input() maxNumberCharacters: number = 50; + + <% if (options.enableRemoteDataHandling) { %> + @Input() maxExportRows: number = 5000; + @Input() customFilterExtension: CustomRQLFilterExtension | undefined; + @Input() customOptionsExtension: CustomRQLOptionExtension | undefined; + @Input() extendedCsvExporter: ExtendedCsvExporter | undefined; + @Input() remoteAPI: string = ''; + <% } else { %> + @Input() maxExportRows: number = 0; + <% } %> + + @Output() cardUpdateStartEvent = new EventEmitter(); + @Output() cardUpdateFinishedEvent = new EventEmitter(); + + <% if (options.addCommandBar) { %> + @Output() downloadEvent = new EventEmitter<{ error: boolean; success: boolean; inProgress: boolean }>(); + <% } %> + + @Output() detail = new EventEmitter(); + + <% if (options.addCommandBar) { %> + @ViewChild('searchInput') searchInput!: ElementRef; + <% } %> + + @ViewChild(MatPaginator, {static: true}) paginator!: MatPaginator; + + currentLanguage: string; + + dataSource: MatTableDataSource<<%= options.aspectModelTypeName %>> = new MatTableDataSource<<%= options.aspectModelTypeName %>>(); + + dataToShow: Array<<%= options.aspectModelTypeName %>> = []; + totalItems: number = 0; + dataLoadError = false; + + <% if (options.enableRemoteDataHandling) { %> + rqlString: string = ''; + <% } %> + + <%= camelize(name) %>CardValues = Object.values(<%= classify(name) %>CardValues); + + <% if (options.hasSearchBar || options.enableRemoteDataHandling) { %> + private readonly destroy$ = new Subject(); + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + private requestSubscription: Subscription = new Subscription(); + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + constructor(private translateService: TranslocoService, + private filterService: <%= classify(name) %>FilterService, + <% if (options.addCommandBar) { %> + public dialog: MatDialog, + <% } %> + private <% if (options.customRemoteService) { %>custom<% } %><%= classify(name) %>Service: <% if (options.customRemoteService) { %>Custom<% } %><%= classify(name) %>Service) { + this.currentLanguage = this.translateService.getActiveLang(); + } + <% } else { %> + constructor(private translateService: TranslocoService, + private <%= camelize(name) %>Service: <%= classify(name) %>Service, + private filterService: <%= classify(name) %>FilterService, + <% if (options.addCommandBar) { %> + public dialog: MatDialog, + <% } %>) { + this.currentLanguage = this.translateService.getActiveLang(); + } + <% } %> + + getContext(data: <%= options.aspectModelTypeName %>) { + return { + <%= camelize(name) %>CardValues: this.<%= camelize(name) %>CardValues, + $implicit: data, + getElementValue: this.getElementValue.bind(this), + translateService: this.translateService, + }; + } + + ngOnInit() { + <% if (options.hasSearchBar) { %> + this.filterService.searchStringInit(this.initialSearchString, this.regexValidator, this.minNumberCharacters, this.maxNumberCharacters); + this.subscribeToSelectedStringColumn(); + <% } %> + } + + ngAfterViewInit() { + <% if (options.defaultSortingCol) { %> + this.defaultSorting(); + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + this.requestData(); + <% } else { %> + this.dataToShow = [...this.data]; + this.totalItems = this.dataToShow.length; + this.dataSource.data = this.dataToShow; + this.dataSource.paginator = this.paginator; + this.paginator.length = this.dataToShow.length; + <% } %> + } + + <% if (options.defaultSortingCol) { %> + private defaultSorting() { + this.filterService.sortedProperty = '<%= options.defaultSortingCol %>'; + <% if (!options.enableRemoteDataHandling) { %> + this.sorting(); + <% } %> + } + <% } %> + + <% if (options.hasFilters) { %> + removeFilter(filterData: any) { + <% if (options.hasFilters) { %> + this.filterService.removeFilter(filterData); + <% } %> + + this.paginator.firstPage(); + + <% if (options.hasSearchBar) { %> + this.filterService.searchString.reset(); + <% } %> + + this.applyFilters(); + } + <% } %> + + + reloadFilter(): void { + this.applyFilters(); + } + + applyFilters(): void { + <% if (options.hasSearchBar) { %> + if (this.filterService.searchString.errors) { + return; + } + <% } %> + + this.cardUpdateStartEvent.emit(); + + <% if (options.enableRemoteDataHandling) { %> + this.requestData(); + <% } else { %> + this.dataToShow = this.applyAllFilters(this.data); + this.totalItems = this.dataToShow.length; + this.maxExportRows = this.totalItems; + + this.cardUpdateFinishedEvent.emit(); + <% } %> + } + + <% if (options.enableRemoteDataHandling) { %> + <%= options.include('/remote-handling/requestData.ts.template') %> + <% } %> + + + <% if (!options.enableRemoteDataHandling) { %> + private applyAllFilters(data: any[]): any[] { + let dataTemp = [...data]; + + <% if (options.isEnumQuickFilter) { %> + dataTemp = this.filterService.applyEnumFilter(dataTemp); + <% } %> + + <% if (options.hasSearchBar) { %> + dataTemp = this.filterService.applyStringSearchFilter(dataTemp); + <% } %> + + <% if (options.isDateQuickFilter) { %> + dataTemp = this.filterService.applyDateFilter(dataTemp); + <% } %> + + return dataTemp; + } + + sorting() { + this.data.sort((a, b) => { + let aValue = (a as any)[this.filterService.sortedProperty]; + let bValue = (b as any)[this.filterService.sortedProperty]; + + if (typeof aValue === 'boolean') { + aValue = aValue ? 1 : 0; + bValue = bValue ? 1 : 0; + } + + if (Date.parse(aValue)) { + aValue = new Date(aValue); + bValue = new Date(bValue); + } + + if (this.filterService.sortCard === SortCard.ASCENDING) { + if (aValue < bValue) return -1; + if (aValue > bValue) return 1; + + return 0; + } else { + if (aValue < bValue) return 1; + if (aValue > bValue) return -1; + + return 0; + } + }); + + this.applyFilters(); + } + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + sorting() { + this.applyFilters(); + } + <% } %> + + <% if (options.hasSearchBar) { %> + private subscribeToSelectedStringColumn() { + this.filterService.selectedStringColumn.valueChanges + .pipe(takeUntil(this.destroy$)) + .subscribe(() => { + if (this.searchInput) { + this.searchInput.nativeElement.focus(); + } + }); + } + <% } %> + + <% if (options.addCommandBar) { %> + openExportConfirmationDialog() { + const dialogRef = this.dialog.open(ExportCardDialogComponent, { + data: {maxExportRows: this.maxExportRows}, + maxWidth: 478, + }).afterClosed() + .pipe(filter(e => !!e)) + .subscribe((event: { action: Action; exportFirstPage: boolean }) => { + if (event.action === Action.cancel) { + return; + } + + const exportData = JSON.parse(JSON.stringify(this.data)); + + if(event.exportFirstPage && exportData.length > this.paginator.pageSize) { + exportData.length = this.paginator.pageSize; + } + + if (!event.exportFirstPage && this.data.length > this.maxExportRows) { + exportData.length = this.maxExportRows; + } + + this.exportToCsv(exportData); + }); + } + + private exportToCsv(exportData: Array<<%= options.aspectModelTypeName %>>) { + const headersCSV = unparse({ + fields: this.<%= camelize(name) %>CardValues.map(columnName => { + const translatedHeader = this.translateService.translate(`<%= options.aspectModelTypeName.toLowerCase() %>.${columnName}.preferredName`); + return translatedHeader !== `<%= options.aspectModelTypeName.toLowerCase() %>.${columnName}.preferredName` ? translatedHeader : columnName; + }) as string[], + data: [], + }); + + this.downloadCsv(`${headersCSV}${unparse(exportData, {header: false, columns: this.<%= camelize(name) %>CardValues})}`); + } + + private downloadCsv(csvArray: string) { + this.downloadEvent.emit({error: false, success: false, inProgress: true}); + try { + <% if (options.enableRemoteDataHandling && options.customRemoteService) { %> + this.<%= ((options.customRemoteService ? 'custom' : '') + classify(name)) %>Service.downloadCsv(csvArray); + <% } else { %> + this.<%= camelize(name) %>Service.downloadCsv(csvArray); + <% } %> + this.downloadEvent.emit({error: false, success: true, inProgress: false}); + } catch (error: any) { + this.downloadEvent.emit({error: true, success: false, inProgress: false}); + } + } + <% } %> + + detailInformation(data: <%= options.aspectModelTypeName %>) { + this.detail.emit(data); + } + + getElementValue(data: any, element: string) { + const properties = element.split('.'); + + return properties.reduce((currentValue, property) => { + if (currentValue && currentValue.hasOwnProperty(property)) { + return currentValue[property]; + } else { + return undefined; + } + }, data); + } + + <% if (options.enableRemoteDataHandling || options.hasSearchBar ) { %> + ngOnDestroy() { + <% if (options.hasSearchBar || options.isEnumQuickFilter || options.isDateQuickFilter) { %> + this.filterService.reset(); + <% } %> + + this.destroy$.next(); + this.destroy$.complete(); + } + <% } %> +} diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/card/index.ts b/libs/schematic/generators/ng-generate/components/card/generators/components/card/index.ts new file mode 100644 index 00000000..b7621753 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/card/index.ts @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, chain, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {Property} from '@esmf/aspect-model-loader'; +import {generateCommandBar} from '../../../../shared/generators/index'; +import {getEnumProperties, getEnumPropertyDefinitions} from '../../../../shared/utils'; +import {Schema} from '../../../../shared/schema'; +import {templateInclude} from '../../../../shared/include'; + +let sharedOptions: any = {}; +let allProps: Array = []; + +export function generateCardComponent(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + allProps = options.listAllProperties; + + return chain([ + ...(options.addCommandBar ? [generateCommandBar(options, allProps)] : []), + generateCard(options, _context), + ])(tree, _context); + }; +} + +function generateCard(options: Schema, _context: SchematicContext): Rule { + sharedOptions = options; + + return mergeWith( + apply(url('./generators/components/card/files'), [ + templateInclude(_context, applyTemplate, options, '../shared/methods'), + move(sharedOptions.path), + ]), + sharedOptions.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); +} + +function applyTemplate(): Rule { + return applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + camelize: strings.camelize, + options: sharedOptions, + name: sharedOptions.name, + selectedModelElementUrn: sharedOptions.selectedModelElement.aspectModelUrn, + aspectModelElementUrn: sharedOptions.aspectModel.aspectModelUrn, + enumProperties: getEnumProperties(sharedOptions), + enumPropertyDefinitions: getEnumPropertyDefinitions(sharedOptions, allProps), + }); +} diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..eba14c2c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.html.template @@ -0,0 +1,22 @@ +
+ {{ 'exportData.title' | transloco }} + close +
+ +
+
{{ dialogDescription }}
+
+
+ + {{ 'exportData.exportFirstPage' | transloco : {maxExportRows: data.maxExportRows} }} + +
+
+
+ +
+ + +
diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..2f8f29fc --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.scss.template @@ -0,0 +1,44 @@ +/** <%= options.generationDisclaimerText %> **/ + +.dialog-button-container { + justify-content: flex-end; +} + +.dialog-title { + justify-content: space-between; + display: flex; + align-items: center; + margin-top: 1rem; + margin-bottom: 1rem; + font-weight: bold; +} + +.close-dialog-icon { + background: none; + border: none; + font-size: 1.3rem; + cursor: pointer; + margin-left: auto; +} + +.dialog-description { + font-size: 1.2rem; + height: 3rem; + margin-right: 2rem; + margin-bottom: 1.5rem; + float: left; +} + +.checkbox-container { + margin: -20px 0 0.5rem -11px; +} + +export-button { + &[data-test="exportData"] { + &.primary { + span { + // Add styles for span here, if any. + } + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..29899041 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/files/__name@dasherize__.component.ts.template @@ -0,0 +1,64 @@ +/** <%= options.generationDisclaimerText %> **/ +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {AfterViewInit, Component, Inject, ViewChild} from '@angular/core'; +import { TranslocoService } from '@jsverse/transloco'; +import {MatCheckbox} from '@angular/material/checkbox'; +import {ChangeDetectorRef} from '@angular/core'; + +export enum Action { + export= 'export', + cancel = 'cancel' +} + +@Component({ + selector: '<%= dasherize(name) %>', + templateUrl: './<%= dasherize(name) %>.component.html', + styleUrls: ['./<%= dasherize(name) %>.component.scss'], + standalone: false +}) +export class <%= classify(name) %>Component implements AfterViewInit { + @ViewChild('exportFirstPage') exportFirstPage!: MatCheckbox; + + + action = Action; + dialogDescription = ''; + showAllColumnsBox = true; + + constructor( + public dialogRef: MatDialogRef<<%= classify(name) %>Component>, + private translateService: TranslocoService, + private cdRef:ChangeDetectorRef, + @Inject(MAT_DIALOG_DATA) + public data: { + <% if (options.enableRemoteDataHandling) { %>extendedCsvExporter: boolean,<% } %> + maxExportRows: number; + } + ) {} + + ngAfterViewInit() { + this.setDialogDescription(); + this.cdRef.detectChanges(); + } + + setDialogDescription() { + const {maxExportRows} = this.data; + const isExportAllPagesChecked = this.exportFirstPage.checked; + + let translationKey = 'exportData.description.default'; + + if (isExportAllPagesChecked) { + translationKey = 'exportData.description.exportOnlyFirstPage'; + } + + this.dialogDescription = this.translateService.translate(translationKey, { + maxExportRows + }); + } + + exportData() { + this.dialogRef.close({ + action: Action.export, + exportFirstPage: this.exportFirstPage.checked, + }); + } +} diff --git a/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/index.ts b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/index.ts new file mode 100644 index 00000000..d45746b8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/generators/components/export-dialog/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateExportCardDialog(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('./generators/components/export-dialog/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'export-card-dialog', + }), + move('src/app/shared/components/export-confirmation-dialog'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/card/index.ts b/libs/schematic/generators/ng-generate/components/card/index.ts new file mode 100644 index 00000000..75d27bd4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/index.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {CardSchema} from './schema'; +import {chain, Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import { + addAndUpdateConfigurationFilesRule, + formatAllFilesRule, + generateComponent, + generateGeneralFilesRules, + insertVersionIntoPathRule, + insertVersionIntoSelectorRule, + loadAspectModelRule, + loadRdfRule, + options, + prepareOptions, + setComponentNameRule, + setCustomActionsAndFiltersRule, + setTemplateOptionValuesRule, +} from '../shared/index'; +import {ComponentType, Schema} from '../shared/schema'; +import {generateCardComponent} from './generators/components/card/index'; +import {generateExportCardDialog} from './generators/components/export-dialog/index'; + +export default function (cardSchema: CardSchema): Rule { + return (tree: Tree, context: SchematicContext) => { + generateComponent(context, cardSchema, ComponentType.CARD); + }; +} + +export function generateCard(cardSchema: Schema): Rule { + prepareOptions(cardSchema, ComponentType.CARD); + + return chain([ + loadRdfRule(), + loadAspectModelRule(), + setCustomActionsAndFiltersRule(), + setComponentNameRule(ComponentType.CARD), + insertVersionIntoSelectorRule(), + insertVersionIntoPathRule(), + setTemplateOptionValuesRule(), + ...generateGeneralFilesRules(), + ...cardSpecificGeneration(), + ...addAndUpdateConfigurationFilesRule(), + formatAllFilesRule(), + ]); +} + +function cardSpecificGeneration(): Array { + return [generateCardComponent(options), generateExportCardDialog(options)]; +} diff --git a/libs/schematic/generators/ng-generate/components/card/schema.json b/libs/schematic/generators/ng-generate/components/card/schema.json new file mode 100644 index 00000000..4e72084b --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/schema.json @@ -0,0 +1,154 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-card-schematic", + "title": "Card Options Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "format": "path", + "description": "The path to create the component.", + "$default": { + "$source": "workingDirectory" + }, + "visible": false + }, + "name": { + "type": "string", + "description": "The name of the Component.", + "default": "card" + }, + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "viewEncapsulation": { + "description": "Specifies the view encapsulation strategy.", + "enum": ["Emulated", "None", "ShadowDom"], + "type": "string", + "default": "None", + "alias": "v" + }, + "changeDetection": { + "description": "Specifies the change detection strategy.", + "enum": ["Default", "OnPush"], + "type": "string", + "alias": "c" + }, + "prefix": { + "type": "string", + "format": "html-selector", + "description": "The prefix to apply to generated selectors.", + "default": "esmf-ui", + "alias": "p" + }, + "style": { + "description": "The file extension to be used for style files.", + "type": "string", + "default": "scss" + }, + "flat": { + "type": "boolean", + "description": "Flag to indicate if a dir is created.", + "default": false + }, + "skipImport": { + "type": "boolean", + "description": "Flag to skip the module import.", + "default": false + }, + "selector": { + "type": "string", + "format": "html-selector", + "description": "The selector to use for the component." + }, + "module": { + "type": "string", + "description": "Allows specification of the declaring module.", + "alias": "m" + }, + "export": { + "type": "boolean", + "default": false, + "description": "Specifies if declaring module exports the component." + }, + "aspectModelUrnToLoad": { + "type": "string", + "default": "" + }, + "selectedModelElementUrn": { + "type": "string", + "default": "" + }, + "jsonAccessPath": { + "type": "string", + "default": "" + }, + "enableVersionSupport": { + "type": "boolean", + "default": true + }, + "addCommandBar": { + "type": "boolean", + "default": false + }, + "enabledCommandBarFunctions": { + "type": "array", + "default": [] + }, + "excludedProperties": { + "type": "array", + "default": [] + }, + "getExcludedPropLabels": { + "type": "boolean", + "default": false + }, + "customCommandBarActions": { + "type": "array", + "default": [] + }, + "customStyleImports": { + "type": "array", + "default": [] + }, + "aspectModel": { + "type": "object" + }, + "enableRemoteDataHandling": { + "type": "boolean", + "default": false + }, + "customRemoteService": { + "type": "boolean", + "default": true + }, + "overwrite": { + "type": "boolean", + "default": false + }, + "ttl": { + "type": "string" + }, + "configFile": { + "description": "Used for pre-loading the config file from the command line(when set, config wizard is disabled).", + "type": "string" + }, + "skipInstall": { + "type": "boolean", + "default": false, + "description": "Weather or not to install dependencies at the end of the generation process." + }, + "getOptionalMaterialTheme": { + "type": "boolean", + "default": false + }, + "commandBarFilterOrder": { + "type": "array", + "default": [] + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/card/schema.ts b/libs/schematic/generators/ng-generate/components/card/schema.ts new file mode 100644 index 00000000..693d8193 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/card/schema.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Values} from '../shared/schema'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type,@typescript-eslint/no-empty-interface +export interface CardSchema extends Values {} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type,@typescript-eslint/no-empty-interface +export interface ConfigurationDefaultsSchema {} + +// class to define default values that are not asked in the prompter +// defaultValue = data.properties.defaultValue.default; +export class CardDefaultsSchema implements ConfigurationDefaultsSchema {} diff --git a/libs/schematic/generators/ng-generate/components/form/README.md b/libs/schematic/generators/ng-generate/components/form/README.md new file mode 100644 index 00000000..457f054f --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/README.md @@ -0,0 +1,581 @@ +## Table of Contents + +- [Generate a form component with the schematics command](#generate-a-form-component-with-the-schematics-command) + - [Flags and options that can be used in the generation process](#flags-and-options-that-can-be-used-in-the-generation-process) + - [Generate a component with a custom name](#generate-a-component-with-a-custom-name) + - [Select the element for which the form will be generated](#select-the-element-for-which-the-form-will-be-generated) + - [Exclude one or more properties from the generation](#exclude-one-or-more-properties-from-the-generation) + - [Exclude one or more constraints from the generation](#exclude-one-or-more-constraints-from-the-generation) + - [Multi-version support for Aspect Models](#multi-version-support-for-aspect-models) + - [Manual adaptions in _app.module.ts_](#manual-adaptions-in-appmodulets) + - [Show form as read only](#show-form-as-read-only) + - [Add translations](#add-translations) + - [Pre-load config file](#pre-load-config-file) + - [Skip Installation](#skip-install) + - [Overwrite](#overwrite) + - [Add material css theme](#add-material-css-theme) + - [Set View Encapsulation strategy](#set-View-Encapsulation-strategy) + - [Generate the environments files](#generate-the-environments-files) +- [Output](#output) + - [Form structure](#form-structure) + - [Validation](#validation) + - [Base validators](#base-validators) + - [Constraint validators](#constraint-validators) + - [Supported Constraint types](#supported-constraint-types) + - [Unsupported Constraint types](#unsupported-constraint-types) + - [Type-specific validators](#type-specific-validators) + - [Supported complex data types](#supported-complex-data-types) + - [Unsupported complex data types](#unsupported-complex-data-types) + - [Supported scalar data types](#supported-scalar-data-types) + - [Unsupported scalar data types](#unsupported-scalar-data-types) + - [Usage](#usage) + - [Working with list-like controls](#working-with-list-like-controls) + +# Generate a form component with the schematics command + +```bash +schematics @esmf/semantic-ui-schematics:form +``` + +Generated files will be located under the folder structure as follows: + +1. Multiple version support: `src/app/shared/components///` +2. Without multiple version support: `src/app/shared/components/` +3. In the component's folder will be generated components for each form control from the form. + +Files which are also automatically generated, but not included in the component's folder are: + +1. `general.component.` under `src/assets/scss` + +To be able to view correctly the material icons add the following +link: in the section of +the index.html + +# Flags and options that can be used in the generation process + +--- + +## Generate a component with a custom name + +By default, all the generated components will take the name of the aspect from the provided aspect model. + +By running the command without the '--name flag' + +```bash +ng generate @esmf/semantic-ui-schematics:form --dry-run=false +``` + +this will be the result in the generated component .ts file + +```typescript +@Component({ + selector: 'esmf-sdk-ui-complex-list-types-form', + templateUrl: './complex-list-types-form.component.html', + styleUrls: ['./complex-list-types-form.component.scss'], +}) +export class ComplexListTypesFormComponent +``` + +By running the command with the '--name' flag + +```bash +ng generate @esmf/semantic-ui-schematics:form --dry-run=false --name=custom +``` + +the name of the component will be changed. This will be reflected under folder structure and as well for the component +selector. + +```typescript +@Component({ + selector: 'esmf-sdk-ui-custom-form', // <- provided name reflected in the selector name + templateUrl: './custom-form.component.html', // <- provided name reflected in the component path + styleUrls: ['./custom-form.component.scss'], // <- provided name reflected in the component files +}) +export class CustomFormComponent {} // <- provided name reflected in the component class name +``` + +--- + +## Select the element for which the form will be generated + +The form can be generated for the whole Aspect Model, and in this case the first level of properties and entities will +be considered or the form can +be generated for a specific entity. + +```bash +Choose a specific Entity or Aspect to show as form: (Use arrow keys) +> urn:samm:org.eclipse.examples.movement:1.0.0#Movement (Aspect) + urn:samm:org.eclipse.examples.movement:1.0.0#Entity (Entity) +``` + +The properties will be automatically read from the provided aspect model or entity, and you can select/deselect which of +them +should be removed from the form. + +--- + +## Exclude one or more properties from the generation + +One or more properties of the selected Aspect Model Element or Entity can be excluded during the initial setup when +the following question appears: + +```bash +Choose the properties to hide in the form: (Press to select,
to toggle all, to invert selection, and to proceed) +>( ) Property moving + ( ) Property speedLimitWarning +``` + +The properties will be automatically read from the provided aspect model, and you can select/deselect which of them +should be removed from the form. + +--- + +## Exclude one or more constraints from the generation + +One or more constraints can be excluded during the initial setup when +the following question appears: + +```bash +Choose the constraints to ignore in the form: (Press to select, to toggle all, to invert selection, and to proceed) +>( ) urn:samm:org.eclipse.digitaltwin:1.0.0#LengthConstraintEitherRight + ( ) urn:samm:org.eclipse.digitaltwin:1.0.0#RangeConstraintCollection +``` + +The constraints will be automatically read from the corresponding subtree of the selected element (Aspect Model Element +or Entity), +and can be select/deselect in order to ignore/keep them in the generated form. + +If a constraint relates to a subtree of previously excluded property, it will not be shown in the list during this step. + +--- + +## Multi-version support for Aspect Models + +By default, the support for different versions of the Aspect Models is +turned on. It can be disabled using the command line parameter `aspectModelVersionSupport` + +```bash +ng generate @esmf/semantic-ui-schematics:form --dry-run=false --aspectModelVersionSupport=false +``` + +For this kind of multi-version support, the schematics for form UI component +generation creates files in the project's directory structure, as +depicted below: + +In this example, the Aspect Model is named _Movement_, Version is 1.0.0. +You have the following directory structure after applying the +schematic for form UI component generation: + +```text + src + +-- app + | +-- shared + | +-- components + | +-- movement-form + | +-- v100 + | +-- movement-form.component.scss + | +-- movement-form.component.ts + | +-- movement-form.component.html + | +-- movement-form.module.ts + | +-- movement-form.service.ts + | +-- altitude + | +-- altitude.component.html + | +-- altitude.component.scss + | +-- altitude.component.ts + | +-- is-moving + | +-- is-moving.component.html + | +-- is-moving.component.scss + | +-- is-moving.component.ts + | + +-- assets + +-- i18n + +-- shared + +-- components + +-- movement-form + +-- v100 + +-- en.movement-form.translation.json +``` + +Next time you use the schematic to create a form UI component from a different +version of the Aspect Model, you will get additional subdirectories for the +component and the language files. + +--- + +## Manual adaptions in _app.module.ts_ + +Please note that you (eventually) need to manually adapt file +_src/app/app.module.ts_ in order to specify which versions of the form UI +component you would like to use. In the example below, versions 1.0.0 and +1.1.0 are to be used as components. + +```typescript +import {NgModule} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; + +import {AppComponent} from './app.component'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import { + MovementFormModule as MovementFormModule_v100 +} from './shared/components/movement-form/v100/movement-form.module'; +import { + MovementFormModule as MovementFormModule_v110 +} from './shared/components/movement-form/v110/movement-form.module'; + +@NgModule({ + imports: [ + MovementFormModule_v100, // <-- Manually added + MovementFormModule_v110 // <-- Manually added + ] +}) +``` + +This gives you the choice to decide which UI components (and in which version) are used to compose your web application. +You then can use this specific version of the form UI component, e.g. in _src/app/app.component.html_: + +```angular2html + + + +``` + +--- + +## Show form as read only + +User can choose to have the form read only, by default it will be editable. + +```bash +Do you want to set the form read only? +``` + +User may choose Yes or No. + +--- + +## Add translations + +In order to see the translations for the generated form we need to run: + +```bash +schematics ..//src/collection.json:i18n --dry-run=false +ng generate @esmf/semantic-ui-schematics:i18n --dry-run=false +``` + +This command will install in demo project the following libraries: "@jsverse/transloco": "6.x", "ngx-i18n-combine": " +^1.x" +And the translation file will be generated: en.movement-form.translation.json + +## Pre-load config file + +If you want to use a pre-existing config file, without going through the generation wizard, you may feed the path to the +.json config using the 'configFile' flag by running the command like this: + +```bash +ng generate @esmf/semantic-ui-schematics:form --configFile=-wizard.configs.json +``` + +Example of configuration file: + +[//]: # 'TODO check this is up to date' + +```json +{ + "aspectModelTFiles": ["Movement.ttl"], + "excludedProperties": [], + "configFile": "test-wizard.config.json", + "complexProps": [], + "configFileName": "test", + "selectedModelElementUrn": "urn:samm:org.eclipse.examples.movement:1.0.0#Movement", + "enableVersionSupport": true, + "getOptionalMaterialTheme": false, + "viewEncapsulation": "Emulated", + "readOnlyForm": false, + "overwrite": true +} +``` + +--- + +## Skip install + +If you want to skip installation of dependencies you may use the '--skip-install' flag + +```bash +ng generate @esmf/semantic-ui-schematics:form --skip-install +``` + +--- + +## Overwrite + +If you want to overwrite the already existing generated files, you may use the '--overwrite' flag + +```bash +ng generate @esmf/semantic-ui-schematics:form --overwrite +``` + +--- + +## Add material css theme + +If you want to add the indigo pink material theme, you may use the '--getOptionalMaterialTheme' flag + +when the wizard will prompt the question: + +```bash +Do you want to add the Angular Material theme? (Indigo Pink Theme) +``` + +User may choose Yes or No. + +if user did not set --getOptionalMaterialTheme to true but wants to add a material theme to the project, +in angular.json in styles section the following code can be added: + +```bash +{ + "styles": [ + "src/styles.scss", + "node_modules/@angular/material/prebuilt-themes/indigo-pink.css" + ] +} + +``` + +--- + +## Set View Encapsulation strategy + +By default, the view encapsulation for the generated form component is set to None. +If you want to change the View Encapsulation strategy, you may use the '--viewEncapsulation' flag +where user can choose one of the following options: None, Emulated, ShadowDom. + +when the wizard will prompt the question: + +```bash +Do you want to specify view encapsulation strategy? +``` + +User may choose one of the values: None, Emulated, ShadowDom. + +## Generate the environments files + +```bash +ng generate environments +``` + +This command will generate the environments folder that will contain 2 files: environment.ts and +environment.development.ts + +--- + +# Output + +As a result, a set of components with form fields and respective controls will be generated, as well as necessary utils +and types. + +--- + +## Form structure + +Generated form structure may vary depending on the model: from a _Root Form Group_ with a set of simple _Child Form +Controls_ to nested controls with `FormGroup`s and `FormArray`s. +Despite the possible variations, each form consists of a _Root Form Group_ and _Child Form Controls_, which are +generated as separate components and can be accessed/reused directly if needed. + +Since the generated form is an Angular Reactive Form, all its methods are available for usage, according to the +respective control type. + +--- + +## Validation + +Each form field or form group can have multiple validators depending on the subtree structure, taking into consideration +element's data type, associated constraints, etc. + +### Base validators + +Each field/group can be marked as "required" depending on whether the corresponding element in the parsed model is +considered as optional or not (has `"isOptional": true | false`). + +### Constraint validators + +During the generation process, validation rules from constraints will be extracted and applied to the corresponding form +elements (individual fields or groups) if they were not explicitly excluded in one of the prompter questions. + +When dealing with complex data types, the validation rules from constraints are applied to its children in most cases, +however, there are exceptions. +For +instance, [Length Constraint](https://eclipse-esmf.github.io/samm-specification/snapshot/characteristics.html#length-constraint) +is applied directly to a group when working with Collection Characteristics (Collection, Set, Sorted Set, List). + +Consult [ESMF documentation](https://eclipse-esmf.github.io/samm-specification/snapshot/characteristics.html#constraints) +for more details on how different types of constraints work with different element types. + +#### Supported Constraint types + +- EncodingConstraint +- FixedPointConstraint +- LengthConstraint +- RangeConstraint (except dates) +- RegularExpressionConstraint + +#### Unsupported Constraint types + +- LanguageConstraint +- LocaleConstraint +- RangeConstraint (for dates) + +### Type-specific validators + +Since some fields can imply additional restrictions depending on the corresponding element type or its configuration, +additional validators will be applied to the respective form control. +A typical example of such case could be "Either" characteristic, which expects values of its child controls to be +specified and unique. + +#### Supported complex data types + +- Either +- StructuredValue + +#### Unsupported complex data types + +_None/Unknown_ + +#### Supported scalar data types + +- xsd:string +- xsd:boolean +- xsd:decimal +- xsd:integer +- xsd:double +- xsd:float +- xsd:byte +- xsd:short +- xsd:int +- xsd:long +- xsd:unsignedByte +- xsd:unsignedShort +- xsd:unsignedInt +- xsd:unsignedLong +- xsd:positiveInteger +- xsd:nonNegativeInteger +- xsd:negativeInteger +- xsd:nonPositiveInteger +- xsd:gYear +- xsd:gMonth +- xsd:gDay +- xsd:gYearMonth +- xsd:gMonthDay +- xsd:duration +- xsd:yearMonthDuration +- xsd:dayTimeDuration +- xsd:time +- xsd:hexBinary +- xsd:base64Binary +- xsd:anyURI +- samm:curie +- rdf:langString + +#### Unsupported scalar data types + +- xsd:date +- xsd:dateTime +- xsd:dateTimeStamp + +--- + +## Usage + +For simple scenarios, the root component of the generated form provides the following outputs: + +```typescript +@Output() formSubmit: EventEmitter = new EventEmitter(); +@Output() formCancel: EventEmitter = new EventEmitter(); +``` + +However, more complex scenarios, like patching form value, manually updating its validity, manipulating child controls, +etc., may require a direct access to the _Root Form Group_ or its _Child Form Controls_, that is why each control has +been made public and can be imported and used directly. + +An example with root "Movement" form: + +```typescript +import {MovementForm} from './shared/components/movement-form/v100/movement-form.component'; +import {TrafficLight} from './shared/types/movement/v100/movement.types'; + +// ... + +export class AppComponent implements OnInit { + ngOnInit() { + MovementForm.disable(); + MovementForm.patchValue({ + isMoving: true, + position: { + latitude: 1, + longitude: 2, + altitude: 3, + }, + speed: 100, + speedLimitWarning: TrafficLight.Yellow, + }); + MovementForm.get('isMoving')?.addValidators([Validators.required]); + } +} +``` + +--- + +## Working with list-like controls + +For elements which are represented by a collection of elements, a table will be generated. +It is represented by a `FormArray` with child `FormControl`s, which contains the factual model, and the table itself +acts as a visual representation of the model, or a view. + +Since it's not possible to predict a number of `FormControl`s in the `FormArray`, as well as all the potential +use-cases, controls of this type should be handled explicitly. +In order to provide a convenient way to communicate with the table and its respective form control, such components are +accompanied by the following members: + +- `[NAME]`FormControl - a form control of type `FormArray` (empty by default) +- `[NAME]`Events - a list of `Observable`s for each supported event + +Usage example: + +```typescript +import { + listPropertyEvents, + listPropertyFormControl, +} from './shared/components/complex-list-types-form/v100/list-property/list-property.component'; + +// ... + +export class AppComponent implements OnInit { + ngOnInit() { + listPropertyEvents.add$.subscribe(() => { + listPropertyFormControl.push( + new FormControl({ + CharacteristicX: 1, + CharacteristicY: 2, + CharacteristicZ: 3, + }) + ); + }); + + listPropertyEvents.edit$.subscribe(selection => { + selection.forEach(item => { + const control = listPropertyFormControl.at(item.controlIndex); + const newValue = { + CharacteristicX: 1, + CharacteristicY: 2, + CharacteristicZ: 3, + }; + control.patchValue(newValue); + }); + }); + listPropertyEvents.delete$.subscribe(selection => { + selection.forEach(item => listPropertyFormControl.removeAt(item.controlIndex)); + }); + } +} +``` diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts new file mode 100644 index 00000000..9660e92d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/FormFieldStrategy.ts @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, Constraint, DefaultConstraint, DefaultTrait, Property} from '@esmf/aspect-model-loader'; +import {apply, applyTemplates, chain, MergeStrategy, mergeWith, move, Rule, SchematicContext, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {templateInclude} from '../../../../shared/include'; +import {addToComponentModule} from '../../../../../../utils/angular'; +import {getFormFieldStrategy} from './index'; +import {getConstraintValidatorStrategy} from '../validators/constraint/index'; +import {ConstraintValidatorStrategyClass} from '../validators/constraint/constraint-validator-strategies'; +import {DataType, GenericValidator, ValidatorConfig} from '../validators/validatorsTypes'; + +export interface BaseFormFieldConfig { + name: string; + nameDasherized: string; + selector: string; +} + +export interface FormFieldConfig extends BaseFormFieldConfig { + validators: ValidatorConfig[]; + exampleValue?: string; + values?: any[]; + unitName?: string; + children?: FormFieldConfig[]; + dataFormat?: string; + placeholder?: string; + deconstructionRule?: string; + isList?: boolean; + isScalarChild?: boolean; +} + +export abstract class FormFieldStrategy { + pathToFiles = ''; + hasChildren = false; + options: any; + isList = false; + + constructor( + options: any, + public context: SchematicContext, + public parent: Property, + public child: Characteristic, + public fieldName: string, + public constraints: Constraint[] + ) { + this.options = {...options}; + } + + static isTargetStrategy(child: Characteristic): boolean { + throw new Error('An implementation of the method has to be provided by a derived class'); + } + + static getShortUrn(child: Characteristic): DataType { + return child.dataType?.shortUrn as DataType; + } + + getValidatorsConfigs(ignoreConstraintValidatorStrategies: ConstraintValidatorStrategyClass = []): ValidatorConfig[] { + return [ + ...this.getBaseValidatorsConfigs(), + ...this.getDataTypeValidatorsConfigs(), + ...this.getConstraintValidatorsConfigs(ignoreConstraintValidatorStrategies), + ]; + } + + getBaseValidatorsConfigs(): ValidatorConfig[] { + const validatorsConfigs: ValidatorConfig[] = []; + + if (!this.parent.isOptional) { + validatorsConfigs.push({ + name: GenericValidator.Required, + definition: 'Validators.required', + isDirectGroupValidator: false, + }); + } + + return validatorsConfigs; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + return []; + } + + getConstraintValidatorsConfigs(ignoreStrategies: ConstraintValidatorStrategyClass): ValidatorConfig[] { + const applicableConstraints: Constraint[] = this.constraints.filter( + constraint => + // Check that it's not excluded explicitly + !this.options.excludedConstraints.includes(constraint.aspectModelUrn) && + // It's not a direct instance of "DefaultConstraint" (it contains no validation rules) + constraint.constructor !== DefaultConstraint + ); + + return applicableConstraints.reduce((acc, constraint) => { + const validatorStrategy = getConstraintValidatorStrategy(constraint, this.child); + const isIgnoredStrategy = !!ignoreStrategies.find(ignoredStrategy => validatorStrategy instanceof ignoredStrategy); + + if (isIgnoredStrategy) { + return acc; + } + + return [...acc, ...validatorStrategy.getValidatorsConfigs()]; + }, []); + } + + getBaseFormFieldConfig(): BaseFormFieldConfig { + return { + name: this.fieldName, + nameDasherized: this.getNameDasherized(), + selector: this.getSelector(), + }; + } + + getSelector(): string { + return `${this.options.prefix}-${strings.dasherize(this.fieldName)}`; + } + + getNameDasherized(): string { + return strings.dasherize(this.fieldName.charAt(0).toLowerCase() + this.fieldName.slice(1)); + } + + applyTemplate(): Rule { + return () => { + return applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: {...this.options, name: this.fieldName}, + name: this.fieldName, + }); + }; + } + + buildConfig(): FormFieldConfig { + throw new Error('An implementation of the method has to be provided by a derived class'); + } + + generate(): Rule { + const fieldConfig = this.buildConfig(); + this.options.fieldConfig = fieldConfig; + + const modules = [ + { + name: strings.classify(this.fieldName) + 'Component', + fromLib: `./${fieldConfig.nameDasherized}/${fieldConfig.nameDasherized}.component`, + }, + ]; + + const operations = [ + mergeWith( + apply(url(this.pathToFiles), [ + templateInclude( + this.context, + this.applyTemplate(), + { + ...this.options, + name: this.fieldName, + }, + '../shared/methods' + ), + move(this.options.path + `/${fieldConfig.nameDasherized}`), + ]), + this.options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ), + addToComponentModule(this.options.skipImport, this.options, modules), + ]; + + if (this.hasChildren) { + operations.push(...this.getChildStrategies().map(strategy => strategy.generate())); + } + + return chain(operations); + } + + getChildConfigs(): FormFieldConfig[] { + return this.getChildStrategies().map(strategy => strategy.buildConfig()); + } + + getChildStrategies(): FormFieldStrategy[] { + throw new Error('An implementation of the method has to be provided by a derived class'); + } + + getChildStrategy(parent: Property, child: Characteristic): FormFieldStrategy { + return getFormFieldStrategy( + this.options, + this.context, + this.parent, + child, + child instanceof DefaultTrait ? child.baseCharacteristic.name : child.name + ); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts new file mode 100644 index 00000000..4e8e0ee4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/BooleanFormFieldStrategy.ts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {DataType} from '../../validators/validatorsTypes'; + +export class BooleanFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/boolean/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type === DataType.Boolean; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + validators: this.getValidatorsConfigs(), + }; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..c6a60dc7 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.html.template @@ -0,0 +1,6 @@ +<%= options.fieldConfig.name %> \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..2634b835 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.scss.template @@ -0,0 +1,3 @@ +.form-field { + width: 100% +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..75641bf3 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/boolean/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {MatCheckboxModule} from "@angular/material/checkbox"; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(false, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatCheckboxModule, ReactiveFormsModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts new file mode 100644 index 00000000..a5c0c6cb --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/ComplexFormFieldStrategy.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, Property} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {getFormFieldStrategy} from '../index'; + +export class ComplexFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/complex/files'; + hasChildren = true; + + static isTargetStrategy(child: Characteristic): boolean { + return child.dataType !== null && !!child.dataType?.isComplex; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + validators: this.getValidatorsConfigs(), + children: this.getChildConfigs(), + }; + } + + getChildStrategies(): FormFieldStrategy[] { + const untypedDataType = this.child.dataType as any; + return untypedDataType?.properties ? untypedDataType.properties.map((p: Property) => this.getChildStrategy(p, p.characteristic)) : []; + } + + getChildStrategy(parent: Property, child: Characteristic): FormFieldStrategy { + return getFormFieldStrategy(this.options, this.context, parent, child, parent.name); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..45b4ed34 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.html.template @@ -0,0 +1,10 @@ +
+
+ <%= options.fieldConfig.name %> +
+ <% for (let childConfig of options.fieldConfig.children) { + %><<%= childConfig.selector %> formControlName="<%= childConfig.name %>" data-test="<%= childConfig.name %>">> + <% } %> +
+
+
diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..9851f7d5 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.scss.template @@ -0,0 +1,21 @@ +.form-group { + padding: 0 1rem; + margin-bottom: 1rem; +} + +.form-fields > * { + display: flex; + flex-flow: column nowrap; + margin: 1rem 0; +} + +fieldset { + border-radius: 0.25rem; + border: 1px solid rgb(142, 142, 142); +} + +legend { + color: rgb(98, 98, 98); + font-size: 1rem; + padding: 0 0.375rem; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..b66ed592 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/complex/files/__name@dasherize__.component.ts.template @@ -0,0 +1,62 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import { + FormControl, + FormGroup, + FormsModule, + NG_VALIDATORS, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, +} from '@angular/forms'; +import {FormGroupReusable} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-group-reusable'; +<% for (let childConfig of options.fieldConfig.children) { + %>import {<%= classify(childConfig.name) %>Component, <%= childConfig.name %>FormControl} from '../<%= childConfig.nameDasherized %>/<%= childConfig.nameDasherized %>.component'; +<% } %> + +export interface <%= options.fieldConfig.name %> { + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: FormControl; + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl<<%= options.fieldConfig.name %> | null>(null); +export const <%= options.fieldConfig.name %>FormGroup = new FormGroup<<%= options.fieldConfig.name %>>({ + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: <%= childConfig.name %>FormControl, + <% } %> +}); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + <% for (let childConfig of options.fieldConfig.children) { + %><%= classify(childConfig.name) %>Component, + <% } %> + ], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormGroupReusable { + formGroup: FormGroup<<%= options.fieldConfig.name %>> = <%= options.fieldConfig.name %>FormGroup; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts new file mode 100644 index 00000000..7a49c403 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/DateFormFieldStrategy.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {ConstraintValidatorRangeStrategy} from '../../validators/constraint/ConstraintValidatorRangeStrategy'; +import {DataType} from '../../validators/validatorsTypes'; + +const DEFAULT_FORMAT = 'yyyy-MM-DD'; +const typesConfigs = [ + { + type: DataType.Date, + format: 'yyyy-MM-DD', + }, +]; +const supportedTypes: DataType[] = typesConfigs.map(dt => dt.type); + +export class DateFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/date/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type ? supportedTypes.includes(type) : false; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + validators: this.getValidatorsConfigs([ConstraintValidatorRangeStrategy]), + dataFormat: this.getDataFormat(), + }; + } + + getDataFormat(): string { + const type = DateFormFieldStrategy.getShortUrn(this.child); + const format = typesConfigs.find(dt => dt.type === type)?.format; + return format || DEFAULT_FORMAT; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..2824b9e9 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.html.template @@ -0,0 +1,17 @@ + + <%= options.fieldConfig.name %> + + + picker [color]="color"> + + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..282784c3 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/date/files/__name@dasherize__.component.ts.template @@ -0,0 +1,58 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef, Input} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormBuilder, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatDatepickerModule} from '@angular/material/datepicker'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; +import {ThemePalette, DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core'; +import {MAT_MOMENT_DATE_ADAPTER_OPTIONS, MAT_MOMENT_DATE_FORMATS, MomentDateAdapter} from '@angular/material-moment-adapter'; +import {isMoment} from 'moment'; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatDatepickerModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + { + provide: DateAdapter, + useClass: MomentDateAdapter, + deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS], + }, + {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, + {provide: MAT_DATE_LOCALE, useValue: 'en-GB'}, + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + @Input() color: ThemePalette; + + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } + + override set value(val: any) { + this.val = isMoment(val) ? val.format('<%= options.fieldConfig.dataFormat %>') : val; + this.onChange(this.val); + this.onTouch(this.val); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts new file mode 100644 index 00000000..110bad27 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/DatePartialFormFieldStrategy.ts @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {ConstraintValidatorRangeStrategy} from '../../validators/constraint/ConstraintValidatorRangeStrategy'; +import {DataType, DataTypeValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +const typesConfigs = [ + { + type: DataType.GDay, + placeholder: "'---04', '---04+03:00'", + }, + { + type: DataType.GMonth, + placeholder: "'--04', '--04+03:00'", + }, + { + type: DataType.GYear, + placeholder: "'2000', '2000+03:00'", + }, + { + type: DataType.GMonthDay, + placeholder: "'--01-01', '--01-01+03:00'", + }, + { + type: DataType.GYearMonth, + placeholder: "'2000-01', '2000-01+03:00'", + }, +]; +const supportedTypes: DataType[] = typesConfigs.map(dt => dt.type); + +export class DatePartialFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/duration/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type ? supportedTypes.includes(type) : false; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + validators: this.getValidatorsConfigs([ConstraintValidatorRangeStrategy]), + placeholder: this.getPlaceholder(), + }; + } + + getPlaceholder(): string | undefined { + const type = DatePartialFormFieldStrategy.getShortUrn(this.child); + return typesConfigs.find(dt => dt.type === type)?.placeholder; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.GDay + ? [ + { + name: DataTypeValidator.GDay, + definition: 'FormValidators.gDayValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.GMonth + ? [ + { + name: DataTypeValidator.GMonth, + definition: 'FormValidators.gMonthValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.GYear + ? [ + { + name: DataTypeValidator.GYear, + definition: 'FormValidators.gYearValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.GMonthDay + ? [ + { + name: DataTypeValidator.GMonthDay, + definition: 'FormValidators.gMonthDayValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.GYearMonth + ? [ + { + name: DataTypeValidator.GYearMonth, + definition: 'FormValidators.gYearMonthValidator()', + isDirectGroupValidator: false, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..f48ee313 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/datePartial/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts new file mode 100644 index 00000000..36f59d40 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/DateTimeFormFieldStrategy.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {ConstraintValidatorRangeStrategy} from '../../validators/constraint/ConstraintValidatorRangeStrategy'; +import {DataType} from '../../validators/validatorsTypes'; + +const DEFAULT_FORMAT = 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ'; +const typesConfigs = [ + { + type: DataType.DateTime, + format: 'YYYY-MM-DDTHH:mm:ss.SSSSSSZ', + }, + { + type: DataType.DateTimeStamp, + format: 'YYYY-MM-DDTHH:mm:ss.SSSSSZ', + }, +]; +const supportedTypes: DataType[] = typesConfigs.map(dt => dt.type); + +export class DateTimeFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/dateTime/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type ? supportedTypes.includes(type) : false; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + validators: this.getValidatorsConfigs([ConstraintValidatorRangeStrategy]), + dataFormat: this.getDataFormat(), + }; + } + + getDataFormat(): string { + const type = DateTimeFormFieldStrategy.getShortUrn(this.child); + const format = typesConfigs.find(dt => dt.type === type)?.format; + return format || DEFAULT_FORMAT; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..6a8fc96c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.html.template @@ -0,0 +1,18 @@ + + <%= options.fieldConfig.name %> + + + picker [color]="color"> + + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..c59d5098 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/dateTime/files/__name@dasherize__.component.ts.template @@ -0,0 +1,58 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef, Input} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatDatepickerModule} from '@angular/material/datepicker'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; +import {ThemePalette, MAT_DATE_LOCALE} from '@angular/material/core'; +import {isMoment} from 'moment'; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [ + CommonModule, + FormsModule, + MatDatepickerModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule, + TranslocoModule, + ], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + @Input() color: ThemePalette; + + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } + + override set value(val: any) { + this.val = isMoment(val) ? val.format('YYYY-MM-DDTHH:mm:ss') : val; + this.onChange(this.val); + this.onTouch(this.val); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts new file mode 100644 index 00000000..dd9e4669 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/DefaultFormFieldStrategy.ts @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; + +export class DefaultFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/default/files'; + hasChildren = false; + + static isTargetStrategy(): boolean { + return true; + } + + buildConfig(): FormFieldConfig { + const untypedChild = this.child as any; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + unitName: untypedChild.unit?.name || '', + validators: this.getValidatorsConfigs(), + }; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..a6fe0f3e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/default/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts new file mode 100644 index 00000000..c837dd3c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/DurationFormFieldStrategy.ts @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {ConstraintValidatorRangeStrategy} from '../../validators/constraint/ConstraintValidatorRangeStrategy'; +import {DataType, DataTypeValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +const typesConfigs = [ + { + type: DataType.Duration, + placeholder: "'P30D', '-P1Y2M3DT1H', 'PT1H5M0S'", + }, + { + type: DataType.DayTimeDuration, + placeholder: "'P30D', 'P1DT5H', 'PT1H5M0S'", + }, + { + type: DataType.YearMonthDuration, + placeholder: "'P10M', 'P5Y2M'", + }, +]; +const supportedTypes: DataType[] = typesConfigs.map(dt => dt.type); + +export class DurationFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/duration/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type ? supportedTypes.includes(type) : false; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + validators: this.getValidatorsConfigs([ConstraintValidatorRangeStrategy]), + placeholder: this.getPlaceholder(), + }; + } + + getPlaceholder(): string | undefined { + const type = DurationFormFieldStrategy.getShortUrn(this.child); + return typesConfigs.find(dt => dt.type === type)?.placeholder; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.Duration + ? [ + { + name: DataTypeValidator.Duration, + definition: 'FormValidators.durationValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.DayTimeDuration + ? [ + { + name: DataTypeValidator.DayTimeDuration, + definition: 'FormValidators.dayTimeDurationValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.YearMonthDuration + ? [ + { + name: DataTypeValidator.YearMonthDuration, + definition: 'FormValidators.yearMonthDurationValidator()', + isDirectGroupValidator: false, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..d0382a53 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/duration/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts new file mode 100644 index 00000000..d50a8d23 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/EitherFormFieldStrategy.ts @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, DefaultEither} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {GenericValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +export class EitherFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/either/files'; + hasChildren = true; + + static isTargetStrategy(child: Characteristic): boolean { + return child instanceof DefaultEither; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + validators: this.getValidatorsConfigs(), + children: this.getChildConfigs(), + }; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + return [ + { + name: GenericValidator.UniqueValues, + definition: 'FormValidators.uniqueValuesValidator()', + isDirectGroupValidator: true, + }, + ]; + } + + getChildStrategies(): FormFieldStrategy[] { + const typedChild = this.child as DefaultEither; + return [this.getChildStrategy(this.parent, typedChild.left), this.getChildStrategy(this.parent, typedChild.right)]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..b9903fbf --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.html.template @@ -0,0 +1,19 @@ +
+
+ + + {{ err.translationKey | transloco : err.translationParams }} + + + + <%= options.fieldConfig.name %> +
+ <% for (let childConfig of options.fieldConfig.children) { + %><<%= childConfig.selector %> formControlName="<%= childConfig.name %>">> + <% } %> +
+
+
diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..4782e695 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.scss.template @@ -0,0 +1,25 @@ +.form-group { + padding: 0 1rem; + margin-bottom: 1rem; + + &.invalid { + border-color: #f44336; + } +} + +.form-fields > * { + display: flex; + flex-flow: column nowrap; + margin: 1rem 0; +} + +fieldset { + border-radius: 0.25rem; + border: 1px solid rgb(142, 142, 142); +} + +legend { + color: rgb(98, 98, 98); + font-size: 1rem; + padding: 0 0.375rem; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..96defe59 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/either/files/__name@dasherize__.component.ts.template @@ -0,0 +1,75 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import { + FormControl, + FormGroup, + FormsModule, + NG_VALIDATORS, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, + ValidatorFn, + Validators, +} from '@angular/forms'; +import {MatFormFieldModule} from "@angular/material/form-field"; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormGroupReusable} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-group-reusable'; +import {FormValidators} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators'; +<% for (let childConfig of options.fieldConfig.children) { + %>import {<%= classify(childConfig.name) %>Component, <%= childConfig.name %>FormControl} from '../<%= childConfig.nameDasherized %>/<%= childConfig.nameDasherized %>.component'; +<% } %> + +export interface <%= options.fieldConfig.name %> { + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: FormControl; + <% } %> +} + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: (<%= validator.definition %>), + <% } %> +}; + +export const <%= options.fieldConfig.name %>FormControl = new FormControl<<%= options.fieldConfig.name %> | null>(null); +export const <%= options.fieldConfig.name %>FormGroup = new FormGroup<<%= options.fieldConfig.name %>>({ + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: <%= childConfig.name %>FormControl, + <% } %> +}, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + TranslocoModule, + <% for (let childConfig of options.fieldConfig.children) { + %><%= classify(childConfig.name) %>Component, + <% } %> + ], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormGroupReusable { + formGroup: FormGroup<<%= options.fieldConfig.name %>> = <%= options.fieldConfig.name %>FormGroup; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts new file mode 100644 index 00000000..94786d93 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/EnumerationFormFieldStrategy.ts @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, DefaultEnumeration} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; + +export class EnumerationFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/enumeration/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + return child instanceof DefaultEnumeration; + } + + buildConfig(): FormFieldConfig { + const typedChild = this.child as DefaultEnumeration; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + values: typedChild.values, + validators: this.getValidatorsConfigs(), + }; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..1aaaaa29 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.html.template @@ -0,0 +1,25 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.values) { %> + <% for (let value of options.fieldConfig.values) { %> + + <%= value %> + + <% } %> + <% } %> + + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..845a8cbb --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/enumeration/files/__name@dasherize__.component.ts.template @@ -0,0 +1,40 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {MatSelectModule} from "@angular/material/select"; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, MatSelectModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/form-field-strategies.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/form-field-strategies.ts new file mode 100644 index 00000000..ef2dca71 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/form-field-strategies.ts @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ComplexFormFieldStrategy} from './complex/ComplexFormFieldStrategy'; +import {EitherFormFieldStrategy} from './either/EitherFormFieldStrategy'; +import {EnumerationFormFieldStrategy} from './enumeration/EnumerationFormFieldStrategy'; +import {BooleanFormFieldStrategy} from './boolean/BooleanFormFieldStrategy'; +import {TextFormFieldStrategy} from './text/TextFormFieldStrategy'; +import {TextAreaFormFieldStrategy} from './textArea/TextAreaFormFieldStrategy'; +import {NumberFormFieldStrategy} from './number/NumberFormFieldStrategy'; +import {DateFormFieldStrategy} from './date/DateFormFieldStrategy'; +import {DateTimeFormFieldStrategy} from './dateTime/DateTimeFormFieldStrategy'; +import {DefaultFormFieldStrategy} from './default/DefaultFormFieldStrategy'; +import {DurationFormFieldStrategy} from './duration/DurationFormFieldStrategy'; +import {TimeFormFieldStrategy} from './time/TimeFormFieldStrategy'; +import {DatePartialFormFieldStrategy} from './datePartial/DatePartialFormFieldStrategy'; +import {ListFormFieldStrategy} from './list/ListFormFieldStrategy'; +import {StructuredValueFormFieldStrategy} from './structuredValue/StructuredValueFormFieldStrategy'; + +// The order matters: +// Some of the "isTargetStrategy" methods have more strict checks than others, +// the checks will be made in the same order as defined by "FORM_FIELD_STRATEGIES" array, +// from more strict to more generic ones. +export const FORM_FIELD_STRATEGIES = [ + EitherFormFieldStrategy, + ListFormFieldStrategy, + StructuredValueFormFieldStrategy, + ComplexFormFieldStrategy, + EnumerationFormFieldStrategy, + BooleanFormFieldStrategy, + TextFormFieldStrategy, + TextAreaFormFieldStrategy, + NumberFormFieldStrategy, + DateFormFieldStrategy, + DateTimeFormFieldStrategy, + DurationFormFieldStrategy, + TimeFormFieldStrategy, + DatePartialFormFieldStrategy, +]; +export const FORM_FIELD_DEFAULT_STRATEGY = DefaultFormFieldStrategy; diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/index.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/index.ts new file mode 100644 index 00000000..5a5face8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/index.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {SchematicContext} from '@angular-devkit/schematics'; +import {FormFieldStrategy} from './FormFieldStrategy'; +import {Characteristic, Constraint, DefaultTrait, Property, Trait} from '@esmf/aspect-model-loader'; +import {FORM_FIELD_DEFAULT_STRATEGY, FORM_FIELD_STRATEGIES} from './form-field-strategies'; + +export function getFormFieldStrategy( + options: any, + context: SchematicContext, + parent: Property, + child: Characteristic | Trait, + fieldName: string +): FormFieldStrategy { + const {characteristic, constraints} = getChildData(child); + const strategy = FORM_FIELD_STRATEGIES.find(strategy => strategy.isTargetStrategy(characteristic)) ?? FORM_FIELD_DEFAULT_STRATEGY; + return new strategy(options, context, parent, characteristic, fieldName, constraints); +} + +function getChildData(child: Characteristic | Trait): {characteristic: Characteristic; constraints: Constraint[]} { + return child instanceof DefaultTrait + ? { + characteristic: child.baseCharacteristic, + constraints: child.constraints, + } + : { + characteristic: child, + constraints: [], + }; +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts new file mode 100644 index 00000000..89f4eb8f --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/ListFormFieldStrategy.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, DefaultCollection, DefaultEntity, DefaultList, DefaultSet, DefaultSortedSet} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; + +export class ListFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/list/files'; + hasChildren = false; + isList = true; + + declare child: DefaultList | DefaultCollection | DefaultSet | DefaultSortedSet; + + static isTargetStrategy(child: Characteristic): boolean { + return ( + child instanceof DefaultList || child instanceof DefaultCollection || child instanceof DefaultSet || child instanceof DefaultSortedSet + ); + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + validators: this.getValidatorsConfigs(), + children: this.getChildConfigs(), + isList: this.isList, + isScalarChild: this.isScalarChild(), + }; + } + + getChildStrategies(): FormFieldStrategy[] { + return this.child.dataType instanceof DefaultEntity + ? this.child.dataType.properties.map(property => this.getChildStrategy(property, property.characteristic)) + : this.isScalarChild() + ? [this.getChildStrategy(this.parent, this.child.elementCharacteristic!)] + : []; + } + + private isScalarChild(): boolean { + return !!this.child.elementCharacteristic; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..8bf56f06 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.html.template @@ -0,0 +1,53 @@ +
+ <%= options.fieldConfig.name %> + +
+
+ + + {{ err.translationKey | transloco : err.translationParams }} + + +
+ +
+ + + +
+
+ + + + + + + + + <% if (options.fieldConfig.isScalarChild) { %> + + + + + <% } else { %> + <% for (let childConfig of options.fieldConfig.children) { %> + + + + + <% } %> + <% } %> + + + +
+ + + + Value{{ element.item }}<%= classify(childConfig.name) %>{{ element.item.<%= childConfig.name %> }}
+
+ + +

No data found

+
+
diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..c4259d75 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.scss.template @@ -0,0 +1,49 @@ +.table-header { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: flex-start; +} + +.table-error { + display: flex; + flex-flow: row nowrap; + align-self: center; +} + +.table-actions { + display: flex; + flex-flow: row nowrap; + justify-content: flex-end; + align-items: flex-start; + padding: 0 0 0 1.75rem; + + &.disabled { + display: none; + } + + & > * + * { + margin-left: 0.5rem; + } +} + +.table-notification { + padding: 1rem; + text-align: center; + color: rgb(98, 98, 98); +} + +fieldset { + border-radius: 0.25rem; + border: 1px solid rgb(142, 142, 142); + + &.invalid { + border-color: #f44336; + } +} + +legend { + color: rgb(98, 98, 98); + font-size: 1rem; + padding: 0 0.375rem; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..68f143ff --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/list/files/__name@dasherize__.component.ts.template @@ -0,0 +1,167 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef, OnInit} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import { + FormControl, + FormArray, + FormsModule, + NG_VALIDATORS, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, + ValidatorFn, + Validators +} from '@angular/forms'; +import {MatFormFieldModule} from "@angular/material/form-field"; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormArrayReusable} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-array-reusable'; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; +import {MatTableDataSource, MatTableModule} from "@angular/material/table"; +import {MatCheckboxChange, MatCheckboxModule} from "@angular/material/checkbox"; +import {MatButtonModule} from "@angular/material/button"; +import {Subject} from "rxjs"; +import {takeUntil} from "rxjs/operators"; + +export type <%= classify(options.fieldConfig.name) %>Item = any; +export type <%= classify(options.fieldConfig.name) %>FormControl = FormArrayItem>>; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: (<%= validator.definition %>), + <% } %> +}; + +export const <%= options.fieldConfig.name %>FormControl: <%= classify(options.fieldConfig.name) %>FormControl = new FormArrayItem>>( + [], + Object.values(validators) +); + +const <%= options.fieldConfig.name %>EventsSubjects = { + add: new Subject(), + edit: new Subject(), + delete: new Subject(), +} + +export const <%= options.fieldConfig.name %>Events = { + add$: <%= options.fieldConfig.name %>EventsSubjects.add.asObservable(), + edit$: <%= options.fieldConfig.name %>EventsSubjects.edit.asObservable(), + delete$: <%= options.fieldConfig.name %>EventsSubjects.delete.asObservable(), +} + +interface DataSourceItem { + item: <%= classify(options.fieldConfig.name) %>Item; + isSelected: boolean; +} + +export interface DataSourceSelectionItem { + item: <%= classify(options.fieldConfig.name) %>Item; + controlIndex: number; +} +export type DataSourceSelection = DataSourceSelectionItem[]; + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatTableModule, + MatCheckboxModule, + MatButtonModule, + MatFormFieldModule, + TranslocoModule, + ], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormArrayReusable implements OnInit { + formArray: <%= classify(options.fieldConfig.name) %>FormControl = <%= options.fieldConfig.name %>FormControl; + dataSource: MatTableDataSource = new MatTableDataSource([]); + selection: DataSourceSelection = []; + isAllChecked: boolean = false; + columns: string[] = [ + 'isSelected', + <% if (options.fieldConfig.isScalarChild) { %> + 'value' + <% } else { %> + <% for (let childConfig of options.fieldConfig.children) { + %>'<%= childConfig.name %>', + <% } %> + <% } %> + ]; + + constructor(@Attribute('formArrayName') public formArrayName: string) { + super(); + } + + get isSelection(): boolean { + return !!this.selection.length; + } + + ngOnInit(): void { + this.setData(<%= options.fieldConfig.name %>FormControl.value); + <%= options.fieldConfig.name %>FormControl.valueChanges + .pipe(takeUntil(this.destroyed$)) + .subscribe((values: <%= classify(options.fieldConfig.name) %>Item[]) => this.setData(values)); + } + + onAdd(): void { + <%= options.fieldConfig.name %>EventsSubjects.add.next(); + } + + onEdit(dataSourceSelection: DataSourceSelection): void { + <%= options.fieldConfig.name %>EventsSubjects.edit.next(dataSourceSelection); + } + + onDelete(dataSourceSelection: DataSourceSelection): void { + <%= options.fieldConfig.name %>EventsSubjects.delete.next([...dataSourceSelection].reverse()); + } + + selectAllRows(value: MatCheckboxChange): void { + this.dataSource.data.forEach(item => item.isSelected = value.checked); + this.selection = this.getSelection(this.dataSource.data); + } + + selectRow(dataSourceItem: DataSourceItem, event: MatCheckboxChange): void { + dataSourceItem.isSelected = event.checked; + this.selection = this.getSelection(this.dataSource.data); + } + + private setData(values: <%= classify(options.fieldConfig.name) %>Item[]): void { + this.isAllChecked = false; + this.dataSource.data = this.createDataSourceItems(values); + this.selection = this.getSelection(values); + } + + private createDataSourceItems(values: <%= classify(options.fieldConfig.name) %>Item[], isSelected: boolean = false): DataSourceItem[] { + return values.map(item => ({ + item, + isSelected + })); + } + + private getSelection(dataSourceItems: DataSourceItem[]): DataSourceSelection { + return dataSourceItems.reduce((acc: DataSourceSelection, dataSourceItem: DataSourceItem, index: number) => { + if (dataSourceItem.isSelected) { + acc.push({ + item: dataSourceItem.item, + controlIndex: index + }); + } + + return acc; + }, []); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts new file mode 100644 index 00000000..354ffe94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/NumberFormFieldStrategy.ts @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {DataType, DataTypeValidator, GenericValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +export class NumberFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/number/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return ( + type === DataType.Byte || + type === DataType.Float || + type === DataType.Decimal || + type === DataType.Double || + type === DataType.Integer || + type === DataType.Int || + type === DataType.PositiveInteger || + type === DataType.Long || + type === DataType.NegativeInteger || + type === DataType.NonPositiveInteger || + type === DataType.NonNegativeInteger || + type === DataType.Short || + type === DataType.UnsignedInt || + type === DataType.UnsignedByte || + type === DataType.UnsignedLong || + type === DataType.UnsignedShort + ); + } + + buildConfig(): FormFieldConfig { + const untypedChild = this.child as any; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + unitName: untypedChild.unit?.name || '', + validators: this.getValidatorsConfigs(), + }; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.Byte + ? [ + { + name: DataTypeValidator.Byte, + definition: 'FormValidators.byteValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Float + ? [ + { + name: DataTypeValidator.Float, + definition: 'FormValidators.floatValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Decimal + ? [ + { + name: DataTypeValidator.Decimal, + definition: 'FormValidators.decimalValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Double + ? [ + { + name: DataTypeValidator.Double, + definition: 'FormValidators.doubleValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Integer + ? [ + { + name: DataTypeValidator.Integer, + definition: 'FormValidators.integerValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Int + ? [ + { + name: DataTypeValidator.Int, + definition: 'FormValidators.intValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.PositiveInteger + ? [ + { + name: DataTypeValidator.PositiveInteger, + definition: 'FormValidators.positiveIntegerValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Long + ? [ + { + name: DataTypeValidator.Long, + definition: 'FormValidators.longValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.NegativeInteger + ? [ + { + name: DataTypeValidator.NegativeInteger, + definition: 'FormValidators.negativeIntegerValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.NonPositiveInteger + ? [ + { + name: DataTypeValidator.NonPositiveInteger, + definition: 'FormValidators.nonPositiveIntegerValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.NonNegativeInteger + ? [ + { + name: DataTypeValidator.NonNegativeInteger, + definition: 'FormValidators.nonNegativeIntegerValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Short + ? [ + { + name: DataTypeValidator.Short, + definition: 'FormValidators.shortValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.UnsignedInt + ? [ + { + name: DataTypeValidator.UnsignedInt, + definition: 'FormValidators.unsignedIntValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.UnsignedByte + ? [ + { + name: DataTypeValidator.UnsignedByte, + definition: 'FormValidators.unsignedByteValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.UnsignedLong + ? [ + { + name: DataTypeValidator.UnsignedLong, + definition: 'FormValidators.unsignedLongValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.UnsignedShort + ? [ + { + name: DataTypeValidator.UnsignedShort, + definition: 'FormValidators.unsignedShortValidator()', + isDirectGroupValidator: false, + }, + ] + : [ + { + name: GenericValidator.Number, + definition: 'FormValidators.numberValidator()', + isDirectGroupValidator: false, + }, + ]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..102d27b9 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/number/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts new file mode 100644 index 00000000..4285cbb5 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/StructuredValueFormFieldStrategy.ts @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, DefaultPropertyInstanceDefinition, DefaultStructuredValue, Property} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {getFormFieldStrategy} from '../index'; +import {DefaultProperty} from '@esmf/aspect-model-loader/dist/aspect-meta-model/default-property'; +import {GenericValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +export class StructuredValueFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/structuredValue/files'; + hasChildren = true; + + declare child: DefaultStructuredValue; + + static isTargetStrategy(child: Characteristic): boolean { + return child instanceof DefaultStructuredValue; + } + + buildConfig(): FormFieldConfig { + return { + ...this.getBaseFormFieldConfig(), + deconstructionRule: this.child.deconstructionRule, + validators: this.getValidatorsConfigs(), + children: this.getChildConfigs(), + }; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + return [this.deconstructionRuleGroupValidatorConfig(this.child)]; + } + + getChildStrategies(): FormFieldStrategy[] { + const instantiatedElements = this.child.elements.filter( + element => element instanceof DefaultPropertyInstanceDefinition + ) as DefaultPropertyInstanceDefinition[]; + return instantiatedElements.map(element => this.getChildStrategy(element, element.characteristic)); + } + + getChildStrategy(parent: Property, child: Characteristic): FormFieldStrategy { + return getFormFieldStrategy(this.options, this.context, parent, child, parent.name); + } + + deconstructionRuleGroupValidatorConfig(element: DefaultStructuredValue): ValidatorConfig { + const elements = element.elements.filter(el => el && typeof el !== 'string') as DefaultProperty[]; + const rules = element.deconstructionRule.split('@').map(rule => `/${rule}/`); + const deconstructionRulesConfigs = rules.map((rule, i) => `{ name: "${elements[i]?.name ?? ''}", rule: ${rule} }`); + + return { + name: GenericValidator.DeconstructionRule, + definition: `FormValidators.deconstructionRuleValidator([ + ${deconstructionRulesConfigs.join(',\n')} + ])`, + isDirectGroupValidator: true, + }; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..0c0e7242 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.html.template @@ -0,0 +1,22 @@ +
+
+ + + {{ err.translationKey | transloco : err.translationParams }} + + + + <%= options.fieldConfig.name %> + <% if (options.fieldConfig.deconstructionRule) { + %>

Deconstruction rule: {{deconstructionRule}}

+ <% } %> +
+ <% for (let childConfig of options.fieldConfig.children) { + %><<%= childConfig.selector %> formControlName="<%= childConfig.name %>" + >> + <% } %> +
+
+
diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..68840fa9 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.scss.template @@ -0,0 +1,29 @@ +.form-group { + padding: 0 1rem; + margin-bottom: 1rem; + + &.invalid { + border-color: #f44336; + } +} + +.form-group > .form-info { + margin: 1rem 0; +} + +.form-fields > * { + display: flex; + flex-flow: column nowrap; + margin: 1rem 0; +} + +fieldset { + border-radius: 0.25rem; + border: 1px solid rgb(142, 142, 142); +} + +legend { + color: rgb(98, 98, 98); + font-size: 1rem; + padding: 0 0.375rem; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..48466a4c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/structuredValue/files/__name@dasherize__.component.ts.template @@ -0,0 +1,77 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import { + FormControl, + FormGroup, + FormsModule, + NG_VALIDATORS, + NG_VALUE_ACCESSOR, + ReactiveFormsModule, + ValidatorFn, + Validators, +} from '@angular/forms'; +import {MatFormFieldModule} from "@angular/material/form-field"; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormGroupReusable} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-group-reusable'; +import {FormValidators} from '<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators'; +<% for (let childConfig of options.fieldConfig.children) { + %>import {<%= classify(childConfig.name) %>Component, <%= childConfig.name %>FormControl} from '../<%= childConfig.nameDasherized %>/<%= childConfig.nameDasherized %>.component'; +<% } %> + +export interface <%= options.fieldConfig.name %> { + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: FormControl; + <% } %> +} + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: (<%= validator.definition %>), + <% } %> +}; + +export const <%= options.fieldConfig.name %>FormControl = new FormControl<<%= options.fieldConfig.name %> | null>(null); +export const <%= options.fieldConfig.name %>FormGroup = new FormGroup<<%= options.fieldConfig.name %>>({ + <% for (let childConfig of options.fieldConfig.children) { + %><%= childConfig.name %>: <%= childConfig.name %>FormControl, + <% } %> +}, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatFormFieldModule, + TranslocoModule, + <% for (let childConfig of options.fieldConfig.children) { + %><%= classify(childConfig.name) %>Component, + <% } %> + ], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + { + provide: NG_VALIDATORS, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + }, + ], +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormGroupReusable { + formGroup: FormGroup<<%= options.fieldConfig.name %>> = <%= options.fieldConfig.name %>FormGroup; + + deconstructionRule = `<%= options.fieldConfig.deconstructionRule %>` + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts new file mode 100644 index 00000000..97fe1c42 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/TextFormFieldStrategy.ts @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {DataType, DataTypeValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +export class TextFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/text/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return ( + type === DataType.String || + type === DataType.AnyURI || + type === DataType.HexBinary || + type === DataType.Curie || + type === DataType.Base64Binary + ); + } + + buildConfig(): FormFieldConfig { + const untypedChild = this.child as any; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + unitName: untypedChild.unit?.name || '', + validators: this.getValidatorsConfigs(), + }; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.HexBinary + ? [ + { + name: DataTypeValidator.HexBinary, + definition: 'FormValidators.hexBinaryValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Base64Binary + ? [ + { + name: DataTypeValidator.Base64Binary, + definition: 'FormValidators.base64BinaryValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.AnyURI + ? [ + { + name: DataTypeValidator.AnyURI, + definition: 'FormValidators.anyUriValidator()', + isDirectGroupValidator: false, + }, + ] + : type === DataType.Curie + ? [ + { + name: DataTypeValidator.Curie, + definition: 'FormValidators.curieValidator()', + isDirectGroupValidator: false, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..55cca8a4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/text/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts new file mode 100644 index 00000000..08fbbfb0 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/TextAreaFormFieldStrategy.ts @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {DataType, DataTypeValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +export class TextAreaFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/textArea/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type === DataType.LangString; + } + + buildConfig(): FormFieldConfig { + const untypedChild = this.child as any; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + unitName: untypedChild.unit?.name || '', + validators: this.getValidatorsConfigs(), + }; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.LangString + ? [ + { + name: DataTypeValidator.LangString, + definition: 'FormValidators.langStringValidator()', + isDirectGroupValidator: false, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..91e323f6 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.html.template @@ -0,0 +1,22 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/textArea/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts new file mode 100644 index 00000000..887f042e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/TimeFormFieldStrategy.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic} from '@esmf/aspect-model-loader'; +import {FormFieldConfig, FormFieldStrategy} from '../FormFieldStrategy'; +import {ConstraintValidatorRangeStrategy} from '../../validators/constraint/ConstraintValidatorRangeStrategy'; +import {DataType, DataTypeValidator, ValidatorConfig} from '../../validators/validatorsTypes'; + +const typesConfigs = [ + { + type: DataType.Time, + placeholder: "'14:23:00', '14:23:00.527634Z', '14:23:00+03:00'", + }, +]; +const supportedTypes: DataType[] = typesConfigs.map(dt => dt.type); + +export class TimeFormFieldStrategy extends FormFieldStrategy { + pathToFiles = './generators/components/fields/time/files'; + hasChildren = false; + + static isTargetStrategy(child: Characteristic): boolean { + const type = this.getShortUrn(child); + return type ? supportedTypes.includes(type) : false; + } + + buildConfig(): FormFieldConfig { + const untypedChild = this.child as any; + + return { + ...this.getBaseFormFieldConfig(), + exampleValue: this.parent.exampleValue || '', + unitName: untypedChild.unit?.name || '', + validators: this.getValidatorsConfigs([ConstraintValidatorRangeStrategy]), + placeholder: this.getPlaceholder(), + }; + } + + getPlaceholder(): string | undefined { + const type = TimeFormFieldStrategy.getShortUrn(this.child); + return typesConfigs.find(dt => dt.type === type)?.placeholder; + } + + getDataTypeValidatorsConfigs(): ValidatorConfig[] { + const type = FormFieldStrategy.getShortUrn(this.child); + + return type === DataType.Time + ? [ + { + name: DataTypeValidator.Time, + definition: 'FormValidators.timeValidator()', + isDirectGroupValidator: false, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..1d47a45e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.html.template @@ -0,0 +1,23 @@ + + <%= options.fieldConfig.name %> + + <% if (options.fieldConfig.unitName) { + %>unit:<%= options.fieldConfig.unitName %> + <% } %> + <% if (options.fieldConfig.exampleValue) { + %>exampleValue: <%= options.fieldConfig.exampleValue %> + <% } %> + + + + {{ err.translationKey | transloco: err.translationParams }} + + + diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..df335f94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.scss.template @@ -0,0 +1,7 @@ +.form-field { + width: 100% +} + +mat-hint { + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..03767b48 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/fields/time/files/__name@dasherize__.component.ts.template @@ -0,0 +1,39 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Attribute, Component, forwardRef} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormControl, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, ValidatorFn, Validators} from '@angular/forms'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input'; +import {TranslocoModule} from '@jsverse/transloco'; +import {FormControlReusable} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-control-reusable"; +import {FormValidators} from "<% if (options.enableVersionSupport) { %>../<% } %>../../../utils/form-validators"; + +export const validators: {[key: string]: ValidatorFn} = { + <% for(let validator of options.fieldConfig.validators) { %> + <%= validator.name %>: <%= validator.definition %>, + <% } %> +} + +export const <%= options.fieldConfig.name %>FormControl = new FormControl(null, Object.values(validators)); + +@Component({ + selector: '<%= options.fieldConfig.selector %>', + imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, ReactiveFormsModule, TranslocoModule], + templateUrl: './<%= dasherize(options.fieldConfig.name) %>.component.html', + styleUrls: ['./<%= dasherize(options.fieldConfig.name) %>.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => <%= classify(options.fieldConfig.name) %>Component), + multi: true, + } + ] +}) +export class <%= classify(options.fieldConfig.name) %>Component extends FormControlReusable { + formControl = <%= options.fieldConfig.name %>FormControl; + + constructor(@Attribute('formControlName') public formControlName: string) { + super(); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts new file mode 100644 index 00000000..eda5a438 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/form/RootFormFieldStrategy.ts @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, Property} from '@esmf/aspect-model-loader'; +import {FormFieldStrategy} from '../fields/FormFieldStrategy'; +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, url} from '@angular-devkit/schematics'; +import {templateInclude} from '../../../../shared/include'; +import {strings} from '@angular-devkit/core'; +import {getFormFieldStrategy} from '../fields/index'; + +export class RootFormField { + options: any; + + constructor(options: any, public context: SchematicContext) { + this.options = {...options}; + } + + generate(): Rule[] { + this.options.childConfigs = this.getChildConfigs(); + + return [ + mergeWith( + apply(url('./generators/components/form/files'), [ + templateInclude(this.context, this.applyTemplate(), this.options, '../shared/methods'), + move(this.options.path), + ]), + this.options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ), + ...this.getChildStrategies().map(strategy => strategy.generate()), + ]; + } + + applyTemplate(): Rule { + return () => { + return applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: this.options, + name: this.options.name, + }); + }; + } + + private getChildConfigs() { + return this.getChildStrategies().map(strategy => strategy.buildConfig()); + } + + private getChildStrategies(): FormFieldStrategy[] { + return this.options.listAllProperties.map((property: Property) => this.getChildStrategy(property, property.characteristic)); + } + + private getChildStrategy(parent: Property, child: Characteristic): FormFieldStrategy { + return getFormFieldStrategy(this.options, this.context, parent, child, parent.name); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..87bdfa4b --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.html.template @@ -0,0 +1,14 @@ +
+
<% for (let childConfig of options.childConfigs) { + %><% if (childConfig.isList === true) { %> + <<%= options.prefix %>-<%= dasherize(childConfig.name) %> formArrayName="<%= childConfig.name %>">-<%= dasherize(childConfig.name) %>> + <% } else { %> + <<%= options.prefix %>-<%= dasherize(childConfig.name) %> formControlName="<%= childConfig.name %>">-<%= dasherize(childConfig.name) %>> + <% } %> + <% } %>
+ +
+ + +
+
diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..9e1a8bd2 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.scss.template @@ -0,0 +1,33 @@ +/** <%= options.generationDisclaimerText %> **/ + +::ng-deep .mat-mdc-form-field-text-suffix { + padding-left: 5px; + color: gray; + font-size: smaller; +} + +form.<%= options.name %> { + display: flex; + flex-flow: column nowrap; + + .form-fields > * { + display: flex; + flex-flow: column nowrap; + margin: 1rem 0; + } + + .form-actions { + display: flex; + flex-flow: row nowrap; + justify-content: flex-end; + padding: 1rem 0; + + &.disabled { + display: none; + } + + button + button { + margin-left: 1rem; + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..00e2d5df --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/form/files/__name@dasherize__.component.ts.template @@ -0,0 +1,40 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {Component, EventEmitter, Output, <% if (options.readOnlyForm) { %>OnInit<% } %>} from '@angular/core'; +import {FormGroup} from '@angular/forms'; +import {<%= options.selectedModelTypeName %>} from '<%= options.typePath %>'; +<% for (let childConfig of options.childConfigs) { + %>import {<%= childConfig.name %>FormControl} from "./<%= childConfig.nameDasherized %>/<%= childConfig.nameDasherized %>.component"; +<% } %> + +export const <%= options.selectedModelTypeName %>Form = new FormGroup({ + <% for (let childConfig of options.childConfigs) { + %><%= childConfig.name %>: <%= childConfig.name %>FormControl, + <% } %> +}) + +@Component({ + selector: '<%= options.prefix %>-<%= dasherize(name) %>', + templateUrl: './<%= dasherize(name) %>.component.html', + styleUrls: ['./<%= dasherize(name) %>.component.scss'] +}) +export class <%= classify(name) %>Component <% if (options.readOnlyForm) { %>implements OnInit<% } %> { + @Output() formSubmit: EventEmitter<<%= options.selectedModelTypeName %>> = new EventEmitter(); + @Output() formCancel: EventEmitter = new EventEmitter(); + + form: FormGroup = <%= options.selectedModelTypeName %>Form; + + <% if (options.readOnlyForm) { %> + ngOnInit() { + this.form.disable(); + } + <% } %> + + onCancel(): void { + this.formCancel.emit(); + } + + onSubmit(form: FormGroup): void { + this.formSubmit.emit(form.value); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/form/index.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/form/index.ts new file mode 100644 index 00000000..10b1249d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/form/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {chain, Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import {RootFormField} from './RootFormFieldStrategy'; + +export function generateFormComponent(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const rootFormField = new RootFormField(options, _context); + const rules = rootFormField.generate(); + return chain(rules)(tree, _context); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts new file mode 100644 index 00000000..3ff81e98 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorDefaultStrategy.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export class ConstraintValidatorDefaultStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return true; + } + + getValidatorsConfigs(): ValidatorConfig[] { + return []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts new file mode 100644 index 00000000..a7efef0d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorEncodingStrategy.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint, DefaultEncodingConstraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +enum EncodingValidator { + US_ASCII = 'US-ASCII', + ISO_8859_1 = 'ISO-8859-1', + UTF_8 = 'UTF-8', + UTF_16 = 'UTF-16', + UTF_16BE = 'UTF-16BE', + UTF_16LE = 'UTF-16LE', +} + +export class ConstraintValidatorEncodingStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return constraint instanceof DefaultEncodingConstraint; + } + + getValidatorsConfigs(): ValidatorConfig[] { + const typedConstraint = this.constraint as DefaultEncodingConstraint; + const type = typedConstraint.value.split('#')[1]; + const isApplyToChildren = this.isList() || this.isComplex(); + + return type === EncodingValidator.US_ASCII + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('US-ASCII'))` + : `FormValidators.encodingValidator('US-ASCII')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : type === EncodingValidator.ISO_8859_1 + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('ISO-8859-1'))` + : `FormValidators.encodingValidator('ISO-8859-1')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : type === EncodingValidator.UTF_8 + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('UTF-8'))` + : `FormValidators.encodingValidator('UTF-8')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : type === EncodingValidator.UTF_16 + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('UTF-16'))` + : `FormValidators.encodingValidator('UTF-16')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : type === EncodingValidator.UTF_16BE + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('UTF-16BE'))` + : `FormValidators.encodingValidator('UTF-16BE')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : type === EncodingValidator.UTF_16LE + ? [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.encodingValidator('UTF-16LE'))` + : `FormValidators.encodingValidator('UTF-16LE')`, + isDirectGroupValidator: !isApplyToChildren, + }, + ] + : []; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts new file mode 100644 index 00000000..79faa400 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorFixedPointStrategy.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint, DefaultFixedPointConstraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export class ConstraintValidatorFixedPointStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return constraint instanceof DefaultFixedPointConstraint; + } + + getValidatorsConfigs(): ValidatorConfig[] { + const typedConstraint = this.constraint as DefaultFixedPointConstraint; + const isApplyToChildren = this.isList() || this.isComplex(); + + return [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.fixedPointValidator(${typedConstraint.integer}, ${typedConstraint.scale}))` + : `FormValidators.fixedPointValidator(${typedConstraint.integer}, ${typedConstraint.scale})`, + isDirectGroupValidator: !isApplyToChildren, + }, + ]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts new file mode 100644 index 00000000..d4dd7060 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorLengthStrategy.ts @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint, DefaultLengthConstraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export class ConstraintValidatorLengthStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return constraint instanceof DefaultLengthConstraint; + } + + getValidatorsConfigs(): ValidatorConfig[] { + const typedConstraint = this.constraint as DefaultLengthConstraint; + + if (typedConstraint.minValue === undefined && typedConstraint.maxValue === undefined) { + return []; + } + + const isApplyToChildren = this.isList() || this.isComplex(); + + return [ + { + name: this.constraint.name, + definition: this.isList() + ? `FormValidators.listLengthValidator(${typedConstraint.minValue}, ${typedConstraint.maxValue})` + : this.isComplex() + ? `FormValidators.applyToChildren(FormValidators.lengthValidator(${typedConstraint.minValue}, ${typedConstraint.maxValue}))` + : `FormValidators.lengthValidator(${typedConstraint.minValue}, ${typedConstraint.maxValue})`, + isDirectGroupValidator: !isApplyToChildren, + }, + ]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts new file mode 100644 index 00000000..7eeb2a1d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRangeStrategy.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint, DefaultRangeConstraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export class ConstraintValidatorRangeStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return constraint instanceof DefaultRangeConstraint; + } + + getValidatorsConfigs(): ValidatorConfig[] { + const typedConstraint = this.constraint as DefaultRangeConstraint; + + if (typedConstraint.minValue === undefined && typedConstraint.maxValue === undefined) { + return []; + } + + const isApplyToChildren = this.isList() || this.isComplex(); + + return [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.rangeValidator(${typedConstraint.minValue}, "${typedConstraint.lowerBoundDefinition}", ${typedConstraint.maxValue}, "${typedConstraint.upperBoundDefinition}"))` + : `FormValidators.rangeValidator(${typedConstraint.minValue}, "${typedConstraint.lowerBoundDefinition}", ${typedConstraint.maxValue}, "${typedConstraint.upperBoundDefinition}")`, + isDirectGroupValidator: !isApplyToChildren, + }, + ]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts new file mode 100644 index 00000000..e835a173 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorRegularExpressionStrategy.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {Constraint, DefaultRegularExpressionConstraint} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export class ConstraintValidatorRegularExpressionStrategy extends ConstraintValidatorStrategy { + static isTargetStrategy(constraint: Constraint): boolean { + return constraint instanceof DefaultRegularExpressionConstraint; + } + + getValidatorsConfigs(): ValidatorConfig[] { + const typedConstraint = this.constraint as DefaultRegularExpressionConstraint; + + if (!typedConstraint.value) { + return []; + } + + const isApplyToChildren = this.isList() || this.isComplex(); + + return [ + { + name: this.constraint.name, + definition: isApplyToChildren + ? `FormValidators.applyToChildren(FormValidators.regularExpression(${typedConstraint.value}))` + : `FormValidators.regularExpression(${typedConstraint.value})`, + isDirectGroupValidator: !isApplyToChildren, + }, + ]; + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts new file mode 100644 index 00000000..8be34ae8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/ConstraintValidatorStrategy.ts @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import { + Characteristic, + Constraint, + DefaultCollection, + DefaultEither, + DefaultList, + DefaultSet, + DefaultSortedSet, + DefaultStructuredValue, +} from '@esmf/aspect-model-loader'; +import {ValidatorConfig} from '../validatorsTypes'; + +export abstract class ConstraintValidatorStrategy { + constructor(public constraint: Constraint, public characteristic: Characteristic) {} + + static isTargetStrategy(constraint: Constraint): boolean { + throw new Error('An implementation of the method has to be provided by a derived class'); + } + + getValidatorsConfigs(): ValidatorConfig[] { + throw new Error('An implementation of the method has to be provided by a derived class'); + } + + isList(): boolean { + return ( + this.characteristic instanceof DefaultList || + this.characteristic instanceof DefaultCollection || + this.characteristic instanceof DefaultSet || + this.characteristic instanceof DefaultSortedSet + ); + } + + isComplex(): boolean { + return ( + this.characteristic instanceof DefaultEither || + this.characteristic instanceof DefaultStructuredValue || + (this.characteristic.dataType !== null && !!this.characteristic.dataType?.isComplex) + ); + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts new file mode 100644 index 00000000..36ffe17a --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/constraint-validator-strategies.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConstraintValidatorDefaultStrategy} from './ConstraintValidatorDefaultStrategy'; +import {ConstraintValidatorEncodingStrategy} from './ConstraintValidatorEncodingStrategy'; +import {ConstraintValidatorFixedPointStrategy} from './ConstraintValidatorFixedPointStrategy'; +import {ConstraintValidatorLengthStrategy} from './ConstraintValidatorLengthStrategy'; +import {ConstraintValidatorRangeStrategy} from './ConstraintValidatorRangeStrategy'; +import {ConstraintValidatorRegularExpressionStrategy} from './ConstraintValidatorRegularExpressionStrategy'; + +export const CONSTRAINT_VALIDATOR_STRATEGIES = [ + ConstraintValidatorEncodingStrategy, + ConstraintValidatorFixedPointStrategy, + ConstraintValidatorLengthStrategy, + ConstraintValidatorRangeStrategy, + ConstraintValidatorRegularExpressionStrategy, +]; + +export const CONSTRAINT_VALIDATOR_DEFAULT_STRATEGY = ConstraintValidatorDefaultStrategy; +export type ConstraintValidatorStrategyClass = typeof CONSTRAINT_VALIDATOR_STRATEGIES; diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/index.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/index.ts new file mode 100644 index 00000000..072588f8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/constraint/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Characteristic, Constraint} from '@esmf/aspect-model-loader'; +import {ConstraintValidatorStrategy} from './ConstraintValidatorStrategy'; +import {CONSTRAINT_VALIDATOR_DEFAULT_STRATEGY, CONSTRAINT_VALIDATOR_STRATEGIES} from './constraint-validator-strategies'; + +export function getConstraintValidatorStrategy(constraint: Constraint, characteristic: Characteristic): ConstraintValidatorStrategy { + const strategy = + CONSTRAINT_VALIDATOR_STRATEGIES.find(strategy => strategy.isTargetStrategy(constraint)) ?? CONSTRAINT_VALIDATOR_DEFAULT_STRATEGY; + return new strategy(constraint, characteristic); +} diff --git a/libs/schematic/generators/ng-generate/components/form/generators/components/validators/validatorsTypes.ts b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/validatorsTypes.ts new file mode 100644 index 00000000..f8b1d80a --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/generators/components/validators/validatorsTypes.ts @@ -0,0 +1,84 @@ +export interface ValidatorConfig { + name: string; + definition: string; + isDirectGroupValidator: boolean; +} + +export enum DataTypeValidator { + AnyURI = 'anyURI', + Base64Binary = 'base64Binary', + Byte = 'byte', + Curie = 'curie', + Date = 'date', + DayTimeDuration = 'dayTimeDuration', + Decimal = 'decimal', + Double = 'double', + Duration = 'duration', + Float = 'float', + GDay = 'gDay', + GMonth = 'gMonth', + GMonthDay = 'gMonthDay', + GYear = 'gYear', + GYearMonth = 'gYearMonth', + HexBinary = 'hexBinary', + Int = 'int', + Integer = 'integer', + LangString = 'langString', + Long = 'long', + NegativeInteger = 'negativeInteger', + NonNegativeInteger = 'nonNegativeInteger', + NonPositiveInteger = 'nonPositiveInteger', + PositiveInteger = 'positiveInteger', + Short = 'short', + Time = 'time', + UnsignedByte = 'unsignedByte', + UnsignedInt = 'unsignedInt', + UnsignedLong = 'unsignedLong', + UnsignedShort = 'unsignedShort', + YearMonthDuration = 'yearMonthDuration', +} + +export enum GenericValidator { + DeconstructionRule = 'deconstructionRule', + Number = 'number', + Required = 'required', + UniqueValues = 'uniqueValues', +} + +export enum DataType { + AnyURI = 'anyURI', + Base64Binary = 'base64Binary', + Boolean = 'boolean', + Byte = 'byte', + Curie = 'curie', + Date = 'date', + DateTime = 'dateTime', + Decimal = 'decimal', + DateTimeStamp = 'dateTimeStamp', + DayTimeDuration = 'dayTimeDuration', + Double = 'double', + Duration = 'duration', + Float = 'float', + GDay = 'gDay', + GMonth = 'gMonth', + GMonthDay = 'gMonthDay', + GYear = 'gYear', + GYearMonth = 'gYearMonth', + HexBinary = 'hexBinary', + Int = 'int', + Integer = 'integer', + PositiveInteger = 'positiveInteger', + LangString = 'langString', + Long = 'long', + NegativeInteger = 'negativeInteger', + NonNegativeInteger = 'nonNegativeInteger', + NonPositiveInteger = 'nonPositiveInteger', + Short = 'short', + String = 'string', + Time = 'time', + UnsignedByte = 'unsignedByte', + UnsignedInt = 'unsignedInt', + UnsignedLong = 'unsignedLong', + UnsignedShort = 'unsignedShort', + YearMonthDuration = 'yearMonthDuration', +} diff --git a/libs/schematic/generators/ng-generate/components/form/index.ts b/libs/schematic/generators/ng-generate/components/form/index.ts new file mode 100644 index 00000000..869afde8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/index.ts @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {FormSchema} from './schema'; +import {chain, Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import { + addAndUpdateConfigurationFilesRule, + formatAllFilesRule, + generateComponent, + insertVersionIntoPathRule, + insertVersionIntoSelectorRule, + loadAspectModelRule, + loadRdfRule, + options, + prepareOptions, + setComponentNameRule, + setCustomActionsAndFiltersRule, + setTemplateOptionValuesRule, +} from '../shared/index'; +import {ComponentType, Schema} from '../shared/schema'; +import {generateFormComponent} from './generators/components/form/index'; +import {addPackageJsonDependencies} from '../../../utils/package-json'; +import {NodeDependencyType} from '@schematics/angular/utility/dependencies'; +import { + generateDestroyedSubject, + generateFormControlReusable, + generateFormGroupReusable, + generateFormValidators, + generateGeneralStyle, + generateSharedModule, + generateTranslationModule, +} from '../shared/generators/index'; +import {generateFormArrayReusable} from '../shared/generators/utils/form-array-reusable/index'; +import {wrapBuildComponentExecution} from '../../../utils/angular'; +import {generateTranslationFiles} from '../../../utils/aspect-model'; + +export default function (formSchema: FormSchema): Rule { + return (tree: Tree, context: SchematicContext) => { + generateComponent(context, formSchema, ComponentType.FORM); + }; +} + +export function generateForm(formSchema: Schema): Rule { + prepareOptions(formSchema, ComponentType.FORM); + + return chain([ + loadRdfRule(), + loadAspectModelRule(), + setCustomActionsAndFiltersRule(), + setComponentNameRule(ComponentType.FORM), + insertVersionIntoSelectorRule(), + insertVersionIntoPathRule(), + setTemplateOptionValuesRule(), + ...genericGeneration(), + ...formSpecificGeneration(), + ...addAndUpdateConfigurationFilesRule(), + ...utilsGeneration(), + addFormValidatorsDependenciesRule(), + formatAllFilesRule(), + ]); +} + +function genericGeneration(): Array { + return [ + generateSharedModule(options), + generateTranslationModule(options), + generateGeneralStyle(options), + generateTranslationFiles(options), + wrapBuildComponentExecution(options), + ]; +} + +function formSpecificGeneration(): Array { + return [generateFormComponent(options)]; +} + +function utilsGeneration(): Array { + return [ + generateFormControlReusable(options), + generateFormGroupReusable(options), + generateFormArrayReusable(options), + generateDestroyedSubject(options), + generateFormValidators(options), + ]; +} + +function addFormValidatorsDependenciesRule(): Rule { + const loadDependencies = [ + { + type: NodeDependencyType.Default, + version: '^0.0.2', + name: 'charset-detector', + overwrite: false, + }, + { + type: NodeDependencyType.Dev, + version: '^0.0.2', + name: '@types/charset-detector', + overwrite: false, + }, + ]; + + return addPackageJsonDependencies(options.skipImport, options.spinner, loadDependencies); +} diff --git a/libs/schematic/generators/ng-generate/components/form/schema.json b/libs/schematic/generators/ng-generate/components/form/schema.json new file mode 100644 index 00000000..ea0f2144 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/schema.json @@ -0,0 +1,154 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-from-schematic", + "title": "Form Options Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "format": "path", + "description": "The path to create the component.", + "$default": { + "$source": "workingDirectory" + }, + "visible": false + }, + "name": { + "type": "string", + "description": "The name of the Component.", + "default": "form" + }, + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "viewEncapsulation": { + "description": "Specifies the view encapsulation strategy.", + "enum": ["Emulated", "None", "ShadowDom"], + "type": "string", + "default": "None", + "alias": "v" + }, + "changeDetection": { + "description": "Specifies the change detection strategy.", + "enum": ["Default", "OnPush"], + "type": "string", + "alias": "c" + }, + "prefix": { + "type": "string", + "format": "html-selector", + "description": "The prefix to apply to generated selectors.", + "default": "esmf-ui", + "alias": "p" + }, + "style": { + "description": "The file extension to be used for style files.", + "type": "string", + "default": "scss" + }, + "flat": { + "type": "boolean", + "description": "Flag to indicate if a dir is created.", + "default": false + }, + "skipImport": { + "type": "boolean", + "description": "Flag to skip the module import.", + "default": false + }, + "selector": { + "type": "string", + "format": "html-selector", + "description": "The selector to use for the component." + }, + "module": { + "type": "string", + "description": "Allows specification of the declaring module.", + "alias": "m" + }, + "export": { + "type": "boolean", + "default": false, + "description": "Specifies if declaring module exports the component." + }, + "aspectModelUrnToLoad": { + "type": "string", + "default": "" + }, + "selectedModelElementUrn": { + "type": "string", + "default": "" + }, + "jsonAccessPath": { + "type": "string", + "default": "" + }, + "enableVersionSupport": { + "type": "boolean", + "default": true + }, + "addCommandBar": { + "type": "boolean", + "default": false + }, + "enabledCommandBarFunctions": { + "type": "array", + "default": [] + }, + "excludedProperties": { + "type": "array", + "default": [] + }, + "getExcludedPropLabels": { + "type": "boolean", + "default": false + }, + "customCommandBarActions": { + "type": "array", + "default": [] + }, + "customStyleImports": { + "type": "array", + "default": [] + }, + "aspectModel": { + "type": "object" + }, + "enableRemoteDataHandling": { + "type": "boolean", + "default": false + }, + "customRemoteService": { + "type": "boolean", + "default": true + }, + "overwrite": { + "type": "boolean", + "default": false + }, + "ttl": { + "type": "string" + }, + "configFile": { + "description": "Used for pre-loading the config file from the command line(when set, config wizard is disabled).", + "type": "string" + }, + "skipInstall": { + "type": "boolean", + "default": false, + "description": "Weather or not to install dependencies at the end of the generation process." + }, + "getOptionalMaterialTheme": { + "type": "boolean", + "default": false + }, + "readOnlyForm": { + "type": "boolean", + "default": false + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/form/schema.ts b/libs/schematic/generators/ng-generate/components/form/schema.ts new file mode 100644 index 00000000..9c0c439c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/form/schema.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Values} from '../shared/schema'; + +export interface FormSchema extends Values { + readOnlyForm: boolean; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template new file mode 100644 index 00000000..52717e31 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.html.template @@ -0,0 +1,419 @@ + +
{{ selection.selected.length > 0 ? (selection.selected.length + ' / ') : '' }}{{ totalItems }}
+ <% if (options.hasSearchBar) { %> + + {{ 'search' | transloco }} + + + {{ 'validation.blankSpace' | transloco }} + + + {{ 'validation.invalidInput' | transloco }} {{ allowedCharacters }} + + + {{'validation.empty_string_columns_array' | transloco }} + + + {{'validation.min_char_no' | transloco }} {{ minNumberCharacters }} + + + {{'validation.max_char_no' | transloco }} {{ maxNumberCharacters }} + + {{ searchHint }} + + + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + + + {{ 'advancedSearch' | transloco }} + + {{ 'allTextFields' | transloco }} + + {{ '<%= options.translationPath %>' + searchField + '.preferredName' | transloco }} + {{ '<%= options.translationPath %>' + searchField + '.description' | transloco }} + + + + + <% } %> + <% } %> + + <% for(let property of propValues) { %> + <% if (options.isDateQuickFilter && property.isDate) { %> + <% if ((datePickerType(options.datePickers, property) === "startAndEndDatePicker") || (datePickerType(options.datePickers, property) === "startOrEndDatePicker")) { %> + + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + + + (dateChange)="triggerReloadFilter()" + <% } %> + > + + + + Picker> + + + + + + {{ 'date.fromError' | transloco }} + {{ 'date.toError' | transloco }} + <% if (datePickerType(options.datePickers, property) === "startAndEndDatePicker") { %> + {{ 'date.fromRequired' | transloco }} + {{ 'date.toRequired' | transloco }} + <% } %> + + <% } else if (datePickerType(options.datePickers, property) === "singleDatePicker") { %> + + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + + + Picker> + + + + + + + <% } %> + <% } %> + <% if (options.isEnumQuickFilter && property.isEnum) { %> + + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + Select multiple> +
+ <% if (property.enumWithEntities) { %> + + {{ <%= property.propertyName %>Option.value }} - {{ <%= property.propertyName %>Option.translationKey | transloco }} + + <% } else { %> + + {{<%= property.propertyName %>Option}} + + <% } %> +
+
+ + + + +
+
+
+ <% } %> + <% } %> + + <% if (options.componentType === 'card' && options.addCommandBar) { %> +
+ + {{ 'toolbar.sort_by' | transloco }} {{ filterService.sortedProperty }} +
+ +
+ + {{ filterService.sortCard === SortCard.ASCENDING ? ('toolbar.sort_asc' | transloco) : ('toolbar.sort_desc' | transloco) }} +
+ <% } %> + + + + + + + + <% if (options.customCommandBarActions.length > 0) { %> + <% for(let action of options.customCommandBarActions) { %> + + <% } %> + <% } %> + + + + + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + + <% } %> + + +
+ +<% if (options.componentType === 'table' && options.hasSearchBar) { %> + + <<%= dasherize(name) %>-config-menu + [isOpenedFromMatMenu]="true" + #configurationMenuComponent + (configChangedEvent)="triggerSetConfiguration($event)" + >-config-menu> + +<% } %> + +<% if (options.componentType === 'card' && options.addCommandBar) { %> + + + +<% } %> + + + <% if (options.hasSearchBar) { %> +
+ + {{ 'search' | transloco }} + + + {{ 'validation.blankSpace' | transloco }} + + + {{ 'validation.invalidInput' | transloco }} {{ allowedCharacters }} + + + {{'validation.empty_string_columns_array' | transloco }} + + + {{'validation.min_char_no' | transloco }} {{ minNumberCharacters }} + + + {{'validation.max_char_no' | transloco }} {{ maxNumberCharacters }} + + {{ searchHint }} + + + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + + + {{ 'advancedSearch' | transloco }} + + {{ 'allTextFields' | transloco }} + + {{ '<%= options.translationPath %>' + searchField + '.preferredName' | transloco }} + {{ '<%= options.translationPath %>' + searchField + '.description' | transloco }} + + + + + <% } %> +
+ <% } %> + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + +
+ + {{ 'advancedSearch' | transloco }} + + {{ 'allTextFields' | transloco }} + + {{ '<%= options.translationPath %>' + searchField + '.preferredName' | transloco }} + {{ '<%= options.translationPath %>' + searchField + '.description' | transloco }} + + + +
+
+ <% } %> + + <% for(let property of propValues) { %> + <% if (options.isDateQuickFilter && property.isDate) { %> + <% if ((datePickerType(options.datePickers, property) === "startAndEndDatePicker") || (datePickerType(options.datePickers, property) === "startOrEndDatePicker")) { %> +
+
Set <%= property.propertyName %>
+
+ <% } else if (datePickerType(options.datePickers, property) === "singleDatePicker") { %> +
+
Set <%= property.propertyName %>
+
+ <% } %> + <% } %> + <% if (options.isEnumQuickFilter && property.isEnum) { %> +
+
Set <%= property.propertyName %>
+
+ <% } %> + <% } %> + + + +
+ autorenew + Refresh +
+ +
+ file_download + Download +
+ + <% if (options.componentType === 'table' && options.hasSearchBar) { %> +
+ settings + + Settings +
+ <% } %> +
+ +<% for(let property of propValues) { %> + <% if (options.isDateQuickFilter && property.isDate) { %> + <% if ((datePickerType(options.datePickers, property) === "startAndEndDatePicker") || (datePickerType(options.datePickers, property) === "startOrEndDatePicker")) { %> + > +
+ + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + + + (dateChange)="triggerReloadFilter()" + <% } %> + > + + + + Picker> + + + + + + {{ 'date.fromError' | transloco }} + {{ 'date.toError' | transloco }} + <% if (datePickerType(options.datePickers, property) === "startAndEndDatePicker") { %> + {{ 'date.fromRequired' | transloco }} + {{ 'date.toRequired' | transloco }} + <% } %> + +
+
+ <% } else if (datePickerType(options.datePickers, property) === "singleDatePicker") { %> + > +
+ + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + + + Picker> + + + + + + +
+
+ <% } %> + <% } %> + <% if (options.isEnumQuickFilter && property.isEnum) { %> + > +
+ + {{ '<%= options.versionedAccessPrefix %><%= property.propertyValue %>.preferredName' | transloco }} + Select multiple> +
+ <% if (property.enumWithEntities) { %> + + {{ <%= property.propertyName %>Option.value }} - {{ <%= property.propertyName %>Option.translationKey | transloco }} + + <% } else { %> + + {{<%= property.propertyName %>Option}} + + <% } %> +
+
+ + + + +
+
+
+
+
+ <% } %> +<% } %> diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template new file mode 100644 index 00000000..fa1aa35a --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.scss.template @@ -0,0 +1,16 @@ +/** <%= options.generationDisclaimerText %> **/ + +<% if (options.componentType === 'card' && options.addCommandBar) { %> + .sorting-content { + display: flex; + align-items: center; + cursor: pointer; + padding-right: 20px; + } +<% } %> + +mat-toolbar { + overflow: hidden; +} + +.padding-40 { padding:40px; } \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template new file mode 100644 index 00000000..7bd8feca --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/files/__name@dasherize__-command-bar.component.ts.template @@ -0,0 +1,189 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Component, EventEmitter, Input, Output, ViewChild, AfterViewInit, ElementRef, HostListener, QueryList, ViewChildren, TemplateRef} from '@angular/core'; +import {SelectionModel} from "@angular/cdk/collections"; +import { MatDialog } from '@angular/material/dialog'; + +<% if (options.hasFilters || (options.componentType === 'card' && options.addCommandBar)) { %> + import {<%= classify(name) %>FilterService + <% if (options.componentType === 'card') { %> + , SortCard + <% } %> + } from './<%= dasherize(name) %>-filter.service'; +<% } %> + +<% if (options.componentType === 'card') { %> + import {<%= classify(name) %>CardValues} from './<%= dasherize(name) %>.component'; +<% } %> + +<% if (options.componentType === 'table' && options.hasSearchBar) { %> + import {Config} from "./<%= dasherize(name) %>.component"; + import {<%= classify(name) %>ConfigMenuComponent} from './<%= dasherize(name) %>-config-menu.component'; +<% } %> + +@Component({ + selector: '<%= dasherize(name) %>-command-bar', + templateUrl: './<%= dasherize(name) %>-command-bar.component.html', + styleUrls: ['./<%= dasherize(name) %>-command-bar.component.scss'], + standalone: false +}) +export class <%= classify(name) %>CommandBarComponent implements AfterViewInit { + @Input() isMultipleSelectionEnabled = true; + @Input() isToolbarActionsEnabled = true; + @Input() selection = new SelectionModel(this.isMultipleSelectionEnabled, []); + @Input() totalItems = 0; + @Input() searchFocused = false; + @Input() allowedCharacters: string = ''; + @Input() minNumberCharacters: number = 2; + @Input() maxNumberCharacters: number = 50; + @Input() searchHint?: string; + @Input() <%= options.localStorageKeyConfig %>: string = ''; + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + @Input() configs: Array = []; + @Input() hasAdvancedSearch: boolean = this.filterService.stringColumns.length > 1; + <% } %> + + @Output() applyFilters = new EventEmitter(); + @Output() reloadFilter = new EventEmitter(); + @Output() exportToCsv = new EventEmitter(); + + <% if (options.customCommandBarActions.length > 0) { %> + @Output() customCommandBarActionEvent = new EventEmitter(); + <% } %> + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + @Output() setConfiguration = new EventEmitter>(); + @ViewChild(<%= classify(name) %>ConfigMenuComponent) private configurationComponent!: <%= classify(name) %>ConfigMenuComponent; + <% } %> + + <% if (options.componentType === 'card') { %> + @Output() sorting = new EventEmitter(); + + <%= camelize(name) %>CardValues = Object.values(<%= classify(name) %>CardValues); + protected readonly SortCard = SortCard; + <% } %> + + @ViewChild('componentsContainer', { read: ElementRef, static: false }) + componentsContainer!: ElementRef; + @ViewChildren('toolbarComp', { read: ElementRef }) + components!: QueryList; + @ViewChild('projectedToolbarActions', {read: ElementRef, static: false}) + projectedToolbarActions!: ElementRef; + hiddenComponents: any[] = []; + initialCompWidths : any[]= []; + + constructor(<% if (options.hasFilters || (options.componentType === 'card' && options.addCommandBar)) { %>public filterService: <%= classify(name) %>FilterService,<% } %> public dialog: MatDialog) { + <% if (options.componentType === 'card') { %> + this.filterService.sortedProperty = this.<%= camelize(name) %>CardValues[0]; + <% } %> + } + + <% for(let property of propValues) { %> + <% if ((options.isEnumQuickFilter && property.isEnum) || (options.isDateQuickFilter && property.isDate) ) { %> + @ViewChild('<%=property.propertyName %>', { static: true }) private <%=property.propertyName %>!: TemplateRef; + openInDialog<%=property.propertyName %>(){ + this.dialog.open(this.<%=property.propertyName %>); + } + <% } %> + <% } %> + + triggerApplyFilters(): void { + this.applyFilters.emit(); + } + + triggerExportToCsv(): void { + this.exportToCsv.emit(); + } + + triggerReloadFilter(): void { + this.reloadFilter.emit(); + } + + <% if (options.componentType === 'card') { %> + setSortingProperty(value: string) { + this.filterService.sortedProperty = value; + this.sorting.emit(); + } + + setSortingDir() { + this.filterService.sortCard = this.filterService.sortCard === SortCard.ASCENDING ? SortCard.DESCENDING : SortCard.ASCENDING; + this.sorting.emit(); + } + <% } %> + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + triggerInitOpenedConfigurationDialog(): void { + this.configurationComponent.keyLocalStorage = this.<%= options.localStorageKeyConfig %>; + this.configurationComponent.configs.splice(0, this.configurationComponent.configs.length); + this.configurationComponent.configs.push(...this.configs.map(config => ({...config}))); + } + + triggerSetConfiguration(config: Array): void { + this.setConfiguration.emit(config); + } + <% } %> + + <% if (options.customCommandBarActions.length > 0) { %> + executeCustomCommandBarAction(action: string) { + this.customCommandBarActionEvent.emit({action: action}) + } + <% } %> + + ngAfterViewInit(): void { + const children = Array.from(this.projectedToolbarActions.nativeElement.children); + const projectedCompWidths: any[] = children.map(comp => ({ + width: comp.clientWidth, + id: comp.getAttribute('data-resp') + })); + + const compWidths: any[] = this.components + .toArray() + .map((comp) => ({width: comp.nativeElement.clientWidth, id: comp.nativeElement.getAttribute('data-resp')})); + + if (this.initialCompWidths.length === 0) { + const widths = [...compWidths]; + const buttonsStartIndex = widths.findIndex(w => w.id?.includes('button')); + widths.splice(buttonsStartIndex, 0, ...projectedCompWidths); + this.initialCompWidths = widths; + }; + + this.updateToolbarComponentsVisibility(); + } + + @HostListener('window:resize', ['$event']) + onResize() { + this.updateToolbarComponentsVisibility(); + } + + updateToolbarComponentsVisibility() { + this.hiddenComponents = []; + const containerWidth = this.componentsContainer.nativeElement.clientWidth; + let usedWidth = 0; + + for (let i = 0; i < this.initialCompWidths.length; i++) { + const buttonWidth = this.initialCompWidths[i]; + // 76 is for the width of the collapsed menu width + if (usedWidth + buttonWidth.width + 76 >= containerWidth) { + this.hiddenComponents.push(buttonWidth.id); + } else { + usedWidth += buttonWidth.width; + } + } + } + + isInCollapsedMenu(id: string) { + return this.hiddenComponents.includes(id); + } + + <% if (options.componentType === 'table' && options.hasSearchBar) { %> + openSettingsFromCollapsed() { + const configMenuDialogRef = this.dialog.open(<%= classify(name) %>ConfigMenuComponent,{ + data: { configs: this.configs, keyLocalStorage: this.<%= options.localStorageKeyConfig %>}, + } + ); + configMenuDialogRef.afterClosed().subscribe((result) =>{ if(result){ + this.triggerSetConfiguration(result)} + }); + } + <% } %> +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/index.ts new file mode 100644 index 00000000..e42fa2a8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/components/command-bar/index.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {DefaultSingleEntity, Property} from '@esmf/aspect-model-loader'; +import {classify} from '@angular-devkit/core/src/utils/strings'; +import {DatePicker} from '../../../../../../utils/aspect-model'; + +type PropValue = { + propertyValue: string; + propertyName: string; + propertyUrn: string; + isEnum?: boolean; + enumWithEntities?: boolean; + isDate?: boolean; +}; + +export function generateCommandBar(options: any, allProps: Array): Rule { + return (tree: Tree, _context: SchematicContext) => { + const propValues = getPropertiesToCreateFilters(options, allProps); + return mergeWith( + apply(url('../shared/generators/components/command-bar/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + camelize: strings.camelize, + options: options, + name: options.name, + spinalCaseFunc: options.templateHelper.spinalCase, + propValues: propValues, + datePickerType: datePickerType, + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} + +function getPropertiesToCreateFilters(options: any, allProps: Array): PropValue[] { + if ( + !options.templateHelper.isAddEnumQuickFilters(options.enabledCommandBarFunctions) && + !options.templateHelper.isAddDateQuickFilters(options.enabledCommandBarFunctions) + ) { + return []; + } + + const allPropsInOrder = sortItemsByArray(options.commandBarFilterOrder, allProps); + + const propertyValues: PropValue[] = []; + allPropsInOrder.forEach((property: Property) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexPropObj = options.templateHelper.getComplexProperties(property, options); + complexPropObj.properties.forEach((complexProp: Property) => { + if (options.templateHelper.isEnumProperty(complexProp) || options.templateHelper.isDateTimeProperty(complexProp)) { + propertyValues.push({ + propertyName: `${complexPropObj.complexProp}${classify(complexProp.name)}`, + propertyValue: `${complexPropObj.complexProp}.${complexProp.name}`, + propertyUrn: complexProp.aspectModelUrn, + isEnum: options.templateHelper.isEnumProperty(complexProp), + enumWithEntities: options.templateHelper.isEnumPropertyWithEntityValues(complexProp), + isDate: options.templateHelper.isDateTimeProperty(complexProp), + }); + } + }); + } else { + propertyValues.push({ + propertyName: property.name, + propertyValue: property.name, + propertyUrn: property.aspectModelUrn, + isEnum: options.templateHelper.isEnumProperty(property), + enumWithEntities: options.templateHelper.isEnumPropertyWithEntityValues(property), + isDate: options.templateHelper.isDateTimeProperty(property), + }); + } + }); + + return propertyValues; +} + +function datePickerType(datePickers: Array, propertyValue: PropValue): string | undefined { + return datePickers.find((value: any) => value.propertyUrn === propertyValue.propertyUrn)?.datePicker.type; +} + +function sortItemsByArray(orderArray: string[], itemsArray: Property[]): Property[] { + const orderMap: {[key: string]: number} = orderArray.reduce((map, name, index) => ({...map, [name]: index}), {}); + return itemsArray.sort((a, b) => orderMap[a.name] - orderMap[b.name]); +} diff --git a/src/ng-generate/components/shared/generators/utils/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/components/index.ts similarity index 73% rename from src/ng-generate/components/shared/generators/utils/index.ts rename to libs/schematic/generators/ng-generate/components/shared/generators/components/index.ts index a4945f3f..aca4ea8e 100644 --- a/src/ng-generate/components/shared/generators/utils/index.ts +++ b/libs/schematic/generators/ng-generate/components/shared/generators/components/index.ts @@ -11,7 +11,5 @@ * SPDX-License-Identifier: MPL-2.0 */ -export * from './form-control-reusable'; -export * from './form-group-reusable'; -export * from './form-validators'; -export * from './destroyed-subject'; + +export * from './command-bar/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/constants/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/constants/index.ts new file mode 100644 index 00000000..ef912e66 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/constants/index.ts @@ -0,0 +1,5 @@ +/* + * Copyright Robert Bosch Manufacturing Solutions GmbH, Germany. All rights reserved. + */ + +export {generateSemanticExplanation} from './semantic-explanation/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template new file mode 100644 index 00000000..b185fd2d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/files/__name@dasherize__-senantic-explanation.const.ts.template @@ -0,0 +1,11 @@ + +/** <%= options.generationDisclaimerText %> **/ + +/** TODO does it make sense to all restrictions by Table Columns Enum to match all the active columns??? **/ + +export const <%= classify(name) %>SemanticExplanation: Record = { + <% for(let column of options.tableColumns) { + let propertyLocaleKeyPath = `${options.templateHelper.getVersionedAccessPrefix(options)}${options.isAspectSelected ? options.jsonAccessPath : ''}${column.complexPrefix}${column.property.name}`; %> + '<%= column.property.name %>': {name: '<%= propertyLocaleKeyPath %>.preferredName', description: '<%= propertyLocaleKeyPath %>.description'}, + <% } %> +}; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts new file mode 100644 index 00000000..9c5c7115 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/constants/semantic-explanation/index.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {Values} from '../../../schema'; +import {getTableColumValues} from '../../../utils'; + +export function generateSemanticExplanation(options: Values): Rule { + return (_tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('../shared/generators/constants/semantic-explanation/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: { + ...options, + tableColumns: getTableColumValues(options.listAllProperties, options), + }, + name: options.name, + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/directives/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/directives/index.ts new file mode 100644 index 00000000..69331f04 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/directives/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './validate-input/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template new file mode 100644 index 00000000..8e2b24f0 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/files/__name@dasherize__.directive.ts.template @@ -0,0 +1,60 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Directive, Input} from '@angular/core'; +import { + AbstractControl, + FormControl, + FormGroupDirective, + NgForm, + NG_VALIDATORS, + ValidationErrors, + ValidatorFn +} from '@angular/forms'; +import {ErrorStateMatcher} from '@angular/material/core'; + +@Directive({ + selector: '[validateInput]', + providers: [{ + provide: NG_VALIDATORS, + multi: true, + useExisting: <%= classify(name) %>Directive, + }], + standalone: false +}) +export class <%= classify(name) %>Directive { + /** Pass here the regex pattern as string, e.g. '^[a-zA-Z0-9-_.,+ ]+$' */ + @Input() validateInput: string = ''; + + validate(control: AbstractControl): ValidationErrors | null { + return validateInputsValidator(new RegExp(this.validateInput))(control) + } +} + +export class ValidationErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + return !!((control && control.invalid && control.touched) || control?.dirty); + } +} + +function validateInputsValidator(pattern: RegExp): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + const allowedCharacters = pattern; + + //trigger error if input has blank space + if (value?.indexOf(' ') === 0 || value?.endsWith(' ')) { + return {blankSpace: true}; + } + + //allow input to be empty + if (value?.length === 0) { + return null; + } + + //trigger error if input does not meet the pattern criteria + if (value?.length > 0 && !value?.match(allowedCharacters)) { + return {invalidInput: true}; + } + + return null; + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/index.ts new file mode 100644 index 00000000..e793ba87 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/directives/validate-input/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateValidateInputDirective(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('../shared/generators/directives/validate-input/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'validate-input', + }), + move('src/app/shared/directives'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/index.ts new file mode 100644 index 00000000..4fad8639 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './components/index'; +export * from './directives/index'; +export * from './modules/index'; +export * from './pipes/index'; +export * from './constants/index'; +export * from './services/index'; +export * from './styles/index'; +export * from './utils/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template b/libs/schematic/generators/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template new file mode 100644 index 00000000..cf9eab43 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/language/files/__name@dasherize__.translation.json.template @@ -0,0 +1,173 @@ +{ + <% if (!options.isAspectSelected) { %> + <% if (options.enableVersionSupport) { %> + "<%= aspectModelName.toLowerCase() %>.v<%= options.formatedAspectModelVersion %>": { + <% } %> + + "preferredName": "<%= preferredName %>", + "description": "<%= description %>" + + <% if (options.enableVersionSupport) { %> + }, + <% } else { %> + , + <% } %> + <% } %> + + <% if (options.enableVersionSupport) { %> + "<%= selectedModelElementName.toLowerCase() %>.v<%= options.formatedAspectModelVersion %>": { + <% } %> + + <%= properties %> + <%= blockTransCustomColumns %> + <%= blockTransRowActions %> + <%= blockCustomCommandBarActions %> + + "customRowActions.preferredName": "Actions", "customRowActions.description": "Custom row actions" + + <% if (options.isAspectSelected) { %> + , + "preferredName": "<%= preferredName %>", + "description": "<%= description %>" + <% } %> + + <% if (options.enableVersionSupport) { %> + } + <% } %> + + <% if (options.hasSearchBar) { %> + , + "search": "Search", + "advancedSearch": "Advanced Search", + "allTextFields": "All Text Fields" + <% } %> + + <% if (options.isEnumQuickFilter || options.isDateQuickFilter) { %> + , + "date": { + "from": "from", + "to": "to", + "fromError": "From date cannot be greater than to date", + "toError": "To date cannot be less than from date", + "fromRequired": "From is required", + "toRequired": "To is required" + } + <% } %> + + , + "exportData": { + "title": "Export data", + "description": { + "exportOnlyFirstPage": "Export only the first page of data.", + "caseOne": "Export the maximum of {{maxExportRows}} rows from all {{allColumns}} columns.", + "caseTwo": { + "singular": "Export the maximum of {{maxExportRows}} rows from the displayed {{displayedColumns}} column.", + "plural": "Export the maximum of {{maxExportRows}} rows from the displayed {{displayedColumns}} columns." + }, + "caseThree": { + "singular": "Export all data from the selected {{displayedColumns}} column of the current page.", + "plural": "Export all data from the selected {{displayedColumns}} columns of the current page." + }, + "caseFour": "Export all data from all {{allColumns}} columns of the current page.", + "default": "Export entire datasource." + }, + + "exportAllPages": "export the maximum of {{maxExportRows}} rows", + "exportAllColumns": "export all data from all {{allColumns}} columns", + "exportFirstPage": "export the first page of data" + } + + , + "validation": { + "invalidInput": "Input can only contain", + "blankSpace": "Input can only contain blank space between characters", + "empty_string_columns_array": "You have to select at least one column to search in", + "min_char_no": "Minimum number of characters is", + "max_char_no": "Maximum number of characters is", + "any_URI": "Value has to match validation rules for \"anyURI\" data type", + "base64_binary": "Value has to match validation rules for \"base64Binary\" data type", + "byte": "Value has to match validation rules for \"byte\" data type", + "curie": "Value has to match validation rules for \"curie\" data type", + "day_time_duration": "Value has to match validation rules for \"dayTimeDuration\" data type", + "decimal": "Value has to match validation rules for \"decimal\" data type", + "default": "Field is not valid", + "double": "Value has to match validation rules for \"double\" data type", + "duration": "Value has to match validation rules for \"duration\" data type", + "encoding": "Value has to be in \"{{encoding}}\" encoding", + "fixed_point_integer": "Integer part has to be {{integerLength}} digits long", + "fixed_point_parts": "Value has to consist of 2 parts separated by a dot", + "fixed_point_scale": "Scale part has to be {{scaleLength}} digits long", + "float": "Value has to match validation rules for \"float\" data type", + "g_day": "Value has to match validation rules for \"gDay\" data type", + "g_month": "Value has to match validation rules for \"gMonth\" data type", + "g_month_day": "Value has to match validation rules for \"gMonthDay\" data type", + "g_year": "Value has to match validation rules for \"gYear\" data type", + "g_year_month": "Value has to match validation rules for \"gYearMonth\" data type", + "group_unique_values": "Each value has to be unique", + "hex_binary": "Value has to match validation rules for \"hexBinary\" data type", + "int": "Value has to match validation rules for \"int\" data type", + "integer": "Value has to match validation rules for \"integer\" data type", + "lang_string": "Value has to match validation rules for \"langString\" data type", + "length_max": "Value has to have a maximum length of {{max}} characters", + "length_min": "Value has to be at least {{min}} characters long", + "list_length_max": "The list has to have a maximum length of {{max}} items", + "list_length_min": "The list has to have at least {{min}} items", + "long": "Value has to match validation rules for \"long\" data type", + "negative_integer": "Value has to match validation rules for \"negativeInteger\" data type", + "non_negative_integer": "Value has to match validation rules for \"nonNegativeInteger\" data type", + "non_positive_integer": "Value has to match validation rules for \"nonPositiveInteger\" data type", + "number": "Value has to be a valid number", + "positive_integer": "Value has to match validation rules for \"positiveInteger\" data type", + "range_max_inclusive": "Value has to be less than or equal to {{max}}", + "range_max": "Value has to be less than {{max}}", + "range_min_inclusive": "Value has to be greater than or equal to {{min}}", + "range_min": "Value has to be greater than {{min}}", + "regular_expression": "Value has to match the following pattern: {{pattern}}", + "required": "Field is required", + "short": "Value has to match validation rules for \"short\" data type", + "time": "Value has to match validation rules for \"time\" data type", + "unsigned_byte": "Value has to match validation rules for \"unsignedByte\" data type", + "unsigned_int": "Value has to match validation rules for \"unsignedInt\" data type", + "unsigned_long": "Value has to match validation rules for \"unsignedLong\" data type", + "unsigned_short": "Value has to match validation rules for \"unsignedShort\" data type", + "year_month_duration": "Value has to match validation rules for \"yearMonthDuration\" data type" + } + + , + "tableActions": { + "openColumnsMenu": "Open columns menu", + "refreshData": "Refresh data", + "exportData": "Export data", + "openConfig": "Open configuration" + } + + , + "scroll": { + "left": "Scroll left", + "right": "Scroll right" + } + + <% if (options.hasSearchBar) { %> + , + "settings": { + "title": "Settings", + "highlight.name": "Highlight", + "highlight.desc": "The search term will be highlighted" + } + <% } %> + + , + "cancel": "Cancel", + "apply": "Apply", + "restoreDefaults": "Restore Defaults", + "columns": "Columns", + "export": "Export", + "noLink": "No link", + "toolbar": { + "sorted_tooltip": "Sort data by property", + "sort_dir_tooltip": "Sort data direction", + "sort_by": "Sorted by", + "sort_asc": "Ascending", + "sort_desc": "Descending" + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/language/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/language/index.ts new file mode 100644 index 00000000..0f321e67 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/language/index.ts @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {DefaultEntityInstance, DefaultEnumeration, Property} from '@esmf/aspect-model-loader'; +import {dasherize} from '@angular-devkit/core/src/utils/strings'; + +let sharedOptions: any = {}; + +export function generateLanguageTranslationAsset(options: any, assetsPath: string, language: string): Rule { + return (tree: Tree, _context: SchematicContext) => { + sharedOptions = options; + + return mergeWith( + apply(url('../shared/generators/language/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: sharedOptions, + name: `${language}.${dasherize(options.name)}`, + aspectModelName: sharedOptions.aspectModel.name, + selectedModelElementName: sharedOptions.selectedModelElement.name, + preferredName: sharedOptions.aspectModel.getPreferredName(language), + description: sharedOptions.aspectModel.getDescription(language), + properties: getProperties(language), + blockTransCustomColumns: getBlockTransCustomColumns(), + blockTransRowActions: getBlockTransRowActions(), + blockCustomCommandBarActions: getBlockCustomCommandBarActions(), + }), + move(assetsPath), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} + +function getProperties(language: string) { + return sharedOptions.templateHelper + .getProperties(sharedOptions, sharedOptions.getExcludedPropLabels) + .map((property: Property) => { + return ` + "${property.name}.preferredName": "${replaceIncorrectSymbols(property.getPreferredName(language)) || property.name}", + "${property.name}.description": "${replaceIncorrectSymbols(property.getDescription(language))}", + ${replaceIncorrectSymbols(getBlockEntityInstance(property, language))} + ${replaceIncorrectSymbols(getBlockTransEntity(property, language))}`; + }) + .join(''); +} + +function getBlockTransEntity(property: Property, lang: string): string { + if (property.effectiveDataType?.isComplex) { + return (property.effectiveDataType as any).properties + .map((effProp: Property) => { + const {name} = effProp; + const preferredName = effProp.getPreferredName(lang) || name; + const description = effProp.getDescription(lang); + const blockEntityInstance = getBlockEntityInstance(effProp, lang, property.name); + + return ` + "${property.name}.${name}.preferredName": "${replaceIncorrectSymbols(preferredName)}", + "${property.name}.${name}.description": "${replaceIncorrectSymbols(description)}", + ${replaceIncorrectSymbols(blockEntityInstance)}`; + }) + .join(''); + } + return ''; +} + +function getBlockEntityInstance(property: Property, lang: string, parentPropertyName = ''): string { + const {characteristic} = property; + + if (characteristic instanceof DefaultEnumeration && characteristic.values?.[0] instanceof DefaultEntityInstance) { + return ''; + } + + if (!(characteristic instanceof DefaultEnumeration) || !characteristic.dataType?.isComplex || !characteristic.values) { + return ''; + } + + const entityInstanceToString = (entityInstance: DefaultEntityInstance) => + `,"${parentPropertyName ? parentPropertyName + '.' : ''}${property.name}.${entityInstance.name}.${entityInstance.descriptionKey}": "${ + entityInstance.getDescription(lang) || '' + }"`; + + return characteristic.values.map(entityInstanceToString).join(''); +} + +function getBlockTransCustomColumns(): string { + const customColumns = sharedOptions.customColumns?.map((cc: string) => `"customColumn.${cc}": "${cc}"`).join(', '); + + return customColumns?.length > 0 ? `${customColumns},` : ''; +} + +function getBlockTransRowActions(): string { + if (!sharedOptions.customRowActions || sharedOptions.customRowActions.length === 0) { + return ''; + } + + const actions: string[] = sharedOptions.customRowActions.map((action: string) => + action + .replace(/\.[^/.]+$/, '') + .replace(/\s+/g, '-') + .toLowerCase() + ); + + const actionTitles = actions.map(action => `"${action}.customRowAction": "${action}"`).join(', '); + const actionNotAvailableTitles = actions.map(action => `"${action}.notAvailable": ""`).join(', '); + + return ` + ${actionTitles}, + "customRowAction": { + ${actionNotAvailableTitles} + }, + `; + + /*const customRowActions = sharedOptions.customRowActions + ?.map((cr: string, i: number, arr: string[]) => { + const crReplaced = cr + .replace(/\.[^/.]+$/, '') + .replace(/\s+/g, '-') + .toLowerCase(); + return `"${crReplaced}.customRowAction": "${crReplaced}"`; + }) + .join(', '); + + return customRowActions?.length > 0 ? `${customRowActions},` : '';*/ +} + +function getBlockCustomCommandBarActions(): string { + const transformActionName = (action: string) => { + return action + .replace(/\.[^/.]+$/, '') + .replace(/\s+/g, '-') + .toLowerCase(); + }; + + const actions = sharedOptions.customCommandBarActions.map(transformActionName); + + const actionStrings = actions.map((action: string) => `"${action}.customCommandBarAction": "${action}"`); + + return actionStrings.length > 0 ? `${actionStrings},` : ''; +} + +function replaceIncorrectSymbols(str: string = ''): string { + return str.replace(/[\n\r\t]+/g, ' '); +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template new file mode 100644 index 00000000..9afad003 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/files/__name@dasherize__.module.ts.template @@ -0,0 +1,11 @@ +/** <%= options.generationDisclaimerText %> **/ +import {NgModule} from '@angular/core'; +import {<%= classify(name) %>Module} from './<%= dasherize(name) %>.module'; + +@NgModule({ + declarations: [], + imports: [<%= classify(name) %>Module], + providers: [], + exports: [], +}) +export class <%= classify(name) %>Module {} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/index.ts new file mode 100644 index 00000000..841cb570 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/form-fields/index.ts @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {addModuleImportToModule} from '@angular/cdk/schematics'; + +export function generateFormFieldsModule(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const {classify, dasherize} = strings; + const name = 'form-fields'; + + const modulePath = `${options.path}/${dasherize(options.name)}.module.ts`; + addModuleImportToModule(tree, '/src/app/shared/app-shared.module.ts', `${classify(name)}Module`, `${modulePath.replace('.ts', '')}`); + + return mergeWith( + apply(url(`../shared/generators/modules/${name}/files`), [ + applyTemplates({ + classify, + dasherize, + options, + name, + }), + move(`src/app/shared/components/${name}`), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/modules/index.ts new file mode 100644 index 00000000..fb07d9f0 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './shared/index'; +export * from './translation/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template new file mode 100644 index 00000000..844fb4f4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/files/__name@dasherize__.module.ts.template @@ -0,0 +1,15 @@ +/** <%= options.generationDisclaimerText %> **/ +import {NgModule} from '@angular/core'; +import {<%= classify(name) %>Component} from './<%= dasherize(name) %>.component'; + +@NgModule({ + declarations: [ + <%= classify(name) %>Component + ], + imports: [AppSharedModule], + providers: [], + exports: [ + <%= classify(name) %>Component + ], +}) +export class <%= classify(name) %>Module {} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/index.ts new file mode 100644 index 00000000..5add6ff9 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/shared/index.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {addModuleImportToModule} from '@angular/cdk/schematics'; + +/** + * Generates a shared module and adds it to the app module. + * The method is used at forms generation only + * @param options + */ +export function generateSharedModule(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + options.module = `${dasherize(options.name)}.module.ts`; + + const sourcePath = options.path.replace('src/app', '.'); + const modulePath = `${sourcePath}/${dasherize(options.name)}.module.ts`; + addModuleImportToModule(tree, '/src/app/app.module.ts', `${classify(options.name)}Module`, `${modulePath.replace('.ts', '')}`); + + return mergeWith( + apply(url('../shared/generators/modules/shared/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: options.name, + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/index.ts new file mode 100644 index 00000000..d15207fa --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/index.ts @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import { + apply, + applyTemplates, + chain, + MergeStrategy, + mergeWith, + move, + noop, + Rule, + SchematicContext, + Tree, + url, +} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {Schema} from '../../../schema'; +import {parseSourceFile} from '@angular/cdk/schematics'; + +export function generateTranslationModule(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + if (isTranslocoProviderDefined(tree, 'src/app/shared/app-shared.module.ts')) { + return noop(); + } + + return chain([generateModuleDefinition(options, _context), generateProviderDefinition(options, _context)])(tree, _context); + }; +} + +function isTranslocoProviderDefined(tree: Tree, modulePath: string): boolean { + return tree.exists(modulePath) && parseSourceFile(tree, modulePath).text.includes(transLocoProviderInformation()); +} + +function generateModuleDefinition(options: Schema, _context: SchematicContext): Rule { + return mergeWith( + apply(url('../shared/generators/modules/translation/module-files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + providerInfo: transLocoProviderInformation(), + name: 'app-shared', + }), + move('src/app/shared'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); +} + +function generateProviderDefinition(options: Schema, _context: SchematicContext): Rule { + return mergeWith( + apply(url('../shared/generators/modules/translation/provider-files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'trans-loco-http-loader', + }), + move('src/app/shared'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); +} + +function transLocoProviderInformation(): string { + return `provideTransloco({ + config: { + availableLangs: ['en'], + defaultLang: 'en', + reRenderOnLangChange: true, + prodMode: !isDevMode(), + }, + loader: TransLocoHttpLoader, + })`; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template new file mode 100644 index 00000000..0a2d6779 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/module-files/__name@dasherize__.module.ts.template @@ -0,0 +1,16 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {isDevMode, NgModule} from '@angular/core'; +import {environment} from "../../environments/environment"; +import {provideTransloco, TranslocoModule} from '@jsverse/transloco'; +import {TransLocoHttpLoader} from './trans-loco-http-loader'; +import {EsmfPaginatorSelectConfigProvider} from './services/paginator-select-config.provider'; + +export const baseUrl = (environment as any).baseUrl || ''; + +@NgModule({ + imports: [TranslocoModule], + exports: [TranslocoModule], + providers: [<%= providerInfo %>], +}) +export class <%= classify(name) %>Module {} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template new file mode 100644 index 00000000..2a54f559 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/modules/translation/provider-files/__name@dasherize__.ts.template @@ -0,0 +1,16 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {HttpClient} from '@angular/common/http'; +import {Injectable} from '@angular/core'; +import {Translation, TranslocoLoader} from '@jsverse/transloco'; +import {Observable} from 'rxjs'; +import {baseUrl} from './app-shared.module'; + +@Injectable({providedIn: 'root'}) +export class <%= classify(name) %> implements TranslocoLoader { + constructor(private http: HttpClient) {} + + getTranslation(langPath: string): Observable { + return this.http.get(`${baseUrl}/assets/i18n/${langPath}.json`); + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/pipes/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/index.ts new file mode 100644 index 00000000..fec170c2 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './show-description/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template new file mode 100644 index 00000000..791b2c54 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/files/__name@dasherize__.pipe.ts.template @@ -0,0 +1,14 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Pipe, PipeTransform} from "@angular/core"; + +@Pipe({name: 'showDescription', standalone: false}) +export class <%= classify(name) %>Pipe implements PipeTransform { + transform(value: any, getByValueFn: any, onlyDesc?: boolean): any { + value = value?.toString(); + + const resultParts: string[] = value && !onlyDesc ? [value] : []; + resultParts.push(getByValueFn(value)?.description); + + return resultParts.join(' - '); + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/index.ts new file mode 100644 index 00000000..9bec4cc4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/pipes/show-description/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateShowDescriptionPipe(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('../shared/generators/pipes/show-description/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'show-description', + }), + move('src/app/shared/pipes'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template new file mode 100644 index 00000000..070e34c4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/files/custom-__name@dasherize__.service.ts.template @@ -0,0 +1,19 @@ +/** <%= options.generationDisclaimerText %> **/ +<% + var serviceName = options.enableRemoteDataHandling ? 'EsmfRemoteTableService' : 'EsmfStaticTableService'; +%> +import {Injectable} from '@angular/core'; +import {<%= serviceName %>} from '@esmf/semantic-ui-schematic'; + +/** +* Custom service which extend the original API service for fetching +* ${this.options.selectedModelElement.name} data from the configured +* remote API. +* +* If you need to override or to extend the current functionality, +* this is the right place to do. All modifications are preserved while +* generating the table component again, also in combination with +* the cli parameter '--force'. +*/ +@Injectable() +export class Custom<%= classify(options.name) %>Service extends <%= serviceName %> {} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/index.ts new file mode 100644 index 00000000..f5bdce34 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/services/custom/index.ts @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {dasherize} from '@angular-devkit/core/src/utils/strings'; + +export function generateCustomService(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const targetPath = `${options.path}/custom-${dasherize(options.name)}.service.ts`; + + if (tree.exists(targetPath) || !(options.enableRemoteDataHandling && options.customRemoteService)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/services/custom/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: options.name, + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template new file mode 100644 index 00000000..c6c56b2b --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/files/__name@dasherize__-filter.service.ts.template @@ -0,0 +1,319 @@ +/** <%= options.generationDisclaimerText %> **/ +<% if (options.enableRemoteDataHandling) { %> + import { + AbstractArrayNode, + AbstractLogicalNode, + AbstractNode, + And, + Ge, + In, + Le, + Alike, + Limit, + Or, + Query, + QueryStringifier, + Sort + } from 'rollun-ts-rql'; +<% } %> + +<% if (options.hasSearchBar || options.isDateQuickFilter) { %>import { TranslocoService } from '@jsverse/transloco';<% } %> +<% if (options.hasSearchBar || options.isEnumQuickFilter || options.isDateQuickFilter) { %> + import {FilterEnums, FilterType} from '@esmf/semantic-ui-schematic'; +<% } %> + +import {AbstractControl, FormControl, ValidationErrors, ValidatorFn} from '@angular/forms'; +import {Injectable<% if (options.isDateQuickFilter) { %>, Inject<% } %>} from '@angular/core'; + +<% if (options.isDateQuickFilter) { %> + import {FormBuilder, Validators} from '@angular/forms'; + import {DateAdapter, MAT_DATE_FORMATS, MatDateFormats} from "@angular/material/core"; + import moment from 'moment'; +<% } %> + +import {<%= classify(options.selectedModelTypeName) %> +<% if (!options.aspectModel.isCollectionAspect && !options.isAspectSelected) { %> + , <%= classify(options.aspectModelTypeName) %> +<% } %> + +<% if (options.isEnumQuickFilter) { %> + , <%= getEnumProperties %> +<% } %> + +} from '<%= options.typePath %>'; + +<% if (options.componentType === 'card') { %> + export enum SortCard { + ASCENDING, + DESCENDING, + } +<% } %> + +<% if (options.hasSearchBar) { %> + export const validateInputsValidator = (pattern: string): ValidatorFn => { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + const allowedCharacters = new RegExp(pattern); + + //allow input to be empty + if (value?.length === 0) { + return null; + } + + //trigger error if input has blank space + if (value?.indexOf(' ') === 0 || value?.endsWith(' ')) { + return {blankSpace: true}; + } + + // no validation pattern + if (!pattern || !pattern.length) { + return null; + } + + //trigger error if input does not meet the pattern criteria + if (value?.length > 0 && !value?.match(allowedCharacters)) { + return {invalidInput: true}; + } + + return null; + }; +} + + export const validateInputLength = (minNoCharacters: number, maxNoCharacters: number): ValidatorFn => { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + // no validation required + if (!minNoCharacters && !maxNoCharacters) { + return null; + } + + //allow input to be empty + if (value?.length === 0) { + return null; + } + + //trigger error if input has less characters than minNoCharacters + if (minNoCharacters && value?.length < minNoCharacters) { + return {minCharNo: true}; + } + + //trigger error if input has more characters than maxNoCharacters + if (maxNoCharacters && value?.length > maxNoCharacters) { + return {maxCharNo: true}; + } + + return null; + }; +} +<% } %> + +/** + * Custom service used for table filtering logic + */ +@Injectable({ + providedIn: 'root' +}) +export class <%= classify(name) %>FilterService { + + <% if (options.hasSearchBar || options.isEnumQuickFilter || options.isDateQuickFilter) { %> + /** Array of active filters */ + activeFilters: FilterType[] = []; + + <% if (options.hasSearchBar) { %> + searchString = new FormControl(''); + <%= setStringColumns %> + <% } %> + + <% if (options.isEnumQuickFilter) { %> + <%= setEnumQuickFilter %> + <% } %> + + <% if (options.isDateQuickFilter) { %> + <%= setDateFormGroups %> + <% } %> + <% } %> + + <% if (options.componentType === 'card') { %> + sortCard = SortCard.ASCENDING; + sortedProperty = ''; + <% } %> + + constructor( + <% if (options.isDateQuickFilter) { %> + @Inject(MAT_DATE_FORMATS) private dateFormats: MatDateFormats, + private dateAdapter: DateAdapter, + private fb: FormBuilder, + <% } %> + <% if (options.isDateQuickFilter || options.hasSearchBar) { %> + private translateService: TranslocoService + <% } %> + ){ + <% if (options.isDateQuickFilter) { %> + <%= setDateQuickFilters %> + <% } %> + } + + <% if (options.hasSearchBar) { %> + searchStringInit(initialValue: string, regexValidator: string, minCharNo: number, maxCharNo: number) { + this.searchString = new FormControl(initialValue, [validateInputsValidator(regexValidator), validateInputLength(minCharNo, maxCharNo)]); + } + <% } %> + + <% if (options.hasSearchBar || options.isEnumQuickFilter || options.isDateQuickFilter) { %> + reset(): void { + const appliedFilters = [...this.activeFilters]; + + appliedFilters.forEach((filter) => { + this.removeFilter(filter) + }) + } + + /** Removes a specific filter. */ + removeFilter(filter:FilterType) { + switch(filter.type) { + <% if (options.hasSearchBar) { %> + case FilterEnums.Search: + const removedFilter = this.activeFilters.findIndex(elem => elem.filterValue === filter.filterValue && elem.prop === filter.prop); + this.activeFilters.splice(removedFilter, 1); + this.searchString.setValue(''); + break; + <% } %> + + <% if (options.isEnumQuickFilter) { %> + <%= setEnumRemoveFilter %> + <% } %> + + <% if (options.isDateQuickFilter) { %> + <%= setDataRemoveFilter %> + <% } %> + } + } + <% } %> + + <% if (options.hasSearchBar) { %> + /** + * Get a value using a dot access path + * @param accessPath access path e.g. object.attrL1.attrL2 + * @param object value behind the path or '' if not found/doesn't exist + */ + getValueByAccessPath(accessPath: string, object: any) { + try { + return accessPath.split('.').reduce((a, b) => a[b], object); + } catch (error) { + + return ''; + } + } + + <% if (!options.enableRemoteDataHandling) { %> + applyStringSearchFilter(data: Array<<%= classify(options.aspectModelTypeName) %>>): Array<<%= classify(options.aspectModelTypeName) %>> { + this.isSearchStringValidAndUnique() && this.activeFilters.push(this.createNewFilter()); + const searchFilters = this.activeFilters.filter(elem => elem.type === FilterEnums.Search); + + return searchFilters.length ? this.filterData(data, searchFilters) : data; + } + + private isSearchStringValidAndUnique(): boolean { + if (!this.searchString.value || this.searchString?.value === '') { + return false; + } + + return !this.activeFilters.some( + elem => elem.prop === this.selectedStringColumn.value && elem.filterValue === this.searchString.value); + } + + private createNewFilter(): FilterType { + return { + removable: true, + type: FilterEnums.Search, + label: `in ${this.getFilterContext()}`, + prop: this.selectedStringColumn.value, + filterValue: this.searchString.value? this.searchString.value : '', + }; + } + + private getFilterContext(): string { + return this.selectedStringColumn.value === this.advancedSearchAllValue + ? this.translateService.translate('allTextFields') + : this.translateService.translate(`<%= options.translationPath %>` + this.selectedStringColumn.value + '.preferredName'); + } + + private filterData(data: Array, searchFilters: FilterType[]): Array { + return data.filter(item => searchFilters.some(filter => this.itemMatchesFilter(item, filter))); + } + + private itemMatchesFilter(item: Movement, filter: FilterType): boolean { + return (filter.prop === this.advancedSearchAllValue ? this.stringColumns : [filter.prop]).some( + prop => { + if(!prop || !filter.filterValue) { + return false; + } + + return this.getValueByAccessPath(prop, <%= itemKey %>).toLowerCase().includes(filter.filterValue.toLowerCase()) + }); + } + <% } else { %> + applyStringSearchFilter(query: AbstractLogicalNode): void { + if (this.searchString.value && this.searchString.value !== '' && !this.activeFilters.find(elem => elem.prop === this.selectedStringColumn.value && elem.filterValue === this.searchString.value)) { + const label = ` in ${ this.selectedStringColumn.value === this.advancedSearchAllValue ? + this.translateService.translate('allTextFields') : + this.translateService.translate(`<%= options.translationPath %>` + this.selectedStringColumn.value + '.preferredName')}`; + this.activeFilters.push( { + removable: true, + type: FilterEnums.Search, + label, + prop: this.selectedStringColumn.value, + filterValue:this.searchString.value + }); + } + + <% if (getAllStringProps.length > 0) { %> + this.activeFilters.filter(af => af.type === FilterEnums.Search).forEach(af => { + if (af.prop !== null && af.filterValue !== undefined) { + query.addNode(new Or(this.addSelectedColumnsQuery(af.prop, af.filterValue))); + } + }); + } + <% } %> + <% } %> + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + addSelectedColumnsQuery(selectedStringColumn: string, searchString: string): Alike[] { + if (selectedStringColumn !== this.advancedSearchAllValue) { + return [new Alike(selectedStringColumn, `*${searchString}*`)]; + } else { + return this.stringColumns.map((column: string) => { + return new Alike(column, `*${searchString}*`); + }); + } + } + <% } %> + + <% if (options.isEnumQuickFilter) { %> + <% if (options.enableRemoteDataHandling) { %> + <%= getEnumFilterRemote %> + <% } else { %> + <%= getEnumFilterNotRemote %> + <% } %> + <% } %> + + <% if (options.isDateQuickFilter) { %> + <% if (options.enableRemoteDataHandling) { %> + <%= getDateRemote %> + <% } else { %> + <%= getDateNotRemote %> + <% } %> + + private createDateAsUTC(date: Date) { + return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); + } + + private getFormattedDate(theDate: string) { + return this.dateFormats.display.dateInput !== 'L' + ? this.dateAdapter.format(moment(theDate).toDate(), this.dateFormats.display.dateInput) + : new Date(theDate).toLocaleDateString( this.translateService.getActiveLang(), {timeZone: 'UTC'}); + } + <% } %> +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/index.ts new file mode 100644 index 00000000..f1d79126 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/services/filter/index.ts @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {DefaultSingleEntity, Property} from '@esmf/aspect-model-loader'; +import {classify} from '@angular-devkit/core/src/utils/strings'; +import {getAllEnumProps, PropValue} from '../../../../../../utils/aspect-model'; +import {ComponentType} from '../../../schema'; + +let sharedOptions: any = {}; + +export function generateFilterService(options: any): Rule { + sharedOptions = options; + + return (tree: Tree, _context: SchematicContext) => { + if (sharedOptions.componentType === ComponentType.TABLE && !sharedOptions.hasFilters) { + return noop; + } + + const enumValues = getAllEnumProps(sharedOptions); + const dataValues = getAllDateProps(sharedOptions.listAllProperties); + + const key = `item.${sharedOptions.jsonAccessPath}`; + const itemKey = key.substring(0, key.length - 1); + + return mergeWith( + apply(url('../shared/generators/services/filter/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: sharedOptions, + name: sharedOptions.name, + itemKey: itemKey, + getAllStringProps: getAllStringProps(sharedOptions.listAllProperties), + setStringColumns: setStringColumns(sharedOptions.listAllProperties), + getEnumProperties: getEnumProperties(), + setEnumQuickFilter: setEnumQuickFilter(enumValues), + setEnumRemoveFilter: setEnumRemoveFilter(enumValues), + setDateFormGroups: setDateFormGroups(dataValues), + setDateQuickFilters: setDateQuickFilters(dataValues), + setDataRemoveFilter: setDataRemoveFilter(dataValues), + getEnumFilterRemote: getEnumFilterRemote(enumValues), + getEnumFilterNotRemote: getEnumFilterNotRemote(enumValues), + getDateRemote: getDateRemote(dataValues), + getDateNotRemote: getDateNotRemote(dataValues), + }), + move(sharedOptions.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} + +function getAllStringProps(allProps: Property[]): string[] { + return allProps.flatMap((property: Property) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexProps = sharedOptions.templateHelper.getComplexProperties(property, sharedOptions); + return complexProps.properties + .filter( + (complexProp: Property) => + sharedOptions.templateHelper.isStringProperty(complexProp) || sharedOptions.templateHelper.isMultiStringProperty(complexProp) + ) + .map((complexProp: Property) => `'${complexProps.complexProp}.${complexProp.name}'`); + } + return sharedOptions.templateHelper.isStringProperty(property) || sharedOptions.templateHelper.isMultiStringProperty(property) + ? [`'${property.name}'`] + : []; + }); +} + +function getEnumProperties(): string { + return sharedOptions.templateHelper + .getEnumProperties(sharedOptions) + .map((property: Property) => classify(property.characteristic.name)) + .join(', '); +} + +function getAllDateProps(allProps: Property[]) { + const getPropValue = (prop: Property, complexPropObj?: any) => ({ + propertyValue: complexPropObj ? `${complexPropObj.complexProp}.${prop.name}` : prop.name, + propertyName: complexPropObj ? `${complexPropObj.complexProp}${classify(prop.name)}` : prop.name, + characteristic: prop.characteristic?.name, + enumWithEntities: false, + property: prop, + complexPropObj: complexPropObj, + }); + + return allProps.flatMap(property => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexPropObj = sharedOptions.templateHelper.getComplexProperties(property, sharedOptions); + return complexPropObj.properties + .filter( + (complexProp: any) => + sharedOptions.templateHelper.isDateTimeProperty(complexProp) && + !sharedOptions.excludedProperties.some( + (excludedProperty: any) => excludedProperty.propToExcludeAspectModelUrn === complexProp.aspectModelUrn + ) + ) + .map((complexProp: any) => getPropValue(complexProp, complexPropObj)); + } else if (sharedOptions.templateHelper.isDateTimeProperty(property)) { + return getPropValue(property); + } + return []; + }); +} + +function setStringColumns(allProps: Property[]) { + const stringColumnsArr = `stringColumns: string[] = [${getAllStringProps(allProps).join(', ')}];\n`; + return `${stringColumnsArr}readonly advancedSearchAllValue = 'allTextFields';\nselectedStringColumn: FormControl = new FormControl(this.advancedSearchAllValue);`; +} + +function setEnumQuickFilter(values: PropValue[]) { + const template = (value: any) => ` + ${value.propertyName}Selected: Array<${value.enumWithEntities ? 'string' : classify(value.characteristic || 'any')}> = []; + ${value.propertyName}Options: Array = ${ + value.enumWithEntities + ? `${classify(value.characteristic)}.getValueDescriptionList('${value.complexPropObj ? value.complexPropObj.complexProp + '.' : ''}${ + value.property.name + }')` + : `Object.values(${classify(value.characteristic)})` + };`; + + return values.map(template).join(''); +} + +function setEnumRemoveFilter(values: PropValue[]) { + const template = (value: any) => ` + if(filter.prop === '${value.propertyValue}') { + this.${value.propertyName}Selected = this.${value.propertyName}Selected.filter(sel => sel !== filter.filterValue); + }`; + + const filterStatements = values.map(template).join(''); + const filterRemovalStatement = + 'this.activeFilters = this.activeFilters.filter(af => af.filterValue !== filter.filterValue && af.label !== filter.label );'; + const endStatement = 'break;'; + + return `case FilterEnums.Enum: ${filterStatements} ${filterRemovalStatement} ${endStatement}`; +} + +function setDateFormGroups(values: PropValue[]) { + const template = (value: any) => ` + ${value.propertyName}Group;`; + + return values.map(template).join(''); +} + +function setDateQuickFilters(values: PropValue[]) { + const template = (value: any) => { + const datePicker = sharedOptions.datePickers?.find((element: any) => element.propertyUrn === value.property.aspectModelUrn)?.datePicker + .type; + + if (sharedOptions.isDateQuickFilter && datePicker) { + const required = datePicker === 'startAndEndDatePicker' ? ', Validators.required' : ''; + + return `this.${value.propertyName}Group = this.fb.group({ + fromControl: [null${required}], + toControl: [null${required}] + });`; + } + + return ''; + }; + + return values.map(template).join(''); +} + +function setDataRemoveFilter(values: PropValue[]) { + const template = (value: any) => + `if(filter.prop === '${value.propertyValue}') { + this.${value.propertyName}Group.reset(); + }`; + + const filtersLogic = values.map(template).join(''); + + return `case FilterEnums.Date: + ${filtersLogic} + this.activeFilters = this.activeFilters.filter(af => af.filterValue !== filter.filterValue && af.label !== filter.label); + break;`; +} + +function getEnumFilterRemote(values: PropValue[]) { + const template = (value: any) => ` + if (this.${value.propertyName}Selected.length > 0) { + query.addNode(new In('${sharedOptions.jsonAccessPath}${value.propertyValue}', this.${value.propertyName}Selected)); + } + + this.${value.propertyName}Selected.forEach(selected => { + const filterProp = '${sharedOptions.jsonAccessPath}${value.propertyValue}'; + const filterVal = selected; + + if(!this.activeFilters.filter(af => af.prop === filterProp).map(af=> af.filterValue).includes(filterVal)) { + this.activeFilters.push({ + removable: true, + type: FilterEnums.Enum, + label: ${getChipLabelEnum(value)}, + prop: filterProp, + filterValue : filterVal + }) + } + }); + + this.activeFilters + .filter((af) => af.prop === '${sharedOptions.jsonAccessPath}${value.propertyValue}') + .forEach((filter) => { + if (!this.${value.propertyName}Selected.includes(filter.filterValue as any)) { + this.removeFilter(filter); + } + });`; + + return `applyEnumFilter(query: AbstractLogicalNode): void { + ${values.map(template).join('')} + }`; +} + +function getEnumFilterNotRemote(values: PropValue[]) { + const code = values.map(generateFilterCode).join(''); + + return `applyEnumFilter(data: Array<${classify(sharedOptions.selectedModelElement.name)}>) { + let filteredData = data; + ${code} + return filteredData; + }`; +} + +const generateFilterCode = (value: any) => ` +filteredData = this.${value.propertyName}Selected.length === 0 ? filteredData : + filteredData.filter((item:${classify(sharedOptions.selectedModelElement.name)}): boolean => + (this.${value.propertyName}Selected.includes(item.${sharedOptions.jsonAccessPath}${value.propertyValue}))); + +this.${value.propertyName}Selected.forEach(selected=> { + const filterProp = '${sharedOptions.jsonAccessPath}${value.propertyValue}'; + const filterVal = selected; + + if (!this.activeFilters.filter(af => af.type === FilterEnums.Enum && af.prop === filterProp).map(af=> af.filterValue).includes(filterVal)) { + this.activeFilters.push({ + removable: true, + type: FilterEnums.Enum, + label: ${getChipLabelEnum(value)}, + prop: filterProp, + filterValue : filterVal + }) + } +}); + +this.activeFilters + .filter((af) => af.type === FilterEnums.Enum && af.prop === '${sharedOptions.jsonAccessPath}${value.propertyValue}') + .forEach((filter) => { + if (!this.${value.propertyName}Selected.includes(filter.filterValue as any)) { + this.removeFilter(filter); + } + }); +`; + +const getChipLabelEnum = (filterProp: PropValue) => { + const templateWithEntities = (propName: string) => + `\`${'${selected} - ${this.translateService.translate(this.'}${propName}Options.filter(option => option.value === selected).map(option => option.translationKey).join(''))}\``; + + const templateWithoutEntities = `\`${'${selected}'}\``; + + return filterProp.enumWithEntities ? templateWithEntities(filterProp.propertyName) : templateWithoutEntities; +}; + +function getDateRemote(values: PropValue[]): string { + const template = (value: any) => ` + if(this.${value.propertyName}Group.valid) { + const {fromControl, toControl} = this.${value.propertyName}Group.value; + this.applySingleDateFilter(query, fromControl, toControl, '${value.propertyName}'); + } + `; + + const activeFilters = values.map(template).join(''); + + return ` + applyDateFilter(query: AbstractLogicalNode): void { + ${activeFilters} + } + + private applySingleDateFilter(query: AbstractLogicalNode, from: number, to: number, filterPropName: string): void { + const conditions = []; + + const fromDateUTC: string | null = from ? this.createDateAsUTC(new Date(from)).toISOString() : null; + let toDateUTC: string | null = null; + let toDate: Date | null = to ? this.createDateAsUTC(new Date(to)) : null; + + if (toDate) { + toDateUTC = this.createDateAsUTC(new Date(toDate.setHours(23, 59, 59, 999))).toISOString(); + } + + if (fromDateUTC) { + conditions.push(new Ge(filterPropName, fromDateUTC)); + } + if (toDateUTC) { + conditions.push(new Le(filterPropName, toDateUTC)); + } + if (conditions.length > 0) { + query.addNode(conditions.length > 1 ? new And(conditions) : conditions[0]); + } + + // DCV-SPECIFIC: wrap the rest of the code in if condition to avoid chip list not updating or removing + if (fromDateUTC || toDateUTC) { + const filterIndex = this.activeFilters.findIndex(af => af.prop === filterPropName); + + let label = this.translateService.translate('batch.v030.' + filterPropName + '.preferredName'); + + if (fromDateUTC && toDateUTC) { + label += ' ' + this.getFormattedDate(fromDateUTC) + ' - ' + this.getFormattedDate(toDate.toISOString()); + } else if (toDateUTC) { + label += ' to ' + this.getFormattedDate(toDate.toISOString()); + } else if (fromDateUTC) { + label += ' from ' + this.getFormattedDate(fromDateUTC); + } + + if (filterIndex === -1) { + this.activeFilters.push({ + removable: true, + type: FilterEnums.Date, + label, + prop: filterPropName + }); + } else { + this.activeFilters[filterIndex].label = label; + } + } + } +`; +} + +function getDateNotRemote(values: PropValue[]): string { + const dateFilterLogic = (value: any, index: number) => ` + const {${value.propertyName}From, ${value.propertyName}To} = this.${value.propertyName}Group.value as any;; + + const ${value.propertyName}StartDate: Date | null = ${value.propertyName}From ? this.createDateAsUTC(new Date(${ + value.propertyName + }From)) : null; + let ${value.propertyName}EndDate: Date | null = ${value.propertyName}To ? this.createDateAsUTC(new Date(${ + value.propertyName + }To)) : null; + + if (${value.propertyName}EndDate) { + ${value.propertyName}EndDate = new Date(${value.propertyName}EndDate.setHours(23, 59, 59, 999)); + } + + ${filteredData(values, index)}.filter(item => { + const itemDate = new Date(item.${value.propertyValue}); + return (!${value.propertyName}StartDate || itemDate >= ${value.propertyName}StartDate) && (!${ + value.propertyName + }EndDate || itemDate <= ${value.propertyName}EndDate); + }); + + if (${value.propertyName}StartDate && ${value.propertyName}EndDate) { + this.updateActiveFilters('${value.propertyValue}', \`${value.propertyValue}: \${this.getFormattedDate(${ + value.propertyName + }StartDate.toISOString())} - \${this.getFormattedDate(${value.propertyName}EndDate.toISOString())}\`); + } else if (${value.propertyName}EndDate) { + this.updateActiveFilters('${value.propertyValue}', \`${value.propertyValue}: until \${this.getFormattedDate(${ + value.propertyName + }EndDate.toISOString())}\`); + } else if (${value.propertyName}StartDate) { + this.updateActiveFilters('${value.propertyValue}', \`${value.propertyValue}: from \${this.getFormattedDate(${ + value.propertyName + }StartDate.toISOString())}\`); + }`; + + return ` + applyDateFilter(data: Array): Array { + ${values.map(dateFilterLogic).join('')} + return filteredData; + } + + private dateInformation (prop: string, label: string) { + } + + updateActiveFilters(prop: string, label: string) { + const filter = this.activeFilters.find(af=> af.prop === prop); + if(!filter) { + this.activeFilters.push({ + removable: true, + type: FilterEnums.Date, + label: label, + prop: prop + }); + } else { + filter.label = label; + } + }`; +} + +function filteredData(values: PropValue[], index: number): string { + if (values.length === 1) { + return 'const filteredData = data'; + } else if (values.length > 1 && index === 0) { + return 'let filteredData = data'; + } + + return 'filteredData = filteredData'; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/services/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/services/index.ts new file mode 100644 index 00000000..1230852e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/services/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './custom/index'; +export * from './filter/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..9983bb0a --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/files/__name@dasherize__.component.scss.template @@ -0,0 +1,256 @@ +/** <%= options.generationDisclaimerText %> **/ + +$gray-100: #f5f5f5; +$gray-300: #e0e0e0; + +.js-sdk-component-container { + display: flex; + flex-direction: column; + height: 100%; + + .mat-table-container { + position: relative; + height: 90%; + overflow-y: auto; + + .full-width-table { + min-width: 100%; + + .mat-mdc-row:not([data-test='no-data-table-row']):not(.selected-row):hover { + background: $gray-100; + } + + .selected-row { + background: var(--selected-row-highlight-color, $gray-300); + } + + .mat-mdc-cell { + overflow: hidden; + text-overflow: ellipsis; + max-width: 100px; + white-space: nowrap; + font-size: inherit; + padding-right: 30px; + position: relative; + + &:hover { + .copy-to-clipboard { + opacity: 1; + transition: all 0.2s ease-in; + } + } + } + + .mat-mdc-header-cell { + position: relative; + + &.table-header-number { + ::ng-deep .mat-sort-header-container { + justify-content: flex-end; + padding-right: 15px; + } + } + } + + .table-cell-number { + text-align: right; + } + + .mat-column-customRowActions { + padding-right: 0; + padding-left: 8px; + } + + .mat-column-columnsMenu { + width: 35px; + padding-right: 0; + + .mat-mdc-table-menu-button { + height: 40px; + width: 35px; + } + } + + .mat-column-checkboxes { + max-width: 50px; + padding-right: 8px; + } + } + } + + .toolbar { + font-size: inherit; + align-items: center; + margin-bottom: 20px; + + .mat-mdc-form-field { + padding-top: 20px; + margin-right: 8px; + } + + .command-bar-number-of-items { + margin-right: 10px; + } + } + + .copy-to-clipboard { + cursor: pointer; + font-size: 15px; + opacity: 0; + transition: all 0.2s ease-in; + + &:hover { + opacity: 1; + } + } + + .chip-text { + max-width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +.resizing { + .js-sdk-component-container { + // Ignore columns with active sorting + .mat-sort-header[aria-sort]:not([aria-sort='ascending']):not([aria-sort='descending']) { + .mat-sort-header-container::after { + // Compensate the empty space when sorting indicator is hidden for a resizable column + content: ''; + display: block; + height: 100%; + min-width: 18px; + max-width: 18px; + } + } + } +} + +::ng-deep { + .advanced-search-option-description { + position: relative; + float: left; + font-size: 10px; + line-height: 1; + top: -12px; + white-space: break-spaces; + } + + & .resizing { + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: e-resize; + } + + & .handle { + width: 15px; + position: absolute; + top: 0; + right: 0; + height: 100%; + cursor: col-resize; + opacity: 0; + transition: all 0.2s ease-in; + + &:after { + content: ''; + display: block; + width: 1px; + height: 100%; + z-index: 1; + background: linear-gradient(0, rgba(255, 255, 255, 1) 0%, rgba(157, 157, 157, 1) 49%, rgba(255, 255, 255, 1) 100%); + transition: all 0.5ms ease-in; + } + } + + .mat-mdc-menu-panel { + max-width: max-content !important; + } + + .mat-list-item-content { + flex-direction: row !important; + } + + .mat-pseudo-checkbox { + margin-right: 10px; + } +} + +.spacer { + flex: 1 1 auto; +} + +.selection-title { + padding: 8px 0 16px 16px; + margin: 0; +} + +.menu-actions-container { + display: flex; + align-items: center; + align-content: space-around; + padding: 16px 16px 8px 16px; + min-width: 450px; + + .column-menu { + &-restore-btn { + align-self: flex-start; + } + + &-cancel-btn { + cursor: pointer; + margin: 0 8px; + } + } + + .config-menu { + &-cancel-btn { + cursor: pointer; + margin: 0 8px; + } + } +} + +.list-content { + display: flex; + align-items: center; + justify-content: space-between; + padding-left: 8px; +} + +.bg-transparent { + background: initial; +} + +.filter-options-container { + overflow-y: auto; + min-height: 100px; + max-height: 200px; +} + +.filter-actions-container { + text-align: right; + padding: 6px; + + .filter-apply-btn { + margin-left: 10px; + } +} + +.mat-mdc-menu-panel { + max-width: max-content !important; +} + +.table-cell-tooltip, +.table-column-tooltip { + max-height: none; + + .mat-mdc-tooltip-surface.mdc-tooltip__surface { + display: block; + } +} + +<%= customStyleImports %> diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/index.ts new file mode 100644 index 00000000..32f9ed21 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/styles/general/index.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateGeneralStyle(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const globalStylePath = 'src/styles.scss'; + + if (tree.exists(globalStylePath)) { + tree.overwrite(globalStylePath, contentForGlobalStyles()); + } else { + tree.create(globalStylePath, contentForGlobalStyles()); + } + + const scssPath = 'src/assets/scss/general.component.scss'; + + if (!options.overwrite && tree.exists(scssPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/styles/general/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'general', + customStyleImports: options.customStyleImports.map((styleImport: string) => `@import '${styleImport}';`).join(''), + }), + move('src/assets/scss'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} + +function contentForGlobalStyles() { + return `@font-face { font-family: 'Material Icons'; font-style: normal;font-weight: 400; src: url(https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2) format('woff2');} .material-icons {font-family: 'Material Icons', serif;font-weight: normal;font-style: normal;font-size: 24px; line-height: 1; letter-spacing: normal; text-transform: none;display: inline-block;white-space: nowrap;word-wrap: normal;direction: ltr; -webkit-font-feature-settings: 'liga';-webkit-font-smoothing: antialiased; }; + html, + body { + margin: 0; + }`; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/styles/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/styles/index.ts new file mode 100644 index 00000000..adf4f099 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/styles/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './general/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template new file mode 100644 index 00000000..9c1bafba --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/files/__name@dasherize__.mixin.ts.template @@ -0,0 +1,14 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Subject} from 'rxjs'; +import {OnDestroy} from '@angular/core'; + +export type Constructor = new (...args: any[]) => T; + +export const mixinDestroyedSubject = (base: T = class {} as T) => + class extends base implements OnDestroy { + destroyed$ = new Subject(); + + ngOnDestroy(): void { + this.destroyed$.next(); + } + }; diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts new file mode 100644 index 00000000..073d5e18 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/destroyed-subject/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateDestroyedSubject(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const tsPath = 'src/app/shared/utils/destroyed-subject.mixin.ts'; + + if (!options.overwrite && tree.exists(tsPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/utils/destroyed-subject/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'destroyed-subject', + }), + move('src/app/shared/utils'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template new file mode 100644 index 00000000..5ef7774e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/files/__name@dasherize__.ts.template @@ -0,0 +1,66 @@ +/** <%= options.generationDisclaimerText %> **/ +import {AbstractControl, ControlValueAccessor, FormArray, ValidationErrors, Validator} from '@angular/forms'; +import {takeUntil} from 'rxjs'; +import {mixinDestroyedSubject} from './destroyed-subject.mixin'; +import {CustomControlValidationError} from "./form-validators"; + +export abstract class FormArrayReusable extends mixinDestroyedSubject() implements ControlValueAccessor, Validator { + abstract formArray: FormArray; + abstract formArrayName: string; + + protected constructor() { + super(); + } + + get error(): CustomControlValidationError { + if (this.formArray.errors && this.formArray.errors['required']) { + return { + translationKey: 'validation.required', + translationParams: {}, + }; + } + + const errors = Object.values(this.formArray.errors ?? {}); + const error = errors.find(value => !!value); + + return error ?? null; + } + + get groupSpecificError(): CustomControlValidationError { + if (this.formArray.errors && this.formArray.errors['required']) { + return { + translationKey: 'validation.required', + translationParams: {}, + }; + } + + const errors = Object.values(this.formArray.errors ?? []); + const error = errors.find(value => !!value && value.isGroupSpecificError); + + return error ?? null; + } + + registerOnChange(fn: any): void { + if (!this.formArray) return; + + this.formArray.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe(fn); + } + + registerOnTouched(fn: any): void { + if (!this.formArray) return; + + this.formArray.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe(fn); + } + + setDisabledState(isDisabled: boolean): void { + isDisabled ? this.formArray.disable() : this.formArray.enable(); + } + + writeValue(value: any): void { + this.formArray.patchValue(value, {emitEvent: false}); + } + + validate(control: AbstractControl): ValidationErrors | null { + return this.formArray.valid ? null : {[this.formArrayName]: true}; + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts new file mode 100644 index 00000000..53b6569c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-array-reusable/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateFormArrayReusable(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const tsPath = 'src/app/shared/utils/form-array-reusable.ts'; + + if (!options.overwrite && tree.exists(tsPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/utils/form-array-reusable/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'form-array-reusable', + }), + move('src/app/shared/utils'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template new file mode 100644 index 00000000..1b58adbe --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/files/__name@dasherize__.ts.template @@ -0,0 +1,51 @@ +/** <%= options.generationDisclaimerText %> **/ +import {ControlValueAccessor, FormControl} from '@angular/forms'; +import {CustomControlValidationError} from "./form-validators"; + +export abstract class FormControlReusable implements ControlValueAccessor { + abstract formControl: FormControl + abstract formControlName: string; + val: any; + + onChange: any = () => {}; + onTouch: any = () => {}; + + set value(val: any) { + this.val = val; + this.onChange(val); + this.onTouch(val); + } + + get value(): any { + return this.val; + } + + get error(): CustomControlValidationError { + if (this.formControl.errors && this.formControl.errors['required']) { + return { + translationKey: 'validation.required', + translationParams: {}, + }; + } + + const errors = Object.values(this.formControl.errors ?? []); + const error = errors.find(value => !!value); + + return error ?? { + translationKey: 'validation.default', + translationParams: {}, + }; + } + + writeValue(value: any): void { + this.value = value; + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouch = fn; + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts new file mode 100644 index 00000000..2be754e1 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-control-reusable/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateFormControlReusable(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const tsPath = 'src/app/shared/utils/form-control-reusable.ts'; + + if (!options.overwrite && tree.exists(tsPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/utils/form-control-reusable/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'form-control-reusable', + }), + move('src/app/shared/utils'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template new file mode 100644 index 00000000..36cb155c --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/files/__name@dasherize__.ts.template @@ -0,0 +1,67 @@ +/** <%= options.generationDisclaimerText %> **/ +import {AbstractControl, ControlValueAccessor, FormGroup, ValidationErrors, Validator} from '@angular/forms'; +import {takeUntil} from 'rxjs'; +import {mixinDestroyedSubject} from './destroyed-subject.mixin'; +import {CustomControlValidationError} from "./form-validators"; + +export abstract class FormGroupReusable extends mixinDestroyedSubject() implements ControlValueAccessor, Validator { + abstract formGroup: FormGroup; + abstract formControlName: string; + + protected constructor() { + super(); + } + + get error(): CustomControlValidationError { + if (this.formGroup.errors && this.formGroup.errors['required']) { + return { + translationKey: 'validation.required', + translationParams: {}, + }; + } + + const errors = Object.values(this.formGroup.errors ?? []); + const error = errors.find(value => !!value); + + return error ?? null; + } + + get groupSpecificError(): CustomControlValidationError { + if (this.formGroup.errors && this.formGroup.errors['required']) { + return { + translationKey: 'validation.required', + translationParams: {}, + }; + } + + const errors = Object.values(this.formGroup.errors ?? []); + const error = errors.find(value => !!value && value.isGroupSpecificError); + + return error ?? null; + } + + registerOnChange(fn: any): void { + if (!this.formGroup) return; + + this.formGroup.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe(fn); + } + + registerOnTouched(fn: any): void { + if (!this.formGroup) return; + + this.formGroup.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe(fn); + } + + setDisabledState(isDisabled: boolean): void { + isDisabled ? this.formGroup.disable() : this.formGroup.enable(); + } + + writeValue(value: any): void { + this.formGroup.patchValue(value, {emitEvent: false}); + } + + validate(control: AbstractControl): ValidationErrors | null { + return this.formGroup.valid ? null : {[this.formControlName]: true}; + } +} + diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts new file mode 100644 index 00000000..688ee699 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-group-reusable/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateFormGroupReusable(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const tsPath = 'src/app/shared/utils/form-group-reusable.ts'; + + if (!options.overwrite && tree.exists(tsPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/utils/form-group-reusable/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'form-group-reusable', + }), + move('src/app/shared/utils'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template new file mode 100644 index 00000000..b8aaa43e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/files/__name@dasherize__.ts.template @@ -0,0 +1,1090 @@ +/** <%= options.generationDisclaimerText %> **/ + +import {AbstractControl, FormArray, FormGroup, ValidationErrors, ValidatorFn} from '@angular/forms'; +import * as charsetDetector from 'charset-detector'; + +export interface CustomControlValidationError { + translationKey: string; + translationParams: {[key: string]: any}; +} + +type BoundDefinition = 'OPEN' | 'AT_LEAST' | 'GREATER_THAN' | 'LESS_THAN' | 'AT_MOST'; +type Encoding = 'US-ASCII' | 'ISO-8859-1' | 'UTF-8' | 'UTF-16' | 'UTF-16BE' | 'UTF-16LE'; + +export class FormValidators { + static applyToChildren(validator: ValidatorFn): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const group = control as FormGroup; + const controls = Object.values(group.controls); + + const validationErrors = controls + .map(c => { + const errors = validator(c); + + if (errors) { + c.setErrors(errors); + } + + return errors; + }) + .filter(c => !!c); + + return validationErrors[0] ?? null; + }; + } + + static uniqueValuesValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const group = control as FormGroup; + + if (!group.value) { + return null; + } + + const values = Object.values(group.value).filter(value => !!value); + const isUnique = new Set(values).size === values.length; + + return !isUnique ? { + lengthMin: { + translationKey: 'validation.group_unique_values', + translationParams: {}, + isGroupSpecificError: true + }, + } + : null; + }; + } + + static listLengthValidator(min: number | undefined, max: number | undefined): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const array = control as FormArray; + + if (!array.value) { + return null; + } + + const length = array.value.length + const minStatement = min !== undefined ? length >= min : true; + const maxStatement = max !== undefined ? length <= max : true; + + return !minStatement + ? { + lengthMin: { + translationKey: 'validation.list_length_min', + translationParams: { + min + }, + isGroupSpecificError: true + } + } + : !maxStatement + ? { + lengthMax: { + translationKey: 'validation.list_length_max', + translationParams: { + max + }, + isGroupSpecificError: true + } + } + : null; + }; + } + + static deconstructionRuleValidator(rules: {name: string; rule: RegExp}[]): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const group = control as FormGroup; + + if (!group.value) { + return null; + } + + const validationErrors = rules + .map(({name, rule}) => { + const control = group.get(name); + + if (!control) { + return null; + } + + const validator = FormValidators.regularExpression(rule); + const errors = validator(control); + + if (errors) { + control.setErrors(errors); + } + + return errors; + }) + .filter(c => !!c); + + return validationErrors[0] ?? null; + }; + } + + static encodingValidator(encoding: Encoding): ValidatorFn { + const error = { + encoding: { + translationKey: 'validation.encoding', + translationParams: { + encoding + }, + } + }; + + const utf16Validator = (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const encoder = new TextEncoder(); + const uint8Array = encoder.encode(value); + + const charsetMatch = charsetDetector.default(uint8Array); + const utf16BeCharsetMatch = charsetMatch.find(charset => charset.charsetName === 'UTF-16BE'); + const utf16LeCharsetMatch = charsetMatch.find(charset => charset.charsetName === 'UTF-16LE'); + const isMatch = utf16BeCharsetMatch && utf16LeCharsetMatch; + + return isMatch ? null : error; + }; + + const usAsciiValidator = (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[\x00-\x7F]*$/; + const isMatch = pattern.test(value); + + return isMatch ? null : error; + }; + + const iso88591Validator = (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[\x00-\xFF]*$/; + const isMatch = pattern.test(value); + + return isMatch ? null : error; + }; + + const defaultValidator = (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const encoder = new TextEncoder(); + const uint8Array = encoder.encode(value); + + const charsetMatch = charsetDetector.default(uint8Array); + const isMatch = !!charsetMatch.find(charset => charset.charsetName === encoding); + + return isMatch ? null : error; + }; + + return encoding === 'UTF-16' + ? utf16Validator + : encoding === 'US-ASCII' + ? usAsciiValidator + : encoding === 'ISO-8859-1' + ? iso88591Validator + : defaultValidator; + } + + static fixedPointValidator(integerLength: number, scaleLength: number): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const stringValue = typeof value === "string" + ? value + : value.toString + ? value.toString() + : JSON.stringify(value); + + const chunks = stringValue.split('.'); + const integerValueLength = chunks[0]?.length ?? 0; + const scaleValueLength = chunks[1]?.length ?? 0; + + return chunks.length !== 2 + ? { + fixedPoint: { + translationKey: 'validation.fixed_point_parts', + translationParams: {}, + } + } + : integerValueLength !== integerLength + ? { + fixedPoint: { + translationKey: 'validation.fixed_point_integer', + translationParams: { + integerLength + }, + } + } + : scaleValueLength !== scaleLength + ? { + fixedPoint: { + translationKey: 'validation.fixed_point_scale', + translationParams: { + scaleLength + }, + } + } + : null; + } + } + + static lengthValidator(min: number | undefined, max: number | undefined): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const length = value.length; + const minStatement = min !== undefined ? length >= min : true; + const maxStatement = max !== undefined ? length <= max : true; + + return !minStatement + ? { + lengthMin: { + translationKey: 'validation.length_min', + translationParams: { + min + }, + } + } + : !maxStatement + ? { + lengthMax: { + translationKey: 'validation.length_max', + translationParams: { + max + }, + } + } + : null; + } + } + + static rangeValidator( + min: number | undefined | null, + lowerBoundDefinition: BoundDefinition, + max: number | undefined | null, + upperBoundDefinition: BoundDefinition + ): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value && value !== 0) { + return null; + } + + let minStatement = true; + if (min !== undefined && min !== null) { + minStatement = + lowerBoundDefinition === 'AT_LEAST' ? value >= min : lowerBoundDefinition === 'GREATER_THAN' ? value > min : true; + } + + let maxStatement = true; + if (max !== undefined && max !== null) { + maxStatement = + upperBoundDefinition === 'AT_MOST' ? value <= max : upperBoundDefinition === 'LESS_THAN' ? value < max : true; + } + + return !minStatement + ? { + rangeMin: { + translationKey: lowerBoundDefinition === 'AT_LEAST' ? 'validation.range_min_inclusive' : 'validation.range_min', + translationParams: { + min + }, + } + } + : !maxStatement + ? { + rangeMax: { + translationKey: upperBoundDefinition === 'AT_MOST' ? 'validation.range_max_inclusive' : 'validation.range_max', + translationParams: { + max + }, + } + } + : null + }; + } + + static regularExpression(pattern: RegExp): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value && value !== 0) { + return null; + } + + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + regularExpression: { + translationKey: 'validation.regular_expression', + translationParams: { + pattern: pattern.source, + }, + } + }; + }; + } + + static byteValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[-+]?[0-9]+$/; + const maxInclusive = 127; + const minInclusive = -128; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.byte', + translationParams: {}, + } + }; + } + } + + static floatValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^\s*([-+]?(?:\d+\.\d+|\.\d+|\d+)(?:[eE][-+]?\d+)?|([-+]?)INF|NaN)\s*$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.float', + translationParams: {}, + } + }; + } + } + + static decimalValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^\s*([-+]?\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?\s*$/ + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.decimal', + translationParams: {}, + } + }; + } + } + + static doubleValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^\s*([-+]?(?:\d+\.\d+|\.\d+|\d+)(?:[eE][-+]?\d+)?|([-+]?)INF|NaN)\s*$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.double', + translationParams: {}, + } + }; + } + } + + static integerValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.integer', + translationParams: {}, + } + }; + } + } + + static intValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 2147483647; + const minInclusive = -2147483648; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.int', + translationParams: {}, + } + }; + } + } + + static positiveIntegerValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const minInclusive = 1; + const isMatch = pattern.test(value) && value >= minInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.positive_integer', + translationParams: {}, + } + }; + } + } + + static longValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const error = { + byte: { + translationKey: 'validation.long', + translationParams: {}, + }, + }; + + if (!+value && +value !== 0) { + return error; + } + + const pattern = /^[+-]?\d+$/; + const isPatternMatch = pattern.test(value); + + if (!isPatternMatch) { + return error; + } + + const maxInclusive = BigInt('9223372036854775807'); + const minInclusive = BigInt('-9223372036854775808'); + const bigIntValue = BigInt(value); + + const isMatch = isPatternMatch && bigIntValue >= minInclusive && bigIntValue <= maxInclusive; + + return isMatch + ? null + : error; + }; + } + + static negativeIntegerValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = -1; + const isMatch = pattern.test(value) && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.negative_integer', + translationParams: {}, + } + }; + } + } + + static nonPositiveIntegerValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 0; + const isMatch = pattern.test(value) && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.non_positive_integer', + translationParams: {}, + } + }; + } + } + + static nonNegativeIntegerValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const minInclusive = 0; + const isMatch = pattern.test(value) && value >= minInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.non_negative_integer', + translationParams: {}, + } + }; + } + } + + static shortValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 32767; + const minInclusive = -32768; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.short', + translationParams: {}, + } + }; + } + } + + static unsignedIntValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 4294967295; + const minInclusive = 0; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.unsigned_int', + translationParams: {}, + } + }; + } + } + + static unsignedByteValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 255; + const minInclusive = 0; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.unsigned_byte', + translationParams: {}, + } + }; + } + } + + static unsignedLongValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const error = { + byte: { + translationKey: 'validation.unsigned_long', + translationParams: {}, + }, + }; + + if (!+value && +value !== 0) { + return error; + } + + const pattern = /^[+-]?\d+$/; + const isPatternMatch = pattern.test(value); + + if (!isPatternMatch) { + return error; + } + + const maxInclusive = BigInt('18446744073709551615'); + const minInclusive = BigInt('0'); + const bigIntValue = BigInt(value); + + const isMatch = isPatternMatch && bigIntValue >= minInclusive && bigIntValue <= maxInclusive; + + return isMatch + ? null + : error; + }; + } + + static unsignedShortValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^[+-]?\d+$/; + const maxInclusive = 65535; + const minInclusive = 0; + + const isMatch = pattern.test(value) && value >= minInclusive && value <= maxInclusive; + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.unsigned_short', + translationParams: {}, + } + }; + } + } + + static numberValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?\d*\.?\d+$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.number', + translationParams: {}, + } + }; + } + } + + static gDayValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^---(0[1-9]|[12][0-9]|3[01])(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.g_day', + translationParams: {}, + } + }; + } + } + + static gMonthValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^--(0[1-9]|1[0-2])(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.g_month', + translationParams: {}, + } + }; + } + } + + static gMonthDayValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^--(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.g_month_day', + translationParams: {}, + } + }; + } + } + + static gYearValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?([1-9][0-9]{3,}|0[0-9]{3})(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.g_year', + translationParams: {}, + } + }; + } + } + + static gYearMonthValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?([1-9][0-9]{3,}|0[0-9]{3})-(0[1-9]|1[0-2])(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.g_year_month', + translationParams: {}, + } + }; + } + } + + static durationValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?P(\d+Y)?(\d+M)?(\d+D)?(T(\d+H)?(\d+M)?(\d+(\.\d+)?S)?)?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.duration', + translationParams: {}, + } + }; + } + } + + static dayTimeDurationValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?P(\d+D)?(T(\d+H)?(\d+M)?(\d+(\.\d+)?S)?)?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.day_time_duration', + translationParams: {}, + } + }; + } + } + + static yearMonthDurationValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^-?P((\d+Y\d+M)|(\d+Y)|(\d+M))$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.year_month_duration', + translationParams: {}, + } + }; + } + } + + static timeValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^(([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\.[0-9]+)?|(24:00:00(\.0+)?))(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.time', + translationParams: {}, + } + }; + } + } + + static hexBinaryValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^([0-9a-fA-F]{2})*$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.hex_binary', + translationParams: {}, + } + }; + } + } + + static base64BinaryValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}[A-Za-z0-9+/=]|([A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)|([A-Za-z0-9+/]{1}[AQgw]=?=?)))?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.base64_binary', + translationParams: {}, + } + }; + } + } + + static anyUriValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^(?!.*#.*#.*$)(?!.*%[^A-Fa-f0-9]|%[A-Fa-f0-9]{1}$)[^\s]+$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.any_URI', + translationParams: {}, + } + }; + } + } + + static curieValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^(?:\[[\w-]+:[^\[\]]+\]|(?::[\w-]+)|(?:[\w-]+:)?[\w'"#+-]+)$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.curie', + translationParams: {}, + } + }; + } + } + + static langStringValidator(): ValidatorFn { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + + if (!value) { + return null; + } + + const pattern = /^".+"@[a-zA-Z]+(-[a-zA-Z0-9]+)?$/; + const isMatch = pattern.test(value); + + return isMatch + ? null + : { + byte: { + translationKey: 'validation.lang_string', + translationParams: {}, + } + }; + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/index.ts new file mode 100644 index 00000000..05766a9f --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/form-validators/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, noop, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateFormValidators(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const tsPath = 'src/app/shared/utils/form-validators.ts'; + + if (!options.overwrite && tree.exists(tsPath)) { + return noop(); + } + + return mergeWith( + apply(url('../shared/generators/utils/form-validators/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'form-validators', + }), + move('src/app/shared/utils'), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/generators/utils/index.ts b/libs/schematic/generators/ng-generate/components/shared/generators/utils/index.ts new file mode 100644 index 00000000..c2d22977 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/generators/utils/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +export * from './form-control-reusable/index'; +export * from './form-group-reusable/index'; +export * from './form-validators/index'; +export * from './destroyed-subject/index'; diff --git a/libs/schematic/generators/ng-generate/components/shared/include.ts b/libs/schematic/generators/ng-generate/components/shared/include.ts new file mode 100644 index 00000000..e087be4b --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/include.ts @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {applyContentTemplate, FileEntry, Rule, SchematicContext, SchematicsException, Tree, url} from '@angular-devkit/schematics'; +import {basename, dirname} from 'path'; +import {strings} from '@angular-devkit/core'; +import {Schema} from './schema'; + +/** + * Type definition for the function to include a template. + */ +type IncludeFunction = (path: string, data?: Schema) => string; + +/** + * Context for the template include function. + */ +interface IncludeContext { + includeBaseDirectory?: string; + context: SchematicContext; + include: IncludeFunction; + data: Schema; +} + +/** + * Prepares the context for including templates and binds the necessary context. + * + * @param {SchematicContext} context - The schematic context. + * @param {Rule} applyTemplate - Rule to apply the template. + * @param {Schema} options - Schema data. + * @param {string} [includeBaseDirectory] - Base directory for includes. + * @returns {Rule} Bound template rule. + */ +export function templateInclude(context: SchematicContext, applyTemplate: Rule, options: Schema, includeBaseDirectory?: string): Rule { + const includeContext = createIncludeContext(context, options, includeBaseDirectory); + (options as any).include = includeContext.include; + + return applyTemplate.bind(includeContext); +} + +/** + * Creates the include context with the provided parameters. + * + * @param {SchematicContext} context - The schematic context. + * @param {Schema} data - Schema data. + * @param {string} [includeBaseDirectory] - Base directory for includes. + * @returns {IncludeContext} Formed include context. + */ +function createIncludeContext(context: SchematicContext, data: Schema, includeBaseDirectory?: string): IncludeContext { + const includeContext: Partial = {context, data}; + + includeContext.includeBaseDirectory = includeBaseDirectory; + includeContext.include = include.bind(includeContext); + + return includeContext as IncludeContext; +} + +/** + * Includes and applies the content template from the provided filepath. + * + * @this {IncludeContext} + * @param {string} filepath - Path to the file. + * @param {Schema} [templateData] - Data for the template. + * @returns {string} Processed template content. + */ +export function include(this: IncludeContext, filepath: string, templateData: Schema = this.data): string { + const {directory, filename} = getDirectoryAndFilename(filepath, this.includeBaseDirectory); + const tree = createTreeFromSource(this.context, directory); + + validateTreeContainsFile(tree, filename); + + const result = generateContentTemplate(templateData, tree.get(filename)!); + + return result.content.toString(); +} + +/** + * Determines the directory and filename from the given filepath. + * + * @param {string} filepath - Full path to the file. + * @param {string} [includeBaseDirectory] - Base directory for includes. + * @returns {Object} Directory and filename details. + */ +function getDirectoryAndFilename( + filepath: string, + includeBaseDirectory?: string +): { + directory: string; + filename: string; +} { + return { + directory: includeBaseDirectory || dirname(filepath), + filename: includeBaseDirectory ? filepath : basename(filepath), + }; +} + +/** + * Creates a tree from a source directory. + * + * @param {SchematicContext} context - The schematic context. + * @param {string} directory - The directory path. + * @returns {Tree} The generated tree. + */ +function createTreeFromSource(context: SchematicContext, directory: string): Tree { + return url(directory)(context) as Tree; +} + +/** + * Validates that the tree contains the specified filename. + * + * @param {Tree} tree - The tree to check. + * @param {string} filename - The filename to validate. + */ +function validateTreeContainsFile(tree: Tree, filename: string) { + if (!tree.exists(filename)) { + throw new SchematicsException(`Template file: "${filename}" not found.`); + } +} + +/** + * Generates a content template from provided data and file. + * + * @param {Schema} templateData - Data for the template. + * @param {FileEntry} file - The file to generate content for. + * @returns {FileEntry} Processed file. + */ +function generateContentTemplate(templateData: Schema, file: FileEntry): FileEntry { + const result = applyContentTemplate({ + classify: strings.classify, + dasherize: strings.dasherize, + camelize: strings.camelize, + options: {...templateData}, + name: templateData.name, + })(file); + + if (!result) { + throw new SchematicsException('Problem generating content template.'); + } + + return result; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/index.ts b/libs/schematic/generators/ng-generate/components/shared/index.ts new file mode 100644 index 00000000..33b8dee8 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/index.ts @@ -0,0 +1,433 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {dasherize} from '@angular-devkit/core/src/utils/strings'; +import {chain, Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import {NodePackageInstallTask, RunSchematicTask} from '@angular-devkit/schematics/tasks'; +import {JSONFile} from '@schematics/angular/utility/json-file'; +import {addToAppModule, addToAppSharedModule, addToComponentModule, wrapBuildComponentExecution} from '../../../utils/angular'; +import {generateTranslationFiles, loadAspectModel, loadRDF, validateUrns} from '../../../utils/aspect-model'; +import {formatGeneratedFiles, loadAndApplyConfigFile} from '../../../utils/file'; +import { + addPackageJsonDependencies, + DATE_QUICK_FILTER_DEPENDENCIES, + DEFAULT_DEPENDENCIES, + REMOTE_HANDLING_DEPENDENCIES, +} from '../../../utils/package-json'; +import {TemplateHelper} from '../../../utils/template-helper'; +import {ComponentType, Schema, Values} from './schema'; +import ora from 'ora'; +import { + generateCustomService, + generateFilterService, + generateGeneralStyle, + generateShowDescriptionPipe, + generateValidateInputDirective, +} from './generators/index'; +import {APP_SHARED_MODULES, cardModules, formModules, tableModules, updateSharedModule} from '../../../utils/modules'; +import {WIZARD_CONFIG_FILE} from '../../prompter/index'; +import {generateSemanticExplanation} from './generators/constants/index'; + +export let options: Schema; + +/** + * Generates a component using provided schema options. + * + * The function conditionally loads a configuration file if provided, + * creates several tasks related to the component generation process, + * and adds a package installation task if `skipInstall` is not set. + * + * @param {SchematicContext} context - Context of the schematics project. + * @param {Schema} schema - Schema options for component generation. + * @param {ComponentType} componentType - Component type to generate. + * Can include a config file path, and a flag to skip package installation. + * + * @returns Rule - A rule function that manipulates the original tree. + * In this case, it performs the component generation and related tasks. + */ +export function generateComponent(context: SchematicContext, schema: Schema, componentType: ComponentType) { + options = schema; + + let prompterTaskId = null; + if (options.configFile === undefined || options.configFile === '') { + options.configFile = WIZARD_CONFIG_FILE; + + prompterTaskId = context.addTask(new RunSchematicTask(`${componentType}-prompter`, options)); + } + + const generateTypesTaskId = context.addTask(new RunSchematicTask('types', options), prompterTaskId ? [prompterTaskId] : []); + + if (componentType !== ComponentType.TYPES) { + const componentGenId = context.addTask(new RunSchematicTask(`${componentType}-generation`, options), [generateTypesTaskId]); + + if (!options.skipInstall) { + context.addTask(new NodePackageInstallTask(), [componentGenId]); + } + } +} + +/** + * Prepares the options for the schema, applying defaults where necessary, + * and loading and applying the configuration file. + * @param {Schema} schema - The options to prepare. + * @param {ComponentType} componentType - Component type to generate. + * + * @returns {Schema} - The prepared options. + */ +export function prepareOptions(schema: Schema, componentType: ComponentType): Schema { + options = schema; + options.componentType = componentType; + + options.spinner = ora().start(); + options.templateHelper = new TemplateHelper(); + + const defaultOptions = { + skipImport: false, + }; + + if (options.configFile === 'wizard.config.json') { + options.configFile = WIZARD_CONFIG_FILE; + } + + options = { + ...defaultOptions, + ...options, + }; + + loadAndApplyConfigFile(options.configFile, options); + + if (options.aspectModelTFilesString) { + options.aspectModelTFiles = options.aspectModelTFilesString.split(','); + } + + validateUrns(options); + + if (options.jsonAccessPath.length > 0 && !options.jsonAccessPath.endsWith('.')) { + options.jsonAccessPath = `${options.jsonAccessPath}.`; + } + + return options; +} + +/** + * Returns a rule that loads an RDF schema. + * + * @returns {Rule} - The rule for loading the RDF schema. + */ +export function loadRdfRule(): Rule { + return loadRDF(options); +} + +/** + * Returns a rule that loads an Aspect Model schema. + * + * @returns {Rule} - The rule for loading the Aspect Model schema. + */ +export function loadAspectModelRule(): Rule { + return loadAspectModel(options); +} + +/** + * Sets custom actions and filters based on options. + * + * @returns {Rule} - The rule for setting custom actions and filters. + */ +export function setCustomActionsAndFiltersRule(): Rule { + return () => { + if (!options.addCommandBar) return; + + const propertiesCheck = [ + {properties: options.templateHelper.getStringProperties(options), function: 'addSearchBar'}, + {properties: options.templateHelper.getDateProperties(options), function: 'addDateQuickFilters'}, + {properties: options.templateHelper.getEnumProperties(options), function: 'addEnumQuickFilters'}, + ]; + + options.enabledCommandBarFunctions = options.enabledCommandBarFunctions.filter(func => + propertiesCheck.some(item => item.function === func && item.properties.length > 0) + ); + + if (options.templateHelper.haveCustomCommandbarActions(options)) { + options.enabledCommandBarFunctions.push('addCustomCommandBarActions'); + } + }; +} + +/** + * Sets the component name if it equals the specified type. + * @param {ComponentType} componentType - The type to compare the component name to. + * + * @returns {Rule} - The rule for setting the component name. + */ +export function setComponentNameRule(componentType: ComponentType): Rule { + return (tree: Tree, context: SchematicContext) => { + if (options.name === componentType) { + options.name = `${options.selectedModelElement?.name}-${options.name}`; + context.logger.info(`Option name set "${options.name}"`); + } + }; +} + +/** + * Inserts version into the selector. + * + * @returns {Rule} - The rule for inserting version into the selector. + */ +export function insertVersionIntoSelectorRule(): Rule { + return (tree: Tree) => { + const {prefix, name, enableVersionSupport, aspectModelVersion} = options; + const prefixPart = prefix ? `${prefix}-` : ''; + const namePart = dasherize(name).toLowerCase(); + const versionPart = enableVersionSupport ? `-v${aspectModelVersion.replace(/\./g, '')}` : ''; + + options.selector = `${prefixPart}${namePart}${versionPart}`; + + return tree; + }; +} + +/** + * Inserts version into the path. + * + * @returns {Rule} - The rule for inserting version into the path. + */ +export function insertVersionIntoPathRule(): Rule { + return (tree: Tree) => { + let pathSuffix = `/${dasherize(options.name).toLowerCase()}`; + + if (options.enableVersionSupport) { + pathSuffix += `/v${options.aspectModelVersion.replace(/\./g, '')}`; + } + + options.path += pathSuffix; + + return tree; + }; +} + +/** + * Sets values for the template options. + * + * @returns {Rule} - The rule for setting values for the template options. + */ +export function setTemplateOptionValuesRule(): Rule { + return (tree: Tree, context: SchematicContext) => { + options.templateHelper.setTemplateOptionValues(options as Values); + context.logger.info('Template option values set.'); + return tree; + }; +} + +/** + * Returns a set of rules to generate the general files. + * + * @returns {Array} - The rules for generating the general files. + */ +export function generateGeneralFilesRules(): Array { + return [ + generateFilterService(options), + generateGeneralStyle(options), + generateTranslationFiles(options, false), + wrapBuildComponentExecution(options), + generateCustomService(options), + generateValidateInputDirective(options), + generateShowDescriptionPipe(options), + generateSemanticExplanation(options as Values), + ]; +} + +/** + * Returns a set of rules to add and update configuration files. + * + * @returns {Array} - The rules for adding and updating configuration files. + */ +export function addAndUpdateConfigurationFilesRule(): Rule[] { + const componentModule = + options.componentType === ComponentType.TABLE + ? addToComponentModule(options.skipImport, options, tableModules(options)) + : options.componentType === ComponentType.CARD + ? addToComponentModule(options.skipImport, options, cardModules(options)) + : options.componentType === ComponentType.FORM + ? addToComponentModule(options.skipImport, options, formModules(options)) + : ({} as Rule); + + return [ + addPackageJsonDependencies(options.skipImport, options.spinner, loadDependencies()), + updateConfigFiles(options), + addToAppModule(options.skipImport, [ + { + name: 'BrowserAnimationsModule', + fromLib: '@angular/platform-browser/animations', + }, + ]), + componentModule, + addToAppSharedModule(false, APP_SHARED_MODULES), + updateSharedModule(options), + ]; +} + +/** + * Updates config files and sets allowedCommonJsDependencies if required. + * @param {any} options - The options for updating config files. + * + * @returns {Rule} - The rule for updating config files. + */ +function updateConfigFiles(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + const angularJson = JSON.parse(getJSONAsString('/angular.json', tree)); + const projectName = getProjectName(angularJson, tree); + const angularBuildOptions = angularJson['projects'][projectName]['architect']['build']['options']; + + if (options.enableRemoteDataHandling) { + updateDependencies(angularBuildOptions, tree); + } + + addStylePreprocessorOptions(angularBuildOptions); + addOptionalMaterialTheme(angularBuildOptions, options.getOptionalMaterialTheme); + + tree.overwrite('/angular.json', JSON.stringify(angularJson, null, 2)); + + return tree; + }; +} + +/** + * Updates the given project's dependencies. + * @param {object} angularBuildOptions - The Angular build options for the project. + * @param {Tree} tree - The tree of files in the project. + */ +function updateDependencies(angularBuildOptions: any, tree: Tree) { + angularBuildOptions['allowedCommonJsDependencies'] = ['rollun-ts-rql', 'crypto', 'moment', 'papaparse']; + const tsConfigJson = getTsConfigJson(tree); + tsConfigJson['compilerOptions']['paths'] = { + path: ['node_modules/path-browserify'], + crypto: ['node_modules/crypto-js'], + }; + tree.overwrite('/tsconfig.json', JSON.stringify(tsConfigJson, null, 2)); +} + +/** + * Retrieves the tsconfig.json file as a JavaScript object. + * @param {Tree} tree - The tree of files in the project. + * + * @returns {object} The contents of the tsconfig.json file. + */ +function getTsConfigJson(tree: Tree) { + let tsFileContent = getJSONAsString('/tsconfig.json', tree); + // removing /** */ comments from file to parse javascript object + tsFileContent = tsFileContent.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); + return JSON.parse(tsFileContent); +} + +/** + * Optionally adds the default Material theme to the project's styles. + * @param {object} angularBuildOptions - The Angular build options for the project. + * @param {function} getOptionalMaterialTheme - Function to get optional Material theme. + */ +function addOptionalMaterialTheme(angularBuildOptions: any, getOptionalMaterialTheme: any) { + const defaultMaterialTheme = 'node_modules/@angular/material/prebuilt-themes/indigo-pink.css'; + if (getOptionalMaterialTheme && !angularBuildOptions['styles'].includes(defaultMaterialTheme)) { + angularBuildOptions['styles'].push(defaultMaterialTheme); + } +} + +/** + * Adds preprocessor options to the styles in the project. + * @param {object} angularBuildOptions - The Angular build options for the project. + */ +function addStylePreprocessorOptions(angularBuildOptions: any): void { + const KEY_STYLE_PREPROCESSOR_OPT = 'stylePreprocessorOptions'; + const KEY_INCLUDE_PATH = 'includePaths'; + const SCSS_PATH = 'src/assets/scss'; + + if (!angularBuildOptions[KEY_STYLE_PREPROCESSOR_OPT]) { + angularBuildOptions[KEY_STYLE_PREPROCESSOR_OPT] = {}; + angularBuildOptions[KEY_STYLE_PREPROCESSOR_OPT][KEY_INCLUDE_PATH] = []; + } + + const optionIncludePaths = angularBuildOptions[KEY_STYLE_PREPROCESSOR_OPT][KEY_INCLUDE_PATH]; + if (optionIncludePaths && !optionIncludePaths.find((entry: string) => entry === SCSS_PATH)) { + optionIncludePaths.push(SCSS_PATH); + } else { + angularBuildOptions[KEY_STYLE_PREPROCESSOR_OPT][KEY_INCLUDE_PATH] = [SCSS_PATH]; + } +} + +/** + * Retrieves the name of the project from the given Angular configuration object. + * @param {object} angularJson - The contents of the angular.json file for the project. + * @param {Tree} tree - The tree of files in the project. + * + * @returns {string} The name of the project. + */ +function getProjectName(angularJson: any, tree: Tree): string { + if (angularJson['defaultProject']) { + return angularJson['defaultProject']; + } + + return Object.keys(JSON.parse(getJSONAsString('/angular.json', tree))['projects'])[0]; +} + +/** + * Reads a JSON file and returns its content as a string. + * @param {string} path - The path to the JSON file. + * @param {Tree} tree - The tree of files in the project. + * + * @returns {string} The contents of the JSON file as a string. + */ +function getJSONAsString(path: string, tree: Tree): string { + return new JSONFile(tree, path)['content']; +} + +/** + * Loads dependencies based on project options. + * + * @returns {Array} The list of dependencies to be loaded. + */ +function loadDependencies() { + const dependencies = [...DEFAULT_DEPENDENCIES]; + + if (options.enableRemoteDataHandling) { + dependencies.push(...REMOTE_HANDLING_DEPENDENCIES); + } + + if (options.enabledCommandBarFunctions?.includes('addDateQuickFilters') || options.skipImport) { + dependencies.push(...DATE_QUICK_FILTER_DEPENDENCIES); + } + + return dependencies; +} + +/** + * Returns a rule that formats all files. + * + * @returns {Rule} - The rule for formatting all files. + */ +export function formatAllFilesRule(): Rule { + const optionsPath = options.path || ''; + const paths = [ + optionsPath, + optionsPath.replace('app', 'assets/i18n'), + 'src/app/shared/directives', + 'src/app/shared/pipes', + 'src/app/shared/constants', + 'src/app/shared/services', + `src/app/shared/components/${options.name}`, + 'src/assets/scss', + 'src/app/shared', + ]; + + const rules = paths.map(path => formatGeneratedFiles({getPath: () => path}, options)); + rules.push(formatGeneratedFiles({getPath: () => 'src/app/shared'}, options, ['app-shared.module.ts'])); + + return chain(rules); +} diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/export/csv.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/export/csv.ts.template new file mode 100644 index 00000000..b139c3b4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/export/csv.ts.template @@ -0,0 +1,36 @@ +exportToCsv() { + this.openExportConfirmationDialog(); +} + +openExportConfirmationDialog() { + const reduce = this.displayedColumns.filter(col => col === 'checkboxes' || col === 'columnsMenu').length; + + const dialogRef = this.dialog.open(ExportConfirmationDialogComponent, { + data: { + <% if (options.enableRemoteDataHandling) { %>extendedCsvExporter: this.extendedCsvExporter,<% } %> + allColumns: this.columns.length, + displayedColumns: this.displayedColumns.length - reduce, + maxExportRows: this.maxExportRows, + }, + maxWidth: 478, + }); + + dialogRef.afterClosed() + .pipe(filter(e => !!e)) + .subscribe((event: { action: Action, exportAllPages: boolean; exportAllColumns: boolean }): void => { + if (event.action === Action.cancel) { + return; + } + + if (event.exportAllPages && this.data.length > this.maxExportRows) { + this.data.length = this.maxExportRows; + } + + <% if (options.enableRemoteDataHandling) { %> + const columns = event.exportAllColumns ? this.columns.map(c => c.name) : this.displayedColumns; + this.extendedCsvExporter?.export(columns, this.rqlString); + <% } else { %> + this.prepareCsv(this.<%= (camelize((options.enableRemoteDataHandling && options.customRemoteService ? 'custom' : '') + name)) %>Service.flatten(this.data), event.exportAllColumns, event.exportAllPages,this.paginator.pageSize); + <% } %> + }); +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/generation/extended-table.html.template b/libs/schematic/generators/ng-generate/components/shared/methods/generation/extended-table.html.template new file mode 100644 index 00000000..237cc773 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/generation/extended-table.html.template @@ -0,0 +1,189 @@ +
+ +
+ + + + + + + + <% if (options.addRowCheckboxes) { %> + + + + + + <% } %> + + <% for(let value of options.tableColumns) { %> + <% + let language = options.templateHelper.isMultiStringProperty(value.property) ? '[currentLanguage]' : ''; + let propertyName = options.templateHelper.isEnumPropertyWithEntityValues(value.property) + ? value.property.name + '?.' + options.templateHelper.getEnumEntityInstancePayloadKey(value.property) + : value.property.name; + let cellPropertyPath = `${options.jsonAccessPath}${value.complexPrefix}${propertyName}`; + let isEmptyValue = `row.${cellPropertyPath} === null || row.${cellPropertyPath} === undefined`; + let propertyLocaleKeyPath = `${options.templateHelper.getVersionedAccessPrefix(options)}${options.isAspectSelected ? options.jsonAccessPath : ''}${value.complexPrefix}${value.property.name}`; + let datePipe = options.templateHelper.isDateTimeProperty(value.property) ? `| date: ${options.resolveDateTimeFormat(options, value.property)}` : ''; + let descriptionPipe = options.templateHelper.isEnumPropertyWithEntityValues(value.property) ? ` | showDescription:get${classify(value.property.name)}Value` : ''; + let cellContent = `!(${isEmptyValue}) ? (row.${cellPropertyPath}${descriptionPipe}${language}${datePipe}) : '-'`; + let isLink = options.templateHelper.isLinkProperty(value.property) + %> + + + + + + + + <% } %> + + <% if(options.customColumns && options.customColumns.length > 0) { %> + <% for(let [index, columnName] of options.customColumns.entries()) { %> + <% let customColumnIndex = options.tableColumns.length + index + 1; %> + + + <% if(options.enableVersionSupport) { %> + + <% } else { %> + + <% } %> + + + <% } %> + <% } %> + + <%= options.getCustomRowActions(options) %> + + + + + + + + + +
+ {{noDataMessage || 'No data'}} +
+ + + + + [resizeColumn]="true" [index]="<%= value.index %>" (dragging)='dragging = $event' + > + + {{ '<%= propertyLocaleKeyPath %>.preferredName' | transloco }} + + info_outlined + + class="table-cell-number" + <% } %> + > + + <% if (isLink) { %> + + <% } else { %> + + [description]="'<%= propertyLocaleKeyPath %>.description' | transloco" + <% } %> + <% if(options.hasSearchBar) { %> + [configs]="configs" + [highlightString]="highlightString" + <% } %> + (copyToClipboardEvent)="copyToClipboard($event)" + > + <% } %> + + + {{'<%= options.selectedModelTypeName.toLowerCase() %>.v<%= options.formatedAspectModelVersion %>.customColumn.<%= columnName %>' | transloco }} + + info_outlined + + + {{ '<%= options.selectedModelTypeName.toLowerCase() %>.customColumn.<%= columnName %>' | transloco }} + + info_outlined + + + + +
+ + + <<%= dasherize(name) %>-column-menu (columnsChangedEvent)="setDisplayedColumns($event)">-column-menu> + + + <% if (options.hasSearchBar) { %> + + <<%= dasherize(name) %>-config-menu (configChangedEvent)="setConfiguration($event)">-config-menu> + + <% } %> + +
+ + + + +
+ diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/generation/simple-table.html.template b/libs/schematic/generators/ng-generate/components/shared/methods/generation/simple-table.html.template new file mode 100644 index 00000000..767b4d0d --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/generation/simple-table.html.template @@ -0,0 +1,133 @@ +
+ +
+ + + +
+ + + + + + + + <% + let tableColumValuesFunc = options.tableColumValues(options.listProps, options); + let propertyColumns = tableColumValuesFunc.map(val => val.property.name); + %> + + + + + + + + <% for(let value of tableColumValuesFunc) { %> + <% + let language = options.templateHelper.isMultiStringProperty(value.property) ? '[currentLanguage]' : ''; + let propertyName = options.templateHelper.isEnumPropertyWithEntityValues(value.property) + ? value.property.name + '?.' + options.templateHelper.getEnumEntityInstancePayloadKey(value.property) + : value.property.name; + let cellPropertyPath = `${options.jsonAccessPath}${value.complexPrefix}${propertyName}`; + let isEmptyValue = `row.${cellPropertyPath} === null || row.${cellPropertyPath} === undefined`; + let propertyLocaleKeyPath = `${options.templateHelper.getVersionedAccessPrefix(options)}${options.isAspectSelected ? options.jsonAccessPath : ''}${value.complexPrefix}${value.property.name}`; + let datePipe = options.templateHelper.isDateTimeProperty(value.property) ? `| date: ${options.resolveDateTimeFormat(options, value.property)}` : ''; + let descriptionPipe = options.templateHelper.isEnumPropertyWithEntityValues(value.property) ? ` | showDescription:get${classify(value.property.name)}Value` : ''; + let cellContent = `!(${isEmptyValue}) ? (row.${cellPropertyPath}${descriptionPipe}${language}${datePipe}) : '-'`; + %> + + <% if (value.property.characteristic.elementCharacteristic?.dataType.isComplex || (value.property.characteristic.dataType !== null && value.property.characteristic.dataType.isComplex)) { %> + +
+ <% } %> + + + +
+ + + + + <% if (value.property.characteristic.elementCharacteristic?.dataType.isComplex || (value.property.characteristic.dataType !== null && value.property.characteristic.dataType.isComplex)) { %> + + + <% } %> + <% } %> + + + +
+ {{noDataMessage || 'No data'}} +
Select + + + [resizeColumn]="true" [index]="<%= value.index %>" (dragging)='dragging = $event' + > + + {{ '<%= propertyLocaleKeyPath %>.preferredName' | transloco }} + + + [matTooltip]="!('<%= isEmptyValue %>') ? (row.<%= cellPropertyPath %><%= descriptionPipe %>:true<%= language %>) :''" [matTooltipDisabled]="'<%= isEmptyValue %>'" + <% } %> + + mat-cell *matCellDef="let row; let i = index" [formGroupName]="i" + + <% if(options.templateHelper.isNumberProperty(value.property)) { %> + class="table-cell-number" + <% } %> + > + + <% if(value.property.characteristic.elementCharacteristic?.dataType.isScalar || (value.property.characteristic.dataType !== null && value.property.characteristic.dataType.isScalar)) { %> + + <% } else if(value.property.characteristic.elementCharacteristic?.dataType.isComplex || (value.property.characteristic.dataType !== null && value.property.characteristic.dataType.isComplex)) { %> + <% let dataTypeName = value.property.characteristic.elementCharacteristic? value.property.characteristic.elementCharacteristic.dataType.name : value.property.characteristic.dataType.name; %> + + <% } %> + + + content_copy + +
+
+ + diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/column.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/column.ts.template new file mode 100644 index 00000000..a78b7d94 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/column.ts.template @@ -0,0 +1,6 @@ +export interface Column { + /** Column name **/ + name: string; + /** State if the column is selected **/ + selected: boolean; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/config.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/config.ts.template new file mode 100644 index 00000000..ff50ee00 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/interfaces/config.ts.template @@ -0,0 +1,10 @@ +export interface Config { + /** Column name **/ + name: string; + /** Desc of the config **/ + desc: string; + /** State if the column is selected **/ + selected: boolean; + /** Color for the highlighted configuration **/ + color?: string; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template new file mode 100644 index 00000000..8b64fbff --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/custom-rql-filter-extensions.ts.template @@ -0,0 +1,34 @@ +/** + * Interface of a CustomRQLFilterExtension which will be used to + * modify the RQL query before the API service will be called to query + * the backend. + */ +export interface CustomRQLFilterExtension { + /** + * Apply modification to the given RQL query + */ + apply(query: And): void; +} + +/** + * Interface of a CustomRQLOptionExtension which will be used to + * modify the RQL query before the API service will be called to query + * the backend. + */ +export interface CustomRQLOptionExtension { + /** + * Apply modification to the given RQL query + */ + apply(query: Query): void; +} + +/** + * Interface of ExtendedCsvExporter which will used to export data + * from a remote backend. + */ +export interface ExtendedCsvExporter { + /** + * Exports the all data + */ + export(displayedColumns: string[], rqlQuery: string): void; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/imports.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/imports.ts.template new file mode 100644 index 00000000..f9060a0a --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/imports.ts.template @@ -0,0 +1,9 @@ +<% if (options.customRemoteService) { %> + import {Custom<%= classify(name) %>Service} from './custom-<%= dasherize(name) %>.service'; +<% } else { %> + import {EsmfRemoteTableService} from '@esmf/semantic-ui-schematic'; +<% } %> + +import {<%= options.aspectModel.name %>Response} from './<%= dasherize(options.name) %>.service'; +import {AbstractArrayNode, AbstractNode, And, Eq, Limit, Query, QueryStringifier, Sort} from 'rollun-ts-rql'; +import {SortOptions} from "rollun-ts-rql/dist/nodes/Sort"; diff --git a/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/requestData.ts.template b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/requestData.ts.template new file mode 100644 index 00000000..674bc785 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/methods/remote-handling/requestData.ts.template @@ -0,0 +1,123 @@ +private requestData() { + <% if (options.hasSearchBar) { %> + if (this.filterService.searchString.errors) { + return; + } + <% } %> + + const query = new And(); + + <% if (options.isEnumQuickFilter) { %> + this.filterService.applyEnumFilter(query); + <% } %> + + <% if (options.hasSearchBar) { %> + this.filterService.applyStringSearchFilter(query); + <% } %> + + <% if (options.isDateQuickFilter) { %> + this.filterService.applyDateFilter(query); + <% } %> + + if (this.customFilterExtension) this.customFilterExtension.apply(query); + + const queryFilter = new Query({query: query}); + + const queryOption = new Query(); + + <% if (options.componentType === 'card') { %> + if (this.filterService.sortedProperty) { + const sortProperty = this.filterService.sortedProperty; + const sortDirection = this.filterService.sortCard === SortCard.ASCENDING ? 1 : -1; + + queryOption.setSort(new Sort({[sortProperty]: sortDirection})); + } + <% } else { %> + if (this.sort.active) { + const sortProperty = this.sort.active; + const sortDirection = this.sort.direction === 'asc' ? 1 : -1; + + queryOption.setSort(new Sort({[sortProperty]: sortDirection})); + } + <% } %> + + queryOption.setLimit(new Limit(this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize)); + + if (this.customOptionsExtension) this.customOptionsExtension.apply(queryOption); + + const additionalCondition = new Eq('local', <% if (options.chooseLanguageForSearch) { %>'<%= options.chooseLanguageForSearch.toUpperCase() %>'<% } else { %>'EN'<% } %>); + queryFilter?.queryNode.subNodes.push(additionalCondition); + + const filterRQLQuery = queryFilter ? QueryStringifier.stringify(queryFilter) : ''; + const optionsRQLQuery = QueryStringifier.stringify(queryOption).replace(/&/g, ','); + + let rqlStringTemp = ''; + if (filterRQLQuery.length > 0) { + rqlStringTemp = `filter=${filterRQLQuery}`; + } + + if (optionsRQLQuery.length > 0) { + rqlStringTemp = `${rqlStringTemp}${rqlStringTemp !== '' ? '&' : ''}option=${optionsRQLQuery}`; + } + + if (!(QueryStringifier as any)['superParseQueryNode']) { + (QueryStringifier as any)['superParseQueryNode'] = QueryStringifier['parseQueryNode']; + } + + QueryStringifier['parseQueryNode'] = (node?: AbstractNode): string => { + let result = (QueryStringifier as any)['superParseQueryNode'](node); + if (node instanceof AbstractArrayNode) { + const arrayNode = node; + const encodedValues = arrayNode.values.map(value => QueryStringifier['withType'](QueryStringifier['withEncoding'](value))); + + // ensure outer brackets are not used. valid query ..in(, "value1", "value2", ...).. + result = `${QueryStringifier['withEncoding'](arrayNode.name, {isField: true})}(${QueryStringifier['withEncoding'](arrayNode.field, { + isField: true, + })}, ${encodedValues.join(',')})`; + } + return result; + }; + + this.rqlString = rqlStringTemp; + + if (this.requestSubscription && !this.requestSubscription.closed) { + this.requestSubscription.unsubscribe(); + } + + this.requestSubscription = this.tableService.requestData(this.remoteAPI, {query: rqlStringTemp}) + .pipe( + tap((movementResponse: <%= classify(options.aspectModel.name) %>Response) => { + this.dataLoadError = false; + this.totalItems = + movementResponse.totalItems !== null && movementResponse.totalItems !== undefined + ? movementResponse.totalItems + : movementResponse.items.length; + this.maxExportRows = this.totalItems; + + <% if (options.componentType === 'card') { %> + this.dataToShow = movementResponse.items; + this.dataSource.data = this.dataToShow; + this.paginator.length = this.dataToShow.length; + <% } else { %> + const dataToShow = movementResponse.items; + this.dataSource.setData(dataToShow); + <% } %> + + this.dataSource.paginator = this.paginator; + this.<% if (options.componentType === 'card') { %>card<% } else { %>table<% } %>UpdateFinishedEvent.emit(); + }), + catchError((error: any) => { + this.dataLoadError = false; + <% if (options.componentType === 'card') { %> + this.dataSource.setData([]); + <% } else { %> + this.dataSource.setData([]); + <% } %> + + this.<% if (options.componentType === 'card') { %>card<% } else { %>table<% } %>UpdateFinishedEvent.emit(error); + throw new Error(error.message); + }), + takeUntil(this.ngUnsubscribe) + ) + .subscribe(); +} diff --git a/libs/schematic/generators/ng-generate/components/shared/schema.ts b/libs/schematic/generators/ng-generate/components/shared/schema.ts new file mode 100644 index 00000000..1d06fc00 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/schema.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Schema as ComponentSchema} from '@schematics/angular/component/schema'; +import {DefaultSchema} from '../../default-schema'; +import {Property} from '@esmf/aspect-model-loader'; + +export enum ComponentType { + TABLE = 'table', + CARD = 'card', + FORM = 'form', + TYPES = 'types', +} + +export interface ExcludedProperty { + /** + * Name of the parent property which include the child property. Empty if the property + * is on the root, and it is not part of a complex Entity + **/ + prop: string; + + /** + * URN of the field to exclude + */ + propToExcludeAspectModelUrn: string; +} + +export interface ComplexEntityProperty { + /** + * Name of the parent property which include the child property. Empty if the property + * is on the root, and it is not part of a complex Entity + **/ + prop: string; + /** + * Properties of teh complex entity to show + */ + propsToShow: { + name: string; + aspectModelUrn: string; + }; +} + +export interface Schema extends ComponentSchema, DefaultSchema { + name: string; + defaultSortingCol: string; + addCommandBar: boolean; + enableRemoteDataHandling: boolean; + customRemoteService: boolean; + enabledCommandBarFunctions: string[]; + chooseLanguageForSearch: string; + customCommandBarActions: string[]; + enableVersionSupport: boolean; + excludedProperties: ExcludedProperty[]; + getExcludedPropLabels: boolean; + jsonAccessPath: string; + customStyleImports: []; + overwrite: boolean; + complexProps: Array<{prop: string; propsToShow: ComplexEntityProperty[]}>; + skipInstall: boolean; + getOptionalMaterialTheme: boolean; + skipImport: boolean; + componentType: ComponentType; + readOnlyForm: boolean; + selectedEl: string; + commandBarFilterOrder: string[]; +} + +export interface Values extends Schema { + filterServiceName: string; + hasSearchBar: boolean; + hasFilters: boolean; + typePath: string; + dateProperties: Property[]; + dateTimeStampProperties: Array; + timeProperties: Array; + generationDisclaimerText: string; + isDateQuickFilter: boolean; + isEnumQuickFilter: boolean; + selectedModelTypeName: string; + aspectModelTypeName: string; + localStorageKeyColumns: string; + localStoragePrefix: string; + localStorageKeyConfig: string; + versionedAccessPrefix: string; + translationPath: string; + isAspectSelected: boolean; + formatedAspectModelVersion: string; + listAllProperties: Array; +} diff --git a/libs/schematic/generators/ng-generate/components/shared/utils.ts b/libs/schematic/generators/ng-generate/components/shared/utils.ts new file mode 100644 index 00000000..46977676 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/shared/utils.ts @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import { + Characteristic, + DefaultCollection, + DefaultEither, + DefaultEnumeration, + DefaultScalar, + DefaultSingleEntity, + DefaultTrait, + Entity, + Property, + Samm, + Type, +} from '@esmf/aspect-model-loader'; +import {classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {Schema} from './schema'; + +/** + * Gets enum properties from provided options and converts them into a string. + * + * @param {Schema} options - The options object which should contain 'templateHelper' that provides methods for manipulating templates. + * @returns {string} - A string of comma-separated, classified enum property names. + */ +export function getEnumProperties(options: Schema): string { + return options.templateHelper + .getEnumProperties(options) + .map((property: Property) => classify(property.characteristic.name)) + .join(','); +} + +/** + * Generates enum property definitions for an array of properties. + * + * @param {Schema} options - The Schema options object. + * @param {Array} allProps - The array of Property objects. + * @return {string} The enum property definitions string. + */ +export function getEnumPropertyDefinitions(options: Schema, allProps: Array): string { + return allProps + .map((property: Property) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + return generateComplexEnumDef(options, property); + } else { + return generateSimpleEnumDef(options, property); + } + }) + .join(''); +} + +/** + * Generates an enum definition string for a complex property. + * + * @param {Schema} options - The Schema options object. + * @param {Property} property - The complex Property object. + * @return {string} The enum definition string for the complex property. + */ +function generateComplexEnumDef(options: Schema, property: Property): string { + const complexProps = options.templateHelper.getComplexProperties(property, options); + return complexProps.properties + .map((complexProp: Property) => { + const propKey = generateKey(`${complexProps.complexProp}_${complexProp.name}`); + return `${propKey} = '${complexProps.complexProp}.${complexProp.name}',`; + }) + .join(''); +} + +/** + * Generates an enum definition string for a simple property. + * + * @param {Schema} options - The Schema options object. + * @param {Property} property - The simple Property object. + * @return {string} The enum definition string for the simple property. + */ +function generateSimpleEnumDef(options: Schema, property: Property): string { + const propKey = generateKey(property.name); + return `${propKey} = '${options.jsonAccessPath}${property.name.trim()}',`; +} + +/** + * Generates a standardized key from a given property name. + * + * @param {string} name - The property name. + * @return {string} The standardized key. + */ +function generateKey(name: string): string { + return dasherize(name).replace(/-/g, '_').toUpperCase(); +} + +/** + * Retrieves table column values based on the provided properties and schema options. + * + * @param {Array} allProps - Array of all properties for the table columns. + * @param {Schema} options - Schema options object that contains additional information. + * @returns {Array<{property: Property; index: number; complexPrefix: string}>} - Returns an array of objects containing property details, index, and complexPrefix. + */ +export function getTableColumValues( + allProps: Array, + options: Schema +): Array<{ + property: Property; + index: number; + complexPrefix: string; + isEnumeration: boolean; +}> { + return allProps.flatMap((property: Property, index: number) => { + const isEnumeration = property.characteristic && property.characteristic instanceof DefaultEnumeration; + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexPropObj = options.templateHelper.getComplexProperties(property, options); + return complexPropObj.properties.map((complexProp: Property, index: number) => { + return { + property: complexProp, + index: index, + complexPrefix: `${complexPropObj.complexProp}.`, + isEnumeration, + }; + }); + } + + return [{property: property, index: index, complexPrefix: '', isEnumeration}]; + }); +} + +/** + * Resolves the datetime format based on the provided schema options and property. + * + * @param {Schema} options - Schema options object that contains additional information. + * @param {Property} property - Property object to determine the datetime format. + * @returns {string} - Returns the datetime format as a string. + */ +export function resolveDateTimeFormat(options: Schema, property: Property): string { + if (options.templateHelper.isTimeProperty(property)) { + return 'tableTimeFormat'; + } + if (options.templateHelper.isDateTimestampProperty(property)) { + return 'tableDateTimeFormat'; + } + if (options.templateHelper.isDateProperty(property)) { + return 'tableDateFormat'; + } + return ''; +} + +/** + * Generates custom row actions based on the provided options. + * + * @param {any} options - An object containing various custom options. + * @returns {string} - Returns the custom row actions as a string. + */ +// TODO refactor this and put it into template file +export function getCustomRowActions(options: any): string { + return options.customRowActions.length > 0 + ? ` + + {{ '${options.templateHelper.getVersionedAccessPrefix(options)}customRowActions.preferredName' | transloco}} + + + + ${options.customRowActions + .map((action: string) => { + const formattedAction = action.replace(/\.[^/.]+$/, ''); + const formattedActionKebab = formattedAction.replace(/\s+/g, '-').toLowerCase(); + const commonParts = `data-test="custom-action-icon" *ngIf="is${classify( + formattedActionKebab + )}Visible" (click)="executeCustomAction($event, '${formattedActionKebab}', row)" style="cursor: pointer;" matTooltip="{{ '${options.templateHelper.getVersionedAccessPrefix( + options + )}${formattedActionKebab}.customRowAction' | transloco }}" aria-hidden="false" attr.aria-label="{{ '${options.templateHelper.getVersionedAccessPrefix( + options + )}${formattedActionKebab}.customRowAction' | transloco }}"`; + return `${action.lastIndexOf('.') > -1 ? `` : ''}${ + action.lastIndexOf('.') === -1 ? `${action}` : '' + } + `; + }) + .join('')} + + + + + + ${options.customRowActions + .map((action: string): string => { + const formattedAction = action.replace(/\.[^/.]+$/, ''); + const formattedActionKebab = formattedAction.replace(/\s+/g, '-').toLowerCase(); + const classifiedAction = classify(formattedActionKebab); + const versionPrefix = options.templateHelper.getVersionedAccessPrefix(options); + const rowActionTextKey = `${versionPrefix}${formattedActionKebab}.customRowAction`; + const commonParts = `style="cursor: pointer;" matTooltip="{{ '${rowActionTextKey}' | transloco }}" aria-hidden="false" attr.aria-label="{{ '${rowActionTextKey}' | transloco }}"`; + const iconTemplate = + action.lastIndexOf('.') === -1 + ? `${formattedAction}` + : ``; + return ` + + `; + }) + .join('')} + + + ` + : ''; +} + +export function resolveJsPropertyType(property: Property): string { + const characteristic = + property.characteristic instanceof DefaultTrait ? property.characteristic.baseCharacteristic : property.characteristic; + + if (characteristic instanceof DefaultEither) { + let leftJsType = resolveJsCharacteristicType(characteristic.left, characteristic.effectiveLeftDataType); + let rightJsType = resolveJsCharacteristicType(characteristic.right, characteristic.effectiveRightDataType); + + if (characteristic.left instanceof DefaultCollection) { + leftJsType = `Array<${leftJsType}>`; + } + + if (characteristic.right instanceof DefaultCollection) { + rightJsType = `Array<${rightJsType}>`; + } + + return leftJsType !== rightJsType ? `${leftJsType} | ${rightJsType}` : leftJsType; + } + + if (property.characteristic instanceof DefaultCollection) { + if (property.characteristic.elementCharacteristic) { + return resolveJsCharacteristicType( + property.characteristic.elementCharacteristic, + property.characteristic.elementCharacteristic.dataType + ); + } + + if (isLangString(property.characteristic.dataType?.urn)) { + return `Array<${resolveJsCharacteristicType(property.characteristic, property.effectiveDataType)}>`; + } + } + + return resolveJsCharacteristicType(property.characteristic, property.effectiveDataType); +} + +function resolveJsCharacteristicType(characteristic: Characteristic, dataType: Type | undefined): string { + if (dataType === null) { + return ''; + } + + // In case of a multi-language text it has the data type langString but actual it must be handled as a + // map where the key ist the local and the value is the corresponding text + if (characteristic.name === 'MultiLanguageText') { + // Plain JSON object that has properties like 'en' or 'de' + return 'MultiLanguageText;'; + } + + // In case of enumeration, an enum is created. Use this enum as data type for the property. + if (characteristic instanceof DefaultEnumeration) { + return classify(characteristic.name); + } + + if (dataType && dataType.isScalar) { + const defaultScalarType = dataType as DefaultScalar; + return processScalarType(defaultScalarType); + } else { + return classify(`${(dataType as Entity).name}`); + } +} + +function processScalarType(defaultScalarType: DefaultScalar): string { + return processType(defaultScalarType.shortUrn); +} + +export function processType(shortUrn: string): string { + switch (shortUrn) { + case 'decimal': + case 'integer': + case 'double': + case 'float': + case 'byte': + case 'short': + case 'int': + case 'long': + case 'unsignedByte': + case 'unsignedLong': + case 'unsignedInt': + case 'unsignedShort': + case 'positiveInteger': + case 'nonNegativeInteger': + case 'negativeInteger': + case 'nonPositiveInteger': + return 'number'; + case 'hexBinary': + case 'base64Binary': + case 'curie': + case 'anyUri': + case 'anyURI': + case 'dayTimeDuration': + case 'duration': + case 'gDay': + case 'gMonth': + case 'gYear': + case 'gMonthDay': + case 'gYearMonth': + case 'yearMonthDuration': + return 'string'; + case 'langString': + return 'MultiLanguageText'; + case 'date': + case 'time': + case 'dateTime': + case 'dateTimeStamp': + return 'Date'; + default: + return shortUrn; + } +} + +export function isLangString(urn: string | undefined): boolean { + return urn === Samm.RDF_LANG_STRING || urn === Samm.XML_LANG_STRING; +} diff --git a/libs/schematic/generators/ng-generate/components/table/README.md b/libs/schematic/generators/ng-generate/components/table/README.md new file mode 100644 index 00000000..072ceb14 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/README.md @@ -0,0 +1,395 @@ +## Table of Contents + +- [Generate a table component with the schematics command](#generate-a-table-component-with-the-schematics-command) + - [Flags and options that can be used in the generation process](#flags-and-options-that-can-be-used-in-the-generation-process) + - [Generate a component with a custom name](#generate-a-component-with-a-custom-name) + - [Exclude one or more properties from the generation](#exclude-one-or-more-properties-from-the-generation) + - [Multi-version support for Aspect Models](#multi-version-support-for-aspect-models) + - [Show customized information in the table](#show-customized-information-in-the-table) + - [Export functionality](#export-functionality) + - [Custom icons for the command bar](#custom-icons-for-the-command-bar) + - [Add translations](#add-translations) + - [Pre-load config file](#pre-load-config-file) + - [Skip Installation](#skip-install) + - [Overwrite](#overwrite) + - [Add material css theme](#Add-material-css-theme) + - [Set View Encapsulation strategy](#Set-View-Encapsulation-strategy) + +# Generate a table component with the schematics command + +```bash +schematics @esmf/semantic-ui-schematics:table +``` + +Generated files will be located under the folder structure as follows: + +1. Multiple version support: `src/app/shared/components///` +2. Without multiple version support: `src/app/shared/components/` + +Files which are also automatically generated, but not included in the component's folder are: + +1. `resize-column.directive.ts` under `src/app/shared/directives` +2. `highlight.directive.ts` under `src/app/shared/directives` +3. `horizontal-overflow.ts` under `src/app/shared/directives` +4. `validate-input.ts` under `src/app/shared/directives` +5. `storage.service.ts` under `src/app/shared/services` +6. `show-descripiton.ts` under `src/app/shared/pipes` +7. `general.component.` under `src/assets/scss` +8. `export-table.dialot.component.ts` under `src/app/shared/export-confirmation-dialog` + +To be able to view correctly the material icons add the following +link: in the section of +the index.html + +# Flags and options that can be used in the generation process + +--- + +## Generate a component with a custom name + +By default, all the generated components will take the name of the aspect from the provided aspect model. + +By running the command without the '--name flag' + +```bash +ng generate @esmf/semantic-ui-schematics:table --dry-run=false --name=movement-table +``` + +this will be the result in the generated component .ts file + +```typescript +@Component({ + selector: 'esmf-sdk-ui-movement-table', + templateUrl: './movement-table.component.html', + styleUrls: ['./movement-table.component.scss'], +}) +export class MovementTableComponent {} +``` + +By running the command with the '--name' flag + +```bash +ng generate @esmf/semantic-ui-schematics:card --dry-run=false --name=custom +``` + +the name of the component will be changed. This will be reflected under folder structure and as well for the component +selector. + +```typescript +@Component({ + selector: 'esmf-sdk-ui-custom-table', // <- provided name reflected in the selector name + templateUrl: './custom-table.component.html', // <- provided name reflected in the component path + styleUrls: ['./custom-table.component.scss'], // <- provided name reflected in the component files +}) +export class CustomTableComponent {} // <- provided name reflected in the component class name +``` + +--- + +## Exclude one or more properties from the generation + +One or more properties of an Aspect Model Element e.g. generating a table can be excluded during the initial setup when +the following question appears: + +```bash +Choose the properties to hide in the table: (Press to select,
to toggle all, to invert selection, and to proceed) +>( ) Property moving + ( ) Property speedLimitWarning +``` + +The properties will be automatically read from the provided aspect model, and you can select/deselect which of them +should be removed from the table columns. + +--- + +## Multi-version support for Aspect Models + +Per default, the support for different versions of the Aspect Models is +turned on. It can be disabled using the command line parameter `aspectModelVersionSupport` + +```bash +ng generate @esmf/semantic-ui-schematics:table --dry-run=false --aspectModelVersionSupport=false +``` + +For this kind of multi-version support, the schematics for table UI component +generation creates files in the project's directory structure, as +depicted below: + +In this example, the Aspect Model is named _Movement_, Version is 1.0.0. +You have the following directory structure after applying the +schematic for table UI component generation: + +```text + src + +-- app + | +-- shared + | +-- components + | +-- movement-table + | +-- v100 + | +-- movement-table-datasource.ts + | +-- movement-table.component.ts + | +-- movement-table.component.scss + | +-- movement-table.component.html + | +-- movement-table-command-bar.component.ts + | +-- movement-table-command-bar.component.html + | +-- movement-table-chip-list.component.ts + | +-- movement-table-chip-list.component.scss + | +-- movement-table-chip-list.component.html + | +-- movement-table-config-menu.component.ts + | +-- movement-table-config-menu.component.html + | +-- movement-table-column-menu.component.ts + | +-- movement-table-column-menu.component.html + | +-- movement-table.module.ts + | +-- movement-table.service.ts + | +-- movement-table-filter.service.ts + | + +-- assets + +-- i18n + +-- shared + +-- components + +-- movement-table + +-- v100 + +-- en.movement-table.translation.json +``` + +Next time you use the schematic to create a table UI component from a different +version of the Aspect Model, you will get additional subdirectories for the +component and the language files. + +--- + +## Show customized information in the table + +Running the following command in combination with 'customColumn : chart,slider' answered in the prompter, creates a +table column or more, depending on the number of elements that where inserted (separated by comma), where an Angular +template with the same ID will be rendered: + +```bash +ng generate @esmf/semantic-ui-schematics:table --dry-run=false +``` + +The following template will be injected: + +```angular2html + + + + + + + + + + +``` + +--- + +## Add translations + +In order to see the translations for the generated table we need to run: + +```bash +schematics ..//src/collection.json:i18n --dry-run=false +ng generate @esmf/semantic-ui-schematics:i18n --dry-run=false +``` + +This command will install in demo project the following libraries: "@jsverse/transloco": "6.x", "ngx-i18n-combine": " +^1.x" +And the translation file will be generated: en.movement-form.translation.json + +## Export functionality + +After generating a table which contains a command bar, the export data button will be present in the right corner of the +toolbar. + +By pressing it, a modal dialog window will appear with multiple options. + +1. If the data is handled on the client side, the following options will appear: + + 1. Export all pages (by default) + Pressing this button will result into a full data export to a csv file. + 2. Export selected rows (only if there are any rows selected) + If this option appears, this will lead to a csv file being exported including only the selected rows from the + table. If the table included checkboxes with the header checkbox selected (option for selecting all rows present + in the table) will lead to a csv exported including only the page that you are currently seing on screen and not + all the data in the table. This can be used to download a paginated set of data. + +2. If the data is handled remotely, the following options will be visible: + + 1. Export all rows (by default) - option which exports a csv containing the set of data which can be visible on that + page. + 2. Export selected rows (only if there are any rows selected) - will result in exporting a csv containing only the + selected rows. + 3. Export all pages (only if an ExtendedCsvExporter function is passed to the table through bindings) - will result + in exporting the data by calling an external function passed to the generated component through binding by using + the `extendedCsvExporter` attribute. + + ```html + + ``` + + The `csvExporter` function will have a type `ExtendedCsvExporter` exported in the component's service file, and it + will need to implement a function with 2 arguments, the displayed columns and the RQL query which will query the data + from the backend. + + ```typescript + export interface ExtendedCsvExporter { + export(displayedColumns: string[], rqlQuery: string): void; + } + ``` + + If this function is not exposed to the component, this option will not appear in the export dialog window. + +### Custom icons for the command bar + +When running the command + +```bash +ng generate @esmf/semantic-ui-schematics:table --dry-run=false +``` + +the wizard will prompt at some point along the generation process this question: + +```bash +To add custom action buttons on the command bar, enter the names of SVG-files or style classes. SVG files will be looked for in ./assets/icons directory. Use ',' to enter multiple (e.g. edit.svg, schedule): (Use tab for suggestions) +``` + +As prompted in the helper text, you have two options: + +1. Pass in an icon name (including the extension - .svg) which needs to exist in the folder under the path _* + ./assets/icons*_ +2. Pass in a material icon name which exists in + the [material icons library](https://fonts.google.com/icons?selected=Material+Icons). + +## Custom icons for each row + +As mentioned above, when running the command + +```bash +ng generate @esmf/semantic-ui-schematics:table --dry-run=false +``` + +the wizard will prompt the question: + +```bash +To add custom action buttons for each table row, enter the names of SVG-files or style classes. SVG files will be looked for in ./assets/icons directory. Use ',' to enter multiple (e.g. edit.svg,schedule): +``` + +Here the same two options as in the command bar custom actions case, you can: + +1. Pass in an icon name (including the extension - .svg) which needs to exist in the folder under the path _* + ./assets/icons*_ +2. Pass in a material icon name which exists in + the [material icons library](https://fonts.google.com/icons?selected=Material+Icons). + +--- + +## Pre-load config file + +If you want to use a pre-existing config file, without going through the generation wizard, you may feed the path to the +.json config using the 'configFile' flag by running the command like this: + +```bash +ng generate @esmf/semantic-ui-schematics:table --configFile=-wizard.configs.json +``` + +Example of configuration file: + +```json +{ + "aspectModelTFiles": ["FOLDER\\Movement.ttl"], + "excludedProperties": [], + "configFile": "wizard.config.json", + "complexProps": [ + { + "prop": "position", + "propsToShow": ["x", "y", "z"] + } + ], + "selectedModelElementUrn": "urn:samm:org.eclipse.esmf.test:1.0.0#Movement", + "jsonAccessPath": "", + "defaultSortingCol": "moving", + "customColumns": [], + "addRowCheckboxes": false, + "customRowActions": ["schedule"], + "addCommandBar": true, + "enabledCommandBarFunctions": ["addCustomCommandBarActions", "addSearchBar", "addEnumQuickFilters", "addDateQuickFilters"], + "customCommandBarActions": ["edit.svg"], + "enableRemoteDataHandling": true, + "enableVersionSupport": true, + "overwrite": true, + "getOptionalMaterialTheme": false, + "datePickers": [ + { + "propertyUrn": "urn:samm:org.eclipse.test:1.0.0#datePicker", + "datePicker": { + "type": "singleDatePicker" + } + } + ] +} +``` + +--- + +## Skip install + +If you want to skip installation of dependencies you may use the '--skip-install' flag + +```bash +ng generate @esmf/semantic-ui-schematics:table --skip-install +``` + +--- + +## Overwrite + +If you want to overwrite the already existing generated files, you may use the '--overwrite' flag + +```bash +ng generate @esmf/semantic-ui-schematics:table --overwrite +``` + +--- + +## Add material css theme + +If you want to add the indigo pink material theme, you may use the '--getOptionalMaterialTheme' flag + +when the wizard will prompt the question: + +```bash +Do you want to add the Angular Material theme? (Indigo Pink Theme) +``` + +User may choose Yes or No. + +if user did not set --getOptionalMaterialTheme to true but wants to add a material theme to the project, +in angular.json in styles section the following code can be added: + +```bash +{ + "styles": [ + "src/styles.scss", + "node_modules/@angular/material/prebuilt-themes/indigo-pink.css" + ] +} + +``` + +--- + +## Set View Encapsulation strategy + +By default, the view encapsulation for the generated table component is set to None. +If you want to change the View Encapsulation strategy, you may use the '--viewEncapsulation' flag +where user can choose one of the following options: None, Emulated, ShadowDom. + +when the wizard will prompt the question: + +```bash +Do you want to specify view encapsulation strategy? +``` + +User may choose one of the values: None, Emulated, ShadowDom. diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template new file mode 100644 index 00000000..813d459f --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.html.template @@ -0,0 +1,51 @@ +
{{ 'columns' | transloco }}
+ + + + +
+
+
{{ '<% if (options.versionedAccessPrefix) { %><%= options.versionedAccessPrefix %><% } %>' + column.name + '.preferredName' | transloco }}
+
{{ '<% if (options.versionedAccessPrefix) { %><%= options.versionedAccessPrefix %><% } %>' + column.name + '.description' | transloco }}
+
+ drag_indicator +
+
+
+ + + + diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template new file mode 100644 index 00000000..7eb6c0a3 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.scss.template @@ -0,0 +1,4 @@ +/** <%= options.generationDisclaimerText %> **/ +.drag-indicator-icon { + color: rgba(0, 0, 0, 0.54); +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template new file mode 100644 index 00000000..c5ddfff4 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/files/__name@dasherize__-column-menu.component.ts.template @@ -0,0 +1,67 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Component, EventEmitter, Output} from '@angular/core'; +import {Column} from './<%= dasherize(name) %>.component'; +import {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop'; +import {EsmfLocalStorageService} from "<% if (options.enableVersionSupport) { %>../<% } %>../../services/storage.service"; + +@Component({ + selector: '<%= dasherize(name) %>-column-menu', + templateUrl: './<%= dasherize(name) %>-column-menu.component.html', + styleUrls: ['./<%= dasherize(name) %>-column-menu.component.scss'], + standalone: false +}) +export class <%= classify(name) %>ColumnMenuComponent { + + @Output() columnsChangedEvent = new EventEmitter(); + + columnsDefault: Array = []; + columns: Array = []; + closeColumnMenu: boolean = false; + keyLocalStorage: string = ''; + + constructor(private storageService: EsmfLocalStorageService) {} + + closeMenu(): void { + this.resetStoredColumns(); + this.closeColumnMenu = true; + } + + stopMenuClosing(event: MouseEvent): void { + if (this.closeColumnMenu) { + return; + } + event.stopPropagation(); + } + + columnClick(event: MouseEvent, column: Column): void { + this.closeColumnMenu = false; + column.selected = !column.selected; + event.preventDefault(); + event.stopPropagation(); + } + + /** + * Reset columns to defaults which are all available columns + */ + resetStoredColumns(event?: MouseEvent): void { + event?.preventDefault(); + event?.stopPropagation(); + this.columns = JSON.parse(JSON.stringify(this.columnsDefault)); + } + + /** + * Store columns locally and update displayed columns afterwards + */ + storeColumns(): void { + this.closeColumnMenu = true; + this.storageService.setItem(this.keyLocalStorage, this.columns); + this.columnsChangedEvent.emit(this.columns) + } + + /** + * Order of a column is changed + */ + columnDrop(event: CdkDragDrop) { + moveItemInArray(this.columns, event.previousIndex, event.currentIndex); + } +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/index.ts b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/index.ts new file mode 100644 index 00000000..12e9be51 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/column-menu/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateColumnMenu(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('./generators/components/column-menu/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: options.name, + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template new file mode 100644 index 00000000..bb67f9df --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.html.template @@ -0,0 +1,42 @@ + + +
+ <% if (options.addCommandBar) { %> + <<%= dasherize(name) %>-command-bar + [isMultipleSelectionEnabled]="isMultipleSelectionEnabled" + [selection]="selection" + [totalItems]="totalItems" + [searchFocused]="searchFocused" + [allowedCharacters]="allowedCharacters" + [minNumberCharacters]="minNumberCharacters" + [maxNumberCharacters]="maxNumberCharacters" + [searchHint]="searchHint" + <% if (options.hasSearchBar) { %> + [configs]="configs" + [<%= options.localStorageKeyConfig %>]="<%= options.localStorageKeyConfig %>" + (setConfiguration)="setConfiguration($event)" + <% } %> + (applyFilters)="applyFilters()" + (reloadFilter)="reloadFilter()" + (exportToCsv)="exportToCsv()" + <% if (options.customCommandBarActions.length > 0) { %> + (customCommandBarActionEvent)="handleCustomCommandBarActionEvent($event.action)" + <% } %> + > + + + + + + + -command-bar> + <% } %> + + + + <% if (options.hasFilters) { %> + + <% } %> + + <%= options.include('/generation/extended-table.html.template') %> +
diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template new file mode 100644 index 00000000..c57b0cc5 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.scss.template @@ -0,0 +1,12 @@ +/** <%= options.generationDisclaimerText %> **/ +@use 'general.component' as *; + +.table-header-icon { + margin-left: 0.5rem; + cursor: default; + font-size: 20px; + min-width: 20px; + width: 20px; + height: 20px; + color: gray; +} \ No newline at end of file diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template new file mode 100644 index 00000000..db5aa376 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/table/files/__name@dasherize__.component.ts.template @@ -0,0 +1,708 @@ +/** <%= options.generationDisclaimerText %> **/ +<% + var tableColumnsEnumName = classify(name) + 'Column'; + var cmpFileName = dasherize(name); + var hasCustomRowActions = options.customRowActions.length > 0; + var customRowActionNames = options.customRowActions.map(action => `'${action.replace(/\.[^/.]+$/, '')}'`); + var tableServiceName = options.enableRemoteDataHandling ? (options.customRemoteService ? `Custom${classify(name)}Service` : 'EsmfRemoteTableService') : 'EsmfStaticTableService'; + var tableDataSourceName = options.enableRemoteDataHandling ? 'EsmfRemoteTableDataSource' : 'EsmfStaticTableDataSource'; +%> +import { + AfterViewInit, + Component, + Input, + ViewChild, + Output, + EventEmitter, + SimpleChanges, + HostBinding, + Inject, + OnChanges, + OnInit, + AfterViewChecked, + TemplateRef, + ElementRef, + ViewEncapsulation, + inject, + <% if (options.enableRemoteDataHandling || options.hasSearchBar) { %>OnDestroy,<% } %> + <% if (options.changeDetection) { %>ChangeDetectionStrategy,<% } %> +} from '@angular/core'; +import { MatPaginator, MatPaginatorSelectConfig } from '@angular/material/paginator'; +import { MatSort, SortDirection } from '@angular/material/sort'; +import { MatTable } from '@angular/material/table'; + +<% if (options.hasFilters || options.hasSearchBar) { %> + import { FilterEnums, <%= options.filterServiceName %>} from './<%= cmpFileName %>-filter.service'; + import {EsmfChipListComponent} from '@esmf/semantic-ui-schematic'; +<% } %> + +<% if (options.addCommandBar) { %> + import {unparse} from 'papaparse'; + import {Action, ExportTableDialogComponent} from '<% if (options.enableVersionSupport) { %>../<% } %>../export-confirmation-dialog/export-table-dialog.component'; +<% } %> + +import {MatDialog} from '@angular/material/dialog'; +import { + <%= classify(options.selectedModelTypeName) %> + <% if (selectedModelElementUrn !== aspectModelElementUrn && !isCollectionAspect) { %> + , <%= classify(options.aspectModelTypeName) %> + <% } %> + <% if (options.isEnumQuickFilter) { %> + , <%= enumProperties %> + <% } %> +} from '<%= options.typePath %>'; +import {<%= tableDataSourceName %>} from '@esmf/semantic-ui-schematic'; + +<% if (options.isDateQuickFilter) { %> + import {DateAdapter, MAT_DATE_FORMATS, MatDateFormats} from '@angular/material/core'; +<% } %> + +<% if ([...options.customRowActions, ...options.customCommandBarActions].findIndex(element => element.includes('.')) !== -1) { %> + import { MatIconRegistry } from '@angular/material/icon'; +<% } %> + +import {DomSanitizer} from '@angular/platform-browser'; +import {SelectionModel} from '@angular/cdk/collections'; +import { TranslocoService } from '@jsverse/transloco'; +import {EsmfPaginatorSelectConfigInjector} from "<% if (options.enableVersionSupport) { %>../<% } %>../../services/paginator-select-config.provider"; +import {EsmfLocalStorageService} from "<% if (options.enableVersionSupport) { %>../<% } %>../../services/storage.service"; +import {<%= classify(name) %>CommandBarComponent} from "./<%= cmpFileName %>-command-bar.component"; +import {<%= classify(name) %>ColumnMenuComponent} from './<%= cmpFileName %>-column-menu.component'; + +<% if (options.hasSearchBar) { %> + import {<%= classify(name) %>ConfigMenuComponent} from './<%= cmpFileName %>-config-menu.component'; +<% } %> + +<% if (options.hasFilters) { %> + import {debounceTime, filter, map, takeUntil} from 'rxjs/operators' +<% } else if (options.hasSearchBar) { %> + import {debounceTime, filter, takeUntil} from 'rxjs/operators'; +<% } else { %> + import {filter, takeUntil} from 'rxjs/operators'; +<% } %> + +import {<% if (options.enableRemoteDataHandling) { %>catchError, finalize, tap, Subscription,<% } %>Subject} from 'rxjs'; + +<% if (options.enableRemoteDataHandling) { %> + <%= options.include('/remote-handling/imports.ts.template') %> + <%= options.include('/remote-handling/custom-rql-filter-extensions.ts.template') %> +<% } else { %> + // TODO remove the commented line bellow + // import {<%= classify(name) %>Service, <%= classify(aspectModelName) %>Response} from './<%= cmpFileName %>.service'; + import {EsmfStaticTableService} from '@esmf/semantic-ui-schematic'; +<% } %> + +<% if (options.hasSearchBar) { %> + <%= options.include('/interfaces/config.ts.template') %> +<% } %> + +<%= options.include('/interfaces/column.ts.template') %> + +/** + * Enumeration of all available columns which can be shown/hide in the table. + */ +export enum <%= tableColumnsEnumName %> { + <% if (options.addRowCheckboxes) { %>CHECKBOX = 'checkboxes',<% } %> + <%= enumPropertyDefinitions %> + <%= enumCustomColumns %> + <% if (hasCustomRowActions) { %>CUSTOM_ROW_ACTIONS = 'customRowActions',<% } %> + COLUMNS_MENU = 'columnsMenu' +} + +export const NON_DATA_COLUMNS: <%= tableColumnsEnumName %>[] = [ + <% if (hasCustomRowActions) { %> + <%= tableColumnsEnumName %>.CUSTOM_ROW_ACTIONS, + <% } %> + <%= tableColumnsEnumName %>.COLUMNS_MENU +]; + +<% if (hasCustomRowActions) { %> + type RowAction = <%= customRowActionNames.join(' | ') %>; + export type <%= options.aspectModelTypeName %>ActionsResolvers = Partial) => boolean>> | undefined; +<% } %> + + + +@Component({ + selector: '<%= options.selector %>', + imports: [EsmfChipListComponent], + templateUrl: './<%= cmpFileName %>.component.html', + styleUrls: ['./<%= cmpFileName %>.component.<%= options.style %>'], + providers: [ + <%= tableServiceName %> + ], + <% if (options.changeDetection) { %>changeDetection: ChangeDetectionStrategy.<%= options.changeDetection %>,<% } %> + <% if (options.viewEncapsulation) { %>encapsulation: ViewEncapsulation.<%= options.viewEncapsulation %>,<% } else { %>encapsulation: ViewEncapsulation.None,<% } %> +}) +export class <%= classify(name) %>Component implements OnInit, AfterViewInit, AfterViewChecked, OnChanges<% if (options.hasSearchBar || options.enableRemoteDataHandling) { %>, OnDestroy<% } %> { + private tableService = inject(<%= tableServiceName %><<%= options.aspectModelTypeName %>>); + + <% if (options.hasSearchBar) { %>@Input() initialSearchString = '';<% } %> + <%= customRowActionInput %> + <% if (options.dateProperties) { %>@Input() tableDateFormat = 'short';<% } %> + <% if (options.dateTimeStampProperties) { %>@Input() tableDateTimeFormat = 'short';<% } %> + <% if (options.timeProperties) { %>@Input() tableTimeFormat = 'shortTime';<% } %> + + @Input() data: Array<<%= options.aspectModelTypeName %>> = []; + @Input() customTemplate?: TemplateRef; + @Input() searchHint?: string; + @Input() showFirstLastButtons: boolean = true; + + <%= customColumnsInput %> + + @Input() pageSize: number = 20; + @Input() pageSizeOptions: Array = [5, 20, 50, 100]; + + @Input() highlightSelectedRow: boolean = true; + @Input() highlightColor = 'rgba(127, 198, 231, 0.3)'; + @Input() isMultipleSelectionEnabled = true; + @Input() noDataMessage: string = ''; + @Input() dataLoadErrorMessage: string = ''; + @Input() visibleRowActionsIcons: number = 3; + @Input() headerTooltipsOff: boolean = false; + @Input() setStickRowActions: boolean = true; + @Input() customTableClass: string = ''; + @Input() debounceTime: number = 500; + @Input() minNumberCharacters: number = 2; + @Input() maxNumberCharacters: number = 50; + @Input() allowedCharacters: string = ''; + @Input() regexValidator:string = ''; + + @Input() hideColumns: <%= tableColumnsEnumName %>[] = []; + + <% if (options.hasSearchBar) { %>@Input() hasAdvancedSearch: boolean = this.filterService.stringColumns.length > 1;<% } %> + <% if (options.enableRemoteDataHandling) { %> + @Input() maxExportRows: number = 5000; + @Input() customFilterExtension: CustomRQLFilterExtension | undefined; + @Input() customOptionsExtension: CustomRQLOptionExtension | undefined; + @Input() extendedCsvExporter: ExtendedCsvExporter | undefined; + @Input() remoteAPI: string = ''; + <% } else { %> + @Input() maxExportRows: number = 0; + <% } %> + + <% if (hasCustomRowActions) { %> + @Input() actionResolvers: <%= options.aspectModelTypeName %>ActionsResolvers = {}; + <% } %> + + @Output() rowClickEvent = new EventEmitter(); + @Output() rowDblClickEvent = new EventEmitter(); + @Output() rowRightClickEvent = new EventEmitter(); + @Output() tableUpdateStartEvent = new EventEmitter(); + @Output() tableUpdateFinishedEvent = new EventEmitter(); + @Output() copyToClipboardEvent = new EventEmitter(); + @Output() downloadEvent = new EventEmitter<{error: boolean, success: boolean, inProgress: boolean}>(); + @Output() rowSelectionEvent = new EventEmitter(); + + <% if (hasCustomRowActions) { %> + @Output() customActionEvent = new EventEmitter(); + <% } %> + <% if (options.customCommandBarActions.length > 0) { %> + @Output() customCommandBarActionEvent = new EventEmitter(); + <% } %> + + @ViewChild(MatSort) private sort!: MatSort; + @ViewChild(MatPaginator) private paginator!: MatPaginator + @ViewChild(MatTable) private table!: MatTable<<%= classify(aspectModelTypeName) %>>; + @ViewChild(<%= classify(name) %>ColumnMenuComponent) private columMenuComponent!: <%= classify(name) %>ColumnMenuComponent; + + <% if (options.hasSearchBar) { %> + @ViewChild(<%= classify(name) %>ConfigMenuComponent) private configurationComponent!: <%= classify(name) %>ConfigMenuComponent; + <% } %> + + @ViewChild('searchInput') searchInput!: ElementRef; + @ViewChild(<%= classify(name) %>CommandBarComponent) commandBar: <%= classify(name) %>CommandBarComponent; + + @HostBinding("attr.style") + public get valueAsStyle(): any { + if(!this.highlightColor) { + return; + } + return this.sanitizer.bypassSecurityTrustStyle(`--selected-row-highlight-color: ${this.highlightColor}`); + } + + readonly <%= options.localStorageKeyColumns %> = '<%= options.localStorageKeyColumns.replace(options.localStoragePrefix, '').toLowerCase() %>'; + + <% if (options.hasSearchBar) { %> + readonly <%= options.localStorageKeyConfig %> = '<%= options.localStorageKeyConfig.replace(options.localStoragePrefix, '').toLowerCase() %>'; + <% } %> + + totalItems: number = 0; + selection = new SelectionModel(this.isMultipleSelectionEnabled, []); + dataSource = new <%= tableDataSourceName %><<%= classify(aspectModelTypeName) %>>(); + + columnToSort:{sortColumnName: string, sortDirection: SortDirection} = {sortColumnName:'<%= options.defaultSortingCol %>', sortDirection : 'asc'}; + // The list of column names that are displayed in the table, including NON_DATA_COLUMNS + displayedColumns: <%= tableColumnsEnumName %>[] = []; + // The list of available columns to select + columns: Array = []; + + <% if (options.hasSearchBar) { %> + configs: Array = []; + <% } %> + + currentLanguage: string; + filteredData: Array<<%= classify(aspectModelTypeName) %>> = []; + dragging: boolean = false; + customRowActionsLength: number = <%= options.customRowActions.length %>; + closeColumnMenu: boolean = false; + rqlString: string = ''; + searchFocused: boolean = false; + dataLoadError = false; + + <% if (options.hasSearchBar) { %> + highlightString: string[] = []; + <% } %> + + <%= byValueFunction %> + + <% if (options.hasSearchBar || options.enableRemoteDataHandling) { %> + private readonly ngUnsubscribe = new Subject(); + <% } %> + + <% if (options.enableRemoteDataHandling) { %> + private requestSubscription: Subscription = new Subscription(); + <% } %> + + constructor(<%= commonImports %>) { + <%= sharedCustomRows %> + } + + ngOnInit(): void { + <% if (options.hasSearchBar) { %> + this.filterService.searchStringInit(this.initialSearchString, this.regexValidator, this.minNumberCharacters, this.maxNumberCharacters); + this.filterService.selectedStringColumn.valueChanges.pipe(takeUntil(this.ngUnsubscribe), debounceTime(100)).subscribe(() => { + if(this.searchInput) { + this.searchInput.nativeElement.focus(); + } + }) + <% } %> + + this.initializeColumns(); + + <% if (options.hasSearchBar) { %> + this.initializeHighlightConfig(); + <% } %> + <% if (!options.enableRemoteDataHandling) { %> + this.maxExportRows = this.data.length; + <% } %> + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes.hideColumns && !changes.hideColumns.isFirstChange()) { + this.initializeColumns(); + } + + <% if (options.enableRemoteDataHandling) { %> + if ( + (changes?.remoteAPI?.currentValue && !changes.remoteAPI.isFirstChange()) || + (changes?.customFilterExtension?.currentValue && !changes.customFilterExtension.isFirstChange()) + ) { + if (this.paginator.pageIndex !== 0) { + this.paginator.firstPage(); + } else { + this.applyFilters(); + } + } + <% } else { %> + if (this.table) { + this.applyFilters(); + } + <% } %> + } + + + <% if (options.hasSearchBar || options.enableRemoteDataHandling) { %> + ngOnDestroy(): void { + <% if (options.hasSearchBar || options.isEnumQuickFilter || options.isDateQuickFilter) { %> + this.filterService.reset(); + <% } %> + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } + <% } %> + + ngAfterViewInit(): void { + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + this.pageChange(); + } + + ngAfterViewChecked(): void { + if (this.table) { + this.table.updateStickyColumnStyles(); + } + } + + initializeColumns(): void { + this.columns = []; + this.displayedColumns = Object.values(<%= tableColumnsEnumName %>).filter( + column => !this.hideColumns.includes(column) + ); + + const columnStorage = this.storageService.getItem(this.<%= options.localStorageKeyColumns %>); + + if (columnStorage?.length > 0) { + columnStorage + .filter( + (column: Column) => + !this.hideColumns.includes(column.name as <%= tableColumnsEnumName %>) && + this.displayedColumns.find(columnName => columnName === column.name) + ) + .forEach((column: Column) => this.columns.push({name: column.name, selected: column.selected})); + } + + this.displayedColumns.forEach((displayedColumn: string): void => { + if (<% if (options.addRowCheckboxes) { %>displayedColumn === <%= tableColumnsEnumName %>['CHECKBOX'] ||<% } %> + !this.isAvailableDataColumn(displayedColumn as <%= tableColumnsEnumName %>) || + this.columns.find(column => column.name === displayedColumn)) { + return; + } + + this.columns.push({name: displayedColumn, selected: true}); + }); + + // if no column besides checkboxes and column actions is active, reset and show all columns + if (!this.columns.find((column: Column) => column.selected)) { + this.columns.forEach((column: Column) => (column.selected = true)); + } + + this.setDisplayedColumns(this.columns); + } + + <% if (options.customColumns.length > 0) { %> + isCustomColumn(columnName: string): boolean { + const customColumns: any = [<%= customColumn %>]; + return customColumns.includes(columnName); + } + <% } %> + + pageChange(): void { + this.applyFilters(); + <% if (!options.enableRemoteDataHandling && options.addRowCheckboxes) { %> + this.selection.clear(); + this.rowSelectionEvent.emit(this.selection.selected); + <% } %> + } + + sortData(): void { + this.applyFilters(); + } + + rowClicked(row: any, $event: MouseEvent): boolean { + if (this.highlightSelectedRow) { + this.checkboxClicked(row); + } + + if ($event.type === 'contextmenu') { + $event.preventDefault(); + const mousePositionOnClick = { x: $event.clientX + 'px', y: $event.clientY + 'px' }; + this.rowRightClickEvent.emit({ data: row, mousePosition: mousePositionOnClick }); + } + + <% if (hasCustomRowActions) { %> + if ($event.type === 'click' && this.isAvailableRowAction('forward-right', row)) { + this.rowClickEvent.emit({ data: row }) + } + <% } else {%> + if ($event.type === 'click') { + this.rowClickEvent.emit({ data: row }) + } + <% }%> + + return false; + } + + rowDblClicked(row: any, $event: MouseEvent): void { + this.rowDblClickEvent.emit({data: row}); + } + + copyToClipboard(value: any): void { + this.copyToClipboardEvent.emit(value); + } + + checkboxClicked(row: any): void { + if(!this.isMultipleSelectionEnabled) { + this.selection.clear(); + } + + this.selection.toggle(row); + this.rowSelectionEvent.emit(this.selection.selected); + } + + <% if (options.addRowCheckboxes) { %> + isAllSelected(): boolean { + return this.selection.selected.length == this.dataSource.displayedData.length; + } + + toggleSelectAll(): void { + this.isAllSelected() ? this.selection.clear() : this.dataSource.displayedData.forEach(item => this.selection.select(item)); + this.rowSelectionEvent.emit(this.selection.selected); + } + + <% if (!options.enableRemoteDataHandling && options.addRowCheckboxes) { %> + trimSelectionToCurrentPage(): void { + const indexOfLastItemOnPreviousPage = this.paginator.pageSize * this.paginator.pageIndex - 1; + const indexOfFirstItemOnNextPage = this.paginator.pageSize * (this.paginator.pageIndex + 1); + this.selection.selected.forEach((u): void => { + if(!this.filteredData.includes(u)) { + this.selection.deselect(u); + } + }) + + this.filteredData.forEach((u, i): void => { + if (i >= indexOfFirstItemOnNextPage || i <= indexOfLastItemOnPreviousPage) { + this.selection.deselect(this.filteredData[i]); + } + }); + + this.rowSelectionEvent.emit(this.selection.selected); + } + <% } %> + <% } %> + + <% if (hasCustomRowActions) { %> + executeCustomAction($event: MouseEvent, action: string, row:any): void{ + if(this.customRowActionsLength <= this.visibleRowActionsIcons) { + $event.stopPropagation(); + } + + this.customActionEvent.emit({action: action, data: row}) + } + <% } %> + + <% if (options.customCommandBarActions.length > 0) { %> + handleCustomCommandBarActionEvent(action: string) { + this.customCommandBarActionEvent.emit({action: action}) + } + <% } %> + + <% if (options.hasFilters) { %> + removeFilter(filterData: any) { + <% if (options.hasFilters) { %> + this.filterService.removeFilter(filterData); + <% } %> + + this.paginator.firstPage(); + + <% if (options.hasSearchBar) { %> + this.filterService.searchString.reset(); + <% } %> + + this.applyFilters(); + } + <% } %> + + reloadFilter(): void { + this.paginator.firstPage(); + this.applyFilters(); + } + + <% if (options.enableRemoteDataHandling) { %> + <%= options.include('/remote-handling/requestData.ts.template') %> + <% } %> + + + applyFilters() { + <% if (options.hasSearchBar) { %> + if (this.filterService.searchString.errors) { + return; + } + <% } %> + + this.tableUpdateStartEvent.emit(); + + <% if (options.enableRemoteDataHandling) { %> + this.requestData(); + <% } else { %> + const dataToShow = this.applyAllFilters(this.data); + this.dataSource.setData(dataToShow); + this.filteredData = dataToShow; + this.totalItems = this.data.length; + this.maxExportRows = this.totalItems; + this.checkIfOnValidPage(); + + <% if (options.addRowCheckboxes) { %> + this.trimSelectionToCurrentPage(); + <% } %> + + this.tableUpdateFinishedEvent.emit(); + <% } %> + } + + <% if (!options.enableRemoteDataHandling) { %> + private applyAllFilters(data: any[]): any[] { + let dataTemp = [...data]; + + <% if (options.isEnumQuickFilter) { %> + dataTemp = this.filterService.applyEnumFilter(dataTemp); + <% } %> + + <% if (options.hasSearchBar) { %> + dataTemp = this.filterService.applyStringSearchFilter(dataTemp); + this.highlightString = this.filterService.activeFilters + .filter(elem => elem.type === FilterEnums.Search && elem.filterValue !== undefined) + .map(elem => elem.filterValue as string); + <% } %> + + <% if (options.isDateQuickFilter) { %> + dataTemp = this.filterService.applyDateFilter(dataTemp); + <% } %> + + return dataTemp; + } + <% } %> + + <% if (options.addCommandBar) { %> + exportToCsv() { + this.openExportConfirmationDialog(); + } + + openExportConfirmationDialog() { + const dataColumns = this.displayedColumns.filter(col => this.isAvailableDataColumn(col)); + + const dialogRef = this.dialog.open(ExportTableDialogComponent, { + data: { + <% if (options.enableRemoteDataHandling) { %> + extendedCsvExporter: this.extendedCsvExporter, + <% } %> + allColumns: this.columns.length, + displayedColumns: dataColumns.length, + maxExportRows: this.maxExportRows, + }, + maxWidth: 478, + }); + + dialogRef.afterClosed() + .pipe(filter(e => !!e)) + .subscribe((event: { action: Action, exportAllPages: boolean; exportAllColumns: boolean }): void => { + if (event.action === Action.cancel) { + return; + } + + if (event.exportAllPages && this.data.length > this.maxExportRows) { + this.data.length = this.maxExportRows; + } + + <% if (options.enableRemoteDataHandling) { %> + const columns = event.exportAllColumns ? this.columns.map(c => c.name) : dataColumns; + this.extendedCsvExporter?.export(columns, this.rqlString); + <% } else { %> + this.prepareCsv(this.<%= (camelize((options.enableRemoteDataHandling && options.customRemoteService ? 'custom' : '') + name)) %>Service.flatten(this.data), event.exportAllColumns, event.exportAllPages,this.paginator.pageSize); + <% } %> + }); + } + <% } %> + + <% if (options.addCommandBar && !options.enableRemoteDataHandling) { %> + prepareCsv(data: any, exportAllColumns: boolean, exportAllPages: boolean, currentPageSize: number): void { + if (!exportAllPages && data.length > currentPageSize) { + data.length = currentPageSize; + } + + const headersToExport = exportAllColumns ? this.columns.map(c => c.name) : this.displayedColumns.filter(col => this.isAvailableDataColumn(col)); + + const headersCSV = unparse({ + fields: headersToExport + <% if (!options.isAspectSelected) { %>.map(columnName => columnName.split('.').pop())<% } %> + .map(columnName => { + const translatedHeader = this.translateService.translate(`<%= columnTransKeyPrefix %>${columnName}.preferredName`); + return translatedHeader !== `<%= columnTransKeyPrefix %>${columnName}.preferredName` ? translatedHeader : columnName; + }) as string[], + data: [], + }); + + this.downloadCsv(`${headersCSV}${unparse(data, {header: false, columns: headersToExport})}`); + } + + downloadCsv(csvArray: any): void { + this.downloadEvent.emit({error: false, success: false, inProgress: true}); + try { + <% if (options.enableRemoteDataHandling && options.customRemoteService) { %> + this.<%= ((options.customRemoteService ? 'custom' : '') + classify(name)) %>Service.downloadCsv(csvArray); + <% } else { %> + this.<%= camelize(name) %>Service.downloadCsv(csvArray); + <% } %> + this.downloadEvent.emit({error: false, success: true, inProgress: false}); + } catch(error: any) { + this.downloadEvent.emit({error: true, success: false, inProgress: false}); + } + } + <% } %> + + initOpenedColumnMenuDialog(): void { + this.columMenuComponent.keyLocalStorage = this.<%= options.localStorageKeyColumns %>; + this.columMenuComponent.columnsDefault = [ + ...Object.values(<%= tableColumnsEnumName %>) + .filter(columnName => this.isAvailableDataColumn(columnName)) + .map(columnName => ({name: columnName, selected: true})), + ]; + this.columMenuComponent.columns.splice(0, this.columMenuComponent.columns.length); + this.columMenuComponent.columns.push(...this.columns); + } + + <% if (options.hasSearchBar) { %> + setConfiguration(configs: Array): void { + this.configs = [...configs]; + } + <% } %> + + setDisplayedColumns(columns: Array): void { + let displayedColumnsTmp: Array = []; + + <% if (options.addRowCheckboxes) { %> + if (columns[0].name !== <%= tableColumnsEnumName %>['CHECKBOX']) { + displayedColumnsTmp.push({name: <%= tableColumnsEnumName %>['CHECKBOX'], selected: true}); + } + <% } %> + + displayedColumnsTmp.push(...columns); + + <% if (hasCustomRowActions) { %> + displayedColumnsTmp.push({name: <%= tableColumnsEnumName %>['CUSTOM_ROW_ACTIONS'], selected: true}); + <% } %> + + displayedColumnsTmp.push({name: <%= tableColumnsEnumName %>['COLUMNS_MENU'], selected: true}); + + this.columns = [...columns]; + this.displayedColumns = displayedColumnsTmp.filter(column => column.selected).map(column => column.name as <%= tableColumnsEnumName %>); + } + + loadCustomTemplate(): TemplateRef | null { + return this.customTemplate ? this.customTemplate as TemplateRef : null; + } + + <% if (!options.enableRemoteDataHandling) { %> + checkIfOnValidPage(): void { + if(this.paginator.length > this.filteredData.length){ + this.paginator.firstPage(); + } + } + <% } %> + + <% if (hasCustomRowActions) { %> + protected isAvailableRowAction(action: RowAction, rowData: <%= options.aspectModelTypeName %>): boolean { + if (!this.actionResolvers || !this.actionResolvers[action]) { + return true; + } + + return this.actionResolvers[action](rowData) ?? true; + } + <% } %> + + <% if (options.hasSearchBar) { %> + private initializeHighlightConfig(): void { + const configStorage = this.storageService.getItem(this.<%= options.localStorageKeyConfig %>); + + if (configStorage?.length > 0) { + configStorage.forEach((config: Config) => this.configs.push(config)); + } else { + this.configs.push({name: 'settings.highlight.name', desc: 'settings.highlight.desc', selected: false, color: '#FFFF00'}); + } + } + <% } %> + + private isAvailableDataColumn(column: <%= tableColumnsEnumName %>): boolean { + return !(Array.isArray(this.hideColumns) && this.hideColumns.includes(column)) && !NON_DATA_COLUMNS.includes(column); + } +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/components/table/index.ts b/libs/schematic/generators/ng-generate/components/table/generators/components/table/index.ts new file mode 100644 index 00000000..29e86045 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/components/table/index.ts @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, chain, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; +import {camelize, classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {getAllEnumProps} from '../../../../../../utils/aspect-model'; +import {generateCommandBar} from '../../../../shared/generators/index'; +import { + getCustomRowActions, + getEnumProperties, + getEnumPropertyDefinitions, + getTableColumValues, + resolveDateTimeFormat, +} from '../../../../shared/utils'; +import {templateInclude} from '../../../../shared/include'; +import {Schema} from '../../../../shared/schema'; +import {TableSchema} from '../../../schema'; + +let sharedOptions: any = {}; + +export function generateTableComponent(options: TableSchema): Rule { + return (tree: Tree, _context: SchematicContext) => { + sharedOptions = options; + sharedOptions['allProps'] = options.listAllProperties; + sharedOptions['tableColumValues'] = getTableColumValues; + sharedOptions['tableColumns'] = getTableColumValues(options.listAllProperties, options); + sharedOptions['resolveDateTimeFormat'] = resolveDateTimeFormat; + sharedOptions['getCustomRowActions'] = getCustomRowActions; + + return chain([ + ...(options.addCommandBar ? [generateCommandBar(sharedOptions, sharedOptions.allProps)] : []), + generateHtml(options, _context), + ])(tree, _context); + }; +} + +function generateHtml(options: Schema, _context: SchematicContext): Rule { + return mergeWith( + apply(url('./generators/components/table/files'), [ + templateInclude(_context, applyTemplate, sharedOptions, '../shared/methods'), + move(sharedOptions.path), + ]), + sharedOptions.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); +} + +function applyTemplate(): Rule { + return applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + camelize: strings.camelize, + options: sharedOptions, + name: sharedOptions.name, + selectedModelElementUrn: sharedOptions.selectedModelElement.aspectModelUrn, + aspectModelElementUrn: sharedOptions.aspectModel.aspectModelUrn, + isCollectionAspect: sharedOptions.aspectModel.isCollectionAspect, + aspectModelName: sharedOptions.aspectModel.name, + aspectModelTypeName: sharedOptions.aspectModelTypeName, + enumPropertyDefinitions: getEnumPropertyDefinitions(sharedOptions, sharedOptions.allProps), + enumCustomColumns: getEnumCustomColumns(), + enumProperties: getEnumProperties(sharedOptions), + customRowActionInput: getCustomRowActionInput(), + customColumnsInput: getCustomColumnsInput(), + byValueFunction: getByValueFunction(), + commonImports: commonImports(), + sharedCustomRows: getSharedCustomRows(), + customColumn: getCustomColumn(), + columnTransKeyPrefix: getColumnTransKeyPrefix(), + }); +} + +function getEnumCustomColumns(): string { + return sharedOptions.customColumns + .map((value: string) => `${dasherize(value.trim()).replace(/-/g, '_').toUpperCase()} = '${value.trim()}',`) + .join(''); +} + +function getCustomRowActionInput(): string { + return `${sharedOptions.customRowActions + .map((customRowAction: string) => { + const formattedAction = customRowAction.replace(/\.[^/.]+$/, ''); + const classifiedFormattedAction = classify(formattedAction); + return `@Input() is${classifiedFormattedAction}Visible = true;`; + }) + .join('')}`; +} + +function getCustomColumnsInput(): string { + return `${ + sharedOptions.customColumns && sharedOptions.customColumns.length > 0 + ? sharedOptions.customColumns + .map((customColumn: string) => `@Input("${camelize(customColumn)}Column") ${camelize(customColumn)}Template!: TemplateRef;`) + .join('') + : '' + }`; +} + +function getCustomColumn(): string { + return `${sharedOptions.customColumns.map((value: string) => `'${value.trim()}'`).join(', ')}`; +} + +function getByValueFunction(): string { + const propertyValues = getAllEnumProps(sharedOptions); + return `${propertyValues + .map(property => { + return property.enumWithEntities + ? `get${classify(property.propertyName)}Value = ${classify(property.characteristic)}.getByValue;` + : ''; + }) + .join('')}`; +} + +function hasCustomActions(): boolean { + return [...sharedOptions.customRowActions, ...sharedOptions.customCommandBarActions].findIndex(element => element.includes('.')) !== -1; +} + +function getSharedCustomRows(): string { + return `this.currentLanguage = this.translateService.getActiveLang(); + ${[...sharedOptions.customRowActions, ...sharedOptions.customCommandBarActions] + .map( + (customRowActions: string) => + `${ + customRowActions.lastIndexOf('.') > -1 + ? `iconRegistry.addSvgIcon('${customRowActions.replace( + /\.[^/.]+$/, + '' + )}', sanitizer.bypassSecurityTrustResourceUrl('./assets/icons/${customRowActions}'));` + : `` + }` + ) + .join('')}`; +} + +function commonImports(): string { + return `${hasCustomActions() ? `iconRegistry: MatIconRegistry,` : ``} + private sanitizer: DomSanitizer, + private translateService: TranslocoService, + public dialog: MatDialog, + private storageService: EsmfLocalStorageService, + @Inject(EsmfPaginatorSelectConfigInjector) public paginatorSelectConfig: MatPaginatorSelectConfig, + ${sharedOptions.hasFilters ? `public filterService: ${sharedOptions.filterServiceName},` : ''} + ${ + sharedOptions.isDateQuickFilter + ? 'private dateAdapter: DateAdapter,@Inject(MAT_DATE_FORMATS) private dateFormats: MatDateFormats,' + : '' + }`; +} + +function getColumnTransKeyPrefix(): string { + return sharedOptions.enableVersionSupport + ? `${sharedOptions.selectedModelElement.name.toLowerCase()}.v${sharedOptions.templateHelper.formatAspectModelVersion( + sharedOptions.aspectModelVersion + )}.` + : ``; +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template b/libs/schematic/generators/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template new file mode 100644 index 00000000..431e0615 --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/services/storage/files/__name@dasherize__.service.ts.template @@ -0,0 +1,38 @@ +/** <%= options.generationDisclaimerText %> **/ +import {Injectable} from '@angular/core'; + +/** + * Manage user settings based on the local storage of the browser. + */ +export abstract class BrowserStorage { + abstract getItem(key: string): T; + abstract removeItem(key: string): void; + abstract setItem(key: string, item: T): void; +} + +@Injectable({ + providedIn: 'root', +}) +export class JSSdkLocal<%= classify(name) %>Service implements BrowserStorage { + /** + * Prefix for keys to avoid overwriting of values of an app having the same key. + */ + readonly KEY_PREFIX = 'JSSDK_'; + + getItem(key: string): T { + const item = localStorage.getItem(this.buildKey(key)); + return item ? JSON.parse(item) : undefined; + } + + removeItem(key: string): void { + localStorage.removeItem(this.buildKey(key)); + } + + setItem(key: string, item: T): void { + localStorage.setItem(this.buildKey(key), JSON.stringify(item)); + } + + private buildKey(key: string): string { + return `${this.KEY_PREFIX}${key}`; + } +} diff --git a/libs/schematic/generators/ng-generate/components/table/generators/services/storage/index.ts b/libs/schematic/generators/ng-generate/components/table/generators/services/storage/index.ts new file mode 100644 index 00000000..a0249bea --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/generators/services/storage/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {apply, applyTemplates, MergeStrategy, mergeWith, move, Rule, SchematicContext, Tree, url} from '@angular-devkit/schematics'; +import {strings} from '@angular-devkit/core'; + +export function generateStorageService(options: any): Rule { + return (tree: Tree, _context: SchematicContext) => { + return mergeWith( + apply(url('./generators/services/storage/files'), [ + applyTemplates({ + classify: strings.classify, + dasherize: strings.dasherize, + options: options, + name: 'storage', + }), + move(options.path), + ]), + options.overwrite ? MergeStrategy.Overwrite : MergeStrategy.Error + ); + }; +} diff --git a/libs/schematic/generators/ng-generate/components/table/index.ts b/libs/schematic/generators/ng-generate/components/table/index.ts new file mode 100644 index 00000000..81e1fb9e --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/index.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {chain, Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import { + formatAllFilesRule, + generateComponent, + generateGeneralFilesRules, + insertVersionIntoPathRule, + insertVersionIntoSelectorRule, + loadAspectModelRule, + loadRdfRule, + options, + prepareOptions, + setComponentNameRule, + setCustomActionsAndFiltersRule, + setTemplateOptionValuesRule, +} from '../shared/index'; +import {ComponentType} from '../shared/schema'; +import {generateStorageService} from './generators/services/storage/index'; +import {generateColumnMenu} from './generators/components/column-menu/index'; +import {generateTableComponent} from './generators/components/table/index'; +import {TableSchema} from './schema'; +import {LOG_COLOR} from '../../../utils/constants'; + +export default function (tableSchema: TableSchema): Rule { + return (tree: Tree, context: SchematicContext) => { + generateComponent(context, tableSchema, ComponentType.TABLE); + }; +} + +export function generateTable(tableSchema: TableSchema): Rule { + console.log(LOG_COLOR, 'Start generating Table component...'); + + prepareOptions(tableSchema, ComponentType.TABLE); + + return chain([ + loadRdfRule(), + loadAspectModelRule(), + setCustomActionsAndFiltersRule(), + setComponentNameRule(ComponentType.TABLE), + insertVersionIntoSelectorRule(), + insertVersionIntoPathRule(), + setTemplateOptionValuesRule(), + ...generateGeneralFilesRules(), + ...tableSpecificGeneration(), + // TODO check how we can handle it at in standalone app ...addAndUpdateConfigurationFilesRule(), + formatAllFilesRule(), + ]); +} + +function tableSpecificGeneration(): Array { + return [ + generateTableComponent(options as TableSchema), + generateStorageService(options), // General + generateColumnMenu(options), // General + ]; +} diff --git a/libs/schematic/generators/ng-generate/components/table/schema.json b/libs/schematic/generators/ng-generate/components/table/schema.json new file mode 100644 index 00000000..1c1b02fa --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/schema.json @@ -0,0 +1,167 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-table-schematic", + "title": "Table Options Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "format": "path", + "description": "The path to create the component.", + "$default": { + "$source": "workingDirectory" + }, + "visible": false + }, + "name": { + "type": "string", + "description": "The name of the Component.", + "default": "table", + "x-prompt": "Component name" + }, + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "viewEncapsulation": { + "description": "Specifies the view encapsulation strategy.", + "enum": ["Emulated", "None", "ShadowDom"], + "type": "string", + "default": "None", + "alias": "v" + }, + "changeDetection": { + "description": "Specifies the change detection strategy.", + "enum": ["Default", "OnPush"], + "type": "string", + "alias": "c" + }, + "prefix": { + "type": "string", + "format": "html-selector", + "description": "The prefix to apply to generated selectors.", + "default": "esmf-ui", + "alias": "p" + }, + "style": { + "description": "The file extension to be used for style files.", + "type": "string", + "default": "scss" + }, + "flat": { + "type": "boolean", + "description": "Flag to indicate if a dir is created.", + "default": false + }, + "skipImport": { + "type": "boolean", + "description": "Flag to skip the module import.", + "default": false + }, + "selector": { + "type": "string", + "format": "html-selector", + "description": "The selector to use for the component." + }, + "module": { + "type": "string", + "description": "Allows specification of the declaring module.", + "alias": "m" + }, + "export": { + "type": "boolean", + "default": false, + "description": "Specifies if declaring module exports the component." + }, + "aspectModelUrnToLoad": { + "type": "string", + "default": "" + }, + "selectedModelElementUrn": { + "type": "string", + "default": "" + }, + "jsonAccessPath": { + "type": "string", + "default": "" + }, + "enableVersionSupport": { + "type": "boolean", + "default": true + }, + "addRowCheckboxes": { + "type": "boolean", + "default": false + }, + "addCommandBar": { + "type": "boolean", + "default": false + }, + "enabledCommandBarFunctions": { + "type": "array", + "default": [] + }, + "excludedProperties": { + "type": "array", + "default": [] + }, + "getExcludedPropLabels": { + "type": "boolean", + "default": false + }, + "customRowActions": { + "type": "array", + "default": [] + }, + "customCommandBarActions": { + "type": "array", + "default": [] + }, + "customColumns": { + "type": "array", + "default": [] + }, + "customStyleImports": { + "type": "array", + "default": [] + }, + "aspectModel": { + "type": "object" + }, + "enableRemoteDataHandling": { + "type": "boolean", + "default": false + }, + "customRemoteService": { + "type": "boolean", + "default": true + }, + "overwrite": { + "type": "boolean", + "default": false + }, + "ttl": { + "type": "string" + }, + "configFile": { + "description": "Used for pre-loading the config file from the command line(when set, config wizard is disabled).", + "type": "string" + }, + "skipInstall": { + "type": "boolean", + "default": false, + "description": "Weather or not to install dependencies at the end of the generation process." + }, + "getOptionalMaterialTheme": { + "type": "boolean", + "default": false + }, + "commandBarFilterOrder": { + "type": "array", + "default": [] + } + } +} diff --git a/libs/schematic/generators/ng-generate/components/table/schema.ts b/libs/schematic/generators/ng-generate/components/table/schema.ts new file mode 100644 index 00000000..ecfe67fe --- /dev/null +++ b/libs/schematic/generators/ng-generate/components/table/schema.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Values} from '../shared/schema'; + +export interface TableSchema extends Values { + customRowActions: string[]; + addRowCheckboxes: boolean; + customColumns: Array; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type,@typescript-eslint/no-empty-interface +export interface ConfigurationDefaultsSchema {} + +// class to define default values that are not asked in the prompter +// defaultValue = data.properties.defaultValue.default; +export class TableDefaultsSchema implements ConfigurationDefaultsSchema {} diff --git a/libs/schematic/generators/ng-generate/default-schema.ts b/libs/schematic/generators/ng-generate/default-schema.ts new file mode 100644 index 00000000..1682c459 --- /dev/null +++ b/libs/schematic/generators/ng-generate/default-schema.ts @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Aspect, Entity} from '@esmf/aspect-model-loader'; +import * as ora from 'ora'; +import {TemplateHelper} from '../utils/template-helper'; + +export interface DefaultSchema { + spinner: ora.Ora; + ttl: Array; + aspectModel: Aspect; + aspectModelVersion: string; + enableVersionSupport: boolean; + selectedModelElement: Aspect | Entity; + aspectModelTFiles: string[]; + aspectModelTFilesString: string; + aspectModelUrnToLoad: string; + selectedModelElementUrn: string; + configFile: string; + templateHelper: TemplateHelper; +} diff --git a/libs/schematic/generators/ng-generate/i18n/index.ts b/libs/schematic/generators/ng-generate/i18n/index.ts new file mode 100644 index 00000000..2dc9cc59 --- /dev/null +++ b/libs/schematic/generators/ng-generate/i18n/index.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {chain, Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import {Schema} from './schema'; +import {addPackageJsonDependencies, addPackageJsonScripts} from '../../utils/package-json'; +import {NodeDependencyType} from '@schematics/angular/utility/dependencies'; +import {TemplateHelper} from '../../utils/template-helper'; +import {formatGeneratedFiles} from '../../utils/file'; +import ora from 'ora'; +import {generateTranslationModule} from '../components/shared/generators/index'; +import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks'; + +/** + * Updates the project with dependencies, scripts, and modules required for translation functionality. + * + * @param {Schema} options - The options configured for the schematics command. + * + * @returns {Rule} - The rule to be applied to the Tree. + */ +export default function (options: Schema): Rule { + const spinner = ora().start(); + options.spinner = spinner; + (options as any).templateHelper = new TemplateHelper(); + return chain([ + addPackageJsonDependencies(options.skipImport, spinner, dependencies), + addPackageJsonScripts(scripts), + generateTranslationModule(options), + formatGeneratedFiles( + { + getPath() { + return `src/app/shared`; + }, + }, + options, + ['app-shared.module.ts'] + ), + installPackages(), + ]); +} + +const dependencies = [ + {type: NodeDependencyType.Default, version: '^7.4.2', name: '@jsverse/transloco-locale', overwrite: false}, + {type: NodeDependencyType.Default, version: '~1.2.0', name: 'ngx-i18n-combine', overwrite: false}, +]; + +const scripts = [ + { + name: 'combine-i18n', + command: 'ngx-i18n-combine -i ./src/**/i18n/shared/components/**/*.translation.json -o ./src/assets/i18n/{en,de}.json', + }, +]; + +function installPackages(): Rule { + return (tree: Tree, context: SchematicContext) => { + context.addTask(new NodePackageInstallTask()); + return tree; + }; +} diff --git a/libs/schematic/generators/ng-generate/i18n/schema.json b/libs/schematic/generators/ng-generate/i18n/schema.json new file mode 100644 index 00000000..88074d04 --- /dev/null +++ b/libs/schematic/generators/ng-generate/i18n/schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-schematic-i18n", + "title": "Translation Strategy Schema", + "type": "object", + "properties": { + "skipImport": { + "type": "boolean", + "description": "Flag to skip the module import.", + "default": false + } + }, + "required": [] +} diff --git a/libs/schematic/generators/ng-generate/i18n/schema.ts b/libs/schematic/generators/ng-generate/i18n/schema.ts new file mode 100644 index 00000000..e4b5f4d9 --- /dev/null +++ b/libs/schematic/generators/ng-generate/i18n/schema.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {DefaultSchema} from '../default-schema'; + +export interface Schema extends DefaultSchema { + skipImport: boolean; +} diff --git a/libs/schematic/generators/ng-generate/prompter/card/index.ts b/libs/schematic/generators/ng-generate/prompter/card/index.ts new file mode 100644 index 00000000..96b1d437 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/card/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {CardSchema} from '../../components/card/schema'; +import {Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Observable, Subscriber} from 'rxjs'; +import {generate} from '../index'; + +export default function (options: CardSchema) { + return (tree: Tree, context: SchematicContext) => { + return new Observable((subscriber: Subscriber) => { + generate(subscriber, tree, options, 'card'); + }); + }; +} diff --git a/libs/schematic/generators/ng-generate/prompter/card/schema.json b/libs/schematic/generators/ng-generate/prompter/card/schema.json new file mode 100644 index 00000000..3fbae92a --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/card/schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-card-prompter-schematic", + "title": "Type Generation Schema", + "type": "object", + "properties": { + "configFile": { + "type": "string", + "description": "Specifies the name and the location of a stored configuration file.", + "default": "" + } + } +} diff --git a/libs/schematic/generators/ng-generate/prompter/form/index.ts b/libs/schematic/generators/ng-generate/prompter/form/index.ts new file mode 100644 index 00000000..c9c7a9f0 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/form/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {FormSchema} from '../../components/form/schema'; +import {Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Observable, Subscriber} from 'rxjs'; +import {generate} from '../index'; + +export default function (options: FormSchema) { + return (tree: Tree, context: SchematicContext) => { + return new Observable((subscriber: Subscriber) => { + generate(subscriber, tree, options, 'form'); + }); + }; +} diff --git a/libs/schematic/generators/ng-generate/prompter/form/schema.json b/libs/schematic/generators/ng-generate/prompter/form/schema.json new file mode 100644 index 00000000..86ebf9a2 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/form/schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-form-prompter-schematic", + "title": "Type Generation Schema", + "type": "object", + "properties": { + "configFile": { + "type": "string", + "description": "Specifies the name and the location of a stored configuration file.", + "default": "" + } + } +} diff --git a/libs/schematic/generators/ng-generate/prompter/index.ts b/libs/schematic/generators/ng-generate/prompter/index.ts new file mode 100644 index 00000000..b4f9d2af --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/index.ts @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Aspect} from '@esmf/aspect-model-loader'; +import * as fs from 'fs'; +import * as path from 'path'; +import {lastValueFrom, Subscriber} from 'rxjs'; +import {TemplateHelper} from '../../utils/template-helper'; +import {ComponentType, Schema} from '../components/shared/schema'; + +import {loader, reorderAspectModelUrnToLoad, writeConfigAndExit} from './utils'; +import {virtualFs} from '@angular-devkit/core'; +import { + anotherFile, + configFileName, + createOrImport, + importConfigFile, + requestPath, +} from './prompts-questions/shared/prompt-simple-questions'; +import {tablePrompterQuestions} from './prompts-questions/table/prompt-questions'; +import {pathDecision, requestAspectModelWithAspect} from './prompts-questions/shared/prompt-complex-questions'; +import {formPrompterQuestions} from './prompts-questions/form/prompt-questions'; +import {cardPrompterQuestions} from './prompts-questions/card/prompt-questions'; +import {typesPrompterQuestions} from './prompts-questions/types/prompt-questions'; +import {loadInquirer} from '../../utils/angular'; +import {LOG_COLOR} from '../../utils/constants'; + +// Function to dynamically load inquirer-fuzzy-path and register the prompt +async function registerFuzzyPathPrompt(): Promise { + try { + const inquirerFuzzyPath = await import('inquirer-fuzzy-path'); + const inquirerPromptSuggest = await import('inquirer-prompt-suggest'); + const inquirerSearchList = await import('inquirer-search-list'); + const inquirer = await loadInquirer(); + + inquirer.registerPrompt('fuzzypath', inquirerFuzzyPath); + inquirer.registerPrompt('suggest', inquirerPromptSuggest); + inquirer.registerPrompt('search-list', inquirerSearchList); + + return inquirer; + } catch (err) { + console.error('Failed to register fuzzy path prompt:', err); + } +} + +export let WIZARD_CONFIG_FILE = 'wizard.config.json'; + +let generationType: ComponentType; + +let fromImport = false; +let index = 1; +let allAnswers: any; +let inquirer: any; +export let aspect: Aspect; + +/** + * Returns a Rule for a schematic which prompts the user for input, + * loads existing configurations, and writes the configuration to a file. + * + * @param {Subscriber} subscriber - The subscriber to notify about the progress of the generation. + * @param {Tree} tree - Represents the structure of the resources (files, modules, etc.). + * @param {Schema} options - The options Schema object for the schematic. + * @param {string} type - The type of the generated component. + * + * @throws {Error} - Will throw an error if an error occurs during execution. + */ +export async function generate(subscriber: Subscriber, tree: Tree, options: Schema, type: string) { + console.log(LOG_COLOR, 'Welcome to the TTL schematic UI generator, answer some questions to get you started:'); + + inquirer = await registerFuzzyPathPrompt(); + generationType = type as ComponentType; + initAnswers(); + + runPrompts(subscriber, tree, new TemplateHelper(), options).finally(() => { + // "path" is the default options property for schematics to determine where to generate files + allAnswers.path = allAnswers.pathToSource; + + cleanUpOptionsObject(allAnswers); + Object.assign(options, allAnswers); + + if (!fromImport) { + WIZARD_CONFIG_FILE = allAnswers.configFile; + writeConfigAndExit(subscriber, tree, allAnswers); + } + }); +} + +/** + * Initializes the `allAnswers` object with default values. + * + * This function is used at the start of the program to ensure that + * `allAnswers` is defined and has a consistent shape. The properties + * of this object will be populated with user input as the program progresses. + * + */ +function initAnswers() { + allAnswers = { + aspectModelTFiles: [], + excludedProperties: [], + configFile: WIZARD_CONFIG_FILE, + complexProps: [], + }; +} + +/** + * Executes series of prompts, gathers user input and combines it into a single answers object. + * + * @param {Subscriber} subscriber - Subscriber from the parent Observable, used for handling errors. + * @param {Tree} tree - The Tree object that represents the file system tree. + * @param {TemplateHelper} templateHelper - A helper object used to manage templates. + * @param {Schema} options - The options provided to the schematic. + * + * @returns {Promise} A Promise that resolves when all the prompts are done and the answers are combined. + * + * @throws Will throw an error if an operation fails. + */ +async function runPrompts(subscriber: Subscriber, tree: Tree, templateHelper: TemplateHelper, options: Schema) { + try { + const answerConfigurationFileConfig = await getConfigurationFileConfig(subscriber, tree); + + if (!answerConfigurationFileConfig.importConfigFile) { + const answerAspectModelWithMainAspect = await getAspectModelWithMainAspect(); + aspect = await loadAspectModel(answerAspectModelWithMainAspect.aspectModelUrnToLoad, tree); + switch (generationType) { + case ComponentType.TABLE: + return tablePrompterQuestions( + answerConfigurationFileConfig, + answerAspectModelWithMainAspect, + templateHelper, + options, + aspect, + combineAnswers, + allAnswers + ); + case ComponentType.FORM: + return formPrompterQuestions( + answerConfigurationFileConfig, + answerAspectModelWithMainAspect, + templateHelper, + options, + aspect, + combineAnswers, + allAnswers + ); + case ComponentType.CARD: + return cardPrompterQuestions( + answerConfigurationFileConfig, + answerAspectModelWithMainAspect, + templateHelper, + options, + aspect, + combineAnswers, + allAnswers + ); + case ComponentType.TYPES: + return typesPrompterQuestions(answerConfigurationFileConfig, answerAspectModelWithMainAspect, combineAnswers); + default: + throw new Error('Invalid component type'); + } + } + } catch (error) { + console.error('An error occurred:', error); + subscriber.error(error); + } +} + +/** + * Prompts the user with questions related to the configuration file and handles + * the user's responses. + * + * If the user chooses to import a configuration file, this function will handle + * the importing of the configuration file and then subscribe to the tree. + * + * If the user chooses to provide file paths, this function will add the files + * to the configuration and ask the user if they want to add more files. + * + * @param {Subscriber} subscriber - The subscriber to the tree. + * @param {Tree} tree - The tree that is being observed. + * @returns {Promise} A promise that resolves to the answers from the user. + */ +async function getConfigurationFileConfig(subscriber: Subscriber, tree: Tree) { + const answerGeneralConfig = await inquirer.prompt([createOrImport, requestPath, configFileName, importConfigFile, pathDecision(WIZARD_CONFIG_FILE)]); + + if (answerGeneralConfig.importConfigFile) { + importFileConfig(answerGeneralConfig.importConfigFile, subscriber, tree); + } + + if (answerGeneralConfig.paths) { + addFileToConfig(answerGeneralConfig.paths, allAnswers); + await askAnotherFile(); + } + return answerGeneralConfig; +} + +/** + * This function adds a TTL file to a list of TTL files within the user's answers. + * + * @param {string} aspectModel - The name of the TTL file to be added to the configuration. + * @param {object} allAnswers - An object containing all the answers given by the user so far in the inquirer prompts. This object includes the list of TTL files to which we want to add. + * + * @throws {Error} Throws an error if the provided TTL file name is not a string or if it is already included in the list of TTL files. + */ +function addFileToConfig(aspectModel: string, allAnswers: any) { + if (!aspectModel) { + console.log('Error loading ttl. Try again with different file!'); + throw new Error('Error loading ttl. Try again with different file!'); + } + + if (allAnswers.aspectModelTFiles.includes(aspectModel)) { + console.log('File was already added'); + } else { + allAnswers.aspectModelTFiles.push(aspectModel); + } + + anotherFile.name = `anotherFile${++index}`; +} + +/** + * Imports configuration from a file, reads the data and uses it to configure the application. + * + * @param {string} configFilePath - The path to the configuration file to be imported. + * @param {Subscriber} subscriber - The subscriber to the observable in the main function. + * @param {Tree} tree - The tree representation of the project structure. + * + * @throws {Error} If an error occurs while loading the config file, an error will be thrown. + */ +async function importFileConfig(configFilePath: string, subscriber: Subscriber, tree: Tree) { + if (!configFilePath) { + console.log('Error loading config file. Try again with a different file!'); + throw new Error('EndPrompting'); + } + + try { + const data = fs.readFileSync(configFilePath, 'utf8'); + + WIZARD_CONFIG_FILE = path.basename(configFilePath); + fromImport = true; + + await writeConfigAndExit(subscriber, tree, JSON.parse(data), true); + } catch (err) { + console.log('Error loading config file. Try again with a different file!'); + throw new Error('Error loading config file. Try again with a different file!'); + } +} + +/** + * Asks the user if they want to add another file, and if so, it prompts for the file path. + * This function will recursively call itself as long as the user wants to add more files. + * + * @returns {Promise} A Promise that resolves when the user does not want to add another file. + * @throws {Error} If there is an issue with the Inquirer prompts or accessing the file paths. + */ +async function askAnotherFile() { + const anotherFileAnswer = await inquirer.prompt([anotherFile]); + + if (anotherFileAnswer[`anotherFile${index}`]) { + await inquirer.prompt([pathDecision(WIZARD_CONFIG_FILE, true)]).then((answer: any) => { + if (answer.paths) addFileToConfig(answer.paths, allAnswers); + }); + + // Recursive call to ask another file + await askAnotherFile(); + } +} + +/** + * Asynchronously prompts the user for input and retrieves an aspect model along with its main aspect. + * + * @returns {Promise} A promise that resolves with the user's input data as an object. + * + */ +async function getAspectModelWithMainAspect(): Promise { + return await inquirer.prompt([requestAspectModelWithAspect(allAnswers)]); +} + +/** + * Loads the aspect model. + * + * @param {string} pathToAspectModelWithMainAspect - The path of the Aspect Model with main Aspect to load. + * @param {Tree} tree - The tree of files. + * + * @returns {Promise} Returns a Promise that resolves to an Aspect. + * If aspect model has already been loaded, it is returned as is. + * If not, it tries to load it from TTL files, taking into account the possibility of having multiple TTL files. + * It throws an error if loading fails. + * + * @throws Will throw an error if loading the aspect model fails. + */ +async function loadAspectModel(pathToAspectModelWithMainAspect: string, tree: Tree): Promise { + if (aspect) return aspect; + + allAnswers.aspectModelTFiles = reorderAspectModelUrnToLoad(allAnswers.aspectModelTFiles, pathToAspectModelWithMainAspect); + + try { + const ttlFileContents: string[] = allAnswers.aspectModelTFiles + .filter((ttlFile: string) => ttlFile.endsWith('.ttl')) + .map((ttlFile: string) => { + const filePath = `${tree.root.path}${ttlFile.trim()}`; + const fileData: any = tree.read(filePath); + return virtualFs.fileBufferToString(fileData); + }); + + if (ttlFileContents.length > 1) { + return await lastValueFrom(loader.load('', ...ttlFileContents)); + } + + return await lastValueFrom(loader.loadSelfContainedModel(ttlFileContents[0])); + } catch (error) { + console.error(error); + throw error; + } +} + +/** + * Removes all temporary entries e.g. paths or anotherFile from the answers object + * + * @param allAnswers - An answer objects, being the result of all inquirer.prompt() calls. + */ +function cleanUpOptionsObject(allAnswers: any) { + Object.keys(allAnswers).forEach((objectKey: any) => { + if ( + objectKey.startsWith('paths') || + objectKey.startsWith('anotherFile') || + objectKey.startsWith('createOrImport') || + objectKey.startsWith('importConfigFile') || + objectKey.startsWith('pathToSource') + ) { + delete allAnswers[objectKey]; + } + }); +} + +/** + * This function combines the answers from different inquirer.prompt() calls + * into a single `allAnswers` object. + * + * @param {...any[]} answers - An array of answer objects, each being the result of an inquirer.prompt() call. + */ +function combineAnswers(...answers: any[]) { + const assign = Object.assign({}, ...answers); + Object.keys(assign).forEach(key => { + allAnswers[key] = assign[key]; + }); +} diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/card/prompt-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/card/prompt-questions.ts new file mode 100644 index 00000000..91ba0fff --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/card/prompt-questions.ts @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ComponentType, Schema} from '../../../components/shared/schema'; +import {TemplateHelper} from '../../../../utils/template-helper'; +import { + chooseLanguageForSearch, + customCommandBarActions, + excludedProperties, + extractComplexPropertyDetails, + extractPropertyElements, + generateLabelsForExcludedProperties, + getCommandBarFilterOrder, + getDatePickerType, + requestCommandBarFunctionality, + requestDefaultSorting, + requestOptionalMaterialTheme, + requestOverwriteFiles, + requestSelectedModelElement, + selectedAspectModelJsonPath, +} from '../shared/prompt-complex-questions'; +import { + requestAddCommandBar, + requestAspectModelVersionSupport, + requestCustomService, + requestCustomStyleImports, + requestEnableRemoteDataHandling, + requestSetViewEncapsulation, +} from '../shared/prompt-simple-questions'; +import {Aspect, BaseMetaModelElement, DefaultEntity} from '@esmf/aspect-model-loader'; +import {ConfigurationDefaultsSchema} from '../../../components/table/schema'; +import {CardDefaultsSchema} from '../../../components/card/schema'; +import {BaseModelLoader} from '@esmf/aspect-model-loader/dist/base-model-loader'; +import {loadInquirer} from '../../../../utils/angular'; + +/** + * Asynchronously prompts the user with a series of questions related to card configurations, + * combines these answers with existing configurations, and updates the provided answers. + * + * @param {any} answerConfigurationFileConfig - The existing configuration from a configuration file. + * @param {any} answerAspectModel - The current aspect model's answers. + * @param {TemplateHelper} templateHelper - An instance of TemplateHelper for assisting in generating template-based configurations. + * @param {Schema} options - Schema options that might affect the generation of table prompts. + * @param {Aspect} aspect - The current aspect of the table for which the configurations are being generated. + * @param {Function} combineAnswers - A function to combine all answers into a single configuration object. + * @param {any} allAnswers - All previously gathered answers that may influence current prompts. + * @returns {Promise} - A promise that resolves once all configurations are combined and processed. + */ +export async function cardPrompterQuestions( + answerConfigurationFileConfig: any, + answerAspectModel: any, + templateHelper: TemplateHelper, + options: Schema, + aspect: Aspect, + combineAnswers: (...answers: any[]) => any, + allAnswers: any +): Promise { + const defaultConfiguration: ConfigurationDefaultsSchema = new CardDefaultsSchema(); + + combineAnswers( + answerConfigurationFileConfig, + answerAspectModel, + await fetchUserSpecificCardConfigurations( + templateHelper, + options, + aspect, + allAnswers, + Object.keys(defaultConfiguration).length > 0 ? defaultConfiguration : {} + ) + ); +} + +async function fetchUserSpecificCardConfigurations( + templateHelper: TemplateHelper, + options: Schema, + aspect: Aspect, + allAnswers: any, + defaultConfiguration?: ConfigurationDefaultsSchema +): Promise { + const inquirer = await loadInquirer(); + const gatherInitialModelElement = await inquirer.prompt([ + requestSelectedModelElement(ComponentType.CARD, aspect, requestSelectedModelCondition), + ]); + const complexPropertiesAnswers = extractComplexPropertyDetails(templateHelper, gatherInitialModelElement, allAnswers, aspect); + const propertyElementAnswers = await extractPropertyElements(ComponentType.CARD, complexPropertiesAnswers); + const selectedAspectModelJsonPathAnswers = await inquirer.prompt([ + selectedAspectModelJsonPath(aspect, gatherInitialModelElement, allAnswers), + ]); + const excludedPropertiesAnswers = await inquirer.prompt([ + excludedProperties(ComponentType.CARD, allAnswers, templateHelper, gatherInitialModelElement, aspect), + ]); + const labelsForExcludedPropsAnswers = await inquirer.prompt([generateLabelsForExcludedProperties(gatherInitialModelElement)]); + const defaultSortingAnswers = await inquirer.prompt([requestDefaultSorting(aspect, allAnswers, templateHelper)]); + const commandbarFunctionalityAnswers = await inquirer.prompt([ + requestAddCommandBar, + requestCommandBarFunctionality(aspect, allAnswers, templateHelper), + chooseLanguageForSearch(aspect, allAnswers, templateHelper), + ]); + const datePickerTypeAnswers = commandbarFunctionalityAnswers.enabledCommandBarFunctions.includes('addDateQuickFilters') + ? await getDatePickerType(templateHelper, allAnswers, gatherInitialModelElement, aspect) + : {}; + const customBarActionsAnswers = await inquirer.prompt([customCommandBarActions(allAnswers, templateHelper)]); + + const setCommandBarFilterOrder = await getCommandBarFilterOrder( + templateHelper, + allAnswers, + gatherInitialModelElement, + aspect, + options, + commandbarFunctionalityAnswers.enabledCommandBarFunctions + ); + + const enableRemoteDataHandlingAnswers = await inquirer.prompt([requestEnableRemoteDataHandling, requestCustomService]); + const aspectModelVersionSupportAnswers = await inquirer.prompt([requestAspectModelVersionSupport]); + const optionalMaterialThemeAnswers = await inquirer.prompt([requestOptionalMaterialTheme(options)]); + const customStyleImportsAnswers = await inquirer.prompt([requestCustomStyleImports]); + const setViewEncapsulationAnswers = await inquirer.prompt([requestSetViewEncapsulation]); + const overwriteFilesAnswers = await inquirer.prompt([requestOverwriteFiles(options)]); + + return { + ...gatherInitialModelElement, + ...propertyElementAnswers, + ...selectedAspectModelJsonPathAnswers, + ...excludedPropertiesAnswers, + ...labelsForExcludedPropsAnswers, + ...defaultSortingAnswers, + ...commandbarFunctionalityAnswers, + ...datePickerTypeAnswers, + ...customBarActionsAnswers, + ...setCommandBarFilterOrder, + ...enableRemoteDataHandlingAnswers, + ...aspectModelVersionSupportAnswers, + ...optionalMaterialThemeAnswers, + ...customStyleImportsAnswers, + ...setViewEncapsulationAnswers, + ...overwriteFilesAnswers, + ...defaultConfiguration, + }; +} + +function requestSelectedModelCondition(aspect: Aspect, baseModelLoader: BaseModelLoader): boolean { + return ( + !aspect.isCollectionAspect && + baseModelLoader.filterElements((entry: BaseMetaModelElement) => entry instanceof DefaultEntity).length >= 1 + ); +} diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/form/prompt-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/form/prompt-questions.ts new file mode 100644 index 00000000..a7c17dac --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/form/prompt-questions.ts @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ComponentType, Schema} from '../../../components/shared/schema'; +import {TemplateHelper} from '../../../../utils/template-helper'; +import { + excludedProperties, + requestExcludedConstraints, + requestOptionalMaterialTheme, + requestOverwriteFiles, + requestSelectedModelElement, +} from '../shared/prompt-complex-questions'; +import {requestAspectModelVersionSupport, requestSetViewEncapsulation} from '../shared/prompt-simple-questions'; +import {Aspect, DefaultCollection, DefaultEntity} from '@esmf/aspect-model-loader'; +import {loadInquirer} from '../../../../utils/angular'; + +export const requestReadOnlyForm = (options: Schema) => ({ + type: 'confirm', + name: 'readOnlyForm', + message: 'Do you want to set the form read only?', + when: () => !options.readOnlyForm, + default: false, +}); + +export async function formPrompterQuestions( + answerConfigurationFileConfig: any, + answerAspectModel: any, + templateHelper: TemplateHelper, + options: Schema, + aspect: Aspect, + combineAnswers: (...answers: any[]) => any, + allAnswers: any +) { + combineAnswers( + answerConfigurationFileConfig, + answerAspectModel, + await getUserSpecificFormConfigs(templateHelper, options, allAnswers, aspect) + ); +} + +/** + * This function fetches user specific configurations by prompting a set of questions. + * The answers are grouped into two batches based on their dependency. + * + * @param {Tree} tree - Represents the file tree. + * @param {TemplateHelper} templateHelper - An instance of the TemplateHelper to aid in handling templates. + * @param {Schema} options - User defined options provided when running the script. + * @returns {Promise} An object containing the user responses. + */ +async function getUserSpecificFormConfigs(templateHelper: TemplateHelper, options: Schema, allAnswers: any, aspect: Aspect) { + const inquirer = await loadInquirer(); + const firstBatchAnswers = await inquirer.prompt([requestSelectedModelElement(ComponentType.FORM, aspect, requestSelectedModelCondition)]); + + const secondBatchAnswers = await inquirer.prompt([ + excludedProperties(ComponentType.FORM, allAnswers, templateHelper, firstBatchAnswers, aspect), + ]); + + const thirdBatchAnswers = await inquirer.prompt([ + requestExcludedConstraints(ComponentType.FORM, allAnswers, templateHelper, {...firstBatchAnswers, ...secondBatchAnswers}, aspect), + requestAspectModelVersionSupport, + requestOptionalMaterialTheme(options), + requestSetViewEncapsulation, + requestReadOnlyForm(options), + requestOverwriteFiles(options), + ]); + + return {...firstBatchAnswers, ...secondBatchAnswers, ...thirdBatchAnswers}; +} + +function requestSelectedModelCondition(aspect: Aspect, loader: any): boolean { + return ( + aspect.isCollectionAspect || + loader.filterElements((entry: any) => entry instanceof DefaultEntity).length >= 1 || + loader.filterElements((entry: any) => entry instanceof DefaultCollection).length >= 1 || + aspect.properties.length >= 1 + ); +} diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts new file mode 100644 index 00000000..44dc98fb --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-complex-questions.ts @@ -0,0 +1,617 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ +import { + Aspect, + AspectModelLoader, + BaseMetaModelElement, + Characteristic, + Constraint, + DefaultAspect, + DefaultCollection, + DefaultEither, + DefaultEntity, + DefaultList, + DefaultProperty, + DefaultPropertyInstanceDefinition, + DefaultSet, + DefaultSingleEntity, + DefaultSortedSet, + DefaultStructuredValue, + DefaultTrait, + Entity, + Property, +} from '@esmf/aspect-model-loader'; + +import {ComponentType, Schema} from '../../../components/shared/schema'; +import {TemplateHelper} from '../../../../utils/template-helper'; +import * as locale from 'locale-codes'; +import {handleComplexPropList, loader} from '../../utils'; +import {loadInquirer} from '../../../../utils/angular'; + +export const requestOverwriteFiles = (options: Schema) => ({ + type: 'confirm', + name: 'overwrite', + message: 'Do you want to overwrite older files(same as running command with --overwrite)?', + when: () => !options.overwrite, + default: true, +}); + +export const requestDefaultSorting = (aspect: Aspect, allAnswers: any, templateHelper: TemplateHelper) => ({ + type: 'list', + name: 'defaultSortingCol', + message: 'Choose the column on which default sorting is applied:', + choices: () => { + let selectedElement: Aspect | Entity = aspect; + if (allAnswers.selectedModelElementUrn && allAnswers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(allAnswers.selectedModelElementUrn) as Aspect | Entity; + } + const columns: string[] = []; + templateHelper + .getProperties({ + selectedModelElement: selectedElement, + excludedProperties: [], + complexProps: allAnswers.complexProps, + }) + .forEach((property: DefaultProperty) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexProperties = templateHelper.getComplexProperties(property, allAnswers); + complexProperties.properties.forEach((complexProp: Property) => { + columns.push(`${complexProperties.complexProp}.${complexProp.name}`); + }); + } else { + columns.push(`${property.name}`); + } + }); + + return columns.sort(); + }, + when: () => { + let selectedElement: Aspect | Entity = aspect; + if (allAnswers.selectedModelElementUrn && allAnswers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(allAnswers.selectedModelElementUrn) as Aspect | Entity; + } + return templateHelper.resolveType(selectedElement).properties.length > 1; + }, + default: false, +}); + +export const requestCommandBarFunctionality = (aspect: Aspect, allAnswers: any, templateHelper: TemplateHelper) => ({ + type: 'checkbox', + name: 'enabledCommandBarFunctions', + message: 'Select functionality of the command bar:', + choices: () => { + let selectedElement: Aspect | Entity = aspect; + + if (allAnswers.selectedModelElementUrn && allAnswers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(allAnswers.selectedModelElementUrn) as Aspect | Entity; + } + + const options = { + selectedModelElement: selectedElement, + excludedProperties: allAnswers.excludedProperties, + complexProps: allAnswers.complexProps, + }; + const choices = [ + { + name: 'Custom action buttons', + value: 'addCustomCommandBarActions', + }, + ]; + if (templateHelper.getStringProperties(options as Schema).length > 0) { + choices.push({ + name: 'Search for string properties', + value: 'addSearchBar', + }); + } + if (templateHelper.getDateProperties(options as Schema).length > 0) { + choices.push({ + name: 'Quick filters for properties of type date', + value: 'addDateQuickFilters', + }); + } + if (templateHelper.getEnumProperties(options as Schema).length > 0) { + choices.push({ + name: 'Quick filters for properties of type enumeration', + value: 'addEnumQuickFilters', + }); + } + return choices; + }, + when: (answers: any) => answers.addCommandBar, + default: [], +}); + +export const requestChooseDatePickerType = (property: Property) => ({ + type: 'list', + name: 'type', + message: `Property ${property.name} is an date type. Choose which type of date picker you want to display:`, + choices: () => [ + { + name: 'Single Date Picker', + value: 'singleDatePicker', + }, + { + name: 'Date Range Picker with single date option', + value: 'startOrEndDatePicker', + }, + { + name: 'Date Range Picker without single date option', + value: 'startAndEndDatePicker', + }, + ], + default: '', +}); + +export const requestOptionalMaterialTheme = (options: Schema) => ({ + type: 'confirm', + name: 'getOptionalMaterialTheme', + message: 'Do you want to add the Angular Material theme? (Indigo Pink Theme)', + when: () => !options.getOptionalMaterialTheme, + default: false, +}); + +export const chooseLanguageForSearch = (aspect: Aspect, allAnswers: any, templateHelper: TemplateHelper) => ({ + type: 'list', + name: 'chooseLanguageForSearch', + message: 'Which language should be used for the search functionality?', + choices: () => { + let selectedElement: Aspect | Entity = aspect; + + if (allAnswers.selectedModelElementUrn && allAnswers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(allAnswers.selectedModelElementUrn) as Aspect | Entity; + } + + const languageCodes = templateHelper.resolveAllLanguageCodes(selectedElement); + const choices = [{name: 'English', value: 'en'}]; + + languageCodes.forEach(code => { + if (code !== 'en') { + choices.push({name: locale.getByTag(code).name, value: code}); + } + }); + + return choices; + }, + when: (answers: any) => answers.addCommandBar && templateHelper.hasSearchBar(answers), + default: 'en', +}); + +export const customCommandBarActions = (answers: any, templateHelper: TemplateHelper) => ({ + type: 'suggest', + name: 'customCommandBarActions', + message: `To add custom action buttons on the command bar, enter the names of SVG-files or style classes. SVG files will be looked for in ./assets/icons directory. Use ',' to enter multiple (e.g. edit.svg,fa fa-edit):`, + suggestions: ['edit', 'delete', 'add', 'remove'], + filter: (input: string) => (input ? Array.from(new Set(input.split(','))) : []), + when: () => answers.addCommandBar && templateHelper.isAddCustomCommandBarActions(answers.enabledCommandBarFunctions), +}); + +export const requestAspectModelWithAspect = (allAnswers: any) => ({ + type: 'list', + name: 'aspectModelUrnToLoad', // TODO change this to aspectModelFilePath or something similar ... + message: 'Choose the .ttl file which includes the Aspect to load:', + choices: allAnswers.aspectModelTFiles, + when: () => allAnswers.aspectModelTFiles?.length > 1, + default: '', +}); + +export const pathDecision: any = (configFile: string, anotherFile = false) => ({ + type: 'fuzzypath', + name: 'paths', + excludeFilter: (nodePath: string) => !nodePath.endsWith('.ttl'), + excludePath: (nodePath: string) => nodePath.startsWith('node_modules'), + itemType: 'file', + message: 'Choose the path to a .ttl file. Start writing file name for suggestions:', + rootPath: './', + suggestOnly: false, + depthLimit: 5, + when: (answer: any) => { + if (answer.configFileName) { + if (answer.configFileName !== configFile) { + configFile = `${answer.configFileName}-${configFile}`; + answer.configFile = configFile; + } + return true; + } + + return anotherFile; + }, +}); + +export const requestComplexPropertyElements = (type: string, property: Property) => ({ + type: 'checkbox', + name: 'complexPropertyList', + message: `Property ${property.name} has a complex value(${property.effectiveDataType?.shortUrn}). Choose which object properties to display in the ${type}:`, + choices: (property.effectiveDataType as DefaultEntity).properties.map(innerProp => innerProp.aspectModelUrn), + default: [], +}); + +export const excludedProperties = (type: string, allAnswers: any, templateHelper: TemplateHelper, answers: any, aspect: Aspect) => ({ + type: 'checkbox', + name: 'excludedProperties', + message: `Choose the properties to hide in the ${type}:`, + when: () => { + let selectedElement: Aspect | Entity = aspect; + if (answers.selectedModelElementUrn && answers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(answers.selectedModelElementUrn) as Aspect | Entity; + } + + return templateHelper.resolveType(selectedElement).properties.length > 1; + }, + choices: () => { + let selectedElement: Aspect | Entity = aspect; + if (answers.selectedModelElementUrn && answers.selectedModelElementUrn.length > 0) { + selectedElement = loader.findByUrn(answers.selectedModelElementUrn) as Aspect | Entity; + } + let allProperties: Array = []; + allProperties = getAllPropertiesFromAspectOrEntity(templateHelper, selectedElement, allAnswers); + return allProperties; + }, +}); + +export const requestExcludedConstraints = (type: string, allAnswers: any, templateHelper: TemplateHelper, answers: any, aspect: Aspect) => { + const constraints = getAllConstraints(allAnswers, templateHelper, answers, aspect); + + return { + type: 'checkbox', + name: 'excludedConstraints', + message: `Choose the constraints to ignore in the ${type}:`, + when: () => constraints.length, + choices: () => + constraints.map(constraint => ({ + name: constraint.aspectModelUrn, + value: constraint.aspectModelUrn, + })), + }; +}; + +export const requestSelectedModelElement = ( + type: ComponentType, + aspect: Aspect, + conditionFunction: (aspect: Aspect, loader: AspectModelLoader) => any +) => ({ + type: 'list', + name: 'selectedModelElementUrn', + message: `Choose a specific Entity or Aspect to show as ${type}:`, + choices: getAspectAndEntities(aspect), + size: 5, + when: () => { + return conditionFunction(aspect, loader); + }, + default: '', +}); + +export const selectedAspectModelJsonPath = (aspect: Aspect, answers: any, allAnswers: any) => ({ + type: 'list', + name: 'jsonAccessPath', + message: `Choose the access path in the JSON payload to show data for ${answers.selectedModelElementUrn}`, + choices: () => + loader + .determineAccessPath((loader.findByUrn(answers.selectedModelElementUrn) as Entity | Aspect).properties[0]) + .map((pathSegments: Array) => (pathSegments.length > 1 ? pathSegments.slice(0, pathSegments.length - 1) : pathSegments)) + .map((pathSegments: Array) => pathSegments.join('.')) + .sort(), + when: () => { + const isAspect = loader.findByUrn(answers.selectedModelElementUrn) instanceof DefaultAspect; + const elementsPathSegments: Array> = loader.determineAccessPath(loader.findByUrn(answers.selectedModelElementUrn)); + + if (!aspect.isCollectionAspect && elementsPathSegments.length <= 1) { + allAnswers.jsonAccessPath = elementsPathSegments[0].join('.'); + } + + return !isAspect && !aspect.isCollectionAspect && elementsPathSegments.length > 1; + }, +}); + +export const generateLabelsForExcludedProperties = (answers: any) => ({ + type: 'confirm', + name: 'getExcludedPropLabels', + message: 'Do you want to generate translation labels for excluded properties?', + when: () => answers.excludedProperties && answers.excludedProperties.length > 0, + default: false, +}); + +function getAllPropertiesFromAspectOrEntity(templateHelper: any, selectedElement: any, allAnswers: any) { + const allProperties: Array = []; + templateHelper + .getProperties({ + selectedModelElement: selectedElement, + excludedProperties: [], + complexProps: allAnswers.complexProps, + }) + .forEach((property: DefaultProperty) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexProperties = templateHelper.getComplexProperties(property, allAnswers); + complexProperties.properties.forEach((complexProp: Property) => { + allProperties.push({ + name: `${complexProp.aspectModelUrn}`, + value: { + prop: `${complexProperties.complexProp}`, + propToExcludeAspectModelUrn: `${complexProp.aspectModelUrn}`, + }, + }); + }); + } else { + allProperties.push({ + name: `${property.aspectModelUrn}`, + value: { + prop: '', + propToExcludeAspectModelUrn: `${property.aspectModelUrn}`, + }, + }); + } + }); + + return allProperties; +} + +function getAspectAndEntities(aspect: Aspect) { + return [ + {name: `${aspect.aspectModelUrn} (Aspect)`, value: `${aspect.aspectModelUrn}`}, + ...loader + .filterElements(entry => entry instanceof DefaultEntity) + .filter((entity: BaseMetaModelElement) => !entity.parents.some((el: BaseMetaModelElement) => el instanceof DefaultSingleEntity)) + .map(entry => ({name: `${entry.aspectModelUrn} (Entity)`, value: `${entry.aspectModelUrn}`})) + .sort(), + ]; +} + +/** + * Extracts complex properties from a selected model element based on the provided aspect. It filters + * out properties that are complex and match certain criteria (e.g., being an instance of DefaultSingleEntity). + * This function is used to identify properties requiring further processing or customization. + * + * @param {TemplateHelper} templateHelper - Utilized for resolving the type based on aspect and fetching properties. + * @param {any} answers - Contains the current set of answers, including the selected model element URN. + * @param {any} allAnswers - Accumulates all answers, updated with the selected model element URN if not already specified. + * @param {Aspect} aspect - The aspect to consider when resolving the type and fetching properties. + * @returns {Array} - A filtered list of complex properties from the selected model element. + */ +export function extractComplexPropertyDetails( + templateHelper: TemplateHelper, + answers: any, + allAnswers: any, + aspect: Aspect +): Array { + allAnswers.selectedModelElementUrn = answers.selectedModelElementUrn || templateHelper.resolveType(aspect).aspectModelUrn; + + const properties = templateHelper.getProperties({ + selectedModelElement: loader.findByUrn(allAnswers.selectedModelElementUrn), + excludedProperties: [], + }); + + return properties.filter(property => property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity); +} + +function getAllConstraints(allAnswers: any, templateHelper: TemplateHelper, answers: any, aspect: Aspect): Constraint[] { + const selectedElement = + answers.selectedModelElementUrn && answers.selectedModelElementUrn.length > 0 + ? (loader.findByUrn(answers.selectedModelElementUrn) as Entity) + : aspect; + + const excludedPropertiesUrns = answers.excludedProperties + ? answers.excludedProperties.map((property: any) => property.propToExcludeAspectModelUrn) + : []; + const allProperties = getAllPropertiesFromAspectOrEntity(templateHelper, selectedElement, allAnswers); + const allowedPropertiesObjects = allProperties.filter(property => !excludedPropertiesUrns.includes(property.name)); + const allowedProperties = allowedPropertiesObjects.map(property => loader.findByUrn(property.name) as Property); + + return allowedProperties.reduce((acc, property) => [...acc, ...getConstraintsFromSubTree(property)], []); +} + +function getConstraintsFromSubTree(property: Property): Constraint[] { + const constraints: Constraint[] = []; + + constraints.push(...getConstraintsFromElement(property.characteristic)); + constraints.push(...getConstraintsFromComplexElement(property.characteristic)); + + if (property.characteristic instanceof DefaultTrait) { + constraints.push(...getConstraintsFromComplexElement(property.characteristic.baseCharacteristic)); + } + + return constraints; +} + +function getConstraintsFromElement(element: BaseMetaModelElement | undefined): Constraint[] { + return element instanceof DefaultTrait && element.constraints?.length ? element.constraints : []; +} + +function getConstraintsFromComplexElement(characteristic: Characteristic): Constraint[] { + if ( + characteristic instanceof DefaultSet || + characteristic instanceof DefaultSortedSet || + characteristic instanceof DefaultCollection || + characteristic instanceof DefaultList + ) { + return getConstraintsFromElement(characteristic.elementCharacteristic); + } + + if (characteristic instanceof DefaultEither) { + return [...getConstraintsFromElement(characteristic.left), ...getConstraintsFromElement(characteristic.right)]; + } + + if (characteristic instanceof DefaultStructuredValue) { + return characteristic.elements.reduce( + (acc, element) => + element instanceof DefaultPropertyInstanceDefinition + ? [...acc, ...getConstraintsFromElement(element.wrappedProperty.characteristic)] + : acc, + [] + ); + } + + return []; +} + +/** + * Processes complex properties of a given generation type, extracting and handling property elements + * through user prompts. It iterates over each property in the provided list, prompts for related complex + * property elements based on the generation type, and compiles the handled properties into a list. + * + * @param {string} generationType - The type of generation (e.g., "form", "table") that influences how properties are processed. + * @param {Array} complexProperties - A list of properties to be processed, typically requiring user input to determine specifics. + * @returns {Promise} - Resolves to an object containing a list of processed complex properties. + */ +export async function extractPropertyElements(generationType: string, complexProperties: Array): Promise { + const complexPropertyList = []; + for (const property of complexProperties) { + const {complexPropertyList: complexPropList} = await complexPropertyElementsPrompt(generationType, property); + const handledProp = handleComplexPropList(property, complexPropList); + complexPropertyList.push(handledProp); + } + + return {complexProps: complexPropertyList}; +} + +async function complexPropertyElementsPrompt(generationType: string, property: Property): Promise { + const inquirer = await loadInquirer(); + return inquirer.prompt([requestComplexPropertyElements(generationType, property)]); +} + +/** + * Gathers date picker types for date-time properties of a selected model element. It determines the + * model element's properties, prompts for date picker types for each date-time property, and returns + * a configuration list of these selections. + * + * @param {TemplateHelper} templateHelper - Assists with resolving types and getting properties. + * @param {any} allAnswers - Contains all previous answers, including the selected model element URN. + * @param {any} answers - Current answers, expected to include the selected model element URN. + * @param {Aspect} aspect - Used to resolve the default model element type if not specified. + * @returns {Promise} - Resolves to an object with configurations for each date-time property's date picker type. + */ +export async function getDatePickerType(templateHelper: TemplateHelper, allAnswers: any, answers: any, aspect: Aspect): Promise { + allAnswers.selectedModelElementUrn = answers.selectedModelElementUrn || templateHelper.resolveType(aspect).aspectModelUrn; + + const properties = templateHelper.getProperties({ + selectedModelElement: loader.findByUrn(allAnswers.selectedModelElementUrn), + excludedProperties: [], + }); + + const datePickerTypeList = []; + for (const property of properties) { + if (templateHelper.isDateTimeProperty(property)) { + const type = await datePickerTypePrompt(property); + const p = property.aspectModelUrn; + datePickerTypeList.push({propertyUrn: property.aspectModelUrn, datePicker: type}); + } + } + + return {datePickers: datePickerTypeList}; +} + +async function datePickerTypePrompt(property: Property): Promise { + const inquirer = await loadInquirer(); + return inquirer.prompt([requestChooseDatePickerType(property)]); +} + +function getFilterProperties( + templateHelper: TemplateHelper, + allAnswers: any, + answers: any, + aspect: Aspect, + enabledCommandBarFunctions?: any[] +): string[] { + const hasEnumFilter = enabledCommandBarFunctions ? enabledCommandBarFunctions.includes('addEnumQuickFilters') : false; + const hasDateFilter = enabledCommandBarFunctions ? enabledCommandBarFunctions.includes('addDateQuickFilters') : false; + allAnswers.selectedModelElementUrn = answers.selectedModelElementUrn || templateHelper.resolveType(aspect).aspectModelUrn; + const props = templateHelper.getProperties({ + selectedModelElement: loader.findByUrn(allAnswers.selectedModelElementUrn), + excludedProperties: [], + }); + + const filterProps: string[] = []; + props.forEach((prop: Property) => { + if (hasEnumFilter && templateHelper.isEnumProperty(prop)) { + filterProps.push(prop.name); + } else if ( + hasDateFilter && + (templateHelper.isDateProperty(prop) || templateHelper.isDateTimeProperty(prop) || templateHelper.isDateTimestampProperty(prop)) + ) { + filterProps.push(prop.name); + } + }); + + return filterProps; +} + +async function commandBarFilterOrderPrompt(allAnswers: any, options: Schema, choices: any): Promise { + const orderedChoices = await orderItems(choices); + options.commandBarFilterOrder = orderedChoices; + allAnswers['commandBarFilterOrder'] = orderedChoices; +} + +export async function getCommandBarFilterOrder( + templateHelper: TemplateHelper, + allAnswers: any, + answers: any, + aspect: Aspect, + options: Schema, + enabledCommandBarFunctions: any[] +): Promise { + const choices = getFilterProperties(templateHelper, allAnswers, answers, aspect, enabledCommandBarFunctions); + if ( + (enabledCommandBarFunctions.includes('addEnumQuickFilters') || enabledCommandBarFunctions.includes('addDateQuickFilters')) && + choices.length > 1 + ) { + return await commandBarFilterOrderPrompt(allAnswers, options, choices); + } +} + +async function orderItems(items: any) { + const orderedItems = [...items]; + let exit = false; + + while (!exit) { + console.log('Please select the order of filters in the command bar:'); + orderedItems.forEach((item, index) => { + console.log(`${index + 1}. ${item}`); + }); + + const inquirer = await loadInquirer(); + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'command', + message: + 'Enter the number of the item to move, followed by "u" to move up or "d" to move down (e.g., "2u" or "3d"). Press "q" to finish:', + validate: input => { + if (input.toLowerCase() === 'q') return true; + const match = input.match(/^(\d+)([ud])$/); + if (!match) return 'Please enter a valid command or "q" to finish.'; + const index = parseInt(match[1], 10) - 1; + const direction = match[2]; + if (index < 0 || index >= orderedItems.length) return 'Invalid item number.'; + if (direction === 'u' && index === 0) return 'Item is already at the top.'; + if (direction === 'd' && index === orderedItems.length - 1) return 'Item is already at the bottom.'; + return true; + }, + }, + ]); + + const command = answers.command.toLowerCase(); + if (command === 'q') { + exit = true; + } else { + const match = command.match(/^(\d+)([ud])$/); + const index = parseInt(match[1], 10) - 1; + const direction = match[2]; + + if (direction === 'u') { + [orderedItems[index], orderedItems[index - 1]] = [orderedItems[index - 1], orderedItems[index]]; + } else if (direction === 'd') { + [orderedItems[index], orderedItems[index + 1]] = [orderedItems[index + 1], orderedItems[index]]; + } + } + } + + return orderedItems; +} diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts new file mode 100644 index 00000000..f1dad47a --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/shared/prompt-simple-questions.ts @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Question} from 'inquirer'; +import {ViewEncapsulation} from '@schematics/angular/component/schema'; + +interface FuzzyPathQuestion extends Question { + excludeFilter?: (nodePath: string) => boolean; + excludePath?: (nodePath: string) => boolean; + itemType?: 'file' | 'directory' | 'any'; + rootPath?: string; + suggestOnly?: boolean; + depthLimit?: number; +} + +export const createOrImport = { + type: 'confirm', + name: 'createOrImport', + message: 'Do you want to create a new config (No for loading a pre-existing config file)?', + default: false, +}; + +export const configFileName: Question = { + type: 'input', + name: 'configFileName', + message: 'Please enter a name for your config file. It will be automatically appended to (-wizard.config.json):', + validate: (input: string) => (input.length === 0 ? 'The config file name cannot be empty. Please provide a valid name.' : true), + when: answer => answer['createOrImport'], +}; + +export const importConfigFile: FuzzyPathQuestion = { + type: 'fuzzypath', + name: 'importConfigFile', + excludeFilter: (nodePath: string) => !nodePath.endsWith('wizard.config.json'), + excludePath: (nodePath: string) => nodePath.startsWith('node_modules'), + itemType: 'file', + message: + 'Choose the path to an existing wizard config file which ends with "wizard.config.json". Start writing file name for suggestions:', + rootPath: './', + suggestOnly: false, + depthLimit: 5, + when: answer => !answer['createOrImport'], +}; + +export const anotherFile: Question = { + type: 'confirm', + name: 'anotherFile', + message: 'Do you want to import another .ttl file?', + default: false, +}; + +export const requestAddCommandBar = { + type: 'confirm', + name: 'addCommandBar', + message: 'Do you want to add a command bar with additional functionality like a search or quick filters?', + default: false, +}; + +export const requestEnableRemoteDataHandling = { + type: 'confirm', + name: 'enableRemoteDataHandling', + message: 'Do you want filtering, sorting and pagination to be done using a remote API?', + default: false, +}; + +export const requestCustomService = { + type: 'confirm', + name: 'customRemoteService', + message: 'Do you want to create a persistent custom service that extends the remote API default service?', + when: (answers: any) => answers.enableRemoteDataHandling, + default: false, +}; + +export const requestAspectModelVersionSupport = { + type: 'confirm', + name: 'enableVersionSupport', + message: 'Do you want to support different model versions?', + default: true, +}; + +export const requestCustomStyleImports = { + type: 'input', + name: 'customStyleImports', + message: `To import custom styles, enter the path and the name of the style files, e.g. ~mylib/scss/app.scss,assets/styles/app-common.scss.`, + filter: (input: string) => (input ? Array.from(new Set(input.split(','))) : []), + default: null, +}; + +export const requestSetViewEncapsulation = { + type: 'list', + name: 'viewEncapsulation', + message: 'Do you want to specify view encapsulation strategy?', + choices: [ViewEncapsulation.None, ViewEncapsulation.Emulated, ViewEncapsulation.ShadowDom], + default: ViewEncapsulation.None, +}; + +export const requestPath = { + type: 'input', + name: 'pathToSource', + message: `Input the path to the source files where the component files should be generated (e.g., src/app/components):`, + filter: (input: string) => input.trim(), + default: 'src/app/shared', + when: answer => answer['createOrImport'], +}; + diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/table/prompt-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/table/prompt-questions.ts new file mode 100644 index 00000000..776d060f --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/table/prompt-questions.ts @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {TemplateHelper} from '../../../../utils/template-helper'; +import { + chooseLanguageForSearch, + customCommandBarActions, + excludedProperties, + extractComplexPropertyDetails, + extractPropertyElements, + generateLabelsForExcludedProperties, + getCommandBarFilterOrder, + getDatePickerType, + requestCommandBarFunctionality, + requestDefaultSorting, + requestOptionalMaterialTheme, + requestOverwriteFiles, + requestSelectedModelElement, + selectedAspectModelJsonPath, +} from '../shared/prompt-complex-questions'; +import {ComponentType, Schema} from '../../../components/shared/schema'; +import {Aspect, BaseMetaModelElement, DefaultEntity} from '@esmf/aspect-model-loader'; +import { + requestAddCommandBar, + requestAspectModelVersionSupport, + requestCustomService, + requestCustomStyleImports, + requestEnableRemoteDataHandling, + requestSetViewEncapsulation, +} from '../shared/prompt-simple-questions'; +import {ConfigurationDefaultsSchema, TableDefaultsSchema} from '../../../components/table/schema'; +import {BaseModelLoader} from '@esmf/aspect-model-loader/dist/base-model-loader'; +import {loadInquirer} from '../../../../utils/angular'; + +/** + * Asynchronously prompts the user with a series of questions related to table configurations, + * combines these answers with existing configurations, and updates the provided answers. + * + * @param {any} answerConfigurationFileConfig - The existing configuration from a configuration file. + * @param {any} answerAspectModel - The current aspect model's answers. + * @param {TemplateHelper} templateHelper - An instance of TemplateHelper for assisting in generating template-based configurations. + * @param {Schema} options - Schema options that might affect the generation of table prompts. + * @param {Aspect} aspect - The current aspect of the table for which the configurations are being generated. + * @param {Function} combineAnswers - A function to combine all answers into a single configuration object. + * @param {any} allAnswers - All previously gathered answers that may influence current prompts. + * @returns {Promise} - A promise that resolves once all configurations are combined and processed. + */ +export async function tablePrompterQuestions( + answerConfigurationFileConfig: any, + answerAspectModel: any, + templateHelper: TemplateHelper, + options: Schema, + aspect: Aspect, + combineAnswers: (...answers: any[]) => any, + allAnswers: any +): Promise { + const defaultConfiguration: ConfigurationDefaultsSchema = {}; + + combineAnswers( + answerConfigurationFileConfig, + answerAspectModel, + await fetchUserSpecificTableConfigurations( + templateHelper, + options, + aspect, + allAnswers, + Object.keys(defaultConfiguration).length > 0 ? defaultConfiguration : {} + ) + ); +} + +async function fetchUserSpecificTableConfigurations( + templateHelper: TemplateHelper, + options: Schema, + aspect: Aspect, + allAnswers: any, + defaultConfiguration?: ConfigurationDefaultsSchema +): Promise { + const inquirer = await loadInquirer(); + const gatherInitialModelElement = await inquirer.prompt([ + requestSelectedModelElement(ComponentType.TABLE, aspect, requestSelectedModelCondition), + ]); + const complexPropertiesAnswers = extractComplexPropertyDetails(templateHelper, gatherInitialModelElement, allAnswers, aspect); + const propertyElementAnswers = await extractPropertyElements(ComponentType.TABLE, complexPropertiesAnswers); + const selectedAspectModelJsonPathAnswers = await inquirer.prompt([ + selectedAspectModelJsonPath(aspect, gatherInitialModelElement, allAnswers), + ]); + const excludedPropertiesAnswers = await inquirer.prompt([ + excludedProperties(ComponentType.TABLE, allAnswers, templateHelper, gatherInitialModelElement, aspect), + ]); + const labelsForExcludedPropsAnswers = await inquirer.prompt([generateLabelsForExcludedProperties(gatherInitialModelElement)]); + const defaultSortingAnswers = await inquirer.prompt([requestDefaultSorting(aspect, allAnswers, templateHelper)]); + const customColumnNamesAnswers = await inquirer.prompt([requestCustomColumnNames]); + const rowCheckBoxesAnswers = await inquirer.prompt([requestRowCheckboxes]); + const customRowCheckBoxesAnswers = await inquirer.prompt([requestCustomRowActions]); + const commandbarFunctionalityAnswers = await inquirer.prompt([ + requestAddCommandBar, + requestCommandBarFunctionality(aspect, allAnswers, templateHelper), + chooseLanguageForSearch(aspect, allAnswers, templateHelper), + ]); + const datePickerTypeAnswers = commandbarFunctionalityAnswers.enabledCommandBarFunctions?.includes('addDateQuickFilters') + ? await getDatePickerType(templateHelper, allAnswers, gatherInitialModelElement, aspect) + : {}; + + const setCommandBarFilterOrder = + (await getCommandBarFilterOrder( + templateHelper, + allAnswers, + gatherInitialModelElement, + aspect, + options, + commandbarFunctionalityAnswers.enabledCommandBarFunctions + )) || {}; + + const customBarActionsAnswers = await inquirer.prompt([customCommandBarActions(allAnswers, templateHelper)]); + const enableRemoteDataHandlingAnswers = await inquirer.prompt([requestEnableRemoteDataHandling, requestCustomService]); + const aspectModelVersionSupportAnswers = await inquirer.prompt([requestAspectModelVersionSupport]); + const optionalMaterialThemeAnswers = await inquirer.prompt([requestOptionalMaterialTheme(options)]); + const customStyleImportsAnswers = await inquirer.prompt([requestCustomStyleImports]); + const setViewEncapsulationAnswers = await inquirer.prompt([requestSetViewEncapsulation]); + const overwriteFilesAnswers = await inquirer.prompt([requestOverwriteFiles(options)]); + + return { + ...gatherInitialModelElement, + ...propertyElementAnswers, + ...selectedAspectModelJsonPathAnswers, + ...excludedPropertiesAnswers, + ...labelsForExcludedPropsAnswers, + ...defaultSortingAnswers, + ...customColumnNamesAnswers, + ...rowCheckBoxesAnswers, + ...customRowCheckBoxesAnswers, + ...commandbarFunctionalityAnswers, + ...datePickerTypeAnswers, + ...customBarActionsAnswers, + ...setCommandBarFilterOrder, + ...enableRemoteDataHandlingAnswers, + ...aspectModelVersionSupportAnswers, + ...optionalMaterialThemeAnswers, + ...customStyleImportsAnswers, + ...setViewEncapsulationAnswers, + ...overwriteFilesAnswers, + ...defaultConfiguration, + }; +} + +function requestSelectedModelCondition(aspect: Aspect, baseModelLoader: BaseModelLoader): boolean { + return ( + !aspect.isCollectionAspect && + baseModelLoader.filterElements((entry: BaseMetaModelElement) => entry instanceof DefaultEntity).length >= 1 + ); +} + +const requestCustomRowActions = { + type: 'suggest', + name: 'customRowActions', + message: `To add custom action buttons for each table row, enter the names of SVG-files or style classes. SVG files will be looked for in ./assets/icons directory. Use ',' to enter multiple (e.g. edit.svg,fa fa-edit):`, + suggestions: ['edit', 'delete', 'add', 'remove'], + filter: (input: string) => (input ? Array.from(new Set(input.split(','))) : []), +}; + +const requestRowCheckboxes = { + type: 'confirm', + name: 'addRowCheckboxes', + message: 'Do you want to add multi-selection checkboxes for selecting table rows?', + default: false, +}; + +const requestCustomColumnNames = { + type: 'suggest', + name: 'customColumns', + message: + "To add custom columns to show individual content. Use keys and adapt column naming in the translation files afterwards. Use ',' to enter multiple (e.g. special-chart, slider):", + suggestions: ['chart', 'slider'], + filter: (input: string) => (input ? Array.from(new Set(input.split(','))) : []), +}; diff --git a/libs/schematic/generators/ng-generate/prompter/prompts-questions/types/prompt-questions.ts b/libs/schematic/generators/ng-generate/prompter/prompts-questions/types/prompt-questions.ts new file mode 100644 index 00000000..91187e2e --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/prompts-questions/types/prompt-questions.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ConfigurationDefaultsSchema, TableDefaultsSchema} from '../../../components/table/schema'; +/** + * Asynchronously prompts the user with a series of questions related to table configurations, + * combines these answers with existing configurations, and updates the provided answers. + * + * @param {any} answerConfigurationFileConfig - The existing configuration from a configuration file. + * @param {any} answerAspectModel - The current aspect model's answers. + * @param {Function} combineAnswers - A function to combine all answers into a single configuration object. + * @returns {Promise} - A promise that resolves once all configurations are combined and processed. + */ +export async function typesPrompterQuestions( + answerConfigurationFileConfig: any, + answerAspectModel: any, + combineAnswers: (...answers: any[]) => any +): Promise { + const defaultConfiguration: ConfigurationDefaultsSchema = new TableDefaultsSchema(); + combineAnswers( + answerConfigurationFileConfig, + answerAspectModel, + await fetchTypesConfigurations(Object.keys(defaultConfiguration).length > 0 ? defaultConfiguration : {}) + ); +} + +async function fetchTypesConfigurations(defaultConfiguration?: ConfigurationDefaultsSchema): Promise { + return { + ...defaultConfiguration, + }; +} diff --git a/libs/schematic/generators/ng-generate/prompter/table/index.ts b/libs/schematic/generators/ng-generate/prompter/table/index.ts new file mode 100644 index 00000000..77200feb --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/table/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {TableSchema} from '../../components/table/schema'; +import {Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Observable, Subscriber} from 'rxjs'; +import {generate} from '../index'; + +export default function (options: TableSchema) { + return (tree: Tree, context: SchematicContext) => { + return new Observable((subscriber: Subscriber) => { + generate(subscriber, tree, options, 'table'); + }); + }; +} diff --git a/libs/schematic/generators/ng-generate/prompter/table/schema.json b/libs/schematic/generators/ng-generate/prompter/table/schema.json new file mode 100644 index 00000000..8155dbb6 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/table/schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-table-prompter-schematic", + "title": "Type Generation Schema", + "type": "object", + "properties": { + "configFile": { + "type": "string", + "description": "Specifies the name and the location of a stored configuration file.", + "default": "" + } + } +} diff --git a/libs/schematic/generators/ng-generate/prompter/types/index.ts b/libs/schematic/generators/ng-generate/prompter/types/index.ts new file mode 100644 index 00000000..c4cf9049 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/types/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Rule, SchematicContext} from '@angular-devkit/schematics'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Observable, Subscriber} from 'rxjs'; +import {generate} from '../index'; +import {TypesSchema} from '../../types/schema'; + +export default function (options: TypesSchema) { + return (tree: Tree, context: SchematicContext) => { + return new Observable((subscriber: Subscriber) => { + generate(subscriber, tree, options, 'types'); + }); + }; +} diff --git a/libs/schematic/generators/ng-generate/prompter/types/schema.json b/libs/schematic/generators/ng-generate/prompter/types/schema.json new file mode 100644 index 00000000..29ee45f0 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/types/schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-types-prompter-schematic", + "title": "Type Generation Schema", + "type": "object", + "properties": { + "configFile": { + "type": "string", + "description": "Specifies the name and the location of a stored configuration file.", + "default": "" + } + } +} diff --git a/libs/schematic/generators/ng-generate/prompter/utils.ts b/libs/schematic/generators/ng-generate/prompter/utils.ts new file mode 100644 index 00000000..8cb15792 --- /dev/null +++ b/libs/schematic/generators/ng-generate/prompter/utils.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {AspectModelLoader, DefaultEntity, Property} from '@esmf/aspect-model-loader'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {Subscriber} from 'rxjs'; +import * as fs from 'fs'; +import * as util from 'util'; +import {WIZARD_CONFIG_FILE} from './index'; +import {LOG_COLOR} from '../../utils/constants'; + +interface PropertyDetail { + name: string; + aspectModelUrn: string; +} + +interface ComplexProperty { + prop: string; + entityUrn: string; + propsToShow: PropertyDetail[]; +} + +export const loader = new AspectModelLoader(); + +/** + * Reorders the array of TTL files, placing the specified TTL file (aspectModelUrnToLoad) at the beginning. + * If aspectModelUrnToLoad does not exist in the array, the original array is returned. + * + * @param {Array} aspectModelTFiles - The array of TTL file URNs. + * @param {string} aspectModelUrnToLoad - The URN of the TTL file to be moved to the beginning of the array. + * + * @returns {Array} The reordered array of TTL file URNs. + */ +export function reorderAspectModelUrnToLoad(aspectModelTFiles: Array, aspectModelUrnToLoad: string): Array { + if (aspectModelTFiles.includes(aspectModelUrnToLoad)) { + return [aspectModelUrnToLoad, ...aspectModelTFiles.filter((item: string) => item !== aspectModelUrnToLoad)]; + } + + return aspectModelTFiles; +} + +/** + * Takes a property and a list of complex properties, and returns an object + * containing the property's name, its entity URN, and an array of properties + * to show. Each of these properties to show is an object with name and aspectModelUrn properties. + * + * @param {Property} property - The property to handle. + * @param {Array} complexPropList - The list of complex properties. + * + * @returns {Object} The object with prop, entityUrn and propsToShow properties. + */ +export function handleComplexPropList(property: Property, complexPropList: Array) { + return { + prop: property.name, + entityUrn: (property.effectiveDataType as DefaultEntity).aspectModelUrn, + propsToShow: complexPropList.map((property: any) => { + const findByUrn = loader.findByUrn(property); + const name = findByUrn ? findByUrn.name : property.split('#')[1]; + const aspectModelUrn = findByUrn ? findByUrn.aspectModelUrn : property; + return {name, aspectModelUrn} as PropertyDetail; + }), + } as ComplexProperty; +} + +/** + * Writes a configuration to a file and then exits. If an error occurs during + * the file writing process, it is thrown. Upon successful write, a message + * is logged to the console and the subscriber are notified of completion. + * + * @param {Subscriber} subscriber - The subscriber to notify of completion. + * @param {Tree} tree - The tree to pass to the subscriber. + * @param {any} config - The configuration to write to the file. + * @param {boolean} [fromImport=false] - A flag to indicate if the operation is from an import. + */ +// TODO add config file name as parameter +export async function writeConfigAndExit(subscriber: Subscriber, tree: Tree, config: any, fromImport = false) { + const writeFileAsync = util.promisify(fs.writeFile); + await writeFileAsync(WIZARD_CONFIG_FILE, JSON.stringify(config), 'utf8'); + + console.log( + LOG_COLOR, + fromImport + ? `The import was successful, the config used for your generation can be found here: ${WIZARD_CONFIG_FILE}` + : `New config file was generated based on your choices, it can be found here: ${WIZARD_CONFIG_FILE}` + ); + + subscriber.next(tree); + subscriber.complete(); +} diff --git a/libs/schematic/generators/ng-generate/types/aspect-model-type-generator-visitor.ts b/libs/schematic/generators/ng-generate/types/aspect-model-type-generator-visitor.ts new file mode 100644 index 00000000..bf4c3d64 --- /dev/null +++ b/libs/schematic/generators/ng-generate/types/aspect-model-type-generator-visitor.ts @@ -0,0 +1,361 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {camelize, classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {Rule, Tree} from '@angular-devkit/schematics'; +import { + Aspect, + BaseMetaModelElement, + Characteristic, + DefaultAspectModelVisitor, + DefaultCharacteristic, + DefaultCollection, + DefaultEntity, + DefaultEntityInstance, + DefaultEnumeration, + DefaultProperty, + Entity, + Enumeration, + Property +} from '@esmf/aspect-model-loader'; +import {TypesSchema} from './schema'; +import {isLangString, processType, resolveJsPropertyType} from '../components/shared/utils'; +import { + MultiLanguageText +} from '@esmf/aspect-model-loader/dist/instantiator/characteristic/characteristic-instantiator-util'; + +export function visitAspectModel(options: TypesSchema): Rule { + return async (tree: Tree) => { + const visitor = new AspectModelTypeGeneratorVisitor(options); + const aspect: Aspect = options.aspectModel; + const aspectName = dasherize(aspect.name); + const aspectModelVersion = 'v' + options.aspectModelVersion.replace(/\./g, ''); + + visitor.visit(aspect); + const generatedTypeDefinitions = visitor.getGeneratedTypeDefinitions(); + const pathToFile = `${options.path}/${aspectName}${ + options.enableVersionSupport ? '/' + aspectModelVersion : '' + }/${aspectName}.types.ts`; + + if (tree.exists(pathToFile)) { + tree.overwrite(pathToFile, generatedTypeDefinitions); + } else { + tree.create(pathToFile, generatedTypeDefinitions); + } + }; +} + +export class AspectModelTypeGeneratorVisitor extends DefaultAspectModelVisitor { + // Key = Name of the generated data type + // Value = Array of lines that define the data type + private typeDefinitions = new Map(); + private readonly options: TypesSchema; + + constructor(options: TypesSchema) { + super(); + this.options = options; + } + + getGeneratedTypeDefinitions(): string { + let typeDefinitionsAsString = ''; + // @ts-expect-error The this.typeDefinitions.values() return type is incorrectly identified + for (const lines of this.typeDefinitions.values()) { + typeDefinitionsAsString = typeDefinitionsAsString.concat(...lines); + } + + return typeDefinitionsAsString; + } + + visitAspect(aspect: Aspect, context: void): BaseMetaModelElement { + const lines = []; + + lines.push('/** Generated form ESMF JS SDK Angular Schematics - PLEASE DO NOT CHANGE IT **/\n\n'); + lines.push(this.getJavaDoc(aspect)); + lines.push(`export interface ${aspect.name} {\n`); + + this.options.spinner.info(`|-> Resolve Aspect: ${aspect.name}`); + + aspect.properties.forEach(property => { + // Visit the property to eventually generate a new data type and return + // the appropriate data type name. + const dataType = + property.characteristic instanceof DefaultCollection + ? `Array<${resolveJsPropertyType(property)}>` + : resolveJsPropertyType(property); + const variableName = camelize(property.name); + lines.push(this.getJavaDoc(property)); + lines.push(`${variableName}${property.isOptional ? '?' : ''}: ${dataType}${dataType.includes(';') ? '' : ';'}\n`); + }); + + lines.push(`}\n\n`); + this.typeDefinitions = this.typeDefinitions.set(aspect.name, lines); + + return aspect; + } + + visitCharacteristic(characteristic: Characteristic, context: void): BaseMetaModelElement { + if (isLangString(characteristic.dataType?.urn)) { + const lines = []; + lines.push(` + /** + * Represents a text with multiple language support. + */ + export interface MultiLanguageText { + /** key defines the locale. Value is the translated text for that locale. */ + [key: string]: string; + }\n\n`); + this.typeDefinitions = this.typeDefinitions.set(characteristic.name, lines); + } + + if (characteristic instanceof DefaultEnumeration) { + this.visitEnumeration(characteristic); + } + + return characteristic; + } + + visitEnumeration(enumeration: Enumeration): BaseMetaModelElement { + const lines = []; + + lines.push(this.getJavaDoc(enumeration)); + + let dataTypeEntityProperty: Property | undefined; + if (enumeration.dataType) { + if (enumeration.dataType.isComplex) { + const dataTypeEntity = enumeration.dataType as Entity; + // Find the property that actually specifies the property name to generate the enum values from + dataTypeEntityProperty = dataTypeEntity.properties.find(property => { + return !property.isNotInPayload && !property.isOptional; + }); + + if (!dataTypeEntityProperty) { + throw new Error(`Not able to find value property in ${dataTypeEntity.name}`); + } + } + } + + if (dataTypeEntityProperty !== undefined && enumeration.dataType && enumeration.dataType.isComplex) { + lines.push(`export class ${classify(enumeration.name)} {\n`); + + const versionedAccessPrefix = (this.options as any).templateHelper.getVersionedAccessPrefix(this.options as any) + ? `${(this.options as any).templateHelper.getVersionedAccessPrefix(this.options as any)}.` + : ``; + + let instanceProps: Array = []; + + enumeration.values.forEach((instance: DefaultEntityInstance) => { + if (dataTypeEntityProperty) { + instanceProps = instance.metaModelType.properties.map(prop => ({ + name: prop.name, + characteristic: prop.characteristic, + dataType: prop.effectiveDataType?.urn, + })); + + const entityInstancePropsWithValues = this.getEntityInstanceValues(instance, instanceProps); + + let values = ''; + entityInstancePropsWithValues.forEach( + (item: { + name: string; + value: string | MultiLanguageText | Array; + characteristic: Characteristic; + dataType: string | undefined; + }) => { + if (item.characteristic instanceof DefaultCollection && isLangString(item.dataType)) { + const arr: string = (item.value as Array) + .map(val => `{value: '${val.value}', language: '${val.language}'}`) + .join(','); + values += `([${arr}] as Array),`; + } else if (isLangString(item.dataType)) { + const multiLanguageText = item.value as MultiLanguageText; + values += `{value: '${multiLanguageText.value}', language: '${multiLanguageText.language}'},`; + } else { + const dataType = item.dataType?.split('#')[1]; + if (dataType && processType(dataType) === 'number') { + values += `${item.value}, `; + } else { + values += `'${item.value}', `; + } + } + } + ); + + values = values.replace(/,([^,]*)$/, '$1'); + + lines.push(`static ${classify(instance.name)} = new ${classify(enumeration.name)}(${values});\n`); + } + }); + + const constructorValues = instanceProps + .map((prop: any) => { + if (prop.characteristic instanceof DefaultCollection && isLangString(prop.dataType)) { + return `public ${prop.name}: Array`; + } else if (isLangString(prop.dataType)) { + return `public ${prop.name}: MultiLanguageText`; + } + + return `public ${prop.name}: ${processType(prop.dataType.split('#')[1])}`; + }) + .join(', '); + + const typeValues = instanceProps + .map((prop: any) => { + if (prop.characteristic instanceof DefaultCollection && isLangString(prop.dataType)) { + return `${prop.name}: Array`; + } else if (isLangString(prop.dataType)) { + return `${prop.name}: MultiLanguageText`; + } + + return `${prop.name}: ${processType(prop.dataType.split('#')[1])}`; + }) + .join(', '); + + lines.push(` + constructor(${constructorValues}){}\n + + /** Gets all defined values from ${classify(enumeration.name)} */ + public static values(): Array<{${typeValues}}> { + return [ + ${enumeration.values + .map( + (instance: DefaultEntityInstance) => + `{${instanceProps + .map((prop: any) => `${prop.name}: ${classify(enumeration.name)}.${classify(instance.name)}.${prop.name}`) + .join(',')}}` + ) + .join(',')} + ] + } + + /** Gets get the instance according to the given value or undefined if no instance exists */ + public static getByValue(value: string): ${classify(enumeration.name)} | undefined { + ${enumeration.values + .map( + (instance: DefaultEntityInstance) => + `if(value === '${instance.value}') return ${classify(enumeration.name)}.${classify(instance.name)}` + ) + .join('; ')} + + return undefined; + } + + public static isEnumeration(): boolean { + return true; + } + + `); + } else { + lines.push(`export enum ${enumeration.name} {\n`); + enumeration.values.forEach(value => { + if (typeof value === 'string') { + const variableName = this.sanitizeVariableName(value); + lines.push(` ${variableName} = '${value}',\n`); + } else if (typeof value === 'number') { + const variableName = this.sanitizeVariableName(`${value}`); + lines.push(` NUMBER${variableName} = ${value},\n`); + } + }); + } + + lines.push(`}\n\n`); + + this.typeDefinitions = this.typeDefinitions.set(enumeration.name, lines); + + return enumeration; + } + + visitEntity(entity: DefaultEntity, context: any): BaseMetaModelElement { + const lines = []; + + lines.push(this.getJavaDoc(entity)); + lines.push(`export interface ${entity.name} ${entity.extends ? `extends ${entity.extends?.name}` : ''} {\n`); + + this.options.spinner.info(`|--> Resolve Entity: ${entity.name}; Urn: ${entity.urn}`); + + entity.getOwnProperties().forEach((property: Property): void => { + if (property.characteristic === null) { + this.options.spinner.fail(`|---> Property ${property.name} has no characteristic defined.`); + } + + const dataTypeName = resolveJsPropertyType(property) || 'any'; + let variableName = ''; + if (property.name) { + variableName = camelize(property.name); + } + + if (dataTypeName) { + lines.push(this.getJavaDoc(property)); + lines.push(`${variableName}${property.isOptional ? '?' : ''}: ${dataTypeName}${dataTypeName.includes(';') ? '' : ';'}\n`); + } + }); + + lines.push(`}\n\n`); + + this.typeDefinitions = this.typeDefinitions.set(entity.name, lines); + + return entity; + } + + private getJavaDoc(element: Aspect | Property | Characteristic | Entity) { + const description = element.getDescription('en'); + if (description === undefined) { + return ''; + } + if (element instanceof DefaultProperty) { + return `/** ${description} */\n`; + } + return `/** + * ${description} + */\n`; + } + + private sanitizeVariableName(name: string): string { + // Convert the first character to upper case + if (name.length > 1) { + name = name[0].toUpperCase() + name.substring(1); + } else { + name = name.toUpperCase(); + } + + // Well, there is a bunch of possibilities how to choose an enum value that + // is not a valid identifier in TypeScript. There are just TOO MANY rules to address them all. + // Let's hope the aspect model designer are NOT choosing enum values that cause problems. + + // No whitespace allowed in variable name + name = name.replace(/\s+/g, '_'); + + // Variable name must not start with digit(s). Prefix them with '_'. + name = name.replace(/^(\d+)/, '_$1'); + + return name; + } + + private getEntityInstanceValues( + entityInstance: DefaultEntityInstance, + entityInstanceProps: Array<{ + name: string; + characteristic: Characteristic; + dataType: string | undefined; + }> + ): Array<{ + value: string | MultiLanguageText | Array; + name: string; + characteristic: DefaultCharacteristic; + dataType: string; + }> { + return entityInstanceProps.map((prop: any) => { + const propObject = (entityInstance as any)[prop.name]; + return {name: prop.name, value: propObject, characteristic: prop.characteristic, dataType: prop.dataType}; + }); + } +} diff --git a/libs/schematic/generators/ng-generate/types/index.ts b/libs/schematic/generators/ng-generate/types/index.ts new file mode 100644 index 00000000..e7324498 --- /dev/null +++ b/libs/schematic/generators/ng-generate/types/index.ts @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {dasherize} from '@angular-devkit/core/src/utils/strings'; +import {chain, Rule, SchematicContext} from '@angular-devkit/schematics'; +import ora from 'ora'; +import {loadAspectModel, loadRDF} from '../../utils/aspect-model'; +import {formatGeneratedFiles, loadAndApplyConfigFile} from '../../utils/file'; +import {TemplateHelper} from '../../utils/template-helper'; +import {visitAspectModel} from './aspect-model-type-generator-visitor'; +import {TypesSchema} from './schema'; +import {generateComponent} from '../components/shared/index'; +import {Tree} from '@angular-devkit/schematics/src/tree/interface'; +import {ComponentType} from '../components/shared/schema'; +import {LOG_COLOR} from '../../utils/constants'; + +export default function (options: TypesSchema): Rule { + if (options && options.configFile !== undefined) { + console.log(LOG_COLOR, 'Start generating types...'); + options.spinner = ora().start(); + options.templateHelper = new TemplateHelper(); + + loadAndApplyConfigFile(options.configFile, options); + + if (options.aspectModelTFilesString) { + options.aspectModelTFiles = options.aspectModelTFilesString.split(','); + } + + return chain([ + loadRDF(options), + loadAspectModel(options), + visitAspectModel(options), + formatGeneratedFiles( + { + getPath(options: TypesSchema) { + return [options.path, dasherize(options.selectedModelElement?.name).toLowerCase(), options.versionedAccessPrefix] + .filter(chunk => !!chunk) + .join('/'); + }, + }, + options + ), + ]); + } else { + return (tree: Tree, context: SchematicContext) => { + generateComponent(context, options, ComponentType.TYPES); + }; + } +} diff --git a/libs/schematic/generators/ng-generate/types/schema.json b/libs/schematic/generators/ng-generate/types/schema.json new file mode 100644 index 00000000..2f10e159 --- /dev/null +++ b/libs/schematic/generators/ng-generate/types/schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "esmf-types-schematic", + "title": "Type Generation Schema", + "type": "object", + "properties": { + "aspectModelTFilesString": { + "type": "string", + "description": "The path to the ttl including the RDF to load. Use ',' to enter multiple paths." + }, + "enableVersionSupport": { + "type": "boolean", + "description": "Flag whether the generated files should be placed in distinct directories, based on the Aspect Model version.", + "default": true + }, + "configFile": { + "description": "Used for pre-loading the config file from the command line(when set, config wizard is disabled).", + "type": "string" + } + }, + "required": [] +} diff --git a/libs/schematic/generators/ng-generate/types/schema.ts b/libs/schematic/generators/ng-generate/types/schema.ts new file mode 100644 index 00000000..d459aa3c --- /dev/null +++ b/libs/schematic/generators/ng-generate/types/schema.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Values} from '../components/shared/schema'; + +// eslint-disable-next-line @typescript-eslint/no-empty-object-type,@typescript-eslint/no-empty-interface +export interface TypesSchema extends Values {} diff --git a/libs/schematic/generators/types/definition.ts b/libs/schematic/generators/types/definition.ts new file mode 100644 index 00000000..5fad5587 --- /dev/null +++ b/libs/schematic/generators/types/definition.ts @@ -0,0 +1,15 @@ +// types/inquirer-prompt-suggest.d.ts +declare module 'inquirer-prompt-suggest' { + import {PromptModule} from 'inquirer'; + + const inquirerPromptSuggest: PromptModule; + export default inquirerPromptSuggest; +} + +// types/inquirer-search-list.d.ts +declare module 'inquirer-search-list' { + import {PromptModule} from 'inquirer'; + + const inquirerSearchList: PromptModule; + export default inquirerSearchList; +} diff --git a/libs/schematic/generators/utils/angular.ts b/libs/schematic/generators/utils/angular.ts new file mode 100644 index 00000000..d8bc7ea3 --- /dev/null +++ b/libs/schematic/generators/utils/angular.ts @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Rule, Tree} from '@angular-devkit/schematics'; +import { + addDeclarationToModule, + addExportToModule, + addModuleImportToModule, + buildComponent, + findModuleFromOptions, + parseSourceFile, +} from '@angular/cdk/schematics'; +import {MODULE_EXT} from '@schematics/angular/utility/find-module'; +import {Schema} from '../ng-generate/components/shared/schema'; +import {dasherize} from '@angular-devkit/core/src/utils/strings'; +import {InsertChange} from '@schematics/angular/utility/change'; +import {PromptModule} from 'inquirer'; + +declare interface ModuleDefinition { + name: string; + fromLib: string; + skip?: () => boolean; +} + +declare interface SkipHandler { + skip(): boolean; +} + +export function addToComponentModule(skipImport: SkipHandler | boolean, options: Schema, modules: Array = []): Rule { + return (tree: Tree) => { + if (skipImport !== undefined && (skipImport === true || (skipImport !== false && (skipImport as SkipHandler).skip()))) { + return; + } + + const componentModuleFile = `${options.path}/${dasherize(options.name)}.module.ts`; + const moduleFileEntry = tree.get(componentModuleFile); + + if (moduleFileEntry === null) { + throw new Error(`Module ${componentModuleFile}.`); + } + + modules + .filter(module => !module.skip || !module.skip()) + .forEach(moduleDef => addModuleImportToModule(tree, moduleFileEntry.path, moduleDef.name, moduleDef.fromLib)); + }; +} + +export function addToAppModule(skipImport: SkipHandler | boolean, modules: Array = []): Rule { + const appModule = {project: 'esmf', name: 'AppModule', module: `app${MODULE_EXT}`, path: '/src/app'}; + return addToModule(appModule, skipImport, modules); +} + +export function addToAppSharedModule(skipImport: SkipHandler | boolean, modules: Array = []): Rule { + const appModule = { + project: 'esmf', + name: 'AppSharedModule', + module: `app-shared${MODULE_EXT}`, + path: '/src/app/shared', + }; + return addToModule(appModule, skipImport, modules); +} + +function addToModule(appModule: any, skipImport: SkipHandler | boolean, modules: Array = []): Rule { + return async (tree: Tree) => { + if (skipImport !== undefined && (skipImport === true || (skipImport !== false && (skipImport as SkipHandler).skip()))) { + return; + } + + const modulePath = await findModuleFromOptions(tree, appModule); + + if (!modulePath) { + throw new Error('Module path could not be found.'); + } + + modules.forEach(moduleDef => { + addModuleImportToModule(tree, modulePath, moduleDef.name, moduleDef.fromLib); + }); + }; +} + +export async function addToDeclarationsArray( + options: Schema, + tree: Tree, + declarationName: string, + declarationPath: string, + modulePath?: string +): Promise { + modulePath = modulePath || (await findModuleFromOptions(tree, options)) || ''; + const sourceFile = parseSourceFile(tree, modulePath); + const declarationChanges = addDeclarationToModule(sourceFile, modulePath, declarationName, declarationPath); + const declarationRecorder = tree.beginUpdate(modulePath); + + for (const change of declarationChanges) { + if (change.constructor.name === 'InsertChange') { + declarationRecorder.insertLeft((change as InsertChange).pos, (change as InsertChange).toAdd); + } + } + tree.commitUpdate(declarationRecorder); + + return tree; +} + +export async function addToExportsArray( + options: Schema, + tree: Tree, + exportName: string, + exportPath: string, + modulePath?: string +): Promise { + modulePath = modulePath || (await findModuleFromOptions(tree, options)) || ''; + const sourceFile = parseSourceFile(tree, modulePath); + const exportChanges = addExportToModule(sourceFile, modulePath, exportName, exportPath); + const exportRecorder = tree.beginUpdate(modulePath); + + for (const change of exportChanges) { + if (change.constructor.name === 'InsertChange') { + exportRecorder.insertLeft((change as InsertChange).pos, (change as InsertChange).toAdd); + } + } + tree.commitUpdate(exportRecorder); + + return tree; +} + +// wrap the execution to avoid raise conditions e.g. the path will +// be changed from relative to absolut ('src/..' -> '/src/..') which +// forces to the error with prettier that no files are found. +// add options for module and flat to ensure correct import path +export function wrapBuildComponentExecution(options: Schema): Rule { + return async () => { + options.module = options.module || 'app.module'; + options.flat = true; + return buildComponent(Object.assign({}, options)); + }; +} + +// Dynamic import for the inquirer +export async function loadInquirer(): Promise<{prompt: PromptModule, registerPrompt: PromptModule['registerPrompt']}> { + const inquirer = await import('inquirer'); + + return inquirer as unknown as {prompt: PromptModule, registerPrompt: PromptModule['registerPrompt']}; +} diff --git a/libs/schematic/generators/utils/aspect-model.ts b/libs/schematic/generators/utils/aspect-model.ts new file mode 100644 index 00000000..3091a517 --- /dev/null +++ b/libs/schematic/generators/utils/aspect-model.ts @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {virtualFs} from '@angular-devkit/core'; +import {classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {chain, Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics'; +import { + Aspect, + AspectModelLoader, + DefaultCollection, + DefaultEntity, + DefaultSingleEntity, + Entity, + Property, +} from '@esmf/aspect-model-loader'; +import {Observable, Subscriber} from 'rxjs'; +import {Schema} from '../ng-generate/components/shared/schema'; +import {generateLanguageTranslationAsset} from '../ng-generate/components/shared/generators/language/index'; +import {FileBuffer} from '@angular-devkit/core/src/virtual-fs/host'; + +export type PropValue = { + propertyValue: string; + propertyName: string; + characteristic: string; + enumWithEntities: boolean; + property: Property; + complexPropObj?: {complexProp: string; properties: Property[]}; +}; + +export type DatePicker = { + propertyUrn: string; + datePicker: { + type: string; + }; +}; + +export const assetsPath = 'assets/i18n/shared/components'; +export const baseAssetsPath = `src/${assetsPath}`; + +/** + * A rule that reads the comma-separated list of files specified as options.aspectModelTFiles + * and provides them as strings in array options.ttl. + */ +export function loadRDF(options: Schema): Rule { + return (tree: Tree, context: SchematicContext) => { + const aspectModelTFiles = Array.isArray(options.aspectModelTFiles) + ? options.aspectModelTFiles + : (options.aspectModelTFiles as string).split(','); + + if (!aspectModelTFiles.length) { + throw new SchematicsException( + `No ttl files provided, please provide the ttl files you want to load using the cli param 'aspectModelTFilesString=ttl-file1,ttl-file2'.` + ); + } + + options.ttl = aspectModelTFiles.map((aspectModel, index) => { + const path = `${tree.root.path}${aspectModel.trim()}`; + const data = tree.read(path); + + if (!data) { + throw new SchematicsException(`TTL file not found under '${path}'.`); + } + + options.spinner.succeed( + `Loaded RDF ${aspectModelTFiles.length > 1 ? index + 1 + '/' + aspectModelTFiles.length : ''} from "${path}"` + ); + + return virtualFs.fileBufferToString(data as unknown as FileBuffer); + }); + + return tree; + }; +} + +/** + * A rule that interprets the provided strings in array options.ttl as RDF and + * provides the aspect in options.aspectModel. + */ +export function loadAspectModel(options: Schema): Rule { + const func = (tree: Tree, context: SchematicContext) => { + return new Observable((subscriber: Subscriber) => { + const loader = new AspectModelLoader(); + if (options.ttl.length > 1) { + loader.load('', ...options.ttl).subscribe((aspect: Aspect) => { + options.aspectModel = aspect; + const prefixPart = aspect.aspectModelUrn.split(':'); + options.aspectModelVersion = prefixPart[prefixPart.length - 1].split('#')[0]; + options.selectedModelElement = getSelectedModelElement(loader, aspect, options); + options.spinner.succeed(`Loaded Aspect Model "${options.aspectModel.aspectModelUrn}"`); + subscriber.next(tree); + subscriber.complete(); + }); + } else { + loader.loadSelfContainedModel(options.ttl[0]).subscribe((aspect: Aspect) => { + options.aspectModel = aspect; + const prefixPart = aspect.aspectModelUrn.split(':'); + options.aspectModelVersion = prefixPart[prefixPart.length - 1].split('#')[0]; + options.selectedModelElement = getSelectedModelElement(loader, aspect, options); + options.spinner.succeed(`Loaded Aspect Model "${options.aspectModel.aspectModelUrn}"`); + subscriber.next(tree); + subscriber.complete(); + }); + } + }); + }; + + return func as unknown as Rule; +} + +export function validateUrns(options: Schema): void { + // if defined, validate URN otherwise the default (all properties 'samm:properties ( ... ) ' + // of the Aspect definition '... a samm:Aspect' is used + if (options.selectedModelElementUrn && options.selectedModelElementUrn !== '') { + if (!options.selectedModelElementUrn.includes('#')) { + options.spinner?.fail(`URN ${options.selectedModelElementUrn} is not valid.`); + } + } +} + +export function getSelectedModelElement(loader: AspectModelLoader, aspect: Aspect, options: Schema): Aspect | Entity { + const element = loader.findByUrn(options.selectedModelElementUrn) || findCollectionElement(aspect); + + return element instanceof DefaultEntity ? (element as Entity) : (element as Aspect); +} + +function findCollectionElement(aspect: Aspect): Aspect | Entity | undefined { + if (!aspect.isCollectionAspect) return undefined; + const collectionElement = aspect.properties.find(property => property.characteristic instanceof DefaultCollection); + return collectionElement?.effectiveDataType?.isComplex ? (collectionElement.effectiveDataType as Entity) : aspect; +} + +export function generateTranslationFiles(options: Schema, formsPathCompatibility = true): Rule { + return (tree: Tree, _context: SchematicContext) => { + const element = options.selectedModelElement as Aspect | Entity; + + const languages = new Set([ + ...element.properties.flatMap(property => property.localesPreferredNames), + ...element.properties.flatMap(property => property.localesDescriptions), + ]); + + if (!languages.size) { + languages.add('en'); + } + + const aspectModelPath = `/${dasherize(options.name).toLowerCase()}`; + const versionPath = options.enableVersionSupport ? `/v${options.aspectModelVersion.replace(/\./g, '')}` : ''; + const assetsPath = formsPathCompatibility ?`${baseAssetsPath}${aspectModelPath}${versionPath}` : options.path; + + const translationRules = Array.from(languages, language => generateLanguageTranslationAsset(options, assetsPath, language)); + + return chain(translationRules)(tree, _context); + }; +} + +export function getAllEnumProps(options: any): PropValue[] { + const enumProps: PropValue[] = []; + options.templateHelper.getProperties(options).forEach((property: Property) => { + if (property.effectiveDataType?.isComplex && property.characteristic instanceof DefaultSingleEntity) { + const complexPropObj = options.templateHelper.getComplexProperties(property, options); + complexPropObj.properties.forEach((complexProp: Property) => { + if ( + options.templateHelper.isEnumProperty(complexProp) && + !options.excludedProperties.find( + (excludedProperty: any) => excludedProperty.propToExcludeAspectModelUrn === complexProp.aspectModelUrn + ) + ) { + const propertyName = `${complexPropObj.complexProp}${classify(complexProp.name)}`; + const propertyValue = `${complexPropObj.complexProp}.${complexProp.name}${ + options.templateHelper.isEnumPropertyWithEntityValues(complexProp) + ? '.' + options.templateHelper.getEnumEntityInstancePayloadKey(complexProp) + : '' + }`; + + enumProps.push({ + propertyValue: propertyValue, + propertyName: propertyName, + characteristic: complexProp.characteristic?.name, + enumWithEntities: options.templateHelper.isEnumPropertyWithEntityValues(complexProp), + property: complexProp, + complexPropObj: complexPropObj, + }); + } + }); + } else if (options.templateHelper.isEnumProperty(property)) { + enumProps.push({ + propertyName: property.name, + propertyValue: `${property.name}${ + options.templateHelper.isEnumPropertyWithEntityValues(property) + ? '.' + options.templateHelper.getEnumEntityInstancePayloadKey(property) + : '' + }`, + characteristic: property.characteristic?.name, + enumWithEntities: options.templateHelper.isEnumPropertyWithEntityValues(property), + property: property, + }); + } + }); + return enumProps; +} diff --git a/libs/schematic/generators/utils/constants.ts b/libs/schematic/generators/utils/constants.ts new file mode 100644 index 00000000..63d41ca4 --- /dev/null +++ b/libs/schematic/generators/utils/constants.ts @@ -0,0 +1 @@ +export const LOG_COLOR = '\x1b[33m%s\x1b[0m'; diff --git a/libs/schematic/generators/utils/file.ts b/libs/schematic/generators/utils/file.ts new file mode 100644 index 00000000..6a156021 --- /dev/null +++ b/libs/schematic/generators/utils/file.ts @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import * as fs from 'fs'; +import {DefaultSchema} from '../ng-generate/default-schema'; + +import * as prettier from 'prettier'; + +// this resolves the config provided by the schematics lib +const defaultPrettierConfigPath = require.resolve('../../../../.prettierrc'); + +export function loadAndApplyConfigFile(configFile: string, options: any): void { + try { + if (configFile && configFile !== '') { + const data = fs.readFileSync(configFile, 'utf8'); + Object.assign(options, JSON.parse(data)); + } + } catch (error) { + console.error('File cannot be found: ' + configFile, error); + } +} + +/** + * Provide the path to the desired folder. + */ +export interface FolderPathProvider { + getPath(options: DefaultSchema): string; +} + +/** + * Trigger the formation of the file in the given folder. + * @param folderProvider Function which returns the path to the folder which includes the files + * @param options Default schema operations + * @param fileFilter name of files to format + */ +export function formatGeneratedFiles(folderProvider: FolderPathProvider, options: DefaultSchema, fileFilter?: Array): Rule { + return async (tree: Tree, context: SchematicContext) => { + try { + const folderPath = folderProvider.getPath(options); + const prettierConfigPath = resolvePrettierConfigPath(options); + const prettierOptions = await resolvePrettierOptions(prettierConfigPath, options); + + tree.getDir(folderPath).visit(async visitor => { + const fileEntry = tree.get(visitor); + if (fileEntry && (fileFilter === undefined || fileFilter.find(fileName => fileEntry.path.includes(fileName)))) { + await formatFile(fileEntry, visitor, prettierOptions, options, tree); + } + }); + } catch (err) { + options.spinner.fail(`Error error while trying to format the generated files (${err})`); + } + }; +} + +function resolvePrettierConfigPath(options: DefaultSchema) { + let prettierConfigPath = `${process.cwd()}/.prettierrc`; + + if (!fs.existsSync(prettierConfigPath)) { + options.spinner.info('Using the prettier config file .prettierrc from the schematics project.'); + prettierConfigPath = defaultPrettierConfigPath; + } + return prettierConfigPath; +} + +async function resolvePrettierOptions(prettierConfigPath: string, options: DefaultSchema) { + let prettierOptions = await prettier.resolveConfig(prettierConfigPath); + + if (!prettierOptions) { + prettierOptions = {}; + options.spinner.info('No prettier config file .prettierrc found. Using defaults.'); + } + + return prettierOptions; +} + +async function formatFile(fileEntry: any, visitor: any, prettierOptions: any, options: DefaultSchema, tree: Tree) { + if (!visitor.includes('DS_Store')) { + prettierOptions.filepath = visitor; // Infer the parser from the file extension + const srcFile = fileEntry.content.toString(); + const dstFile = await prettier.format(srcFile, prettierOptions); + tree.overwrite(visitor, dstFile); + options.spinner.succeed(`Prettier ${visitor}`); + } +} diff --git a/libs/schematic/generators/utils/modules.ts b/libs/schematic/generators/utils/modules.ts new file mode 100644 index 00000000..6999b55e --- /dev/null +++ b/libs/schematic/generators/utils/modules.ts @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {SchematicContext, Tree} from '@angular-devkit/schematics'; +import {classify, dasherize} from '@angular-devkit/core/src/utils/strings'; +import {ComponentType, Schema} from '../ng-generate/components/shared/schema'; +import {addToDeclarationsArray, addToExportsArray} from './angular'; +import {TableSchema} from '../ng-generate/components/table/schema'; + +const generalComponentsModules = (options: Schema) => [ + {name: 'MatPaginatorModule', fromLib: '@angular/material/paginator'}, + {name: 'MatButtonModule', fromLib: '@angular/material/button'}, + {name: 'MatMenuModule', fromLib: '@angular/material/menu'}, + {name: 'HttpClientModule', fromLib: '@angular/common/http'}, + {name: 'MatIconModule', fromLib: '@angular/material/icon'}, + {name: 'MatTooltipModule', fromLib: '@angular/material/tooltip'}, + {name: 'NgIf', fromLib: '@angular/common'}, + {name: 'NgFor', fromLib: '@angular/common'}, + {name: 'NgClass', fromLib: '@angular/common'}, + {name: 'MatDialogModule', fromLib: '@angular/material/dialog'}, + { + name: 'MatToolbarModule', + fromLib: '@angular/material/toolbar', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'MatFormFieldModule', + fromLib: '@angular/material/form-field', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'MatInputModule', + fromLib: '@angular/material/input', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'MatChipsModule', + fromLib: '@angular/material/chips', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'ReactiveFormsModule', + fromLib: '@angular/forms', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'MatSelectModule', + fromLib: '@angular/material/select', + skip: () => !options.addCommandBar || options.skipImport, + }, + { + name: 'MatOptionModule', + fromLib: '@angular/material/core', + skip: () => !options.enabledCommandBarFunctions?.includes('addEnumQuickFilters') || options.skipImport, + }, + { + name: 'MatNativeDateModule', + fromLib: '@angular/material/core', + skip: () => !options.enabledCommandBarFunctions?.includes('addDateQuickFilters') || options.skipImport, + }, + { + name: 'MatDatepickerModule', + fromLib: '@angular/material/datepicker', + skip: () => !options.enabledCommandBarFunctions?.includes('addDateQuickFilters') || options.skipImport, + }, +]; + +export const tableModules = (options: Schema) => [ + ...generalComponentsModules(options), + {name: 'MatTableModule', fromLib: '@angular/material/table'}, + {name: 'MatSortModule', fromLib: '@angular/material/sort'}, + {name: 'ClipboardModule', fromLib: '@angular/cdk/clipboard'}, + {name: 'MatListModule', fromLib: '@angular/material/list'}, + {name: 'DragDropModule', fromLib: '@angular/cdk/drag-drop'}, + {name: 'NgTemplateOutlet', fromLib: '@angular/common'}, + {name: 'DatePipe', fromLib: '@angular/common'}, + {name: 'TableCellLinkComponent', fromLib: '../../src/lib/components/table-cell-link/table-cell-link.component'}, + { + name: 'MatCheckboxModule', + fromLib: '@angular/material/checkbox', + skip: () => !(options as TableSchema).addRowCheckboxes || options.skipImport, + }, +]; + +export const cardModules = (options: Schema) => [ + ...generalComponentsModules(options), + {name: 'MatCardModule', fromLib: '@angular/material/card'}, + {name: 'NgForOf', fromLib: '@angular/common'}, + {name: 'NgTemplateOutlet', fromLib: '@angular/common'}, + {name: 'SlicePipe', fromLib: '@angular/common'}, +]; + +export const formModules = (options: Schema) => [ + ...generalComponentsModules(options), + {name: 'ReactiveFormsModule', fromLib: '@angular/forms'}, + {name: 'MatFormFieldModule', fromLib: '@angular/material/form-field'}, + {name: 'MatSelectModule', fromLib: '@angular/material/select'}, + {name: 'MatOptionModule', fromLib: '@angular/material/core'}, + {name: 'MatInputModule', fromLib: '@angular/material/input'}, + {name: 'MatDatepickerModule', fromLib: '@angular/material/datepicker'}, + {name: 'MatCheckboxModule', fromLib: '@angular/material/checkbox'}, + {name: 'MatNativeDateModule', fromLib: '@angular/material/core'}, +]; + +export const APP_SHARED_MODULES = [ + {name: 'MatButtonModule', fromLib: '@angular/material/button'}, + {name: 'MatDialogModule', fromLib: '@angular/material/dialog'}, + {name: 'MatCheckboxModule', fromLib: '@angular/material/checkbox'}, + {name: 'MatIconModule', fromLib: '@angular/material/icon'}, + {name: 'FormsModule', fromLib: '@angular/forms'}, + {name: 'NgIf', fromLib: '@angular/common'}, +]; + +// TODO rethink this method +export function updateSharedModule(options: Schema) { + return (tree: Tree, _context: SchematicContext): Tree => { + const generatePath = (type: string, name: string, extraPath = '') => { + let base = ''; + let pathName = ''; + + switch (type) { + case 'component': + if (name.includes('card')) { + pathName = name.replace('card', 'confirmation'); + } else if (name.includes('table') && name !== 'esmf-table-cell') { + pathName = name.replace('table', 'confirmation'); + } + + base = `./components/${pathName}`; + break; + case 'directive': + base = './directives'; + break; + case 'pipe': + base = './pipes'; + break; + } + return `${base}/${dasherize(name)}.${type}`; + }; + + const generateClassName = (type: string, name: string) => `${classify(name)}${classify(type)}`; + + const processItem = async (type: string, name: string, extraPath = '') => { + const path = generatePath(type, name, extraPath); + const className = generateClassName(type, name); + await addToDeclarationsArray(options, tree, className, path, options.templateHelper.getSharedModulePath()); + await addToExportsArray(options, tree, className, path, options.templateHelper.getSharedModulePath()); + }; + + if (options.componentType === ComponentType.TABLE) { + processItem('component', 'export-table-dialog'); + processItem('component', 'esmf-table-cell', 'table-cell'); + processItem('directive', 'table-cell-tooltip'); + } + + if (options.componentType === ComponentType.CARD) { + processItem('component', 'export-card-dialog'); + } + + ['horizontal-overflow', 'resize-column', 'validate-input'].forEach(directive => { + if (options.componentType === 'form') { + return; + } + + if (directive === 'resize-column' && options.componentType === 'card') { + return; + } + + processItem('directive', directive); + }); + + if (options.templateHelper.hasSearchBar(options) && options.componentType !== 'card') { + processItem('directive', 'highlight'); + } + + if (options.componentType !== 'form') { + processItem('pipe', 'show-description'); + } + + return tree; + }; +} diff --git a/libs/schematic/generators/utils/package-json.ts b/libs/schematic/generators/utils/package-json.ts new file mode 100644 index 00000000..0f34c985 --- /dev/null +++ b/libs/schematic/generators/utils/package-json.ts @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {Rule, SchematicContext, Tree} from '@angular-devkit/schematics'; +import {JSONFile} from '@schematics/angular/utility/json-file'; +import {addPackageJsonDependency, NodeDependency, NodeDependencyType} from '@schematics/angular/utility/dependencies'; +import {Ora} from 'ora'; + +interface NodeScript { + name: string; + command: string; + overwrite?: boolean; +} + +export const DEFAULT_DEPENDENCIES = [ + {type: NodeDependencyType.Dev, version: '^5.3.14', name: '@types/papaparse', overwrite: false}, + {type: NodeDependencyType.Default, version: '~19.2.8', name: '@angular/cdk', overwrite: false}, + {type: NodeDependencyType.Default, version: '~19.2.8', name: '@angular/material', overwrite: false}, + {type: NodeDependencyType.Default, version: '^7.5.1', name: '@jsverse/transloco', overwrite: false}, + {type: NodeDependencyType.Default, version: '^7.0.2', name: '@jsverse/transloco-utils', overwrite: false}, + {type: NodeDependencyType.Default, version: '^5.4.1', name: 'papaparse', overwrite: false}, + {type: NodeDependencyType.Default, version: '^1.0.1', name: 'path-browserify', overwrite: false}, +]; + +export const REMOTE_HANDLING_DEPENDENCIES = [ + {type: NodeDependencyType.Default, version: '~0.10.0', name: 'rollun-ts-rql', overwrite: false}, + {type: NodeDependencyType.Default, version: '~4.2.0', name: 'crypto-js', overwrite: false}, +]; + +export const DATE_QUICK_FILTER_DEPENDENCIES = [ + {type: NodeDependencyType.Default, version: '~19.2.8', name: '@angular/material-moment-adapter', overwrite: false}, +]; + +export function addPackageJsonDependencies(skipImport: boolean, spinner: Ora, dependencies: NodeDependency[] = []): Rule { + return (host: Tree, context: SchematicContext) => { + dependencies + .filter(dependency => !skipImport || dependency.type === NodeDependencyType.Peer) + .forEach(dependency => { + addPackageJsonDependency(host, dependency); + spinner.succeed(`Added "${dependency.name}" as ${dependency.type}`); + }); + + return host; + }; +} + +export function addPackageJsonScripts(scripts: NodeScript[]): Rule { + return (host: Tree) => { + scripts.forEach(script => addPackageJsonScript(host, script)); + return host; + }; +} + +function addPackageJsonScript(tree: Tree, script: NodeScript, pkgJsonPath = '/package.json'): void { + const json = new JSONFile(tree, pkgJsonPath); + const {name, command, overwrite} = script; + const path = ['scripts', name]; + if (overwrite || !json.get(path)) { + json.modify(path, command); + } +} diff --git a/libs/schematic/generators/utils/template-helper.ts b/libs/schematic/generators/utils/template-helper.ts new file mode 100644 index 00000000..afbf9414 --- /dev/null +++ b/libs/schematic/generators/utils/template-helper.ts @@ -0,0 +1,586 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import { + Aspect, + Characteristic, + DefaultAspect, + DefaultCharacteristic, + DefaultCollection, + DefaultEntity, + DefaultEntityInstance, + DefaultEnumeration, + DefaultPropertyInstanceDefinition, + DefaultScalar, + DefaultSingleEntity, + Entity, + Property, +} from '@esmf/aspect-model-loader'; +import {classify, dasherize, underscore} from '@angular-devkit/core/src/utils/strings'; +// TODO change this ... +import {ExcludedProperty, Schema, Values} from '../ng-generate/components/shared/schema'; +import * as locale from 'locale-codes'; + +export class TemplateHelper { + /** + * Sets the template option values. + * @param {Values} options The template options. + * @returns {void} + */ + setTemplateOptionValues(options: Values) { + options.filterServiceName = `${classify(options.name)}FilterService`; + options.hasSearchBar = this.hasSearchBar(options); + options.hasFilters = this.hasFilters(options); + options.typePath = this.getTypesPath(options.enableVersionSupport, options.aspectModelVersion, options.aspectModel); + options.dateProperties = this.getDateProperties(options).filter((property: Property) => this.isDateProperty(property)); + options.dateTimeStampProperties = this.getDateProperties(options).filter((property: Property) => + this.isDateTimestampProperty(property) + ); + options.timeProperties = this.getDateProperties(options).filter((property: Property) => this.isTimeProperty(property)); + options.isDateQuickFilter = this.isAddDateQuickFilters(options.enabledCommandBarFunctions); + options.isEnumQuickFilter = this.isAddEnumQuickFilters(options.enabledCommandBarFunctions); + options.selectedModelTypeName = this.resolveType(options.selectedModelElement).name; + options.aspectModelTypeName = this.resolveType(options.aspectModel).name; + options.localStorageKeyColumns = this.getLocalStorageKeyColumns(options); + options.localStorageKeyConfig = this.getLocalStorageKeyConfig(options); + options.versionedAccessPrefix = this.getVersionedAccessPrefix(options); + options.translationPath = this.getTranslationPath(options); + options.formatedAspectModelVersion = this.formatAspectModelVersion(options.aspectModelVersion); + options.listAllProperties = this.getProperties(options); + options.generationDisclaimerText = this.getGenerationDisclaimerText(); + options.localStoragePrefix = this.getLocalStoragePrefix(); + options.isAspectSelected = this.isAspectSelected(options); + } + + /** + * Checks if the given property is a dateTime property. + * + * @param {Property} property The property to check. + * @returns {boolean} Whether the property is a date or time property. + */ + isDateTimeProperty(property: Property) { + if (!this.isDefaultScalarProperty(property)) { + return false; + } + + return this.isDateProperty(property) || this.isTimeProperty(property) || this.isDateTimestampProperty(property); + } + + /** + * Checks if the given property is a dateTimeStamp property. + * + * @param {Property} property The property to check. + * @returns {boolean} Whether the property is a date or time property. + */ + isDateTimestampProperty(property: Property) { + if (!this.isDefaultScalarProperty(property)) { + return false; + } + + return property.effectiveDataType?.shortUrn === 'dateTime' || property.effectiveDataType?.shortUrn === 'dateTimeStamp'; + } + + /** + * Checks if the given property is a date property. + * + * @param {Property} property The property to check. + * @returns {boolean} Whether the property is a date or time property. + */ + isDateProperty(property: Property) { + if (!this.isDefaultScalarProperty(property)) { + return false; + } + + return property.effectiveDataType?.shortUrn === 'date'; + } + + /** + * Checks if the given property is a time property. + * + * @param {Property} property The property to check. + * @returns {boolean} Whether the property is a date or time property. + */ + isTimeProperty(property: Property) { + if (!this.isDefaultScalarProperty(property)) { + return false; + } + + return property.effectiveDataType?.shortUrn === 'time'; + } + + /** + * Checks if the given command bar functions include the `addCustomCommandBarActions` function. + * + * @param {string[]} commandBarFunctions A list of command bar functions. + * @returns {boolean} True if the `addCustomCommandBarActions` function is included, False otherwise. + */ + isAddCustomCommandBarActions(commandBarFunctions: string[]) { + return commandBarFunctions.includes('addCustomCommandBarActions'); + } + + /** + * Checks if the given command bar functions include the `addDateQuickFilters` function. + * + * @param {string[]} commandBarFunctions A list of command bar functions. + * @returns {boolean} True if the `addDateQuickFilters` function is included, False otherwise. + */ + isAddDateQuickFilters(commandBarFunctions: string[]) { + return commandBarFunctions.includes('addDateQuickFilters'); + } + + /** + * Checks if the given command bar functions include the `addEnumQuickFilters` function. + * + * @param {string[]} commandBarFunctions A list of command bar functions. + * @returns {boolean} True if the `addEnumQuickFilters` function is included, False otherwise. + */ + isAddEnumQuickFilters(commandBarFunctions: string[]) { + return commandBarFunctions.includes('addEnumQuickFilters'); + } + + /** + * Returns true if the given property is an enumeration property. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is an enumeration property. + */ + isEnumProperty(property: Property) { + return property.characteristic instanceof DefaultEnumeration; + } + + /** + * Returns true if the given property is an enumeration property with entity values. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is an enumeration with entity values property. + */ + isEnumPropertyWithEntityValues(property: Property) { + if (property.characteristic instanceof DefaultEnumeration && property.characteristic.values?.[0] instanceof DefaultEntityInstance) { + return false; + } + return this.isEnumProperty(property) && property.effectiveDataType instanceof DefaultEntity; + } + + /** + * Returns true if the given property is a string property. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is a string property. + */ + isStringProperty(property: Property) { + return property.effectiveDataType ? property.effectiveDataType?.urn.toString().indexOf('string') > -1 : false; + } + + /** + * Returns True if the property is a number property. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is a number property, False otherwise. + */ + isNumberProperty(property: Property) { + if (!this.isDefaultScalarProperty(property)) { + return false; + } + + if (!property.effectiveDataType) { + return false; + } + + const numberShortUrns = [ + 'decimal', + 'integer', + 'double', + 'float', + 'short', + 'int', + 'long', + 'unsignedLong', + 'unsignedInt', + 'unsignedShort', + 'positiveInteger', + 'nonNegativeInteger', + 'negativeInteger', + 'nonPositiveInteger', + ]; + + return numberShortUrns.includes(property.effectiveDataType.shortUrn); + } + + /** + * Returns true if the given property is a multi string property. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is a multi string property. + */ + isMultiStringProperty(property: Property) { + return property.characteristic.name === 'MultiLanguageText'; + } + + /** + * Returns true if the given property is a link property. + * + * @param {Property} property The property to check. + * @returns {boolean} True if the property is a link property. + */ + isLinkProperty(property: Property): boolean { + return property.characteristic.name === 'ResourcePath'; + } + + /** + * Gets all enum properties. + * + * @param {Schema} options The schema options. + * @returns {Array} The array of enum properties. + */ + getEnumProperties(options: Schema): Array { + return this.getAllProperties(options).filter( + property => + this.isEnumProperty(property) && + !options.excludedProperties.find( + (excludedProp: ExcludedProperty) => excludedProp.propToExcludeAspectModelUrn === property.aspectModelUrn + ) + ); + } + + /** + * Checks if there are any custom command bar actions defined in the provided schema options. + * + * @param {Schema} options - The schema options containing potential custom command bar actions. + * @returns {boolean} - Returns true if there are one or more custom command bar actions, otherwise false. + */ + haveCustomCommandbarActions(options: Schema): boolean { + return options.customCommandBarActions.length > 0; + } + + /** + * Gets all string properties. + * + * @param {Schema} options The schema options. + * @returns {Array} The array of string properties. + */ + getStringProperties(options: Schema): Array { + return this.getAllProperties(options).filter( + property => + this.isStringProperty(property) && + !options.excludedProperties.find( + (excludedProp: ExcludedProperty) => excludedProp.propToExcludeAspectModelUrn === property.aspectModelUrn + ) + ); + } + + /** + * Gets all date properties. + * + * @param {Schema} options The schema options. + * @returns {Array} The array of date properties. + */ + getDateProperties(options: Schema): Array { + return this.getAllProperties(options).filter( + property => + this.isDateTimeProperty(property) && + !options.excludedProperties.find( + (excludedProp: ExcludedProperty) => excludedProp.propToExcludeAspectModelUrn === property.aspectModelUrn + ) + ); + } + + /** + * Gets the payload key for the first value of an enum property that is an entity instance. + * + * @param {Property} property The property to get the payload key for. + * @returns {string} The payload key for the first value of the property, or an empty string if the property is not an enum property or is not an entity instance. + */ + getEnumEntityInstancePayloadKey(property: Property) { + if (!(this.isEnumProperty(property) && property.effectiveDataType instanceof DefaultEntity)) { + return ''; + } + + return ((property.characteristic as DefaultEnumeration).values?.[0] as DefaultEntityInstance).valuePayloadKey; + } + + /** + * Gets the properties for the selected model element. + * + * @param {Schema | any} options The options for the operation. + * @param {boolean} generateLabelsForExcludedProps Whether to generate labels for excluded properties. + * @returns {Array} The properties for the model element. + */ + getProperties(options: Schema | any, generateLabelsForExcludedProps = false): Array { + if (!generateLabelsForExcludedProps) { + return this.resolveType(options.selectedModelElement).properties.filter( + (prop: Property) => + !options.excludedProperties.find( + (excludedProp: ExcludedProperty) => excludedProp.propToExcludeAspectModelUrn === prop.aspectModelUrn + ) + ); + } + return this.resolveType(options.selectedModelElement).properties; + } + + /** + * Gets the properties of a complex property. + * + * @param {Property} complexProp The complex property. + * @param {Schema} options The schema options. + * @returns {Object} An object with the complex property name and the properties. + */ + getComplexProperties(complexProp: Property, options: Schema): {complexProp: string; properties: Property[]} { + const propsToShow = options.complexProps.find(cp => cp.prop === complexProp.name)?.propsToShow; + const properties = this.getProperties({ + selectedModelElement: complexProp.effectiveDataType as DefaultEntity, + excludedProperties: options.excludedProperties, + }).filter((property: Property) => propsToShow?.find((prop: any) => prop.aspectModelUrn === property.aspectModelUrn)); + + return {complexProp: complexProp.name, properties: properties}; + } + + /** + * Recursively resolves all language codes from the given aspect model element. + * + * @param {Aspect | Entity} modelElement The aspect model element to start the resolution from. + * @returns {Set} The set of all language codes found. + */ + resolveAllLanguageCodes(modelElement: Aspect | Entity): Set { + const allLanguageCodes: Set = new Set(); + + const processElement = (element: Aspect | Entity | Property | Characteristic) => { + const {localesPreferredNames, localesDescriptions} = element; + + localesPreferredNames.forEach(code => allLanguageCodes.add(code)); + localesDescriptions.forEach(code => allLanguageCodes.add(code)); + + this.addLocalized(allLanguageCodes); + + if (element instanceof DefaultAspect && element.properties.length >= 1) { + element.properties.forEach(processElement); + } + + if (element instanceof DefaultPropertyInstanceDefinition) { + const characteristic = element.characteristic; + if (characteristic) { + processElement(characteristic); + } + } + + if (element instanceof DefaultCharacteristic && element.dataType && element.dataType.isComplex) { + processElement(element.dataType); + } + + if (element instanceof DefaultEntity && element.isComplex && element.properties) { + element.properties.forEach(processElement); + } + }; + + processElement(modelElement); + + return allLanguageCodes; + } + + /** + * Resolves the type of the given aspect model element. + * + * @param {Aspect | Entity} modelElement - The aspect model element to resolve the type of. + * @returns {Aspect | Entity} - The resolved type of the model element. + */ + resolveType(modelElement: Aspect | Entity): Aspect | Entity { + if (modelElement instanceof DefaultAspect && modelElement.isCollectionAspect) { + const collectionProperty = modelElement.properties.find(prop => prop.characteristic instanceof DefaultCollection); + if (collectionProperty?.effectiveDataType?.isComplex) { + return collectionProperty.effectiveDataType as Entity; + } + } + return modelElement; + } + + /** + * Replaces all dots in the version string with empty strings. + * + * @param {string} version The version string. + * @returns {string} The version string with all dots replaced. + */ + formatAspectModelVersion(version: string): string { + return version.replace(/\./g, ''); + } + + /** + * Returns the versioned access prefix for the given options. + * + * @param {Schema} options The options for the getVersionedAccessPrefix function. + * @returns {string} The versioned access prefix. + */ + getVersionedAccessPrefix(options: Schema): string { + if (!options.enableVersionSupport) { + return ``; + } + return `${options.selectedModelElement.name.toLowerCase()}.v${this.formatAspectModelVersion(options.aspectModelVersion)}.`; + } + + /** + * Converts a string to spinal case. + * + * @param text The string to convert. + * @returns The converted string. + */ + spinalCase(text: string): string { + const regex = /\.[^/.]+$/; + return text.replace(regex, '').replace(regex, '-').toLowerCase(); + } + + /** + * Returns the path to the shared module. + * + * @returns The path to the shared module. + */ + getSharedModulePath(): string { + return 'src/app/shared/app-shared.module.ts'; + } + + /** + * Returns whether the schema has a search bar. + * + * @param options The schema options. + * @returns Whether the schema has a search bar. + */ + hasSearchBar(options: Schema): boolean { + return options.enabledCommandBarFunctions.includes('addSearchBar'); + } + + /** + * Returns whether the schema has filters. + * + * @param options The schema options. + * @returns Whether the schema has filters. + */ + hasFilters(options: Schema): boolean { + return ( + this.hasSearchBar(options) || + this.isAddDateQuickFilters(options.enabledCommandBarFunctions) || + this.isAddEnumQuickFilters(options.enabledCommandBarFunctions) + ); + } + + private getGenerationDisclaimerText(): string { + return 'Generated from ESMF JS SDK Angular Schematics - PLEASE DO NOT CHANGE IT'; + } + + /** + * Returns the prefix for the local storage key. + * + * @returns {string} The prefix for the local storage key. + */ + private getLocalStoragePrefix(): string { + return `KEY_LOCAL_STORAGE_`; + } + + /** + * Checks if the given options indicate that the aspect is selected. + * + * @param {Schema} options The options object. + * @returns {boolean} Whether or not the aspect is selected. + */ + private isAspectSelected(options: Schema) { + return options.selectedModelElementUrn === options.aspectModel.aspectModelUrn; + } + + /** + * Gets the local storage key for the columns of the given schema. + * + * @param {Schema} options The schema. + * @returns {string} The local storage key. + */ + private getLocalStorageKeyColumns(options: Schema): string { + return `${this.getLocalStoragePrefix()}${underscore(options.name)}${ + options.enableVersionSupport ? `_${'v' + options.aspectModelVersion.replace(/\./g, '')}` : '' + }_columns`.toUpperCase(); + } + + /** + * Gets the local storage key for the config of the given schema. + * + * @param {Schema} options The schema. + * @returns {string} The local storage key. + */ + private getLocalStorageKeyConfig(options: Schema): string { + return `${this.getLocalStoragePrefix()}${underscore(options.name)}${ + options.enableVersionSupport ? `_${'v' + options.aspectModelVersion.replace(/\./g, '')}` : '' + }_config`.toUpperCase(); + } + + /** + * Gets the translation path for the given options. + * + * @param {Schema} options The options object. + * @returns {string} The translation path. + */ + private getTranslationPath(options: Schema): string { + const translationPath = `${this.getVersionedAccessPrefix(options)}${this.isAspectSelected(options) ? options.jsonAccessPath : ''}`; + return `${translationPath.length ? translationPath : ''}`; + } + + /** + * Checks if the given property is a default scalar property. + * + * @param {Property} property The property to check. + * @returns {boolean} Whether the property is a default scalar property. + */ + private isDefaultScalarProperty(property: Property) { + return property.effectiveDataType && property.effectiveDataType?.isScalar && property.effectiveDataType instanceof DefaultScalar; + } + + /** + * @function addLocalized + * @param {Set} languages - The set of languages to add localized strings for. + * @returns {string[]} - An array of localized strings. + */ + private addLocalized(languages: Set): string[] { + return Array.from(languages) + .map(languageCode => locale.getByTag(languageCode).tag) + .filter(e => !!e); + } + + /** + * Gets all the properties of the schema, including complex properties. + @private + @param {Schema} options The schema options. + @returns {Array} The array of all properties, including complex properties. + */ + private getAllProperties(options: Schema) { + const properties = this.getProperties(options); + const resolvedProperties: Array = []; + properties + .filter(prop => prop.effectiveDataType?.isComplex && prop.characteristic instanceof DefaultSingleEntity) + .forEach(prop => { + resolvedProperties.push(...this.getComplexProperties(prop, options).properties); + }); + + return [ + ...properties.filter(prop => !(prop.effectiveDataType?.isComplex && prop.characteristic instanceof DefaultSingleEntity)), + ...resolvedProperties, + ]; + } + + /** + * Gets the path to the types file for the specified aspect model. + * + * @param {boolean} aspectModelVersionSupport Whether or not the aspect model supports versioned types. + * @param {string} version The version of the aspect model. + * @param {Aspect} aspectModel The aspect model. + * @returns {string} The path to the types file. + */ + private getTypesPath(aspectModelVersionSupport: boolean, version: string, aspectModel: Aspect): string { + if (aspectModelVersionSupport) { + return `../../../types/${dasherize(aspectModel.name)}/v${version.split('.').join('')}/${dasherize(aspectModel.name)}.types`; + } + return `../../types/${dasherize(aspectModel.name)}/${dasherize(aspectModel.name)}.types`; + } +} diff --git a/libs/schematic/jest.config.ts b/libs/schematic/jest.config.ts new file mode 100644 index 00000000..af4f5153 --- /dev/null +++ b/libs/schematic/jest.config.ts @@ -0,0 +1,21 @@ +export default { + displayName: 'schematic', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../coverage/libs/schematic', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/schematic/ng-package.json b/libs/schematic/ng-package.json new file mode 100644 index 00000000..f97d3f7a --- /dev/null +++ b/libs/schematic/ng-package.json @@ -0,0 +1,28 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/libs/schematic", + "lib": { + "entryFile": "src/index.ts" + }, + "allowedNonPeerDependencies": [ + "@esmf/aspect-model-loader", + "inquirer", + "inquirer-fuzzy-path", + "inquirer-prompt-suggest", + "inquirer-search-list", + "path" + ], + "assets": [ + { + "input": "./generators", + "glob": "**/*", + "ignore": ["**/*.ts"], + "output": "./generators" + }, + { + "input": "./.tmp-generators", + "glob": "**/*", + "output": "./generators" + } + ] +} diff --git a/libs/schematic/package-lock.json b/libs/schematic/package-lock.json new file mode 100644 index 00000000..a702c951 --- /dev/null +++ b/libs/schematic/package-lock.json @@ -0,0 +1,2454 @@ +{ + "name": "@esmf/semantic-ui-schematic", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@esmf/semantic-ui-schematic", + "version": "0.0.1", + "dependencies": { + "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "inquirer": "8.2.5", + "inquirer-fuzzy-path": "2.3.0", + "inquirer-prompt-suggest": "0.1.0", + "inquirer-search-list": "^1.2.6", + "path": "^0.12.7" + }, + "peerDependencies": { + "@angular/common": "^20.3.0", + "@angular/core": "^20.3.0", + "@angular/forms": "^20.3.0", + "@angular/material": "^20.2.0", + "@jsverse/transloco": "^8.2.0", + "@jsverse/transloco-locale": "^8.2.0" + } + }, + "node_modules/@angular/cdk": { + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", + "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/common": { + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.13.tgz", + "integrity": "sha512-Jy+Qu6760TZyiDJX0+fNzkc70+lwF9ojdkIyCso/Lvbx1v3Fki0+9Wui7Vge56hknkr05xXg1aEUeqMN0966Lg==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.13", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/core": { + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.13.tgz", + "integrity": "sha512-12Kou+WAIjAUSG5TkDbypV2kreJ105VylAjlQ09bCvsGNTHjezGgahFa/tLz7iyrozhuivtGiQtiDaYsc79ysw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.13", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.13.tgz", + "integrity": "sha512-9vu9MCHJtgXvgPH+ZgXN46N3gpBBAckcmG62P7U+9BKivWvv3rEvkgX+4HvO+Pm2D6x/Jy1xbiQuVq9EDGPSNA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.13", + "@angular/core": "20.3.13", + "@angular/platform-browser": "20.3.13", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material": { + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.2.14.tgz", + "integrity": "sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": "20.2.14", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/forms": "^20.0.0 || ^21.0.0", + "@angular/platform-browser": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.3.13", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.13.tgz", + "integrity": "sha512-KyJzzpD4jMPGotDgVHF0cz9psjlVg6wYQrhuWcLeE97VUvp+CdwdOJ9tlxDlGE5tYZ0JrQxAT0l5qdcr6K9iNQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.3.13", + "@angular/common": "20.3.13", + "@angular/core": "20.3.13" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esmf/aspect-model-loader": { + "version": "2.3.3", + "resolved": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "integrity": "sha512-vlTEj1NJobiWLbORPsnNEaMUs4Ya6iE9JvWmYlGWtkd/TKqAN5Za73o2Zm3pjhuqi/rS+8xLxcVcQpLf/Yfg+g==", + "license": "mpl-2.0", + "dependencies": { + "buffer": "^6.0.3", + "locale-codes": "1.3.1", + "n3": "1.17.2", + "rxjs": "7.x", + "tslib": "2.6.2", + "util": "0.12.5" + }, + "engines": { + "node": ">=12.18.0" + } + }, + "node_modules/@esmf/aspect-model-loader/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/@jsverse/transloco": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco/-/transloco-8.2.0.tgz", + "integrity": "sha512-5SU9mjmKHlTraW/GKSUsWEjt7ATBLzKcKd6w+mTbRrnU38ZyYdCJoR2W/ii8lWiRwhfgbXTFCsTUueW5Ak61WA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jsverse/transloco-utils": "^8.2.0", + "@jsverse/utils": "1.0.0-beta.5", + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@jsverse/transloco-locale": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco-locale/-/transloco-locale-8.2.0.tgz", + "integrity": "sha512-EMj9f1ugqKT0m6V3heTrJ4dm9UV5vNiLj3WnMKWoiNfqsZtUr6FTeTsTNoDCBSel4ucC9pCVfmcFk6SUUzfIAQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0", + "@jsverse/transloco": ">=8.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@jsverse/transloco-utils": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco-utils/-/transloco-utils-8.2.0.tgz", + "integrity": "sha512-rDactF2Qmu4JKBpecyYLzD3spPZ0U+6wgoQS2OIcVraq5riV8eE3sPYb5dgL2wxMgGtJRuT8PgMMAD7LUOcCNw==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jsverse/utils": { + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@jsverse/utils/-/utils-1.0.0-beta.5.tgz", + "integrity": "sha512-z7IdlV6BdSeF3Veii8Yyk64KuyTjNIQnFaW5PAhmDx0wN29lB2BFp8WO6+tJPLPjtlz2yKeNrjkp1XqnMPaeHA==", + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "license": "Python-2.0" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", + "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", + "license": "ISC", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "figures": "^3.2.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/inquirer-fuzzy-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz", + "integrity": "sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "fuzzy": "^0.1.3", + "inquirer": "^6.0.0", + "inquirer-autocomplete-prompt": "^1.0.2", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-fuzzy-path/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-fuzzy-path/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/inquirer-prompt-suggest": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/inquirer-prompt-suggest/-/inquirer-prompt-suggest-0.1.0.tgz", + "integrity": "sha512-RC5XKDeBSsf0nBOQ380NloJcI+WTbGNo049aJsXRZXxxnRDCL5PqvftIe81zUPSUqF8hI0UxR+v77L74xJB40w==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "inquirer": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "license": "MIT" + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-prompt-suggest/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "license": "MIT", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-prompt-suggest/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "license": "Apache-2.0", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", + "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", + "license": "MIT", + "dependencies": { + "chalk": "^2.3.0", + "figures": "^2.0.0", + "fuzzy": "^0.1.3", + "inquirer": "^3.3.0" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "license": "MIT" + }, + "node_modules/inquirer-search-list/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-search-list/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-search-list/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-search-list/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "license": "MIT", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-search-list/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer-search-list/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-search-list/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "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-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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "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-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/iso639-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", + "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/langs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", + "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/locale-codes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", + "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "license": "MIT", + "dependencies": { + "iso639-codes": "^1.0.1", + "langs": "^2.0.0", + "windows-locale": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/n3": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.17.2.tgz", + "integrity": "sha512-BxSM52wYFqXrbQQT5WUEzKUn6qpYV+2L4XZLfn3Gblz2kwZ09S+QxC33WNdVEQy2djenFL8SNkrjejEKlvI6+Q==", + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.1.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/path/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==", + "license": "0BSD" + }, + "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==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/windows-locale": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.1.3.tgz", + "integrity": "sha512-0OlMOPNGj7GTB6C7WmqS3o4eydjnoYj0uwot2KJf7E0JUucwYwzkcvCWQwnuOV60WqDMeGJpSankgveNMj5r0g==", + "license": "MIT", + "engines": { + "node": ">=v10.24.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + } + } +} diff --git a/libs/schematic/package.json b/libs/schematic/package.json new file mode 100644 index 00000000..8e6bc22e --- /dev/null +++ b/libs/schematic/package.json @@ -0,0 +1,25 @@ +{ + "name": "@esmf/semantic-ui-schematic", + "version": "0.0.1", + "dependencies": { + "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "inquirer": "8.2.5", + "inquirer-fuzzy-path": "2.3.0", + "inquirer-prompt-suggest": "0.1.0", + "inquirer-search-list": "^1.2.6", + "path": "^0.12.7" + }, + "peerDependencies": { + "@angular/common": "^20.3.0", + "@angular/core": "^20.3.0", + "@angular/forms": "^20.3.0", + "@angular/material": "^20.2.0", + "@jsverse/transloco": "^8.2.0", + "@jsverse/transloco-locale": "^8.2.0" + }, + "sideEffects": false, + "nx-migrations": { + "collection": "./generators/collection.json" + }, + "schematics": "./generators/collection.json" +} diff --git a/libs/schematic/project.json b/libs/schematic/project.json new file mode 100644 index 00000000..156604e5 --- /dev/null +++ b/libs/schematic/project.json @@ -0,0 +1,61 @@ +{ + "name": "schematic", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/schematic/src", + "prefix": "esmf", + "projectType": "library", + "release": { + "version": { + "manifestRootsToUpdate": ["dist/{projectRoot}"], + "currentVersionResolver": "git-tag", + "fallbackCurrentVersionResolver": "disk" + } + }, + "tags": [], + "targets": { + "build": { + "executor": "@nx/angular:package", + "outputs": ["{workspaceRoot}/dist/{projectRoot}"], + "dependsOn": ["build-generators"], + "options": { + "project": "libs/schematic/ng-package.json", + "tsConfig": "libs/schematic/tsconfig.lib.json" + }, + "configurations": { + "production": { + "tsConfig": "libs/schematic/tsconfig.lib.prod.json" + }, + "development": {} + }, + "defaultConfiguration": "production" + }, + "build-generators": { + "executor": "nx:run-commands", + "outputs": ["{workspaceRoot}/libs/schematic/.tmp-generators"], + "options": { + "command": "tsc -p libs/schematic/tsconfig.generators.json" + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/schematic/jest.config.ts", + "tsConfig": "libs/schematic/tsconfig.spec.json" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + }, + "generators": { + "@nx/angular:component": { + "style": "scss" + } + } +} diff --git a/libs/schematic/src/index.ts b/libs/schematic/src/index.ts new file mode 100644 index 00000000..f8e11bdc --- /dev/null +++ b/libs/schematic/src/index.ts @@ -0,0 +1,19 @@ +export * from './lib/components/chip-list/chip-list.component'; +export * from './lib/components/config-menu/config-menu.component'; +export * from './lib/components/export-table-dialog/export-table-dialog.component'; +export * from './lib/components/table-cell/table-cell.component'; +export * from './lib/components/table-cell-link/table-cell-link.component'; + +export * from './lib/directives/highlight.directive'; +export * from './lib/directives/horizontal-overflow.directive'; +export * from './lib/directives/resize-column.directive'; +export * from './lib/directives/table-cell-tooltip.directive'; + +export * from './lib/services/paginator-select-config.provider'; +export * from './lib/services/remote-table.service'; +export * from './lib/services/static-table.service'; +export * from './lib/services/storage.service'; +export * from './lib/services/remote-table-data-source.service'; +export * from './lib/services/static-table-data-source.service'; + +export * from './lib/models/filter.definition'; diff --git a/libs/schematic/src/lib/components/chip-list/chip-list.component.html b/libs/schematic/src/lib/components/chip-list/chip-list.component.html new file mode 100644 index 00000000..c45674a1 --- /dev/null +++ b/libs/schematic/src/lib/components/chip-list/chip-list.component.html @@ -0,0 +1,59 @@ + + @if (activeFilters().length) { +
+ @if (chipsScrollEl.scrollable) { + + } +
+ + @for (filter of activeFilters(); track filter) { + +
+ {{ chipListValue(filter) }} +
+ @if (filter.removable) { + + } +
+ } +
+
+ @if (chipsScrollEl.scrollable) { + + } +
+ } +
diff --git a/libs/schematic/src/lib/components/chip-list/chip-list.component.scss b/libs/schematic/src/lib/components/chip-list/chip-list.component.scss new file mode 100644 index 00000000..774dc9fe --- /dev/null +++ b/libs/schematic/src/lib/components/chip-list/chip-list.component.scss @@ -0,0 +1,25 @@ +.esmf-chip-list { + .scrollable-chips-container { + display: flex; + align-content: center; + position: relative; + + .chip-list-container { + display: flex; + overflow: hidden; + scroll-behavior: smooth; + + .mat-mdc-chip-set .mdc-evolution-chip-set__chips { + margin: 0; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + + .mat-mdc-chip { + flex: 0 0 auto; + } + } + } + } +} diff --git a/libs/schematic/src/lib/components/chip-list/chip-list.component.ts b/libs/schematic/src/lib/components/chip-list/chip-list.component.ts new file mode 100644 index 00000000..c834c747 --- /dev/null +++ b/libs/schematic/src/lib/components/chip-list/chip-list.component.ts @@ -0,0 +1,37 @@ +import {Component, input, output, ViewEncapsulation} from '@angular/core'; +import {MatIcon} from '@angular/material/icon'; +import {MatTooltip} from '@angular/material/tooltip'; +import {FilterEnums, FilterType} from '../../models/filter.definition'; +import {MatMiniFabButton} from '@angular/material/button'; +import {MatChipListbox, MatChipOption} from '@angular/material/chips'; +import {EsmfHorizontalOverflowDirective} from '../../directives/horizontal-overflow.directive'; + +@Component({ + selector: 'esmf-chip-list', + templateUrl: './chip-list.component.html', + imports: [MatIcon, MatTooltip, MatMiniFabButton, MatChipListbox, MatChipOption, EsmfHorizontalOverflowDirective], + styleUrls: ['./chip-list.component.scss'], + encapsulation: ViewEncapsulation.None, + host: {class: 'esmf-chip-list'}, +}) +// TODO: add unit tests to the component +export class EsmfChipListComponent { + activeFilters = input.required(); + removeFilter = output(); + + triggerRemoveFilter(filter: FilterType): void { + this.removeFilter.emit(filter); + } + + chipListValue(filter: FilterType): string { + if (filter.type === FilterEnums.Search) { + return `${filter.filterValue}: ${filter.label}`; + } + + if (filter.type === FilterEnums.Date) { + return filter.label; + } + + return `${filter.prop}: ${filter.label}`; + } +} diff --git a/libs/schematic/src/lib/components/config-menu/config-menu.component.html b/libs/schematic/src/lib/components/config-menu/config-menu.component.html new file mode 100644 index 00000000..c40bb4a8 --- /dev/null +++ b/libs/schematic/src/lib/components/config-menu/config-menu.component.html @@ -0,0 +1,80 @@ + +
{{ t('settings.title') }}
+ + + + @for (config of configs(); track config) { + +
+
+
{{ t(config.name) }}
+
{{ t(config.desc) }}
+
+
+ +
+
+
+ } +
+ + + +
diff --git a/libs/schematic/src/lib/components/config-menu/config-menu.component.spec.ts b/libs/schematic/src/lib/components/config-menu/config-menu.component.spec.ts new file mode 100644 index 00000000..22d867ff --- /dev/null +++ b/libs/schematic/src/lib/components/config-menu/config-menu.component.spec.ts @@ -0,0 +1,503 @@ +/* + * Copyright (c) 2025 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for + * additional information regarding authorship. + * + * 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 https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentRef} from '@angular/core'; +import {MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import {By} from '@angular/platform-browser'; +import {EsmfConfigMenuComponent, ConfigMenuBase} from './config-menu.component'; +import {EsmfLocalStorageService} from '../../services/storage.service'; +import {getTranslocoTestingModule} from '../../test-utils'; + +describe('EsmfConfigMenuComponent', () => { + let component: EsmfConfigMenuComponent; + let fixture: ComponentFixture>; + let componentRef: ComponentRef>; + let storageService: jest.Mocked; + + const createMockConfigs = (): ConfigMenuBase[] => [ + {name: 'config.name1', desc: 'config.desc1', selected: true, color: '#ff0000'}, + {name: 'config.name2', desc: 'config.desc2', selected: false, color: '#00ff00'}, + {name: 'config.name3', desc: 'config.desc3', selected: true, color: '#0000ff'}, + ]; + + const createMockEvent = () => + ({ + preventDefault: jest.fn(), + stopPropagation: jest.fn(), + } as unknown as MouseEvent); + + const setupComponent = async (dialogData?: {configs: ConfigMenuBase[]; keyLocalStorage: string} | null) => { + await TestBed.configureTestingModule({ + imports: [EsmfConfigMenuComponent, getTranslocoTestingModule({langs: {en: {}, de: {}}})], + providers: [ + {provide: MAT_DIALOG_DATA, useValue: dialogData}, + {provide: MatDialogRef, useValue: {close: jest.fn()}}, + {provide: EsmfLocalStorageService, useValue: {setItem: jest.fn()}}, + ], + }).compileComponents(); + + storageService = TestBed.inject(EsmfLocalStorageService) as jest.Mocked; + fixture = TestBed.createComponent(EsmfConfigMenuComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + }; + + describe('Component Initialization', () => { + describe('with MAT_DIALOG_DATA', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + beforeEach(async () => await setupComponent(mockData)); + + it('should initialize with provided configs from dialog data', () => { + expect(component.configs()).toEqual(mockConfigs); + expect(component.configsDefault()).toEqual(mockConfigs); + expect(component.keyLocalStorage()).toBe('test-key'); + }); + + it('should create deep copy of configs for configsDefault', () => { + expect(component.configsDefault()).not.toBe(component.configs()); + expect(component.configsDefault()).toEqual(component.configs()); + }); + }); + + describe('without MAT_DIALOG_DATA', () => { + beforeEach(async () => { + await setupComponent(null); + }); + + it('should initialize with empty configs when no dialog data provided', () => { + expect(component.configs()).toEqual([]); + expect(component.configsDefault()).toEqual([]); + expect(component.keyLocalStorage()).toBe(''); + }); + }); + }); + + describe('Template Rendering', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should render the settings title', () => { + const titleElement = fixture.debugElement.query(By.css('.selection-title')); + expect(titleElement).toBeTruthy(); + expect(titleElement.nativeElement.textContent.trim()).toBe('settings.title'); + }); + + it('should render all config items in the list', () => { + const listOptions = fixture.debugElement.queryAll(By.css('[data-test="configuration-list-option"]')); + expect(listOptions.length).toBe(3); + }); + + it('should display config name and description for each item', () => { + const firstOption = fixture.debugElement.query(By.css('[data-test="configuration-list-option"]')); + const name = firstOption.query(By.css('[data-test="config-option-name"]')); + const desc = firstOption.query(By.css('[data-test="config-option-desc"]')); + + expect(name.nativeElement.textContent.trim()).toBe('config.name1'); + expect(desc.nativeElement.textContent.trim()).toBe('config.desc1'); + }); + + it('should render color picker with correct value for each config', () => { + const listOptions = fixture.debugElement.queryAll(By.css('[data-test="configuration-list-option"]')); + const colorPicker = listOptions[0].query(By.css('input[type="color"]')); + + expect(colorPicker).toBeTruthy(); + expect(colorPicker.nativeElement.value).toBe('#ff0000'); + }); + + it('should render selected state correctly', () => { + const listOptions = fixture.debugElement.queryAll(By.css('mat-list-option')); + expect(listOptions[0].componentInstance.selected).toBe(true); + expect(listOptions[1].componentInstance.selected).toBe(false); + expect(listOptions[2].componentInstance.selected).toBe(true); + }); + }); + + describe('configClick', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should toggle config selection when clicked', () => { + const config = component.configs()[0]; + const initialSelected = config.selected; + const mockEvent = createMockEvent(); + component.configClick(mockEvent, config); + + expect(config.selected).toBe(!initialSelected); + expect(mockEvent.preventDefault).toHaveBeenCalled(); + expect(mockEvent.stopPropagation).toHaveBeenCalled(); + }); + + it('should toggle config from false to true', () => { + const config = component.configs()[1]; + const mockEvent = createMockEvent(); + expect(config.selected).toBe(false); + component.configClick(mockEvent, config); + expect(config.selected).toBe(true); + }); + + it('should be triggered when clicking list option', () => { + const spy = jest.spyOn(component, 'configClick'); + const listOption = fixture.debugElement.query(By.css('[data-test="configuration-list-option"]')); + listOption.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('colorChange', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should update config color when color picker value changes', () => { + const config = component.configs()[0]; + const newColor = '#123456'; + + const event = { + ...createMockEvent(), + target: {value: newColor}, + } as unknown as MouseEvent; + + component.colorChange(event, config); + + expect(config.color).toBe(newColor); + expect(event.preventDefault).toHaveBeenCalled(); + expect(event.stopPropagation).toHaveBeenCalled(); + }); + + it('should be triggered when color picker changes', () => { + const spy = jest.spyOn(component, 'colorChange'); + const colorPicker = fixture.debugElement.query(By.css('input[type="color"]')); + + colorPicker.nativeElement.value = '#abcdef'; + colorPicker.nativeElement.dispatchEvent(new Event('change')); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('closeMenu', () => { + const mockData = {configs: createMockConfigs(), keyLocalStorage: 'test-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should reset configs to default values', () => { + component.configs()[0].selected = false; + component.configs()[0].color = '#999999'; + const originalDefaults = component.configsDefault(); + + component.closeMenu(); + + expect(component.configs()).toEqual(originalDefaults); + expect(component.configs()[0].selected).toBe(true); + expect(component.configs()[0].color).toBe('#ff0000'); + }); + + it('should set closeConfigMenu flag to true', () => { + expect(component.closeConfigMenu()).toBe(false); + component.closeMenu(); + expect(component.closeConfigMenu()).toBe(true); + }); + + it('should be triggered when cancel button is clicked (non-mat-menu)', () => { + const spy = jest.spyOn(component, 'closeMenu'); + componentRef.setInput('isOpenedFromMatMenu', false); + fixture.detectChanges(); + + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + cancelButton.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + + it('should be triggered when cancel button is clicked (from mat-menu)', () => { + const spy = jest.spyOn(component, 'closeMenu'); + componentRef.setInput('isOpenedFromMatMenu', true); + fixture.detectChanges(); + + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + cancelButton.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('stopMenuClosing', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + beforeEach(async () => await setupComponent(mockData)); + + it('should stop propagation when isOpenedFromMatMenu is true and closeConfigMenu is false', () => { + const mockEvent = createMockEvent(); + componentRef.setInput('isOpenedFromMatMenu', true); + component.closeConfigMenu.set(false); + fixture.detectChanges(); + component.stopMenuClosing(mockEvent); + + expect(mockEvent.stopPropagation).toHaveBeenCalled(); + }); + + it('should not stop propagation when isOpenedFromMatMenu is false', () => { + const mockEvent = createMockEvent(); + componentRef.setInput('isOpenedFromMatMenu', false); + component.closeConfigMenu.set(false); + fixture.detectChanges(); + component.stopMenuClosing(mockEvent); + + expect(mockEvent.stopPropagation).not.toHaveBeenCalled(); + }); + + it('should not stop propagation when closeConfigMenu is true', () => { + const mockEvent = createMockEvent(); + componentRef.setInput('isOpenedFromMatMenu', true); + component.closeConfigMenu.set(true); + fixture.detectChanges(); + component.stopMenuClosing(mockEvent); + + expect(mockEvent.stopPropagation).not.toHaveBeenCalled(); + }); + + it('should be triggered when clicking actions container', () => { + const spy = jest.spyOn(component, 'stopMenuClosing'); + componentRef.setInput('isOpenedFromMatMenu', true); + fixture.detectChanges(); + + const actionsContainer = fixture.debugElement.query(By.css('[data-test="config-menu-actions-container"]')); + actionsContainer.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('storeConfig', () => { + const mockData = {configs: createMockConfigs(), keyLocalStorage: 'test-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should set closeConfigMenu to true', () => { + component.closeConfigMenu.set(false); + component.storeConfig(); + expect(component.closeConfigMenu()).toBe(true); + }); + + it('should call storageService.setItem with correct parameters', () => { + component.storeConfig(); + expect(storageService.setItem).toHaveBeenCalledWith('test-key', component.configs()); + }); + + it('should emit configChangedEvent with current configs', () => { + const spy = jest.fn(); + component.configChangedEvent.subscribe(spy); + component.storeConfig(); + + expect(spy).toHaveBeenCalledWith(component.configs()); + }); + + it('should be triggered when apply button is clicked (non-mat-menu)', () => { + const spy = jest.spyOn(component, 'storeConfig'); + componentRef.setInput('isOpenedFromMatMenu', false); + fixture.detectChanges(); + + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + applyButton.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + + it('should be triggered when apply button is clicked (from mat-menu)', () => { + const spy = jest.spyOn(component, 'storeConfig'); + componentRef.setInput('isOpenedFromMatMenu', true); + fixture.detectChanges(); + + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + applyButton.nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('Template UI Elements', () => { + const mockConfigs = createMockConfigs(); + const mockData = {configs: mockConfigs, keyLocalStorage: 'test-key'}; + + describe('when not opened from mat-menu', () => { + beforeEach(async () => { + await setupComponent(mockData); + componentRef.setInput('isOpenedFromMatMenu', false); + fixture.detectChanges(); + }); + + it('should render cancel button with mat-dialog-close directive', () => { + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + expect(cancelButton).toBeTruthy(); + expect(cancelButton.nativeElement.getAttribute('data-test')).toBe('config-menu-cancel-button'); + }); + + it('should render apply button with mat-dialog-close directive', () => { + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + expect(applyButton).toBeTruthy(); + }); + + it('should render cancel button with icon and text', () => { + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + const icon = cancelButton.query(By.css('[data-test="config-menu-cancel-icon"]')); + const text = cancelButton.query(By.css('[data-test="config-menu-cancel-text"]')); + + expect(icon.nativeElement.textContent.trim()).toBe('close'); + expect(text.nativeElement.textContent.trim()).toBe('cancel'); + }); + + it('should render apply button with icon and text', () => { + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + const icon = applyButton.query(By.css('[data-test="config-menu-apply-icon"]')); + const text = applyButton.query(By.css('[data-test="config-menu-apply-text"]')); + + expect(icon.nativeElement.textContent.trim()).toBe('check'); + expect(text.nativeElement.textContent.trim()).toBe('apply'); + }); + }); + + describe('when opened from mat-menu', () => { + beforeEach(async () => { + await setupComponent(mockData); + componentRef.setInput('isOpenedFromMatMenu', true); + fixture.detectChanges(); + }); + + it('should render cancel button without mat-dialog-close directive', () => { + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + expect(cancelButton).toBeTruthy(); + expect(cancelButton.nativeElement.getAttribute('ng-reflect-dialog-result')).toBeNull(); + }); + + it('should render apply button without mat-dialog-close directive', () => { + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + expect(applyButton).toBeTruthy(); + expect(applyButton.nativeElement.getAttribute('ng-reflect-dialog-result')).toBeNull(); + }); + }); + + it('should render mat-dividers', () => { + fixture.detectChanges(); + const dividers = fixture.debugElement.queryAll(By.css('mat-divider')); + expect(dividers.length).toBe(2); + }); + + it('should render selection list with proper attributes', () => { + fixture.detectChanges(); + const selectionList = fixture.debugElement.query(By.css('[data-test="config-selection-list"]')); + expect(selectionList).toBeTruthy(); + expect(selectionList.nativeElement.classList.contains('selection-list')).toBe(true); + }); + + it('should have stopPropagation handler on title element', () => { + fixture.detectChanges(); + const titleElement = fixture.debugElement.query(By.css('.selection-title')); + + expect(titleElement).toBeTruthy(); + expect(titleElement.nativeElement.getAttribute('role')).toBe('button'); + expect(titleElement.nativeElement.getAttribute('tabindex')).toBe('0'); + }); + }); + + describe('Integration Tests', () => { + const mockData = {configs: createMockConfigs(), keyLocalStorage: 'test-storage-key'}; + + beforeEach(async () => { + await setupComponent(mockData); + fixture.detectChanges(); + }); + + it('should handle complete user flow: change selection, color, and save', () => { + const emitSpy = jest.fn(); + component.configChangedEvent.subscribe(emitSpy); + + // Toggle selection + const listOption = fixture.debugElement.query(By.css('[data-test="configuration-list-option"]')); + listOption.nativeElement.click(); + fixture.detectChanges(); + + expect(component.configs()[0].selected).toBe(false); + + // Change color + const colorPicker = fixture.debugElement.query(By.css('input[type="color"]')); + colorPicker.nativeElement.value = '#abcdef'; + colorPicker.nativeElement.dispatchEvent(new Event('change')); + fixture.detectChanges(); + + expect(component.configs()[0].color).toBe('#abcdef'); + + // Save configuration + const applyButton = fixture.debugElement.query(By.css('[data-test="config-menu-apply-button"]')); + applyButton.nativeElement.click(); + + expect(storageService.setItem).toHaveBeenCalledWith('test-storage-key', component.configs()); + expect(emitSpy).toHaveBeenCalledWith(component.configs()); + expect(component.closeConfigMenu()).toBe(true); + }); + + it('should handle complete user flow: make changes and cancel', () => { + const originalConfigs = JSON.parse(JSON.stringify(component.configs())); + + // Toggle selection + const listOption = fixture.debugElement.query(By.css('[data-test="configuration-list-option"]')); + listOption.nativeElement.click(); + fixture.detectChanges(); + + // Change color + const colorPicker = fixture.debugElement.query(By.css('input[type="color"]')); + colorPicker.nativeElement.value = '#123456'; + colorPicker.nativeElement.dispatchEvent(new Event('change')); + fixture.detectChanges(); + + // Cancel changes + const cancelButton = fixture.debugElement.query(By.css('[data-test="config-menu-cancel-button"]')); + cancelButton.nativeElement.click(); + + expect(component.configs()).toEqual(originalConfigs); + expect(storageService.setItem).not.toHaveBeenCalled(); + }); + + it('should prevent color picker clicks from propagating to list option', () => { + const configClickSpy = jest.spyOn(component, 'configClick'); + const colorPicker = fixture.debugElement.query(By.css('input[type="color"]')); + colorPicker.nativeElement.click(); + + expect(configClickSpy).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/schematic/src/lib/components/config-menu/config-menu.component.ts b/libs/schematic/src/lib/components/config-menu/config-menu.component.ts new file mode 100644 index 00000000..1db89539 --- /dev/null +++ b/libs/schematic/src/lib/components/config-menu/config-menu.component.ts @@ -0,0 +1,89 @@ +import {ChangeDetectionStrategy, Component, inject, input, output, signal} from '@angular/core'; +import {EsmfLocalStorageService} from '../../services/storage.service'; +import {MAT_DIALOG_DATA, MatDialogClose} from '@angular/material/dialog'; +import {MatDivider} from '@angular/material/divider'; +import {MatListOption, MatSelectionList} from '@angular/material/list'; +import {CdkDrag, CdkDropList} from '@angular/cdk/drag-drop'; +import {TranslocoDirective} from '@jsverse/transloco'; +import {MatButton} from '@angular/material/button'; +import {MatIcon} from '@angular/material/icon'; + +/** + * A base config for ConfigMenuComponent + */ +export interface ConfigMenuBase { + /** Column name **/ + name: string; + /** Desc of the config **/ + desc: string; + /** State if the column is selected **/ + selected: boolean; + /** Color for the highlighted configuration **/ + color?: string; +} + +@Component({ + selector: 'esmf-config-menu', + templateUrl: './config-menu.component.html', + styleUrls: ['./config-menu.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + MatDivider, + MatSelectionList, + CdkDropList, + MatListOption, + CdkDrag, + MatDialogClose, + MatIcon, + MatButton, + MatIcon, + TranslocoDirective, + ], +}) +export class EsmfConfigMenuComponent { + isOpenedFromMatMenu = input(false); + configChangedEvent = output(); + + private readonly storageService: EsmfLocalStorageService = inject(EsmfLocalStorageService); + private readonly data = inject<{configs: Config[]; keyLocalStorage: string} | null>(MAT_DIALOG_DATA, {optional: true}); + + keyLocalStorage = signal(this.data?.keyLocalStorage ?? ''); + closeConfigMenu = signal(false); + configs = signal(this.data?.configs ?? []); + configsDefault = signal(JSON.parse(JSON.stringify(this.data?.configs ?? []))); + + closeMenu() { + this.configs.set(JSON.parse(JSON.stringify(this.configsDefault()))); + this.closeConfigMenu.set(true); + } + + stopMenuClosing(event: MouseEvent) { + if (this.isOpenedFromMatMenu()) { + if (this.closeConfigMenu()) { + return; + } + event.stopPropagation(); + } + } + + configClick(event: MouseEvent, config: Config) { + config.selected = !config.selected; + event.preventDefault(); + event.stopPropagation(); + } + + colorChange(event: Event, config: Config) { + config.color = (event.target as HTMLInputElement).value; + event.preventDefault(); + event.stopPropagation(); + } + + /** + * Store columns locally and update displayed columns afterward + */ + storeConfig() { + this.closeConfigMenu.set(true); + this.storageService.setItem(this.keyLocalStorage(), this.configs()); + this.configChangedEvent.emit(this.configs()); + } +} diff --git a/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.html b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.html new file mode 100644 index 00000000..719c7ac3 --- /dev/null +++ b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.html @@ -0,0 +1,29 @@ +
+ {{ 'exportData.title' | transloco }} + close +
+ +
+
{{ dialogDescription() }}
+
+
+ + {{ 'exportData.exportAllPages' | transloco : {maxExportRows: data.maxExportRows} }} + +
+
+ @if (!showAllColumnsBox()) { + + {{ 'exportData.exportAllColumns' | transloco : {allColumns: data.allColumns} }} + + } +
+
+
+ +
+ + +
diff --git a/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.scss b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.scss new file mode 100644 index 00000000..f70a165b --- /dev/null +++ b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.scss @@ -0,0 +1,32 @@ +.dialog-button-container { + justify-content: flex-end; +} + +.dialog-title { + justify-content: space-between; + display: flex; + align-items: center; + margin-top: 1rem; + margin-bottom: 1rem; + font-weight: bold; +} + +.close-dialog-icon { + background: none; + border: none; + font-size: 1.3rem; + cursor: pointer; + margin-left: auto; +} + +.dialog-description { + font-size: 1.2rem; + height: 3rem; + margin-right: 2rem; + margin-bottom: 1.5rem; + float: left; +} + +.checkbox-container { + margin: -20px 0 0.5rem -11px; +} diff --git a/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.spec.ts b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.spec.ts new file mode 100644 index 00000000..4b205ed0 --- /dev/null +++ b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.spec.ts @@ -0,0 +1,331 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import {EsmfExportTableDialogComponent, ExportTableDialogComponentData, Actions} from './export-table-dialog.component'; +import {TranslocoService} from '@jsverse/transloco'; +import {By} from '@angular/platform-browser'; +import {MatCheckbox} from '@angular/material/checkbox'; +import {of} from 'rxjs'; + +describe('EsmfExportTableDialogComponent', () => { + let component: EsmfExportTableDialogComponent; + let fixture: ComponentFixture; + let dialogRef: jest.Mocked>; + let translocoService: jest.Mocked; + + const createMockData = (overrides?: Partial): ExportTableDialogComponentData => ({ + extendedCsvExporter: true, + allColumns: 10, + displayedColumns: 5, + maxExportRows: 1000, + ...overrides, + }); + + const createTranslocoMock = () => ({ + translate: jest.fn().mockReturnValue('Translated text'), + langChanges$: of('en'), + config: {reRenderOnLangChange: false}, + }); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EsmfExportTableDialogComponent], + providers: [ + {provide: MatDialogRef, useValue: {close: jest.fn()}}, + {provide: MAT_DIALOG_DATA, useValue: createMockData()}, + {provide: TranslocoService, useValue: createTranslocoMock()}, + ], + }).compileComponents(); + + dialogRef = TestBed.inject(MatDialogRef) as jest.Mocked>; + translocoService = TestBed.inject(TranslocoService) as jest.Mocked; + fixture = TestBed.createComponent(EsmfExportTableDialogComponent); + component = fixture.componentInstance; + }); + + it('should initialize with correct data', () => { + expect(component.data).toEqual(createMockData()); + expect(component.Actions).toEqual(Actions); + }); + + describe('ngAfterViewInit', () => { + it('should set showAllColumnsBox to false when displayedColumns < allColumns', () => { + fixture.detectChanges(); + expect(component.showAllColumnsBox()).toBe(false); + }); + + it('should set showAllColumnsBox to true when displayedColumns === allColumns', () => { + component.data.displayedColumns = 10; + fixture.detectChanges(); + expect(component.showAllColumnsBox()).toBe(true); + }); + + it('should call setDialogDescription on initialization', () => { + const spy = jest.spyOn(component, 'setDialogDescription'); + fixture.detectChanges(); + expect(spy).toHaveBeenCalled(); + }); + }); + + const setCheckboxStates = (exportAllPages: boolean, exportAllColumns: boolean, displayedColumns = 5) => { + component.data.displayedColumns = displayedColumns; + fixture.detectChanges(); + + const exportAllPagesCheckbox = component.exportAllPages(); + const exportAllColumnsCheckbox = component.exportAllColumns(); + + exportAllPagesCheckbox.checked = exportAllPages; + exportAllColumnsCheckbox.checked = exportAllColumns; + }; + + describe('setDialogDescription', () => { + beforeEach(() => fixture.detectChanges()); + + it('should set description to "caseOne" when both checkboxes are checked', () => { + setCheckboxStates(true, true); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseOne', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 5, + }); + expect(component.dialogDescription()).toBe('Translated text'); + }); + + it('should set description to "caseTwo.plural" when only exportAllPages is checked and displayedColumns > 1', () => { + setCheckboxStates(true, false); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseTwo.plural', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 5, + }); + expect(component.dialogDescription()).toBe('Translated text'); + }); + + it('should set description to "caseTwo.singular" when only exportAllPages is checked and displayedColumns === 1', () => { + setCheckboxStates(true, false, 1); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseTwo.singular', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 1, + }); + }); + + it('should set description to "caseThree.plural" when exportAllPages is unchecked, exportAllColumns is unchecked, and displayedColumns > 1', () => { + setCheckboxStates(false, false); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseThree.plural', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 5, + }); + }); + + it('should set description to "caseThree.singular" when exportAllPages is unchecked, exportAllColumns is unchecked, and displayedColumns === 1', () => { + setCheckboxStates(false, false, 1); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseThree.singular', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 1, + }); + }); + + it('should set description to "caseFour" when exportAllPages is unchecked and exportAllColumns is checked', () => { + setCheckboxStates(false, true); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseFour', { + maxExportRows: 1000, + allColumns: 10, + displayedColumns: 5, + }); + }); + + it('should set description to "default" when both checkboxes are unchecked', () => { + setCheckboxStates(false, false); + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseThree.plural', expect.any(Object)); + }); + }); + + describe('exportData', () => { + beforeEach(() => { + fixture.detectChanges(); + }); + + it('should close dialog with export action and checkbox states', () => { + const exportAllPagesCheckbox = component.exportAllPages(); + const exportAllColumnsCheckbox = component.exportAllColumns(); + + exportAllPagesCheckbox.checked = true; + exportAllColumnsCheckbox.checked = false; + + component.exportData(); + + expect(dialogRef.close).toHaveBeenCalledWith({ + action: Actions.Export, + exportAllPages: true, + exportAllColumns: false, + }); + }); + + it('should close dialog with both checkboxes checked', () => { + const exportAllPagesCheckbox = component.exportAllPages(); + const exportAllColumnsCheckbox = component.exportAllColumns(); + + exportAllPagesCheckbox.checked = true; + exportAllColumnsCheckbox.checked = true; + + component.exportData(); + + expect(dialogRef.close).toHaveBeenCalledWith({ + action: Actions.Export, + exportAllPages: true, + exportAllColumns: true, + }); + }); + + it('should close dialog with both checkboxes unchecked', () => { + const exportAllPagesCheckbox = component.exportAllPages(); + const exportAllColumnsCheckbox = component.exportAllColumns(); + + exportAllPagesCheckbox.checked = false; + exportAllColumnsCheckbox.checked = false; + + component.exportData(); + + expect(dialogRef.close).toHaveBeenCalledWith({ + action: Actions.Export, + exportAllPages: false, + exportAllColumns: false, + }); + }); + }); + + describe('UI interactions', () => { + beforeEach(() => fixture.detectChanges()); + + it('should display the dialog title', () => { + const titleElement = fixture.debugElement.query(By.css('[mat-dialog-title]')); + expect(titleElement).toBeTruthy(); + }); + + it('should display the dialog description', () => { + const descriptionElement = fixture.debugElement.query(By.css('[data-test="dialogDescription"]')); + expect(descriptionElement).toBeTruthy(); + expect(descriptionElement.nativeElement.textContent).toBe('Translated text'); + }); + + it('should display exportAllPages checkbox', () => { + expect(fixture.debugElement.query(By.css('[data-test="exportAllPages"]'))).toBeTruthy(); + }); + + it('should display exportAllColumns checkbox when showAllColumnsBox is false', () => { + expect(fixture.debugElement.query(By.css('[data-test="exportAllColumns"]'))).toBeTruthy(); + }); + + it('should not display exportAllColumns checkbox when showAllColumnsBox is true', () => { + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + imports: [EsmfExportTableDialogComponent], + providers: [ + {provide: MatDialogRef, useValue: {close: jest.fn()}}, + {provide: MAT_DIALOG_DATA, useValue: createMockData({displayedColumns: 10, allColumns: 10})}, + {provide: TranslocoService, useValue: createTranslocoMock()}, + ], + }); + const newFixture = TestBed.createComponent(EsmfExportTableDialogComponent); + newFixture.detectChanges(); + + expect(newFixture.debugElement.query(By.css('[data-test="exportAllColumns"]'))).toBeFalsy(); + }); + + it('should call setDialogDescription when exportAllPages checkbox changes', () => { + const spy = jest.spyOn(component, 'setDialogDescription'); + const checkbox = fixture.debugElement.query(By.css('[data-test="exportAllPages"]')).componentInstance as MatCheckbox; + + checkbox.change.emit(); + + expect(spy).toHaveBeenCalled(); + }); + + it('should call setDialogDescription when exportAllColumns checkbox changes', () => { + const spy = jest.spyOn(component, 'setDialogDescription'); + const checkbox = fixture.debugElement.query(By.css('[data-test="exportAllColumns"]')).componentInstance as MatCheckbox; + + checkbox.change.emit(); + + expect(spy).toHaveBeenCalled(); + }); + + it('should call exportData when export button is clicked', () => { + const spy = jest.spyOn(component, 'exportData'); + + fixture.debugElement.query(By.css('[data-test="exportData"]')).nativeElement.click(); + + expect(spy).toHaveBeenCalled(); + }); + + it('should close dialog with Cancel action when close button is clicked', () => { + expect(fixture.debugElement.query(By.css('[data-test="closeDialog"]'))).toBeTruthy(); + }); + + it('should close dialog with Cancel action when close icon is clicked', () => { + const closeIcon = fixture.debugElement.query(By.css('.close-dialog-icon')); + expect(closeIcon).toBeTruthy(); + }); + + it('should update dialog description when checkbox state changes via UI', () => { + const checkbox = fixture.debugElement.query(By.css('[data-test="exportAllPages"]')).componentInstance as MatCheckbox; + + checkbox.checked = true; + checkbox.change.emit(); + + expect(translocoService.translate).toHaveBeenCalled(); + }); + }); + + describe('Edge cases', () => { + it('should handle when exportAllColumns is undefined (showAllColumnsBox true)', () => { + component.data.displayedColumns = 10; + fixture.detectChanges(); + + const exportAllPagesCheckbox = component.exportAllPages(); + exportAllPagesCheckbox.checked = false; + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalled(); + }); + + it('should handle maxExportRows of 0', () => { + component.data.maxExportRows = 0; + fixture.detectChanges(); + + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({maxExportRows: 0})); + }); + + it('should handle displayedColumns of 0', () => { + component.data.displayedColumns = 0; + fixture.detectChanges(); + + const exportAllPagesCheckbox = component.exportAllPages(); + const exportAllColumnsCheckbox = component.exportAllColumns(); + + exportAllPagesCheckbox.checked = true; + exportAllColumnsCheckbox.checked = false; + component.setDialogDescription(); + + expect(translocoService.translate).toHaveBeenCalledWith('exportData.description.caseTwo.singular', expect.any(Object)); + }); + }); +}); diff --git a/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.ts b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.ts new file mode 100644 index 00000000..4e66f19c --- /dev/null +++ b/libs/schematic/src/lib/components/export-table-dialog/export-table-dialog.component.ts @@ -0,0 +1,84 @@ +import {MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle} from '@angular/material/dialog'; +import {AfterViewInit, ChangeDetectionStrategy, Component, computed, inject, signal, viewChild} from '@angular/core'; +import {MatCheckbox} from '@angular/material/checkbox'; +import {TranslocoPipe, TranslocoService} from '@jsverse/transloco'; +import {MatButton} from '@angular/material/button'; +import {MatIcon} from '@angular/material/icon'; + +export const Actions = { + Export: 'export', + Cancel: 'cancel', +}; +export type Action = (typeof Actions)[keyof typeof Actions]; + +export interface ExportTableDialogComponentData { + extendedCsvExporter: boolean; + allColumns: number; + displayedColumns: number; + maxExportRows: number; +} + +@Component({ + selector: 'esmf-export-table-dialog', + templateUrl: './export-table-dialog.component.html', + styleUrls: ['./export-table-dialog.component.scss'], + imports: [MatIcon, MatDialogTitle, MatDialogClose, MatDialogContent, MatCheckbox, MatDialogActions, MatButton, TranslocoPipe], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class EsmfExportTableDialogComponent implements AfterViewInit { + private readonly translateService = inject(TranslocoService); + + readonly dialogRef = inject>(MatDialogRef); + readonly data = inject(MAT_DIALOG_DATA); + + readonly exportAllPages = viewChild.required('exportAllPages'); + readonly exportAllColumns = viewChild('exportAllColumns'); + + readonly Actions = Actions; + readonly dialogDescription = signal(''); + readonly showAllColumnsBox = computed(() => this.data.displayedColumns === this.data.allColumns); + + ngAfterViewInit() { + this.setDialogDescription(); + } + + setDialogDescription() { + const {maxExportRows, allColumns, displayedColumns} = this.data; + const isExportAllPagesChecked = this.exportAllPages().checked; + const isExportAllColumnsChecked = this.exportAllColumns()?.checked; + + const translationKey = this.getTranslationKey(isExportAllPagesChecked, isExportAllColumnsChecked, displayedColumns); + this.dialogDescription.set(this.translateService.translate(translationKey, {maxExportRows, allColumns, displayedColumns})); + } + + exportData() { + const exportAllPagesCheckbox = this.exportAllPages(); + const exportAllColumnsCheckbox = this.exportAllColumns(); + + this.dialogRef.close({ + action: Actions.Export, + exportAllPages: exportAllPagesCheckbox.checked, + exportAllColumns: exportAllColumnsCheckbox?.checked, + }); + } + + private getTranslationKey(isExportAllPagesChecked: boolean, isExportAllColumnsChecked: boolean, displayedColumns: number): string { + if (isExportAllPagesChecked && isExportAllColumnsChecked) { + return 'exportData.description.caseOne'; + } + + if (isExportAllPagesChecked) { + return displayedColumns > 1 ? 'exportData.description.caseTwo.plural' : 'exportData.description.caseTwo.singular'; + } + + if (!isExportAllColumnsChecked) { + return displayedColumns > 1 ? 'exportData.description.caseThree.plural' : 'exportData.description.caseThree.singular'; + } + + if (isExportAllColumnsChecked) { + return 'exportData.description.caseFour'; + } + + return 'exportData.description.default'; + } +} diff --git a/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.html b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.html new file mode 100644 index 00000000..3b136442 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.html @@ -0,0 +1,11 @@ + diff --git a/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.scss b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.scss new file mode 100644 index 00000000..571d34f1 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.scss @@ -0,0 +1,14 @@ +button { + background-color: transparent; + border: none; + color: inherit; + padding: 0; + font: inherit; + cursor: pointer; + outline: inherit; +} + +.button-disabled { + cursor: not-allowed; + opacity: 0.4; +} diff --git a/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.spec.ts b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.spec.ts new file mode 100644 index 00000000..a5029253 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.spec.ts @@ -0,0 +1,160 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {EsmfTableCellLinkComponent} from './table-cell-link.component'; +import {By} from '@angular/platform-browser'; +import {ComponentRef} from '@angular/core'; + +describe('EsmfTableCellLinkComponent', () => { + let component: EsmfTableCellLinkComponent; + let fixture: ComponentFixture; + let componentRef: ComponentRef; + let windowOpenSpy: jest.SpyInstance; + + const DISABLED_VALUE = '-'; + const VALID_URL = 'https://example.com'; + const ALTERNATIVE_URL = 'https://newsite.com'; + const TOOLTIP_MESSAGE = 'Open link'; + const NO_LINK_MESSAGE = 'No link'; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EsmfTableCellLinkComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(EsmfTableCellLinkComponent); + component = fixture.componentInstance; + componentRef = fixture.componentRef; + windowOpenSpy = jest.spyOn(window, 'open').mockImplementation(); + }); + + afterEach(() => { + windowOpenSpy.mockRestore(); + }); + + describe('isDisabled computed signal', () => { + it('should return true only when value is "-"', () => { + componentRef.setInput('value', DISABLED_VALUE); + componentRef.setInput('tooltipMessage', NO_LINK_MESSAGE); + fixture.detectChanges(); + + expect(component.isDisabled()).toBe(true); + }); + + it('should return false for any other value', () => { + const testValues = [VALID_URL, '', 'some-text']; + + testValues.forEach(value => { + componentRef.setInput('value', value); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + + expect(component.isDisabled()).toBe(false); + }); + }); + }); + + describe('openExternalLink', () => { + it('should open link in new tab when enabled', () => { + componentRef.setInput('value', VALID_URL); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + + component.openExternalLink(); + + expect(windowOpenSpy).toHaveBeenCalledWith(VALID_URL, '_blank'); + }); + + it('should not open link when disabled', () => { + componentRef.setInput('value', DISABLED_VALUE); + componentRef.setInput('tooltipMessage', NO_LINK_MESSAGE); + fixture.detectChanges(); + + component.openExternalLink(); + + expect(windowOpenSpy).not.toHaveBeenCalled(); + }); + }); + + describe('UI rendering', () => { + beforeEach(() => { + componentRef.setInput('value', VALID_URL); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + }); + + it('should render button with icon', () => { + const button = fixture.debugElement.query(By.css('button[mat-icon-button]')); + const icon = fixture.debugElement.query(By.css('mat-icon')); + + expect(button).toBeTruthy(); + expect(button.nativeElement.getAttribute('aria-label')).toBe('link row'); + expect(icon.nativeElement.textContent.trim()).toBe('open_in_new'); + }); + + it('should apply disabled class based on isDisabled state', () => { + const button = fixture.debugElement.query(By.css('button')); + expect(button.nativeElement.classList.contains('button-disabled')).toBe(false); + + componentRef.setInput('value', DISABLED_VALUE); + fixture.detectChanges(); + + expect(button.nativeElement.classList.contains('button-disabled')).toBe(true); + }); + }); + + describe('UI interactions', () => { + it('should open window when button is clicked and enabled', () => { + componentRef.setInput('value', VALID_URL); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + + const button = fixture.debugElement.query(By.css('button')); + button.nativeElement.click(); + + expect(windowOpenSpy).toHaveBeenCalledWith(VALID_URL, '_blank'); + }); + + it('should not open window when button is clicked and disabled', () => { + componentRef.setInput('value', DISABLED_VALUE); + componentRef.setInput('tooltipMessage', NO_LINK_MESSAGE); + fixture.detectChanges(); + + const button = fixture.debugElement.query(By.css('button')); + button.nativeElement.click(); + + expect(windowOpenSpy).not.toHaveBeenCalled(); + }); + }); + + describe('Dynamic input changes', () => { + it('should update disabled state when value changes', () => { + componentRef.setInput('value', VALID_URL); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + + expect(component.isDisabled()).toBe(false); + + componentRef.setInput('value', DISABLED_VALUE); + fixture.detectChanges(); + + expect(component.isDisabled()).toBe(true); + }); + + it('should open new URL when value changes', () => { + componentRef.setInput('value', VALID_URL); + componentRef.setInput('tooltipMessage', TOOLTIP_MESSAGE); + fixture.detectChanges(); + + const button = fixture.debugElement.query(By.css('button')); + button.nativeElement.click(); + + expect(windowOpenSpy).toHaveBeenCalledWith(VALID_URL, '_blank'); + + componentRef.setInput('value', ALTERNATIVE_URL); + fixture.detectChanges(); + + button.nativeElement.click(); + + expect(windowOpenSpy).toHaveBeenCalledWith(ALTERNATIVE_URL, '_blank'); + }); + }); +}); diff --git a/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.ts b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.ts new file mode 100644 index 00000000..235ac65a --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell-link/table-cell-link.component.ts @@ -0,0 +1,23 @@ +import {ChangeDetectionStrategy, Component, computed, input} from '@angular/core'; +import {MatTooltipModule} from '@angular/material/tooltip'; +import {MatIconModule} from '@angular/material/icon'; +import {MatIconButton} from '@angular/material/button'; + +@Component({ + selector: 'esmf-table-cell-link', + templateUrl: './table-cell-link.component.html', + styleUrls: ['./table-cell-link.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [MatTooltipModule, MatIconModule, MatIconButton], +}) +export class EsmfTableCellLinkComponent { + value = input.required(); + tooltipMessage = input.required(); + + isDisabled = computed(() => this.value() === '-'); + + openExternalLink() { + if (this.isDisabled()) return; + window.open(this.value(), '_blank'); + } +} diff --git a/libs/schematic/src/lib/components/table-cell/table-cell.component.html b/libs/schematic/src/lib/components/table-cell/table-cell.component.html new file mode 100644 index 00000000..434eb2a1 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell/table-cell.component.html @@ -0,0 +1,27 @@ +@let val = value(); + +
+ {{ val === null ? '-' : val }} +
+ +@if (hasValue()) { +
+ + content_copy + +
+} diff --git a/libs/schematic/src/lib/components/table-cell/table-cell.component.scss b/libs/schematic/src/lib/components/table-cell/table-cell.component.scss new file mode 100644 index 00000000..0d7a2a13 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell/table-cell.component.scss @@ -0,0 +1,18 @@ +:host { + display: flex; + justify-content: space-between; + align-items: center; +} + +.cell-content { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +mat-icon { + font-size: 1rem; + width: 1rem; + line-height: 1rem; + height: 1rem; +} diff --git a/libs/schematic/src/lib/components/table-cell/table-cell.component.spec.ts b/libs/schematic/src/lib/components/table-cell/table-cell.component.spec.ts new file mode 100644 index 00000000..cc6e0477 --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell/table-cell.component.spec.ts @@ -0,0 +1,160 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {EsmfTableCellComponent} from './table-cell.component'; +import {Clipboard} from '@angular/cdk/clipboard'; +import {By} from '@angular/platform-browser'; + +describe('EsmfTableCellComponent', () => { + let component: EsmfTableCellComponent; + let fixture: ComponentFixture; + let clipboardSpy: jest.SpyInstance; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [EsmfTableCellComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(EsmfTableCellComponent); + component = fixture.componentInstance; + clipboardSpy = jest.spyOn(TestBed.inject(Clipboard), 'copy'); + }); + + describe('value input transformation', () => { + it('should convert null to "-"', () => { + fixture.componentRef.setInput('value', null); + fixture.detectChanges(); + + expect(component.value()).toBe('-'); + }); + + it('should convert undefined to "-"', () => { + fixture.componentRef.setInput('value', undefined); + fixture.detectChanges(); + + expect(component.value()).toBe('-'); + }); + + it('should convert empty string to "-"', () => { + fixture.componentRef.setInput('value', ''); + fixture.detectChanges(); + + expect(component.value()).toBe('-'); + }); + + it('should convert whitespace-only string to "-"', () => { + fixture.componentRef.setInput('value', ' '); + fixture.detectChanges(); + + expect(component.value()).toBe('-'); + }); + + it('should convert number to string', () => { + fixture.componentRef.setInput('value', 123); + fixture.detectChanges(); + + expect(component.value()).toBe('123'); + }); + + it('should convert boolean to string', () => { + fixture.componentRef.setInput('value', true); + fixture.detectChanges(); + + expect(component.value()).toBe('true'); + }); + + it('should keep valid string as is', () => { + fixture.componentRef.setInput('value', 'test value'); + fixture.detectChanges(); + + expect(component.value()).toBe('test value'); + }); + }); + + describe('computed properties', () => { + it('should compute hasValue correctly', () => { + fixture.componentRef.setInput('value', null); + expect(component.hasValue()).toBe(false); + + fixture.componentRef.setInput('value', 'test'); + expect(component.hasValue()).toBe(true); + }); + + it('should compute highlight config properties', () => { + const configs = [ + {name: 'highlight-test', desc: 'Test', selected: true, color: 'red'}, + {name: 'other', desc: 'Other', selected: false}, + ]; + fixture.componentRef.setInput('value', 'test'); + fixture.componentRef.setInput('configs', configs); + + expect(component.highlightConfig()).toEqual(configs[0]); + expect(component.color()).toBe('red'); + expect(component.selected()).toBe(true); + }); + + it('should return undefined when no highlight config exists', () => { + fixture.componentRef.setInput('value', 'test'); + fixture.componentRef.setInput('configs', [{name: 'other', desc: 'Test', selected: false}]); + + expect(component.highlightConfig()).toBeUndefined(); + expect(component.color()).toBeUndefined(); + expect(component.selected()).toBeUndefined(); + }); + }); + + describe('copyToClipboard', () => { + it('should copy value, prevent event bubbling, and emit event', () => { + const event = new MouseEvent('click'); + const stopPropagationSpy = jest.spyOn(event, 'stopPropagation'); + const preventDefaultSpy = jest.spyOn(event, 'preventDefault'); + const emitSpy = jest.spyOn(component.copyToClipboardEvent, 'emit'); + + component.copyToClipboard('test', event); + + expect(clipboardSpy).toHaveBeenCalledWith('test'); + expect(stopPropagationSpy).toHaveBeenCalled(); + expect(preventDefaultSpy).toHaveBeenCalled(); + expect(emitSpy).toHaveBeenCalledWith('test'); + }); + }); + + describe('template', () => { + it('should render value and show copy icon when value exists', () => { + fixture.componentRef.setInput('value', 'test value'); + fixture.detectChanges(); + + expect(fixture.debugElement.query(By.css('.cell-content')).nativeElement.textContent).toContain('test value'); + expect(fixture.debugElement.query(By.css('[data-test="copy-to-clipboard-icon"]'))).toBeTruthy(); + }); + + it('should render "-" and hide copy icon when value is empty', () => { + fixture.componentRef.setInput('value', null); + fixture.detectChanges(); + + expect(fixture.debugElement.query(By.css('.cell-content')).nativeElement.textContent).toContain('-'); + expect(fixture.debugElement.query(By.css('[data-test="copy-to-clipboard-icon"]'))).toBeNull(); + }); + + it('should trigger copy on icon click', () => { + fixture.componentRef.setInput('value', 'test'); + fixture.detectChanges(); + + const emitSpy = jest.spyOn(component.copyToClipboardEvent, 'emit'); + fixture.debugElement.query(By.css('[data-test="copy-to-clipboard-icon"]')).nativeElement.click(); + + expect(clipboardSpy).toHaveBeenCalledTimes(1); + expect(emitSpy).toHaveBeenCalledTimes(1); + }); + + it('should apply directives with correct bindings', () => { + fixture.componentRef.setInput('value', 'test'); + fixture.componentRef.setInput('description', 'desc'); + fixture.componentRef.setInput('highlightString', ['test']); + fixture.detectChanges(); + + expect(fixture.debugElement.query(By.css('[esmfHighlight]'))).toBeTruthy(); + expect(fixture.debugElement.query(By.css('[esmfTableCellTooltip]'))).toBeTruthy(); + expect(component.description()).toBe('desc'); + expect(component.highlightString()).toEqual(['test']); + }); + }); +}); diff --git a/libs/schematic/src/lib/components/table-cell/table-cell.component.ts b/libs/schematic/src/lib/components/table-cell/table-cell.component.ts new file mode 100644 index 00000000..4539fdca --- /dev/null +++ b/libs/schematic/src/lib/components/table-cell/table-cell.component.ts @@ -0,0 +1,58 @@ +import {ChangeDetectionStrategy, Component, computed, inject, input, output} from '@angular/core'; +import {Clipboard} from '@angular/cdk/clipboard'; +import {MatIcon} from '@angular/material/icon'; +import {EsmfTableCellTooltipDirective} from '../../directives/table-cell-tooltip.directive'; +import {EsmfHighlightDirective} from '../../directives/highlight.directive'; + +interface Config { + /** Column name **/ + name: string; + /** Desc of the config **/ + desc: string; + /** State if the column is selected **/ + selected: boolean; + /** Color for the highlighted configuration **/ + color?: string; +} + +function convertToSafeString(val: unknown) { + if (val === null || val === undefined || val.toString().trim() === '') { + return '-'; + } + + return val.toString(); +} + +@Component({ + selector: 'esmf-table-cell', + templateUrl: './table-cell.component.html', + styleUrl: './table-cell.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [MatIcon, EsmfTableCellTooltipDirective, EsmfHighlightDirective], +}) +export class EsmfTableCellComponent { + value = input.required({transform: convertToSafeString}); + description = input(); + highlightString = input([]); + // TODO: Investigate whether it's possible to replace the array of configs with a single config for "highlight" only. + // Should be easily achievable after migrating "Extended Table" to "General" components + configs = input(); + + copyToClipboardEvent = output(); + + private readonly clipboard = inject(Clipboard); + + highlightConfig = computed(() => { + return this.configs()?.find((config: Config) => config.name.includes('highlight')); + }); + color = computed(() => this.highlightConfig()?.color); + selected = computed(() => this.highlightConfig()?.selected); + hasValue = computed(() => this.value() !== '-'); + + copyToClipboard(value: string, event: MouseEvent) { + event.stopPropagation(); + event.preventDefault(); + this.clipboard.copy(value); + this.copyToClipboardEvent.emit(value); + } +} diff --git a/libs/schematic/src/lib/directives/highlight.directive.spec.ts b/libs/schematic/src/lib/directives/highlight.directive.spec.ts new file mode 100644 index 00000000..fdb3f57d --- /dev/null +++ b/libs/schematic/src/lib/directives/highlight.directive.spec.ts @@ -0,0 +1,101 @@ +import {Component, DebugElement} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; +import {EsmfHighlightDirective} from './highlight.directive'; + +@Component({ + template: ` +
+ {{ highlightSource }} +
+ `, + imports: [EsmfHighlightDirective], +}) +class TestHostComponent { + highlight: string | string[] = ''; + highlightSource = 'ESMF Highlight Test'; + highlightColor = '#ff0'; + selected = false; +} + +describe('EsmfHighlightDirective', () => { + let fixture: ComponentFixture; + let host: TestHostComponent; + let debugEl: DebugElement; + let el: HTMLElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [TestHostComponent], + }); + fixture = TestBed.createComponent(TestHostComponent); + host = fixture.componentInstance; + debugEl = fixture.debugElement.query(By.directive(EsmfHighlightDirective)); + el = debugEl.nativeElement; + }); + + it('should not highlight if selected is false', () => { + host.highlight = 'ESMF'; + host.selected = false; + fixture.detectChanges(); + expect(el.innerHTML.includes(' { + host.highlight = 'ESMF'; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML).toContain(' { + host.highlight = ['ESMF', 'Test']; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML.match(/ { + host.highlight = 'ESMF'; + host.highlightColor = '#00ff00'; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML).toContain('background-color: #00ff00;'); + }); + + it('should clear highlights when selected is set to false after being true', () => { + host.highlight = 'ESMF'; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML).toContain(' { + host.highlightSource = ''; + host.highlight = 'ESMF'; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML).not.toContain(' { + host.highlightColor = ''; + host.highlight = 'ESMF'; + host.selected = true; + fixture.detectChanges(); + expect(el.innerHTML.includes('(); + highlightColor = input(); + highlight = input(); + selected = input(); + + private readonly el = inject(ElementRef); + private readonly sanitizer = inject(DomSanitizer); + private readonly regExpFlags = 'gi'; + + private readonly highlightArray = computed(() => { + const value = this.highlight(); + if (Array.isArray(value)) { + return value.filter((v): v is string => typeof v === 'string'); + } + return typeof value === 'string' ? [value] : []; + }); + + private get isStringHighlighted(): boolean { + return !!this.el.nativeElement.querySelector('mark'); + } + + constructor() { + effect(() => { + this.handleHighlightText(); + }); + } + + private handleHighlightText(): void { + if (this.selected()) { + this.transformText(); + } else if (this.isStringHighlighted) { + this.clearHighlights(); + } + } + + private transformText(): void { + if (this.canHighlightText()) { + const allRanges = this.calcRangesToReplace(); + const rangesToHighlight = this.mergeRangeIntersections(allRanges); + const content = this.sanitizer.sanitize(SecurityContext.STYLE, this.replaceHighlights(rangesToHighlight)); + + if (content?.length) { + (this.el.nativeElement as HTMLElement).innerHTML = content; + } + } + } + + private canHighlightText(): boolean { + const source = this.highlightSource(); + return ( + this.el?.nativeElement && + this.highlightArray().length > 0 && + typeof source === 'string' && + source.length > 0 && + !!this.highlightColor() + ); + } + + private calcRangesToReplace(): HighlightRange[] { + return this.highlightArray() + .map(highlightString => { + const len = highlightString.length; + const matches = this.highlightSource()?.matchAll(new RegExp(highlightString.toLowerCase(), this.regExpFlags)); + + if (!matches) return []; + + return [...matches] + .filter((a: RegExpMatchArray) => a && a.index !== undefined) + .map(a => ({from: a.index!, to: a.index! + len})); + }) + .filter(match => match.length > 0) + .flat() + .sort((a, b) => a.from - b.from); + } + + private mergeRangeIntersections(allRanges: HighlightRange[]): HighlightRange[] { + if (allRanges.length === 0) { + return []; + } + + const rangesToHighlight = [allRanges[0]]; + + allRanges.forEach(range => { + const currentRange = rangesToHighlight[rangesToHighlight.length - 1]; + + if (range.from <= currentRange.from) { + currentRange.from = range.from; + + if (range.to > currentRange.to) { + currentRange.to = range.to; + } + } else if (range.from <= currentRange.to && range.to >= currentRange.to) { + currentRange.to = range.to; + } else { + rangesToHighlight.push(range); + } + }); + + return rangesToHighlight; + } + + private replaceHighlights(rangesToHighlight: HighlightRange[]): string { + const highlightSource = this.highlightSource(); + + if (!highlightSource) return ''; + if (rangesToHighlight.length === 0) return highlightSource; + + let result = ''; + let lastIndex = 0; + + rangesToHighlight.forEach(({from, to}) => { + result += highlightSource?.substring(lastIndex, from); + result += `${highlightSource?.substring(from, to)}`; + lastIndex = to; + }); + + result += highlightSource?.substring(lastIndex); + return result; + } + + private clearHighlights(): void { + (this.el.nativeElement as HTMLElement).innerHTML = this.highlightSource() || ''; + } +} diff --git a/libs/schematic/src/lib/directives/horizontal-overflow.directive.ts b/libs/schematic/src/lib/directives/horizontal-overflow.directive.ts new file mode 100644 index 00000000..9f0c2ff7 --- /dev/null +++ b/libs/schematic/src/lib/directives/horizontal-overflow.directive.ts @@ -0,0 +1,86 @@ +/** Generated from ESMF JS SDK Angular Schematics - PLEASE DO NOT CHANGE IT **/ +import {AfterContentInit, Directive, ElementRef, HostListener, inject, Input, NgZone, OnDestroy} from '@angular/core'; +import {Subject} from 'rxjs'; +import {take, takeUntil} from 'rxjs/operators'; +import {MatChipListbox} from '@angular/material/chips'; + +@Directive({ + selector: '[esmfHorizontalOverflow]', + exportAs: 'horizontalOverflow', +}) +//TODO add unit tests to the directive +export class EsmfHorizontalOverflowDirective implements AfterContentInit, OnDestroy { + // eslint-disable-next-line @angular-eslint/no-input-rename + @Input('chipsObj') chips!: MatChipListbox; + + disableLeftBtn = true; + disableRightBtn = true; + left = 0; + offsetWidth = 0; + scrollWidth = 0; + clientWidth = 0; + scrollable = false; + scrollValue = 200; + + private readonly _destroyed$ = new Subject(); + private readonly element = inject(ElementRef); + private readonly zone = inject(NgZone); + + ngAfterContentInit() { + this.chips._chips.changes.pipe(takeUntil(this._destroyed$)).subscribe(() => + this.zone.onStable + .asObservable() + .pipe(take(1)) + .subscribe(() => { + this.adjustValues(); + }) + ); + } + + @HostListener('wheel', ['$event']) + public onScroll(event: WheelEvent) { + const [x, y] = [event.deltaX, event.deltaY]; + let magnitude; + + if (x === 0) { + magnitude = y > 0 ? this.scrollValue : -this.scrollValue; + } else { + magnitude = x; + } + + this.element.nativeElement.scrollBy({ + left: magnitude, + behavior: 'smooth', + }); + } + + @HostListener('scroll') onScrollEvent() { + this.adjustValues(); + } + + adjustValues() { + this.left = this.element.nativeElement.scrollLeft; + this.offsetWidth = this.element.nativeElement.offsetWidth; + this.scrollWidth = this.element.nativeElement.scrollWidth; + this.clientWidth = this.element.nativeElement.clientWidth; + this.disableLeftBtn = this.left === 0; + this.disableRightBtn = this.left >= this.scrollWidth - this.offsetWidth - 1; + this.scrollable = this.scrollWidth > this.clientWidth; + } + + scrollChipList(direction: string) { + switch (direction) { + case 'left': + this.element.nativeElement.scrollLeft -= this.scrollValue; + break; + case 'right': + this.element.nativeElement.scrollLeft += this.scrollValue; + break; + } + } + + ngOnDestroy() { + this._destroyed$.next(); + this._destroyed$.complete(); + } +} diff --git a/libs/schematic/src/lib/directives/resize-column.directive.spec.ts b/libs/schematic/src/lib/directives/resize-column.directive.spec.ts new file mode 100644 index 00000000..795e756c --- /dev/null +++ b/libs/schematic/src/lib/directives/resize-column.directive.spec.ts @@ -0,0 +1,361 @@ +import {Component, DebugElement} from '@angular/core'; +import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; +import {EsmfResizeColumnDirective} from './resize-column.directive'; + +@Component({ + template: ` + + + + + + + +
+ Column 1 + Column 2
+ `, + imports: [EsmfResizeColumnDirective], +}) +class TestComponent { + resizable = true; + minWidth = 50; + initialWidth = 200; + isDragging = false; + + onDragging(dragging: boolean): void { + this.isDragging = dragging; + } +} + +describe('EsmfResizeColumnDirective', () => { + let component: TestComponent; + let fixture: ComponentFixture; + let directiveElement: DebugElement; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TestComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + + directiveElement = fixture.debugElement.query(By.directive(EsmfResizeColumnDirective)); + }); + + afterEach(fakeAsync(() => { + // Clean up any pending drag operations to prevent warnings + document.dispatchEvent(new MouseEvent('mouseup')); + fixture.detectChanges(); + tick(); + fixture.destroy(); + })); + + describe('when resizable is true', () => { + beforeEach(() => { + component.resizable = true; + fixture.detectChanges(); + }); + + it('should create handle element', () => { + const handle = directiveElement.nativeElement.querySelector('.handle'); + expect(handle).toBeTruthy(); + }); + + it('should set initial width on column', () => { + const column = directiveElement.nativeElement; + expect(column.style.minWidth).toBe('200px'); + }); + + it('should show handle on mouse enter', () => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + expect(handle.style.opacity).toBe('1'); + }); + + it('should hide handle on mouse leave', () => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + expect(handle.style.opacity).toBe('1'); + + column.dispatchEvent(new MouseEvent('mouseleave')); + fixture.detectChanges(); + + expect(handle.style.opacity).toBe('0'); + }); + + it('should start resize on handle mousedown', () => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + clientX: 100, + }); + + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + expect(component.isDragging).toBe(true); + expect(document.body.classList.contains('resizing')).toBe(true); + }); + + it('should resize column on mousemove', fakeAsync(() => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + const table = column.closest('table') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + const initialWidth = column.offsetWidth; + + // Start resize + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + view: window, + }); + Object.defineProperty(mouseDownEvent, 'pageX', {value: 100}); + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + // Move mouse + const mouseMoveEvent = new MouseEvent('mousemove', { + bubbles: true, + cancelable: true, + buttons: 1, + view: window, + }); + Object.defineProperty(mouseMoveEvent, 'pageX', {value: 150}); + table.dispatchEvent(mouseMoveEvent); + fixture.detectChanges(); + + // Column width should change + const newWidth = parseInt(column.style.width, 10); + expect(newWidth).toBeGreaterThan(initialWidth); + })); + + it('should not resize below minimum width', fakeAsync(() => { + component.minWidth = 100; + fixture.detectChanges(); + + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + const table = column.closest('table') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + // Start resize + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + view: window, + }); + Object.defineProperty(mouseDownEvent, 'pageX', {value: 200}); + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + // Try to resize to less than minimum + const mouseMoveEvent = new MouseEvent('mousemove', { + bubbles: true, + cancelable: true, + buttons: 1, + view: window, + }); + Object.defineProperty(mouseMoveEvent, 'pageX', {value: 50}); + table.dispatchEvent(mouseMoveEvent); + fixture.detectChanges(); + + // Width should be at minimum + const width = parseInt(column.style.width, 10); + expect(width).toBe(100); + })); + + it('should end resize on mouseup', fakeAsync(() => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + // Start resize + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + view: window, + }); + Object.defineProperty(mouseDownEvent, 'pageX', {value: 100}); + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + expect(component.isDragging).toBe(true); + + // End resize + document.dispatchEvent(new MouseEvent('mouseup')); + fixture.detectChanges(); + tick(); + + expect(component.isDragging).toBe(false); + expect(document.body.classList.contains('resizing')).toBe(false); + expect(handle.style.opacity).toBe('0'); + })); + + it('should not resize if mousemove without buttons pressed', fakeAsync(() => { + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + const table = column.closest('table') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + const initialWidth = column.offsetWidth; + + // Start resize + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + view: window, + }); + Object.defineProperty(mouseDownEvent, 'pageX', {value: 100}); + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + // Move mouse without buttons pressed + const mouseMoveEvent = new MouseEvent('mousemove', { + bubbles: true, + cancelable: true, + buttons: 0, + view: window, + }); + Object.defineProperty(mouseMoveEvent, 'pageX', {value: 150}); + table.dispatchEvent(mouseMoveEvent); + fixture.detectChanges(); + + // Width should not change significantly (might have some browser default) + const currentStyleWidth = column.style.width; + expect(currentStyleWidth === '' || parseInt(currentStyleWidth, 10) <= initialWidth + 1).toBe(true); + })); + + it('should not do anything on mouseup if not pressed', () => { + const handle = directiveElement.nativeElement.querySelector('.handle') as HTMLElement; + + // Call mouseup without starting resize + document.dispatchEvent(new MouseEvent('mouseup')); + fixture.detectChanges(); + + // Should not affect dragging state + expect(component.isDragging).toBe(false); + // Handle opacity might be empty string or '0' if not set + expect(handle.style.opacity === '' || handle.style.opacity === '0').toBe(true); + }); + }); + + describe('when resizable is false', () => { + it('should not create handle element', fakeAsync(() => { + // Create a new fixture with resizable set to false from the start + const testFixture = TestBed.createComponent(TestComponent); + const testComponent = testFixture.componentInstance; + testComponent.resizable = false; + testFixture.detectChanges(); + + const testDirectiveElement = testFixture.debugElement.query(By.directive(EsmfResizeColumnDirective)); + const handle = testDirectiveElement.nativeElement.querySelector('.handle'); + expect(handle).toBeFalsy(); + + tick(); + testFixture.destroy(); + })); + + it('should not set up event listeners', fakeAsync(() => { + // Create a new fixture with resizable set to false from the start + const testFixture = TestBed.createComponent(TestComponent); + const testComponent = testFixture.componentInstance; + testComponent.resizable = false; + testFixture.detectChanges(); + + const testDirectiveElement = testFixture.debugElement.query(By.directive(EsmfResizeColumnDirective)); + const column = testDirectiveElement.nativeElement; + + // Mouse enter should not create handle + column.dispatchEvent(new MouseEvent('mouseenter')); + testFixture.detectChanges(); + + const handle = column.querySelector('.handle'); + expect(handle).toBeFalsy(); + + tick(); + testFixture.destroy(); + })); + }); + + describe('custom configuration', () => { + it('should use custom minWidth', fakeAsync(() => { + component.minWidth = 150; + component.resizable = true; + fixture.detectChanges(); + + const column = directiveElement.nativeElement; + const handle = column.querySelector('.handle') as HTMLElement; + const table = column.closest('table') as HTMLElement; + + column.dispatchEvent(new MouseEvent('mouseenter')); + fixture.detectChanges(); + + // Start resize + const mouseDownEvent = new MouseEvent('mousedown', { + bubbles: true, + cancelable: true, + view: window, + }); + Object.defineProperty(mouseDownEvent, 'pageX', {value: 200}); + handle.dispatchEvent(mouseDownEvent); + fixture.detectChanges(); + + // Try to resize below custom minimum + const mouseMoveEvent = new MouseEvent('mousemove', { + bubbles: true, + cancelable: true, + buttons: 1, + view: window, + }); + Object.defineProperty(mouseMoveEvent, 'pageX', {value: 50}); + table.dispatchEvent(mouseMoveEvent); + fixture.detectChanges(); + + const width = parseInt(column.style.width, 10); + expect(width).toBe(150); + })); + + it('should use custom initialWidth', fakeAsync(() => { + // Create a new fixture with custom initialWidth from the start + const testFixture = TestBed.createComponent(TestComponent); + const testComponent = testFixture.componentInstance; + testComponent.initialWidth = 300; + testComponent.resizable = true; + testFixture.detectChanges(); + + const testDirectiveElement = testFixture.debugElement.query(By.directive(EsmfResizeColumnDirective)); + const column = testDirectiveElement.nativeElement; + expect(column.style.minWidth).toBe('300px'); + + tick(); + testFixture.destroy(); + })); + }); +}); diff --git a/libs/schematic/src/lib/directives/resize-column.directive.ts b/libs/schematic/src/lib/directives/resize-column.directive.ts new file mode 100644 index 00000000..b5a64db9 --- /dev/null +++ b/libs/schematic/src/lib/directives/resize-column.directive.ts @@ -0,0 +1,111 @@ +import {Directive, effect, ElementRef, inject, input, output, Renderer2, signal} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; + +@Directive({ + selector: '[esmfResizeColumn]', +}) +export class EsmfResizeColumnDirective { + resizable = input(false, {alias: 'esmfResizeColumn'}); + minWidth = input(50); + initialWidth = input(200); + + dragging = output(); + + private readonly renderer = inject(Renderer2); + private readonly el = inject(ElementRef); + private readonly document = inject(DOCUMENT); + + private readonly startX = signal(0); + private readonly startWidth = signal(0); + private readonly pressed = signal(false); + private readonly column: HTMLElement; + private table!: HTMLElement; + private handle!: HTMLElement; + + private mouseMoveListener!: () => void; + private mouseUpListener!: () => void; + private mouseEnterListener!: () => void; + private mouseLeaveListener!: () => void; + + constructor() { + this.column = this.el.nativeElement; + + effect(() => { + if (this.resizable()) { + this.setTable(); + this.setListeners(); + this.createHandle(); + } + }); + } + + createHandle(): void { + this.handle = this.renderer.createElement('div'); + this.renderer.appendChild(this.column, this.handle); + this.renderer.addClass(this.handle, 'handle'); + } + + setTable(): void { + const row = this.renderer.parentNode(this.column); + const thead = this.renderer.parentNode(row); + this.table = this.renderer.parentNode(thead); + this.renderer.setStyle(this.column, 'min-width', `${this.initialWidth()}px`); + } + + setListeners(): void { + this.mouseEnterListener = this.renderer.listen(this.column, 'mouseenter', this.onMouseEnter); + this.mouseLeaveListener = this.renderer.listen(this.column, 'mouseleave', this.onMouseLeave); + } + + onMouseEnter = (): void => { + this.renderer.setStyle(this.handle, 'opacity', '1'); + this.renderer.listen(this.handle, 'mousedown', this.onMouseDown); + }; + + onMouseLeave = (): void => { + this.renderer.setStyle(this.handle, 'opacity', '0'); + }; + + onMouseDown = (event: MouseEvent) => { + this.pressed.set(true); + this.mouseEnterListener(); + this.mouseLeaveListener(); + this.dragging.emit(true); + this.startX.set(event.pageX); + this.startWidth.set(this.column.offsetWidth); + this.renderer.addClass(this.document.body, 'resizing'); + this.mouseMoveListener = this.renderer.listen(this.table, 'mousemove', this.onMouseMove); + this.mouseUpListener = this.renderer.listen('document', 'mouseup', this.onMouseUp); + }; + + onMouseMove = (event: MouseEvent): void => { + if (this.pressed() && event.buttons) { + // Calculate width of column + const distance = event.pageX - this.startX(); + const targetWidth = this.startWidth() + distance; + const width = targetWidth >= this.minWidth() ? targetWidth : this.minWidth(); + + // Set column width explicitly (cells are getting resized automatically) + this.renderer.setStyle(this.column, 'min-width', `${width}px`); + this.renderer.setStyle(this.column, 'width', `${width}px`); + } + }; + + onMouseUp = (): void => { + if (this.pressed()) { + this.mouseMoveListener(); + this.mouseUpListener(); + this.setListeners(); + this.pressed.set(false); + + // setTimeout is used in order to ensure that the click will only trigger the resize event and not the + // sorting one as well, since both of the events are triggered on the same cell. This is the only way it + // worked. If you have another idea, please feel free to change it. + setTimeout((): void => { + this.dragging.emit(false); + this.renderer.removeClass(this.document.body, 'resizing'); + this.renderer.setStyle(this.handle, 'opacity', '0'); + }, 0); + } + }; +} diff --git a/libs/schematic/src/lib/directives/table-cell-tooltip.directive.spec.ts b/libs/schematic/src/lib/directives/table-cell-tooltip.directive.spec.ts new file mode 100644 index 00000000..6ef12611 --- /dev/null +++ b/libs/schematic/src/lib/directives/table-cell-tooltip.directive.spec.ts @@ -0,0 +1,77 @@ +import {ElementRef} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {MatTooltip} from '@angular/material/tooltip'; +import {EsmfTableCellTooltipDirective} from './table-cell-tooltip.directive'; + +describe('EsmfTableCellTooltipDirective', () => { + let directive: EsmfTableCellTooltipDirective; + let elementRefMock: ElementRef<{offsetParent: {offsetWidth: number}; offsetWidth: number}>; + let tooltipMock: MatTooltip; + + beforeEach(() => { + elementRefMock = { + nativeElement: { + offsetParent: {offsetWidth: 0}, + offsetWidth: 0, + }, + } as ElementRef; + + tooltipMock = { + message: '', + tooltipClass: '', + } as MatTooltip; + + TestBed.configureTestingModule({ + providers: [ + EsmfTableCellTooltipDirective, + {provide: ElementRef, useValue: elementRefMock}, + {provide: MatTooltip, useValue: tooltipMock}, + ], + }); + + directive = TestBed.inject(EsmfTableCellTooltipDirective); + }); + + const setNativeElementDimensions = (cellWidth: number, contentWidth: number) => { + elementRefMock.nativeElement = { + offsetParent: {offsetWidth: cellWidth}, + offsetWidth: contentWidth, + }; + }; + + const setDirectiveInputs = (value: string, description?: string) => { + (directive as any).value = jest.fn(() => value); + (directive as any).description = jest.fn(() => description); + }; + + it('applies the tooltip class on creation', () => { + expect(tooltipMock.tooltipClass).toBe('table-cell-tooltip'); + }); + + it('uses only the description when the full content fits inside the cell', () => { + setNativeElementDimensions(200, 100); + setDirectiveInputs('Row value', 'Full description'); + + directive.check(); + + expect(tooltipMock.message).toBe('Full description'); + }); + + it('shows the value plus description when content is truncated', () => { + setNativeElementDimensions(100, 80); + setDirectiveInputs('Row value', 'Full description'); + + directive.check(); + + expect(tooltipMock.message).toBe('Row value - Full description'); + }); + + it('falls back to the value when truncated with no description', () => { + setNativeElementDimensions(100, 80); + setDirectiveInputs('Row value'); + + directive.check(); + + expect(tooltipMock.message).toBe('Row value'); + }); +}); diff --git a/libs/schematic/src/lib/directives/table-cell-tooltip.directive.ts b/libs/schematic/src/lib/directives/table-cell-tooltip.directive.ts new file mode 100644 index 00000000..cba7093d --- /dev/null +++ b/libs/schematic/src/lib/directives/table-cell-tooltip.directive.ts @@ -0,0 +1,34 @@ +import {Directive, ElementRef, HostListener, inject, input} from '@angular/core'; +import {MatTooltip} from '@angular/material/tooltip'; + +@Directive({ + selector: '[esmfTableCellTooltip]', + hostDirectives: [MatTooltip], +}) +export class EsmfTableCellTooltipDirective { + value = input.required(); + description = input(); + + private readonly el = inject(ElementRef); + private readonly matTooltip = inject(MatTooltip); + // average space taken by the 3 dots that trim the text + private readonly ellipsisSpace = 56; + + constructor() { + this.matTooltip.tooltipClass = 'table-cell-tooltip'; + } + + @HostListener('mouseenter') + check(): void { + const nativeEl = this.el.nativeElement; + // offsetParent.offsetWidth is the width of the table cell (td element) + // offsetWidth width of the span that contains the text inside the table cell + const isCellContentVisible = nativeEl.offsetParent.offsetWidth - this.ellipsisSpace >= nativeEl.offsetWidth; + + if (isCellContentVisible) { + this.matTooltip.message = this.description(); + } else { + this.matTooltip.message = this.description() ? `${this.value()} - ${this.description()}` : this.value(); + } + } +} diff --git a/libs/schematic/src/lib/models/filter.definition.ts b/libs/schematic/src/lib/models/filter.definition.ts new file mode 100644 index 00000000..287776a4 --- /dev/null +++ b/libs/schematic/src/lib/models/filter.definition.ts @@ -0,0 +1,13 @@ +export enum FilterEnums { + Date, + Search, + Enum, +} + +export type FilterType = { + type: FilterEnums; + label: string; + prop: string | null; + filterValue?: string; + removable?: boolean; +}; diff --git a/libs/schematic/src/lib/services/abstract-table-data-source.service.ts b/libs/schematic/src/lib/services/abstract-table-data-source.service.ts new file mode 100644 index 00000000..1e9de524 --- /dev/null +++ b/libs/schematic/src/lib/services/abstract-table-data-source.service.ts @@ -0,0 +1,58 @@ +import {DataSource} from '@angular/cdk/collections'; +import {MatPaginator} from '@angular/material/paginator'; +import {MatSort} from '@angular/material/sort'; +import {BehaviorSubject, Observable} from 'rxjs'; + +export abstract class EsmfAbstractTableDataSource extends DataSource { + paginator: MatPaginator | undefined; + sort: MatSort | undefined; + + remoteAPI: string | undefined; + private _dataSubject = new BehaviorSubject([]); + + private _data: T[] = []; + + get data(): T[] { + return this._data; + } + + get displayedData(): T[] { + return this._dataSubject.value; + } + + get length(): number { + return this._data.length; + } + + /** + * Connect this data source to the table. The table will + * only update when the returned stream emits new items. + * @returns A stream of the items to be rendered. + */ + connect(): Observable { + return this._dataSubject.asObservable(); + } + + /** + * Called when the table is being destroyed. Use this function, to clean up + * any open connections or free any held resources that were set up during connect. + */ + disconnect(): void { + this._dataSubject.complete(); + } + + setDataSubject(data: T[]): void { + this._dataSubject.next(data); + } + + setData(data: T[]) { + this._data = []; + data.forEach(item => { + this._data.push(JSON.parse(JSON.stringify(item))); + }); + + this.addData(this._data); + } + + abstract addData(data: T[]): void; +} diff --git a/libs/schematic/src/lib/services/paginator-select-config.provider.spec.ts b/libs/schematic/src/lib/services/paginator-select-config.provider.spec.ts new file mode 100644 index 00000000..82046bde --- /dev/null +++ b/libs/schematic/src/lib/services/paginator-select-config.provider.spec.ts @@ -0,0 +1,133 @@ +import {TestBed} from '@angular/core/testing'; +import {FactoryProvider} from '@angular/core'; +import {MatPaginatorSelectConfig} from '@angular/material/paginator'; +import {EsmfPaginatorSelectConfigInjector, EsmfPaginatorSelectConfigProvider} from './paginator-select-config.provider'; + +describe('EsmfPaginatorSelectConfigProvider', () => { + describe('EsmfPaginatorSelectConfigInjector', () => { + it('should be defined', () => { + expect(EsmfPaginatorSelectConfigInjector).toBeDefined(); + }); + + it('should have correct token description', () => { + expect(EsmfPaginatorSelectConfigInjector.toString()).toContain('PaginatorSelectConfig'); + }); + }); + + describe('EsmfPaginatorSelectConfigProvider', () => { + const typedProvider = EsmfPaginatorSelectConfigProvider as FactoryProvider; + + it('should be defined', () => { + expect(EsmfPaginatorSelectConfigProvider).toBeDefined(); + }); + + it('should provide EsmfPaginatorSelectConfigInjector token', () => { + expect(typedProvider.provide).toBe(EsmfPaginatorSelectConfigInjector); + }); + + it('should have useFactory defined', () => { + expect(typedProvider.useFactory).toBeDefined(); + expect(typeof typedProvider.useFactory).toBe('function'); + }); + + it('should have deps defined', () => { + expect(typedProvider.deps).toBeDefined(); + expect(Array.isArray(typedProvider.deps)).toBe(true); + }); + }); + + describe('useFactory behavior', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [EsmfPaginatorSelectConfigProvider], + }); + }); + + it('should return default config when no custom config is provided', () => { + const config = TestBed.inject(EsmfPaginatorSelectConfigInjector); + + expect(config).toEqual({disableOptionCentering: true}); + }); + + it('should return custom config when provided in parent injector', () => { + const customConfig: MatPaginatorSelectConfig = { + disableOptionCentering: false, + }; + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + { + provide: EsmfPaginatorSelectConfigInjector, + useValue: customConfig, + }, + ], + }); + + const childInjector = TestBed.inject(EsmfPaginatorSelectConfigInjector); + + expect(childInjector).toEqual(customConfig); + }); + + it('should handle custom config with additional properties in parent injector', () => { + const customConfig: MatPaginatorSelectConfig = { + disableOptionCentering: false, + panelClass: 'custom-panel', + }; + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + { + provide: EsmfPaginatorSelectConfigInjector, + useValue: customConfig, + }, + ], + }); + + const childInjector = TestBed.inject(EsmfPaginatorSelectConfigInjector); + + expect(childInjector).toEqual(customConfig); + expect(childInjector.panelClass).toBe('custom-panel'); + }); + }); + + describe('factory function directly', () => { + const typedProvider = EsmfPaginatorSelectConfigProvider as FactoryProvider; + + it('should return default config when called with undefined', () => { + const factory = typedProvider.useFactory as (config?: MatPaginatorSelectConfig) => MatPaginatorSelectConfig; + const result = factory(undefined); + + expect(result).toEqual({disableOptionCentering: true}); + }); + + it('should return default config when called with no arguments', () => { + const factory = typedProvider.useFactory as (config?: MatPaginatorSelectConfig) => MatPaginatorSelectConfig; + const result = factory(); + + expect(result).toEqual({disableOptionCentering: true}); + }); + + it('should return custom config when provided', () => { + const customConfig: MatPaginatorSelectConfig = { + disableOptionCentering: false, + }; + const factory = typedProvider.useFactory as (config?: MatPaginatorSelectConfig) => MatPaginatorSelectConfig; + const result = factory(customConfig); + + expect(result).toEqual(customConfig); + }); + + it('should return the exact custom config object', () => { + const customConfig: MatPaginatorSelectConfig = { + disableOptionCentering: false, + panelClass: 'test-class', + }; + const factory = typedProvider.useFactory as (config?: MatPaginatorSelectConfig) => MatPaginatorSelectConfig; + const result = factory(customConfig); + + expect(result).toBe(customConfig); + }); + }); +}); diff --git a/libs/schematic/src/lib/services/paginator-select-config.provider.ts b/libs/schematic/src/lib/services/paginator-select-config.provider.ts new file mode 100644 index 00000000..df3ca84d --- /dev/null +++ b/libs/schematic/src/lib/services/paginator-select-config.provider.ts @@ -0,0 +1,10 @@ +import {InjectionToken, Optional, Provider, SkipSelf} from '@angular/core'; +import {MatPaginatorSelectConfig} from '@angular/material/paginator'; + +export const EsmfPaginatorSelectConfigInjector = new InjectionToken('EsmfPaginatorSelectConfig'); + +export const EsmfPaginatorSelectConfigProvider: Provider = { + provide: EsmfPaginatorSelectConfigInjector, + useFactory: (customConfig?: MatPaginatorSelectConfig) => customConfig || {disableOptionCentering: true}, + deps: [[new Optional(), new SkipSelf(), EsmfPaginatorSelectConfigInjector]], +}; diff --git a/libs/schematic/src/lib/services/remote-table-data-source.service.ts b/libs/schematic/src/lib/services/remote-table-data-source.service.ts new file mode 100644 index 00000000..f431ee1b --- /dev/null +++ b/libs/schematic/src/lib/services/remote-table-data-source.service.ts @@ -0,0 +1,7 @@ +import {EsmfAbstractTableDataSource} from './abstract-table-data-source.service'; + +export class EsmfRemoteTableDataSource extends EsmfAbstractTableDataSource { + addData(data: T[]) { + this.setDataSubject(data); + } +} diff --git a/libs/schematic/src/lib/services/remote-table.service.spec.ts b/libs/schematic/src/lib/services/remote-table.service.spec.ts new file mode 100644 index 00000000..1aa5942f --- /dev/null +++ b/libs/schematic/src/lib/services/remote-table.service.spec.ts @@ -0,0 +1,82 @@ +import {TestBed} from '@angular/core/testing'; +import {HttpTestingController, provideHttpClientTesting} from '@angular/common/http/testing'; +import {EsmfRemoteTableService, Response} from './remote-table.service'; +import {provideHttpClient} from '@angular/common/http'; + +interface TestItem { + id: number; + name: string; +} + +describe('EsmfRemoteTableService', () => { + let service: EsmfRemoteTableService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [provideHttpClient(), provideHttpClientTesting(), EsmfRemoteTableService], + }); + service = TestBed.inject(EsmfRemoteTableService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it('should make POST request with correct URL and body', () => { + const url = 'https://api.example.com/data'; + const payload = {query: 'test'}; + const mockResponse: Response = { + items: [{id: 1, name: 'Test'}], + currentPage: 1, + itemCount: 1, + totalItems: 1, + totalPages: 1, + }; + + service.requestData(url, payload).subscribe(response => { + expect(response).toEqual(mockResponse); + }); + + const req = httpMock.expectOne(url); + expect(req.request.method).toBe('POST'); + expect(req.request.body).toEqual(payload); + req.flush(mockResponse); + }); + + it('should extract query parameters from URL and merge with body', () => { + const url = 'https://api.example.com/data?page=2&limit=10'; + const payload = {query: 'test'}; + const expectedBody = {query: 'test', page: '2', limit: '10'}; + + service.requestData(url, payload).subscribe(); + + const req = httpMock.expectOne('https://api.example.com/data'); + expect(req.request.body).toEqual(expectedBody); + req.flush({items: [], currentPage: 1, itemCount: 0, totalItems: 0, totalPages: 0}); + }); + + it('should handle URL without query parameters', () => { + const url = 'https://api.example.com/data'; + const payload = {query: 'test'}; + + service.requestData(url, payload).subscribe(); + + const req = httpMock.expectOne(url); + expect(req.request.body).toEqual(payload); + req.flush({items: [], currentPage: 1, itemCount: 0, totalItems: 0, totalPages: 0}); + }); + + it('should override payload properties with query parameters', () => { + const url = 'https://api.example.com/data?query=override&page=5'; + const payload = {query: 'original', page: 1}; + const expectedBody = {query: 'override', page: '5'}; + + service.requestData(url, payload).subscribe(); + + const req = httpMock.expectOne('https://api.example.com/data'); + expect(req.request.body).toEqual(expectedBody); + req.flush({items: [], currentPage: 1, itemCount: 0, totalItems: 0, totalPages: 0}); + }); +}); diff --git a/libs/schematic/src/lib/services/remote-table.service.ts b/libs/schematic/src/lib/services/remote-table.service.ts new file mode 100644 index 00000000..590eee26 --- /dev/null +++ b/libs/schematic/src/lib/services/remote-table.service.ts @@ -0,0 +1,32 @@ +import {inject, Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +export interface Response { + items: T[]; + currentPage: number; + itemCount: number; + totalItems: number; + totalPages: number; +} + +interface Payload { + query: string; + + [key: string]: string | number | boolean; +} + +@Injectable() +export class EsmfRemoteTableService { + private http = inject(HttpClient); + + requestData(remoteAPI: string, body: Payload) { + const strippedUrlParts: string[] = remoteAPI.split('?'); + if (strippedUrlParts && strippedUrlParts.length === 2) { + const queryParams = new URLSearchParams(strippedUrlParts[1]); + queryParams.forEach((value, key) => { + body[key] = value; + }); + } + return this.http.post>(strippedUrlParts[0], body); + } +} diff --git a/libs/schematic/src/lib/services/static-table-data-source.service.ts b/libs/schematic/src/lib/services/static-table-data-source.service.ts new file mode 100644 index 00000000..e6363fb2 --- /dev/null +++ b/libs/schematic/src/lib/services/static-table-data-source.service.ts @@ -0,0 +1,49 @@ +import {EsmfAbstractTableDataSource} from './abstract-table-data-source.service'; + +export class EsmfStaticTableDataSource extends EsmfAbstractTableDataSource { + addData(data: T[]) { + this.setDataSubject(this.getPagedData(this.sortData(data))); + } + + sortData(data: T[]): T[] { + if (!this.sort || !this.sort.active || this.sort.direction === '') { + return data; + } + + return data.sort((a: T, b: T): number => { + const isSortingAsc = this.sort?.direction === 'asc'; + const sortProp = this.sort?.active.trim(); + + if(Object.prototype.hasOwnProperty.call(a, sortProp) && Object.prototype.hasOwnProperty.call(b, sortProp)) { + return this.compare(a[sortProp], b[sortProp], isSortingAsc); + } else { + return 0; + } + }); + } + + private getPagedData(data: T[]): T[] { + if (this.paginator) { + const startIndex = this.paginator.pageIndex * this.paginator.pageSize; + return data.slice(startIndex, startIndex + this.paginator.pageSize); + } else { + return data; + } + } + + private compare( + a: string | number | boolean | Date | undefined, + b: string | number | boolean | Date | undefined, + isSortingAsc: boolean + ): number { + if (a === undefined || b === undefined) { + return (a === undefined ? -1 : 1) * (isSortingAsc ? 1 : -1); + } + + if (typeof a === 'boolean') { + return (a === b ? 0 : a ? -1 : 1) * (isSortingAsc ? 1 : -1); + } + + return (a < b ? -1 : 1) * (isSortingAsc ? 1 : -1); + } +} diff --git a/libs/schematic/src/lib/services/static-table.service.spec.ts b/libs/schematic/src/lib/services/static-table.service.spec.ts new file mode 100644 index 00000000..7624499a --- /dev/null +++ b/libs/schematic/src/lib/services/static-table.service.spec.ts @@ -0,0 +1,67 @@ +import {EsmfStaticTableService} from './static-table.service'; + +class MockEnum { + static isEnumeration() { + return true; + } + static values() { + return [ + {a: 1, b: 2}, + {a: 3, b: 4}, + ]; + } + a: number; + b: number; + constructor(a: number, b: number) { + this.a = a; + this.b = b; + } +} + +describe('EsmfStaticTableService', () => { + let service: EsmfStaticTableService; + + beforeEach(() => { + service = new EsmfStaticTableService(); + }); + + it('should flatten a simple object', () => { + const input = [{foo: 'bar', num: 42}]; + const output = service.flatten(input); + expect(output).toEqual([{foo: 'bar', num: 42}]); + }); + + it('should flatten a nested object', () => { + const input = [{foo: {bar: 'baz', qux: 1}, num: 42}]; + const output = service.flatten(input); + expect(output).toEqual([{'foo.bar': 'baz', 'foo.qux': 1, num: 42}]); + }); + + it('should flatten an object with enumeration', () => { + const input = [{enumProp: new MockEnum(1, 2), other: 'test'}]; + const output = service.flatten(input); + expect(output).toEqual([{enumProp: '1-2', other: 'test'}]); + }); + + it('should flatten deeply nested objects', () => { + const input = [ + { + a: { + b: { + c: 'd', + }, + }, + e: 5, + }, + ]; + const output = service.flatten(input); + expect(output).toEqual([{'a.b.c': 'd', e: 5}]); + }); + + it('should handle Date objects without flattening', () => { + const date = new Date(); + const input = [{created: date, value: 10}]; + const output = service.flatten(input); + expect(output).toEqual([{created: date, value: 10}]); + }); +}); diff --git a/libs/schematic/src/lib/services/static-table.service.ts b/libs/schematic/src/lib/services/static-table.service.ts new file mode 100644 index 00000000..21221757 --- /dev/null +++ b/libs/schematic/src/lib/services/static-table.service.ts @@ -0,0 +1,31 @@ +import {Injectable} from '@angular/core'; + +@Injectable() +export class EsmfStaticTableService { + flatten(csvArray: T[]): T[] { + return csvArray.map((item: T): T => { + return this.flattenObj(item); + }); + } + + private flattenObj(obj: any): any { + const result: any = {}; + + for (const key in obj) { + if (typeof obj[key].constructor.isEnumeration === 'function' && obj[key]?.constructor?.isEnumeration()) { + const enumerationValues = obj[key].constructor.values().find((v: any) => Object.keys(v).every(k => v[k] === obj[key][k])); + + result[key] = Object.values(enumerationValues).join('-'); + } else if (typeof obj[key] === 'object' && !(obj[key] instanceof Date)) { + const childObj = this.flattenObj(obj[key]); + + for (const childObjKey in childObj) { + result[`${key}.${childObjKey}`] = childObj[childObjKey]; + } + } else { + result[key] = obj[key]; + } + } + return result; + } +} diff --git a/libs/schematic/src/lib/services/storage.service.ts b/libs/schematic/src/lib/services/storage.service.ts new file mode 100644 index 00000000..bad07d63 --- /dev/null +++ b/libs/schematic/src/lib/services/storage.service.ts @@ -0,0 +1,9 @@ +import {Injectable} from '@angular/core'; + +// TODO: It's a temporary stub for the EsmfLocalStorageService. Will be removed during the actual migration of the service. +@Injectable() +export class EsmfLocalStorageService { + setItem(x, y) { + console.log(x, y); + } +} diff --git a/libs/schematic/src/lib/test-utils/index.ts b/libs/schematic/src/lib/test-utils/index.ts new file mode 100644 index 00000000..dc5a40f2 --- /dev/null +++ b/libs/schematic/src/lib/test-utils/index.ts @@ -0,0 +1,2 @@ +export * from './transloco-testing.module'; +export * from './transloco-testing.provider'; diff --git a/libs/schematic/src/lib/test-utils/transloco-testing.module.ts b/libs/schematic/src/lib/test-utils/transloco-testing.module.ts new file mode 100644 index 00000000..dbf6a930 --- /dev/null +++ b/libs/schematic/src/lib/test-utils/transloco-testing.module.ts @@ -0,0 +1,25 @@ +import {TranslocoTestingModule, TranslocoTestingOptions} from '@jsverse/transloco'; + +/** + * Returns a configured instance of TranslocoTestingModule for testing purposes. + * + * @param {TranslocoTestingOptions} options - Configuration options for the TranslocoTestingModule. + * @param {Record} options.langs - An object of languages to be used in the testing module. + * The translations may be loaded from a file, e.g.: `import * as en from '../assets/i18n/en.json';` + * + * @returns {TranslocoTestingModule} - A configured instance of TranslocoTestingModule. + */ +export function getTranslocoTestingModule(options: TranslocoTestingOptions = {}): TranslocoTestingModule { + if (!options.langs) { + throw new Error('Please provide a map of languages to be used in the testing module.'); + } + return TranslocoTestingModule.forRoot({ + langs: {en: {}, de: {}}, + translocoConfig: { + availableLangs: ['en', 'de'], + defaultLang: 'en', + }, + preloadLangs: true, + ...options, + }); +} diff --git a/libs/schematic/src/lib/test-utils/transloco-testing.provider.ts b/libs/schematic/src/lib/test-utils/transloco-testing.provider.ts new file mode 100644 index 00000000..e1129843 --- /dev/null +++ b/libs/schematic/src/lib/test-utils/transloco-testing.provider.ts @@ -0,0 +1,11 @@ +import {TRANSLOCO_SCOPE} from '@jsverse/transloco'; + +/** + * Provides a list of configured translations-related providers for testing purposes. + * + * @param scope - Translation scope to be used in tests. + * @returns - A list of configured providers. + */ +export function getTranslocoTestingProviders(scope = '') { + return [{provide: TRANSLOCO_SCOPE, useValue: [{scope}]}]; +} diff --git a/libs/schematic/src/test-setup.ts b/libs/schematic/src/test-setup.ts new file mode 100644 index 00000000..79b276cb --- /dev/null +++ b/libs/schematic/src/test-setup.ts @@ -0,0 +1,6 @@ +import {setupZoneTestEnv} from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/schematic/tsconfig.generators.json b/libs/schematic/tsconfig.generators.json new file mode 100644 index 00000000..5b10da67 --- /dev/null +++ b/libs/schematic/tsconfig.generators.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./.tmp-generators", + "rootDir": "./generators", + "module": "commonjs", + "moduleResolution": "node", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "types": [] + }, + "include": ["generators/**/*.ts"] +} diff --git a/libs/schematic/tsconfig.json b/libs/schematic/tsconfig.json new file mode 100644 index 00000000..0e1a20d0 --- /dev/null +++ b/libs/schematic/tsconfig.json @@ -0,0 +1,31 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "es2022", + "moduleResolution": "bundler", + "strict": false, + "noImplicitOverride": false, + "noImplicitAny": false, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/schematic/tsconfig.lib.json b/libs/schematic/tsconfig.lib.json new file mode 100644 index 00000000..93454efd --- /dev/null +++ b/libs/schematic/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": ["src/**/*.spec.ts", "src/test-setup.ts", "jest.config.ts", "src/**/*.test.ts", "jest.config.cts"], + "include": ["src/**/*.ts"] +} diff --git a/libs/schematic/tsconfig.lib.prod.json b/libs/schematic/tsconfig.lib.prod.json new file mode 100644 index 00000000..2a2faa88 --- /dev/null +++ b/libs/schematic/tsconfig.lib.prod.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/libs/schematic/tsconfig.spec.json b/libs/schematic/tsconfig.spec.json new file mode 100644 index 00000000..d6317ee3 --- /dev/null +++ b/libs/schematic/tsconfig.spec.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"], + "moduleResolution": "node10" + }, + "files": ["src/test-setup.ts"], + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/nx.json b/nx.json new file mode 100644 index 00000000..5394f658 --- /dev/null +++ b/nx.json @@ -0,0 +1,85 @@ +{ + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "namedInputs": { + "default": ["{projectRoot}/**/*", "sharedGlobals"], + "production": [ + "default", + "!{projectRoot}/.eslintrc.json", + "!{projectRoot}/eslint.config.mjs", + "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", + "!{projectRoot}/tsconfig.spec.json", + "!{projectRoot}/jest.config.[jt]s", + "!{projectRoot}/src/test-setup.[jt]s", + "!{projectRoot}/test-setup.[jt]s" + ], + "sharedGlobals": ["{workspaceRoot}/.github/workflows/ci.yml"] + }, + "targetDefaults": { + "@angular-devkit/build-angular:browser": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"] + }, + "@nx/eslint:lint": { + "cache": true, + "inputs": ["default", "{workspaceRoot}/.eslintrc.json", "{workspaceRoot}/.eslintignore", "{workspaceRoot}/eslint.config.mjs"] + }, + "@nx/jest:jest": { + "cache": true, + "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"], + "options": { + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + }, + "@nx/angular:package": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"] + }, + "@nx/js:tsc": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"] + } + }, + "plugins": [ + { + "plugin": "@nx/playwright/plugin", + "options": { + "targetName": "e2e" + } + }, + { + "plugin": "@nx/eslint/plugin", + "options": { + "targetName": "lint" + } + } + ], + "generators": { + "@nx/angular:application": { + "e2eTestRunner": "playwright", + "linter": "eslint", + "style": "scss", + "unitTestRunner": "jest" + }, + "@nx/angular:library": { + "linter": "eslint", + "unitTestRunner": "jest" + }, + "@nx/angular:component": { + "style": "css" + } + }, + "release": { + "version": { + "preVersionCommand": "npx nx run-many -t build" + } + } +} diff --git a/package-lock.json b/package-lock.json index 92fe29c6..0057fd4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,330 +1,442 @@ { "name": "@esmf/semantic-ui-schematics", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@esmf/semantic-ui-schematics", + "version": "0.0.1", "license": "mpl-2.0", "dependencies": { - "@angular-devkit/core": "19.2.8", - "@angular-devkit/schematics": "19.2.8", + "@angular/common": "~20.3.0", + "@angular/compiler": "~20.3.0", + "@angular/core": "~20.3.0", + "@angular/forms": "~20.3.0", + "@angular/material": "~20.2.0", + "@angular/platform-browser": "~20.3.0", + "@angular/platform-browser-dynamic": "~20.3.0", + "@angular/router": "~20.3.0", "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", - "@schematics/angular": "19.2.8", - "@types/cli-spinner": "^0.2.3", - "cli-spinner": "^0.2.10", - "fs": "0.0.1-security", + "@jsverse/transloco": "^8.2.0", + "@jsverse/transloco-locale": "^8.2.0", + "@nx/devkit": "22.0.4", "inquirer": "8.2.5", "inquirer-fuzzy-path": "2.3.0", "inquirer-prompt-suggest": "0.1.0", "inquirer-search-list": "^1.2.6", - "ora": "^5.4.1", "path": "^0.12.7", - "prettier": "2.8.8", - "rxjs": "7.x", - "typescript": "5.8.3" + "rxjs": "~7.8.0", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/cdk": "19.2.14", - "@babel/core": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/preset-typescript": "7.27.0", - "@types/inquirer": "^9.0.7", - "@types/inquirer-fuzzy-path": "2.3.9", - "@types/jest": "29.5.14", - "@types/node": "^22.15.3", - "@types/prettier": "^2.7.3", - "@typescript-eslint/eslint-plugin": "8.31.1", - "@typescript-eslint/parser": "8.31.1", - "eslint": "8.57.0", - "jest": "29.7.0", - "jest-stare": "2.5.2", - "locale-codes": "^1.3.1", - "ts-node": "10.9.2" - }, - "engines": { - "node": ">=18.13.0" - }, - "peerDependencies": { - "@angular/animations": "19.x", - "@angular/common": "19.x", - "@angular/forms": "19.x", - "@angular/material": "19.x", - "@angular/platform-browser": "19.x", - "@angular/platform-browser-dynamic": "19.x", - "@jsverse/transloco": "7.x", - "ngx-i18n-combine": "1.x", - "rxjs": "7.x" + "@angular-devkit/build-angular": "~20.3.0", + "@angular-devkit/core": "~20.3.0", + "@angular-devkit/schematics": "~20.3.0", + "@angular/cli": "~20.3.0", + "@angular/compiler-cli": "~20.3.0", + "@angular/language-service": "~20.3.0", + "@eslint/js": "^9.8.0", + "@nx/angular": "22.0.3", + "@nx/devkit": "22.0.4", + "@nx/eslint": "22.0.3", + "@nx/eslint-plugin": "22.0.3", + "@nx/jest": "22.0.4", + "@nx/js": "22.0.4", + "@nx/playwright": "22.0.3", + "@nx/plugin": "^22.0.4", + "@nx/web": "22.0.3", + "@nx/workspace": "22.0.3", + "@playwright/test": "^1.36.0", + "@schematics/angular": "~20.3.0", + "@swc-node/register": "~1.9.1", + "@swc/cli": "~0.6.0", + "@swc/core": "~1.5.7", + "@swc/helpers": "~0.5.11", + "@types/inquirer": "^9.0.9", + "@types/inquirer-fuzzy-path": "^2.3.9", + "@types/jest": "^29.5.12", + "@types/node": "20.19.9", + "@typescript-eslint/utils": "^8.40.0", + "angular-eslint": "^20.3.0", + "autoprefixer": "^10.4.0", + "eslint": "^9.8.0", + "eslint-config-prettier": "^10.0.0", + "eslint-plugin-playwright": "^1.6.2", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-preset-angular": "~14.6.1", + "jest-util": "^29.7.0", + "jsonc-eslint-parser": "^2.1.0", + "ng-mocks": "^14.13.2", + "ng-packagr": "~20.3.0", + "nx": "22.0.3", + "postcss": "^8.4.5", + "postcss-url": "~10.1.3", + "prettier": "^2.6.2", + "ts-jest": "^29.1.0", + "ts-node": "10.9.1", + "tslib": "^2.3.0", + "typescript": "~5.9.2", + "typescript-eslint": "^8.40.0", + "verdaccio": "^6.0.5" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@angular-devkit/core": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.8.tgz", - "integrity": "sha512-kcxUHKf5Hi98r4gAvMP3ntJV8wuQ3/i6wuU9RcMP0UKUt2Rer5Ryis3MPqT92jvVVwg6lhrLIhXsFuWJMiYjXQ==", + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "dev": true, + "license": "MIT", "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" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.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" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">= 14.0.0" } }, - "node_modules/@angular-devkit/core/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/@algolia/client-common": { + "version": "5.35.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@angular-devkit/schematics": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.8.tgz", - "integrity": "sha512-QsmFuYdAyeCyg9WF/AJBhFXDUfCwmDFTEbsv5t5KPSP6slhk0GoLNZApniiFytU2siRlSxVNpve2uATyYuAYkQ==", + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.8", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.17", - "ora": "5.4.1", - "rxjs": "7.8.1" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.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" + "node": ">= 14.0.0" } }, - "node_modules/@angular-devkit/schematics/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==", + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@angular/animations": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.9.tgz", - "integrity": "sha512-Xg/JD8GyeUpBwno51iuK/iJnbSVc6A+THyP+2ScNVdWFdLyuCiEr9EbIHdeGDnhK1f/MVjRKbkrN6OElkxCx8A==", + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.2.9", - "@angular/core": "19.2.9" + "node": ">= 14.0.0" } }, - "node_modules/@angular/cdk": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.14.tgz", - "integrity": "sha512-VRTvSRCJYrlywT0mtUZTqA6zb8beWNqr9xl7d/vaPjopzJMSdmIpNmPiN+WshLeQhRYnXOPmhUbhULAwThnetg==", + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "dev": true, "license": "MIT", "dependencies": { - "parse5": "^7.1.2", - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, - "peerDependencies": { - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@angular/common": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.9.tgz", - "integrity": "sha512-4Lio3nRp13sTU15hsVcv8Zkj+7OKZ6Pc6CIIkQYHs9KisSwwvwmRZDU1wFhKlH+ogebLgOcNurIPdqeYWWnLjQ==", + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.2.9", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">= 14.0.0" } }, - "node_modules/@angular/compiler": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.9.tgz", - "integrity": "sha512-K6wtAsJhQeD2OjoupV03gWHBqnqhEP9llzFzlnQoXAAZzM1eIT/KAtQEdNY75NO+BESKxaXvQBAU16Tg/1I6uw==", + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + "node": ">= 14.0.0" } }, - "node_modules/@angular/core": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.9.tgz", - "integrity": "sha512-73WMvxWll8/nQiAbigDhR27dQ+GjciODY5JVADdneNBSEwcQxi0HirlGzm5wy1TonOu4eTTWkvgV/3YlTOmo4A==", + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.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": ">= 14.0.0" } }, - "node_modules/@angular/forms": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.9.tgz", - "integrity": "sha512-RKzShsMf9X7LQd4qsfx1ShSPF0qODS7HWBPz/khFvfpscDYAqXvqzfXS2yvu0PaCwyNneR7vZKYMCN564SK7hw==", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.2.9", - "@angular/core": "19.2.9", - "@angular/platform-browser": "19.2.9", - "rxjs": "^6.5.3 || ^7.4.0" + "node": ">= 14.0.0" } }, - "node_modules/@angular/material": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.14.tgz", - "integrity": "sha512-jx9DGWwc/FuPbujG4SCZgrwvcdsqxTjpWaof1h3vR+9o01t0G0ugQebYiTEAVg+tuYMoq16stxtKo18BrYCI1Q==", + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0" }, - "peerDependencies": { - "@angular/cdk": "19.2.14", - "@angular/common": "^19.0.0 || ^20.0.0", - "@angular/core": "^19.0.0 || ^20.0.0", - "@angular/forms": "^19.0.0 || ^20.0.0", - "@angular/platform-browser": "^19.0.0 || ^20.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@angular/platform-browser": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.9.tgz", - "integrity": "sha512-vMBgCj/R2OxVX7YAqBTOsBiEUbwB3sJoZSy+E05vJovC0QhPWTiR4QiBXB1nlCoAZ8HTv79j7j8AYl10pqlPfQ==", + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "tslib": "^2.3.0" + "@algolia/client-common": "5.35.0" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/animations": "19.2.9", - "@angular/common": "19.2.9", - "@angular/core": "19.2.9" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } + "node": ">= 14.0.0" } }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.9.tgz", - "integrity": "sha512-llyjP1d3f6NDP6GwfHVNKZmkHlKpRKR/nYvP60Xl5vt90Gw2H5MJ+JHlzAHMt4O4paQHaYH1+b+2bio5/VSxjQ==", - "license": "MIT", - "peer": true, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/common": "19.2.9", - "@angular/compiler": "19.2.9", - "@angular/core": "19.2.9", - "@angular/platform-browser": "19.2.9" + "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/@angular-devkit/architect": { + "version": "0.2003.9", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@angular-devkit/core": "20.3.9", + "rxjs": "7.8.2" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", - "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", + "node_modules/@angular-devkit/build-angular": { + "version": "20.3.9", "dev": true, - "engines": { - "node": ">=6.9.0" + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.9", + "@angular-devkit/build-webpack": "0.2003.9", + "@angular-devkit/core": "20.3.9", + "@angular/build": "20.3.9", + "@babel/core": "7.28.3", + "@babel/generator": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.28.0", + "@babel/plugin-transform-async-to-generator": "7.27.1", + "@babel/plugin-transform-runtime": "7.28.3", + "@babel/preset-env": "7.28.3", + "@babel/runtime": "7.28.3", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "20.3.9", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "13.0.1", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.9", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.4.0", + "less-loader": "12.3.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.4", + "open": "10.2.0", + "ora": "8.2.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "postcss": "8.5.6", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.2", + "sass": "1.90.0", + "sass-loader": "16.0.5", + "semver": "7.7.2", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.43.1", + "tree-kill": "1.2.2", + "tslib": "2.8.1", + "webpack": "5.101.2", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.2", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.25.9" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.9", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0 || ^30.2.0", + "jest-environment-jsdom": "^29.5.0 || ^30.2.0", + "karma": "^6.3.0", + "ng-packagr": "^20.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "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/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.28.3", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -339,1424 +451,1951 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", "dev": true, - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/generator": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", - "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", "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" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime": { + "version": "7.28.3", "dev": true, - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "node_modules/@angular-devkit/build-angular/node_modules/autoprefixer": { + "version": "10.4.21", "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" + } + ], + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "postcss": "^8.1.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { + "version": "10.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "find-up": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5.61.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "node_modules/@angular-devkit/build-angular/node_modules/commander": { + "version": "2.20.3", "dev": true, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { + "version": "13.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "webpack": "^5.1.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "node_modules/@angular-devkit/build-angular/node_modules/cosmiconfig": { + "version": "9.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "node_modules/@angular-devkit/build-angular/node_modules/css-loader": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "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": ">=6.9.0" + "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/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "node_modules/@angular-devkit/build-angular/node_modules/define-lazy-prop": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { + "version": "0.25.9", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "node_modules/@angular-devkit/build-angular/node_modules/estraverse": { + "version": "4.3.0", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=6.9.0" + "node": ">=4.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "node_modules/@angular-devkit/build-angular/node_modules/fraction.js": { + "version": "4.3.7", "dev": true, - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "node_modules/@angular-devkit/build-angular/node_modules/glob-parent": { + "version": "6.0.2", "dev": true, + "license": "ISC", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, - "node_modules/@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "node_modules/@angular-devkit/build-angular/node_modules/jiti": { + "version": "1.21.7", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/less": { + "version": "4.4.0", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@babel/types": "^7.27.1" + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" }, "bin": { - "parser": "bin/babel-parser.js" + "lessc": "bin/lessc" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" + }, + "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/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "node_modules/@angular-devkit/build-angular/node_modules/less-loader": { + "version": "12.3.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@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/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "node_modules/@angular-devkit/build-angular/node_modules/loader-utils": { + "version": "3.3.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">= 12.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/memfs": { + "version": "4.50.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "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.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "node_modules/@angular-devkit/build-angular/node_modules/mini-css-extract-plugin": { + "version": "2.9.4", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "webpack": "^5.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "10.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "node_modules/@angular-devkit/build-angular/node_modules/postcss-loader": { + "version": "8.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@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/@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==", + "node_modules/@angular-devkit/build-angular/node_modules/sass": { + "version": "1.90.0", "dev": true, + "license": "MIT", + "peer": 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": ">=6.9.0" + "node": ">=14.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "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==", + "node_modules/@angular-devkit/build-angular/node_modules/sass-loader": { + "version": "16.0.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "neo-async": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "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/@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==", + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.7.2", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.6.1", "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "node_modules/@angular-devkit/build-angular/node_modules/terser": { + "version": "5.43.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "terser": "bin/terser" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack": { + "version": "5.101.2", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "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": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-middleware": { + "version": "7.4.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "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": ">=6.9.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "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==", + "node_modules/@angular-devkit/build-angular/node_modules/webpack-merge": { + "version": "6.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.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==", + "node_modules/@angular-devkit/build-webpack": { + "version": "0.2003.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-devkit/architect": "0.2003.9", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "node_modules/@angular-devkit/core": { + "version": "20.3.9", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "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==", + "node_modules/@angular-devkit/schematics": { + "version": "20.3.9", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@angular-devkit/core": "20.3.9", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.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==", + "node_modules/@angular-eslint/builder": { + "version": "20.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "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==", + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "20.6.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "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==", + "node_modules/@angular-eslint/eslint-plugin": { + "version": "20.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-eslint/bundled-angular-compiler": "20.6.0", + "@angular-eslint/utils": "20.6.0", + "ts-api-utils": "^2.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "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==", + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "20.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@angular-eslint/bundled-angular-compiler": "20.6.0", + "@angular-eslint/utils": "20.6.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular-eslint/template-parser": "20.6.0", + "@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/@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==", + "node_modules/@angular-eslint/schematics": { + "version": "20.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/eslint-plugin": "20.6.0", + "@angular-eslint/eslint-plugin-template": "20.6.0", + "ignore": "7.0.5", + "semver": "7.7.3", + "strip-json-comments": "3.1.1" } }, - "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==", + "node_modules/@angular-eslint/schematics/node_modules/ignore": { + "version": "7.0.5", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 4" } }, - "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==", + "node_modules/@angular-eslint/template-parser": { + "version": "20.6.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "20.6.0", + "eslint-scope": "^8.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "node_modules/@angular-eslint/utils": { + "version": "20.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "@angular-eslint/bundled-angular-compiler": "20.6.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "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==", + "node_modules/@angular/build": { + "version": "20.3.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.9", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", + "browserslist": "^4.23.0", + "esbuild": "0.25.9", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rollup": "4.52.3", + "sass": "1.90.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.1.11", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, - "engines": { - "node": ">=6.9.0" + "optionalDependencies": { + "lmdb": "3.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.9", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "node_modules/@angular/build/node_modules/@babel/core": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "node_modules/@angular/build/node_modules/esbuild": { + "version": "0.25.9", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/@angular/build/node_modules/sass": { + "version": "1.90.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "node_modules/@angular/build/node_modules/semver": { + "version": "7.7.2", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "node_modules/@angular/build/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "node_modules/@angular/build/node_modules/source-map-support": { + "version": "0.5.21", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "node_modules/@angular/build/node_modules/tinyglobby": { + "version": "0.2.14", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "node_modules/@angular/build/node_modules/vite": { + "version": "7.1.11", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "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/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "node_modules/@angular/build/node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "node_modules/@angular/build/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 14.6" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, + "node_modules/@angular/cdk": { + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.2.14.tgz", + "integrity": "sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "parse5": "^8.0.0", + "tslib": "^2.3.0" }, + "peerDependencies": { + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "peer": true, "engines": { - "node": ">=6.9.0" + "node": ">=0.12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "dev": true, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" + "entities": "^6.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "node_modules/@angular/cli": { + "version": "20.3.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@angular-devkit/architect": "0.2003.9", + "@angular-devkit/core": "20.3.9", + "@angular-devkit/schematics": "20.3.9", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.17.3", + "@schematics/angular": "20.3.9", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "3.25.76" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "ng": "bin/ng.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "6.2.2", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "node_modules/@angular/cli/node_modules/ansi-styles": { + "version": "6.2.3", "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "node_modules/@angular/cli/node_modules/cliui": { + "version": "9.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "node_modules/@angular/cli/node_modules/emoji-regex": { + "version": "10.6.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT" + }, + "node_modules/@angular/cli/node_modules/ini": { + "version": "5.0.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "node_modules/@angular/cli/node_modules/resolve": { + "version": "1.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.2", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=10" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "node_modules/@angular/cli/node_modules/string-width": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "node_modules/@angular/cli/node_modules/strip-ansi": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "node_modules/@angular/cli/node_modules/wrap-ansi": { + "version": "9.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "node_modules/@angular/cli/node_modules/yargs": { + "version": "18.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "node_modules/@angular/cli/node_modules/yargs-parser": { + "version": "22.0.0", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "ISC", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, + "node_modules/@angular/common": { + "version": "20.3.10", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/core": "20.3.10", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "dev": true, + "node_modules/@angular/compiler": { + "version": "20.3.10", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "node_modules/@angular/compiler-cli": { + "version": "20.3.10", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/core": "7.28.3", + "@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": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/compiler": "20.3.10", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", - "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "node_modules/@angular/compiler-cli/node_modules/ansi-styles": { + "version": "6.2.3", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "9.0.1", "dev": true, + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "node_modules/@angular/compiler-cli/node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/node_modules/emoji-regex": { + "version": "10.6.0", "dev": true, + "license": "MIT" + }, + "node_modules/@angular/compiler-cli/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "node_modules/@angular/compiler-cli/node_modules/strip-ansi": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "node_modules/@angular/compiler-cli/node_modules/wrap-ansi": { + "version": "9.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "18.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "22.0.0", "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/core": { + "version": "20.3.10", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/compiler": "20.3.10", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, + "node_modules/@angular/forms": { + "version": "20.3.10", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@angular/common": "20.3.10", + "@angular/core": "20.3.10", + "@angular/platform-browser": "20.3.10", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "node_modules/@angular/language-service": { + "version": "20.3.10", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/material": { + "version": "20.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-20.2.14.tgz", + "integrity": "sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/cdk": "20.2.14", + "@angular/common": "^20.0.0 || ^21.0.0", + "@angular/core": "^20.0.0 || ^21.0.0", + "@angular/forms": "^20.0.0 || ^21.0.0", + "@angular/platform-browser": "^20.0.0 || ^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, + "node_modules/@angular/platform-browser": { + "version": "20.3.10", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/animations": "20.3.10", + "@angular/common": "20.3.10", + "@angular/core": "20.3.10" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, + "node_modules/@angular/platform-browser-dynamic": { + "version": "20.3.10", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "20.3.10", + "@angular/compiler": "20.3.10", + "@angular/core": "20.3.10", + "@angular/platform-browser": "20.3.10" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, + "node_modules/@angular/router": { + "version": "20.3.10", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "tslib": "^2.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@angular/common": "20.3.10", + "@angular/core": "20.3.10", + "@angular/platform-browser": "20.3.10", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@babel/plugin-transform-template-literals": { + "node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "node_modules/@babel/compat-data": { + "version": "7.28.5", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "node_modules/@babel/core": { + "version": "7.28.5", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "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" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1765,3223 +2404,2972 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@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.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@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.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.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.26.3", - "@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.26.6", - "@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.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@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.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.11", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { + "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "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/@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==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "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": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@babel/types": "^7.27.1" }, "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": ">=6.9.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==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", "dev": true, + "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/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" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "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/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/types": "^7.24.7" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "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, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@esmf/aspect-model-loader": { - "version": "2.3.3", - "resolved": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", - "integrity": "sha512-vlTEj1NJobiWLbORPsnNEaMUs4Ya6iE9JvWmYlGWtkd/TKqAN5Za73o2Zm3pjhuqi/rS+8xLxcVcQpLf/Yfg+g==", - "dependencies": { - "buffer": "^6.0.3", - "locale-codes": "1.3.1", - "n3": "1.17.2", - "rxjs": "7.x", - "tslib": "2.6.2", - "util": "0.12.5" - }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12.18.0" + "node": ">=6.9.0" } }, - "node_modules/@esmf/aspect-model-loader/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "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", + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/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==", + "node_modules/@babel/helpers": { + "version": "7.28.4", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/parser": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": "*" + "node": ">=6.0.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==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, "engines": { - "node": ">=12.22" + "node": ">=6.9.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "peer": true, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "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==", - "license": "MIT", - "peer": 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==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.8.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" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/helper-plugin-utils": "^7.12.13" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, + "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "dev": true, + "license": "MIT", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", "dev": true, + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", "dev": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.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==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==" - }, - "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==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jsverse/transloco": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@jsverse/transloco/-/transloco-7.6.1.tgz", - "integrity": "sha512-hFFKJ1pVFYeW2E4UFETQpOeOn0tuncCSUdRewbq3LiV+qS9x4Z2XVuCaAaFPdiNhy4nUKHWFX1pWjpZ5XjUPaQ==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@jsverse/transloco-utils": "^7.0.0", - "fs-extra": "^11.0.0", - "glob": "^10.0.0", - "lodash.kebabcase": "^4.1.1", - "ora": "^5.4.1", - "replace-in-file": "^7.0.1", - "tslib": "^2.2.0" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@angular/core": ">=16.0.0" + "@babel/core": "^7.12.0" } }, - "node_modules/@jsverse/transloco-utils": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@jsverse/transloco-utils/-/transloco-utils-7.0.2.tgz", - "integrity": "sha512-zud1M68mMC/Pu6irEba+Z2SzmwmmPzUPnBzMKlcGdIhzUe1z41cqQutK1M0QaQpY4h4yhumXcNaY/Ot6piv6QQ==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "cosmiconfig": "^8.1.3", - "tslib": "^2.3.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" }, "engines": { - "node": ">=16" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jsverse/transloco/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==", - "license": "ISC", - "peer": true, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "dev": true - }, - "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==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", "dev": true, "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@schematics/angular": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.8.tgz", - "integrity": "sha512-oE/RzC9a0kS6+T72zX08Qkh42tbHlPZxFx1lm3saIzU9mifxlQRT9Od4PK+yksDBvxvtr+TcM2KVOqxCujpHXg==", "dependencies": { - "@angular-devkit/core": "19.2.8", - "@angular-devkit/schematics": "19.2.8", - "jsonc-parser": "3.3.1" + "@babel/helper-plugin-utils": "^7.27.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": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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/@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==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/cli-spinner": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/cli-spinner/-/cli-spinner-0.2.3.tgz", - "integrity": "sha512-TMO6mWltW0lCu1de8DMRq9+59OP/tEjghS+rs8ZEQ2EgYP5yV3bGw0tS14TMyJGqFaoVChNvhkVzv9RC1UgX+w==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/inquirer-autocomplete-prompt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-2.0.2.tgz", - "integrity": "sha512-Y7RM1dY3KVg11JnFkaQkTT+2Cgmn9K8De/VtrTT2a5grGIoMfkQuYM5Sss+65oiuqg1h1cTsKHG8pkoPsASdbQ==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/inquirer": "^8" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/inquirer-autocomplete-prompt/node_modules/@types/inquirer": { - "version": "8.2.10", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", - "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/inquirer-fuzzy-path": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.9.tgz", - "integrity": "sha512-hOzDXaPDENzAioMYM520CCe09GnKQQ417v8wU95YNft0hiaL1sKJVtoyWqOODqD6CTq54b5ddSewuK3LJAvg0g==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@types/inquirer": "^8", - "@types/inquirer-autocomplete-prompt": "^2" + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/inquirer-fuzzy-path/node_modules/@types/inquirer": { - "version": "8.2.10", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", - "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", - "dependencies": { - "undici-types": "~6.21.0" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "license": "MIT" - }, - "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/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", "dev": true, + "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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/@typescript-eslint/eslint-plugin": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", - "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/type-utils": "8.31.1", - "@typescript-eslint/utils": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", - "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "debug": "^4.3.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", - "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", - "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/utils": "8.31.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", - "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", - "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "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.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", - "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", - "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", - "eslint-visitor-keys": "^4.2.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys/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==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "dev": true, + "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" }, "engines": { - "node": ">=6.5" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", "dev": true, + "license": "ISC", "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "semver": "bin/semver.js" } }, - "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==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.11.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-parser": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.11.tgz", - "integrity": "sha512-HeEwCVf/pI9qQUVaTkoDBl9U/QU4RvWJ+Trg1jNSNvDzFsBAId6fHv6VLiC7HzwrOiL8uOEkO5T1eTgpnTFQfQ==", - "dev": true - }, - "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==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=8.6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">= 6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/preset-env": { + "version": "7.28.5", "dev": true, + "license": "MIT", "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" + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "@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==", + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", "dev": true, + "license": "MIT", "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" + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "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==", + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", "dev": true, + "license": "MIT", "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" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/@babel/runtime": { + "version": "7.28.4", "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" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "node_modules/@babel/template": { + "version": "7.27.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "node_modules/@babel/traverse": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "node_modules/@babel/types": { + "version": "7.28.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6.9.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==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", "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" - } + "license": "MIT" }, - "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==", + "node_modules/@borewit/text-codec": { + "version": "0.1.1", "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" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "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==" - }, - "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/@bufbuild/protobuf": { + "version": "2.10.0", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/bl/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" - } - ], + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/bl/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==", + "node_modules/@cypress/request": { + "version": "3.0.9", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~4.0.4", + "http-signature": "~1.4.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.14.0", + "safe-buffer": "^5.1.2", + "tough-cookie": "^5.0.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" }, "engines": { "node": ">= 6" } }, - "node_modules/bootstrap": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", - "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.14.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "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==", + "license": "BSD-3-Clause", "dependencies": { - "balanced-match": "^1.0.0" + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "5.1.2", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "fill-range": "^7.1.1" + "tldts": "^6.1.32" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", "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.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, + "license": "MIT", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=14.17.0" } }, - "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==", + "node_modules/@emnapi/core": { + "version": "1.7.0", "dev": true, + "license": "MIT", "dependencies": { - "node-int64": "^0.4.0" + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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/@emnapi/runtime": { + "version": "1.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "tslib": "^2.4.0" } }, - "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/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@eslint/core": { + "version": "0.17.0", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001717", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", - "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", "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/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" }, - "node_modules/chart.js": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz", - "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "@kurkle/color": "^0.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "pnpm": ">=8" + "node": "*" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/@eslint/js": { + "version": "9.39.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "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==", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "restore-cursor": "^3.1.0" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "node_modules/@esmf/aspect-model-loader": { + "version": "2.3.3", + "resolved": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", + "integrity": "sha512-vlTEj1NJobiWLbORPsnNEaMUs4Ya6iE9JvWmYlGWtkd/TKqAN5Za73o2Zm3pjhuqi/rS+8xLxcVcQpLf/Yfg+g==", + "license": "mpl-2.0", + "dependencies": { + "buffer": "^6.0.3", + "locale-codes": "1.3.1", + "n3": "1.17.2", + "rxjs": "7.x", + "tslib": "2.6.2", + "util": "0.12.5" + }, "engines": { - "node": ">=0.10" + "node": ">=12.18.0" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@esmf/aspect-model-loader/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/@esmf/aspect-model-loader/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 10" + "node": ">=18.18.0" } }, - "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==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=12" + "node": ">=18.18.0" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", "dev": true, + "license": "Apache-2.0", "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/collect-v8-coverage": { + "node_modules/@inquirer/ansi": { "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" - }, + "dev": true, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=18" } }, - "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/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "node_modules/@inquirer/checkbox": { + "version": "4.3.1", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.1", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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==", + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">=18" }, "peerDependencies": { - "typescript": ">=4.9.5" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "typescript": { + "@types/node": { "optional": true } } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "node_modules/@inquirer/core": { + "version": "10.3.1", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "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==", + "node_modules/@inquirer/editor": { + "version": "4.2.22", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@inquirer/core": "^10.3.1", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=6.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" }, "peerDependenciesMeta": { - "supports-color": { + "@types/node": { "optional": true } } }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "node_modules/@inquirer/expand": { + "version": "4.0.22", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.1", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "babel-plugin-macros": { + "@types/node": { "optional": 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==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", + "license": "MIT", "dependencies": { - "clone": "^1.0.2" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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==", + "node_modules/@inquirer/figures": { + "version": "1.0.15", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "node_modules/@inquirer/input": { + "version": "4.3.0", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.1", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": ">=0.3.1" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/@inquirer/number": { + "version": "3.0.22", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.1", + "@inquirer/type": "^3.0.10" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/diff2html": { - "version": "3.4.51", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.51.tgz", - "integrity": "sha512-/rVCSDyokkzSCEGaGjkkElXtIRwyNDRzIa3S8VUhR6pjk25p6+AMnb1s2zGmhjl66D5m/HnV3IeZoxnWsvTy+w==", + "node_modules/@inquirer/password": { + "version": "4.0.22", "dev": true, + "license": "MIT", "dependencies": { - "diff": "^7.0.0", - "hogan.js": "3.0.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.1", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=12" + "node": ">=18" }, - "optionalDependencies": { - "highlight.js": "11.9.0" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@inquirer/prompts": { + "version": "7.8.2", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "esutils": "^2.0.2" + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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==", + "node_modules/@inquirer/rawlist": { + "version": "4.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "@inquirer/core": "^10.3.1", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.149", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", - "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", - "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==", + "node_modules/@inquirer/search": { + "version": "3.2.1", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.1", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "node_modules/@inquirer/select": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.1", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=0.12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@inquirer/type": { + "version": "3.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "20 || >=22" } }, - "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==", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, "engines": { - "node": ">= 0.4" + "node": "20 || >=22" } }, - "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==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0" + "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": ">= 0.4" + "node": ">=12" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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.", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", "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" + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", "dev": true, + "license": "ISC", "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" + "minipass": "^7.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/eslint/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==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" - }, - "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/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "p-locate": "^4.1.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" }, "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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "p-limit": "^2.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "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==", + "node_modules/@jest/console": { + "version": "30.2.0", "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=4.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.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==", + "node_modules/@jest/console/node_modules/@jest/schemas": { + "version": "30.0.5", "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=4.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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==", + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "30.2.0", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } + "node_modules/@jest/console/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/@jest/console/node_modules/ci-info": { + "version": "4.3.1", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/@jest/console/node_modules/jest-util": { + "version": "30.2.0", "dev": true, + "license": "MIT", "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" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, + "node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "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==" - }, - "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==", + "node_modules/@jest/core": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8.6.0" + "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/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==", + "node_modules/@jest/core/node_modules/@jest/console": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@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": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/@jest/core/node_modules/@jest/environment": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@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/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/@jest/core/node_modules/@jest/expect": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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": ">=0.8.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/@jest/core/node_modules/@jest/reporters": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "@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": "^10.12.0 || >=12.0.0" + "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/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@jest/core/node_modules/@jest/test-result": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@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": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/@jest/test-sequencer": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/@jest/transform": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@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": "^10.12.0 || >=12.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "node_modules/@jest/core/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/@jest/core/node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "@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": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "peer": true, + "node_modules/@jest/core/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "@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": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/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==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" - }, - "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==", - "license": "MIT", - "peer": true, + "node_modules/@jest/core/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@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": ">=14.14" + "node": ">=8" } }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/@jest/core/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuzzy": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", - "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "license": "MIT", + "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": ">= 0.6.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/babel-preset-jest": { + "version": "29.6.3", "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-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/brace-expansion": { + "version": "1.1.12", "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==", + "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/glob": { + "node_modules/@jest/core/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, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4997,1042 +5385,21813 @@ "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==", + "node_modules/@jest/core/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "is-glob": "^4.0.3" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=10" } }, - "node_modules/glob/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==", + "node_modules/@jest/core/node_modules/jest-circus": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@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/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@jest/core/node_modules/jest-config": { + "version": "29.7.0", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@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": "*" + "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/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@jest/core/node_modules/jest-each": { + "version": "29.7.0", "dev": true, + "license": "MIT", + "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": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" + "node_modules/@jest/core/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, - "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==" - }, - "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/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/core/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/highlight.js": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", - "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "29.7.0", "dev": true, - "optional": true, + "license": "MIT", + "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": ">=12.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "node_modules/@jest/core/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "license": "ISC", "dependencies": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" + "brace-expansion": "^1.1.7" }, - "bin": { - "hulk": "bin/hulk" + "engines": { + "node": "*" } }, - "node_modules/holderjs": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/holderjs/-/holderjs-2.9.9.tgz", - "integrity": "sha512-ceWPz1MrR3dxOoZXiom+G48+l1VPG3TcjBw9fq5iwCiZAMvYX8Aia13GOxT7DoV/AcSyTH7Vvr11ygjZP9qn4w==", - "dev": true - }, - "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/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==", + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">=10.17.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/@jest/core/node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@jest/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@jest/core/node_modules/slash": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, + "node_modules/@jest/core/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/@jest/core/node_modules/write-file-atomic": { + "version": "4.0.2", "dev": true, + "license": "ISC", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "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.", + "node_modules/@jest/environment": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "node_modules/@jest/environment/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=12.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-autocomplete-prompt": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", - "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "figures": "^3.2.0", - "run-async": "^2.4.0", - "rxjs": "^6.6.2" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-autocomplete-prompt/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@jest/environment/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "npm": ">=2.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-autocomplete-prompt/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/inquirer-fuzzy-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz", - "integrity": "sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg==", + "node_modules/@jest/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "fuzzy": "^0.1.3", - "inquirer": "^6.0.0", - "inquirer-autocomplete-prompt": "^1.0.2", - "strip-ansi": "^4.0.0" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": ">=8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@jest/get-type": "30.1.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@jest/expect/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "node_modules/@jest/expect/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^2.0.0" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + "node_modules/@jest/expect/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" }, - "node_modules/inquirer-fuzzy-path/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@jest/expect/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-fuzzy-path/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/inquirer-fuzzy-path/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==", + "node_modules/@jest/expect/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/inquirer-fuzzy-path/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/@jest/expect/node_modules/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@jest/expect/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "node_modules/@jest/expect/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" }, "engines": { - "node": ">=6.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/@jest/expect/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": ">=6" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + "node_modules/@jest/fake-timers/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" }, - "node_modules/inquirer-fuzzy-path/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-fuzzy-path/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, + "node_modules/@jest/fake-timers/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inquirer-fuzzy-path/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "npm": ">=2.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@jest/globals/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-fuzzy-path/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/inquirer-prompt-suggest": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/inquirer-prompt-suggest/-/inquirer-prompt-suggest-0.1.0.tgz", - "integrity": "sha512-RC5XKDeBSsf0nBOQ380NloJcI+WTbGNo049aJsXRZXxxnRDCL5PqvftIe81zUPSUqF8hI0UxR+v77L74xJB40w==", + "node_modules/@jest/globals/node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^2.4.1", - "inquirer": "^5.2.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "node_modules/@jest/globals/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" + "node_modules/@jest/globals/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-prompt-suggest/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@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": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" - }, - "node_modules/inquirer-prompt-suggest/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^2.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "node_modules/inquirer-prompt-suggest/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@jest/globals/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@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/inquirer-prompt-suggest/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "node_modules/@jest/globals/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/inquirer-prompt-suggest/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==", + "node_modules/@jest/globals/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/inquirer-prompt-suggest/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/@jest/pattern": { + "version": "30.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "@types/node": "*", + "jest-regex-util": "30.0.1" }, "engines": { - "node": ">=0.12" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/@jest/reporters": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/inquirer-prompt-suggest/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@jest/reporters/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=6.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-prompt-suggest/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/@jest/reporters/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inquirer-prompt-suggest/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" - }, - "node_modules/inquirer-prompt-suggest/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "symbol-observable": "1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "npm": ">=2.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/inquirer-prompt-suggest/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, + "node_modules/@jest/reporters/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inquirer-prompt-suggest/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-prompt-suggest/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", - "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^2.3.0", - "figures": "^2.0.0", - "fuzzy": "^0.1.3", - "inquirer": "^3.3.0" - } - }, - "node_modules/inquirer-search-list/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-search-list/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inquirer-search-list/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" - }, - "node_modules/inquirer-search-list/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "node_modules/@jest/test-result": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^2.0.0" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" - }, - "node_modules/inquirer-search-list/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@jest/test-result/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/inquirer-search-list/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==", + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, "engines": { - "node": ">=0.8.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/@jest/test-result/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer-search-list/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/has-flag": { + "node_modules/@jest/test-sequencer/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inquirer-search-list/node_modules/inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "node_modules/inquirer-search-list/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" - }, - "node_modules/inquirer-search-list/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "node_modules/@jest/transform/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/inquirer-search-list/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=4" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsverse/transloco": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco/-/transloco-8.2.0.tgz", + "integrity": "sha512-5SU9mjmKHlTraW/GKSUsWEjt7ATBLzKcKd6w+mTbRrnU38ZyYdCJoR2W/ii8lWiRwhfgbXTFCsTUueW5Ak61WA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@jsverse/transloco-utils": "^8.2.0", + "@jsverse/utils": "1.0.0-beta.5", + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@jsverse/transloco-locale": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco-locale/-/transloco-locale-8.2.0.tgz", + "integrity": "sha512-EMj9f1ugqKT0m6V3heTrJ4dm9UV5vNiLj3WnMKWoiNfqsZtUr6FTeTsTNoDCBSel4ucC9pCVfmcFk6SUUzfIAQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": ">=16.0.0", + "@jsverse/transloco": ">=8.0.0", + "rxjs": ">=6.0.0" + } + }, + "node_modules/@jsverse/transloco-utils": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@jsverse/transloco-utils/-/transloco-utils-8.2.0.tgz", + "integrity": "sha512-rDactF2Qmu4JKBpecyYLzD3spPZ0U+6wgoQS2OIcVraq5riV8eE3sPYb5dgL2wxMgGtJRuT8PgMMAD7LUOcCNw==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jsverse/transloco-utils/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==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@jsverse/utils": { + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@jsverse/utils/-/utils-1.0.0-beta.5.tgz", + "integrity": "sha512-z7IdlV6BdSeF3Veii8Yyk64KuyTjNIQnFaW5PAhmDx0wN29lB2BFp8WO6+tJPLPjtlz2yKeNrjkp1XqnMPaeHA==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.4.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.14.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.7.0", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modern-js/node-bundle-require": { + "version": "2.68.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/utils": "2.68.2", + "@swc/helpers": "^0.5.17", + "esbuild": "0.25.5" + } + }, + "node_modules/@modern-js/utils": { + "version": "2.68.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.17", + "caniuse-lite": "^1.0.30001520", + "lodash": "^4.17.21", + "rslog": "^1.1.0" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.4", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/cli": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@modern-js/node-bundle-require": "2.68.2", + "@module-federation/dts-plugin": "0.21.4", + "@module-federation/sdk": "0.21.4", + "chalk": "3.0.0", + "commander": "11.1.0" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.4", + "@module-federation/sdk": "0.21.4", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.4", + "@module-federation/managers": "0.21.4", + "@module-federation/sdk": "0.21.4", + "@module-federation/third-party-dts-extractor": "0.21.4", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.12.0", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "3.0.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/enhanced": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.4", + "@module-federation/cli": "0.21.4", + "@module-federation/data-prefetch": "0.21.4", + "@module-federation/dts-plugin": "0.21.4", + "@module-federation/error-codes": "0.21.4", + "@module-federation/inject-external-runtime-core-plugin": "0.21.4", + "@module-federation/managers": "0.21.4", + "@module-federation/manifest": "0.21.4", + "@module-federation/rspack": "0.21.4", + "@module-federation/runtime-tools": "0.21.4", + "@module-federation/sdk": "0.21.4", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" + }, + "bin": { + "mf": "bin/mf.js" + }, + "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.21.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@module-federation/runtime-tools": "0.21.4" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.4", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/manifest": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "0.21.4", + "@module-federation/managers": "0.21.4", + "@module-federation/sdk": "0.21.4", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node": { + "version": "2.7.23", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/enhanced": "0.21.4", + "@module-federation/runtime": "0.21.4", + "@module-federation/sdk": "0.21.4", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "react": "^16||^17||^18||^19", + "react-dom": "^16||^17||^18||^19", + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.4", + "@module-federation/dts-plugin": "0.21.4", + "@module-federation/inject-external-runtime-core-plugin": "0.21.4", + "@module-federation/managers": "0.21.4", + "@module-federation/manifest": "0.21.4", + "@module-federation/runtime-tools": "0.21.4", + "@module-federation/sdk": "0.21.4", + "btoa": "1.2.1" + }, + "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.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.4", + "@module-federation/runtime-core": "0.21.4", + "@module-federation/sdk": "0.21.4" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.4", + "@module-federation/sdk": "0.21.4" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime": "0.21.4", + "@module-federation/webpack-bundler-runtime": "0.21.4" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.21.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.4", + "@module-federation/sdk": "0.21.4" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngtools/webpack": { + "version": "20.3.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "typescript": ">=5.8 <6.0", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "dev": true, + "license": "ISC", + "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-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/ini": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "dev": true, + "license": "ISC", + "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/hosted-git-info": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "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.2.2", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@nx/angular": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/eslint": "22.0.3", + "@nx/js": "22.0.3", + "@nx/module-federation": "22.0.3", + "@nx/rspack": "22.0.3", + "@nx/web": "22.0.3", + "@nx/webpack": "22.0.3", + "@nx/workspace": "22.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@typescript-eslint/type-utils": "^8.0.0", + "enquirer": "~2.3.6", + "magic-string": "~0.30.2", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">= 18.0.0 < 21.0.0", + "@angular-devkit/core": ">= 18.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 18.0.0 < 21.0.0", + "@angular/build": ">= 18.0.0 < 21.0.0", + "@schematics/angular": ">= 18.0.0 < 21.0.0", + "ng-packagr": ">= 18.0.0 < 21.0.0", + "rxjs": "^6.5.3 || ^7.5.0" + }, + "peerDependenciesMeta": { + "@angular-devkit/build-angular": { + "optional": true + }, + "@angular/build": { + "optional": true + }, + "ng-packagr": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/angular/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/angular/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/angular/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/angular/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/devkit": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/eslint": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "typescript": "~5.9.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": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@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.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/globals": { + "version": "15.15.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/eslint/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/eslint/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/eslint/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/eslint/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/jest": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/reporters": "^30.0.2", + "@jest/test-result": "^30.0.2", + "@nx/devkit": "22.0.4", + "@nx/js": "22.0.4", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^30.0.2", + "jest-resolve": "^30.0.2", + "jest-util": "^30.0.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/jest/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/jest/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/js": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "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": "22.0.4", + "@nx/workspace": "22.0.4", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nx/js/node_modules/@nx/nx-darwin-arm64": { + "version": "22.0.4", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/js/node_modules/@nx/workspace": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.4", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.0.4", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/js/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@nx/js/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/js/node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/js/node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/js/node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/js/node_modules/nx": { + "version": "22.0.4", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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.12.0", + "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": "^7.0.5", + "jest-diff": "^30.0.2", + "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.6.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "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": "22.0.4", + "@nx/nx-darwin-x64": "22.0.4", + "@nx/nx-freebsd-x64": "22.0.4", + "@nx/nx-linux-arm-gnueabihf": "22.0.4", + "@nx/nx-linux-arm64-gnu": "22.0.4", + "@nx/nx-linux-arm64-musl": "22.0.4", + "@nx/nx-linux-x64-gnu": "22.0.4", + "@nx/nx-linux-x64-musl": "22.0.4", + "@nx/nx-win32-arm64-msvc": "22.0.4", + "@nx/nx-win32-x64-msvc": "22.0.4" + }, + "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/js/node_modules/nx/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@nx/js/node_modules/ora": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "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/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/js/node_modules/yaml": { + "version": "2.8.1", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/@nx/module-federation": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21", + "@module-federation/sdk": "^0.21.2", + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "@nx/web": "22.0.3", + "@rspack/core": "^1.5.2", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "^5.101.3" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/module-federation/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/module-federation/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "22.0.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/playwright": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/eslint": "22.0.3", + "@nx/js": "22.0.3", + "minimatch": "9.0.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@playwright/test": "^1.36.0" + }, + "peerDependenciesMeta": { + "@playwright/test": { + "optional": true + } + } + }, + "node_modules/@nx/playwright/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/playwright/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/playwright/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/playwright/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/playwright/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/plugin": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.4", + "@nx/eslint": "22.0.4", + "@nx/jest": "22.0.4", + "@nx/js": "22.0.4", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/plugin/node_modules/@nx/eslint": { + "version": "22.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.4", + "@nx/js": "22.0.4", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/rspack": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "@nx/module-federation": "22.0.3", + "@nx/web": "22.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@rspack/core": "^1.5.2", + "@rspack/dev-server": "^1.1.4", + "@rspack/plugin-react-refresh": "^1.0.0", + "autoprefixer": "^10.4.9", + "browserslist": "^4.21.4", + "css-loader": "^6.4.0", + "enquirer": "~2.3.6", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "parse5": "4.0.0", + "picocolors": "^1.1.0", + "postcss": "^8.4.38", + "postcss-import": "~14.1.0", + "postcss-loader": "^8.1.1", + "sass": "^1.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "ts-checker-rspack-plugin": "^1.1.1", + "tslib": "^2.3.0", + "webpack": "^5.101.3", + "webpack-node-externals": "^3.0.0" + }, + "peerDependencies": { + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21" + } + }, + "node_modules/@nx/rspack/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/rspack/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/rspack/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/rspack/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/rspack/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/web": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/web/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/web/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/web/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/web/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/web/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/webpack": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@nx/devkit": "22.0.3", + "@nx/js": "22.0.3", + "@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.85.0", + "sass-embedded": "^1.83.4", + "sass-loader": "^16.0.4", + "source-map-loader": "^5.0.0", + "style-loader": "^3.3.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "4.2.0", + "tslib": "^2.3.0", + "webpack": "^5.101.3", + "webpack-dev-server": "^5.2.1", + "webpack-node-externals": "^3.0.0", + "webpack-subresource-integrity": "^5.1.0" + } + }, + "node_modules/@nx/webpack/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/webpack/node_modules/@nx/js": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "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": "22.0.3", + "@nx/workspace": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/webpack/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/webpack/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/webpack/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/webpack/node_modules/postcss-loader": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "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/workspace": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.3", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.0.3", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/devkit": { + "version": "22.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/workspace/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nx/workspace/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.56.1", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "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/rollup-darwin-arm64": { + "version": "4.52.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/wasm-node": { + "version": "4.53.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@rspack/binding": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.6.1", + "@rspack/binding-darwin-x64": "1.6.1", + "@rspack/binding-linux-arm64-gnu": "1.6.1", + "@rspack/binding-linux-arm64-musl": "1.6.1", + "@rspack/binding-linux-x64-gnu": "1.6.1", + "@rspack/binding-linux-x64-musl": "1.6.1", + "@rspack/binding-wasm32-wasi": "1.6.1", + "@rspack/binding-win32-arm64-msvc": "1.6.1", + "@rspack/binding-win32-ia32-msvc": "1.6.1", + "@rspack/binding-win32-x64-msvc": "1.6.1" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.6.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/core": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@module-federation/runtime-tools": "0.21.2", + "@rspack/binding": "1.6.1", + "@rspack/lite-tapable": "1.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { + "version": "0.21.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime": { + "version": "0.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.2", + "@module-federation/runtime-core": "0.21.2", + "@module-federation/sdk": "0.21.2" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime-core": { + "version": "0.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.2", + "@module-federation/sdk": "0.21.2" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.2", + "@module-federation/webpack-bundler-runtime": "0.21.2" + } + }, + "node_modules/@rspack/core/node_modules/@module-federation/sdk": { + "version": "0.21.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.2", + "@module-federation/sdk": "0.21.2" + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "http-proxy-middleware": "^2.0.9", + "p-retry": "^6.2.0", + "webpack-dev-server": "5.2.2", + "ws": "^8.18.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@rspack/dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rspack/dev-server/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@rspack/plugin-react-refresh": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.1.4", + "html-entities": "^2.6.0" + }, + "peerDependencies": { + "react-refresh": ">=0.10.0 <1.0.0", + "webpack-hot-middleware": "2.x" + }, + "peerDependenciesMeta": { + "webpack-hot-middleware": { + "optional": true + } + } + }, + "node_modules/@schematics/angular": { + "version": "20.3.9", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@angular-devkit/core": "20.3.9", + "@angular-devkit/schematics": "20.3.9", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@swc-node/register": { + "version": "1.9.2", + "dev": true, + "license": "MIT", + "peer": 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/register/node_modules/@swc-node/core": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.13.3", + "@swc/types": ">= 0.1" + } + }, + "node_modules/@swc-node/sourcemap-support": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.21", + "tslib": "^2.6.3" + } + }, + "node_modules/@swc-node/sourcemap-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@swc-node/sourcemap-support/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@swc/cli": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/counter": "^0.1.3", + "@xhmikosr/bin-wrapper": "^13.0.5", + "commander": "^8.3.0", + "fast-glob": "^3.2.5", + "minimatch": "^9.0.3", + "piscina": "^4.3.1", + "semver": "^7.3.8", + "slash": "3.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "spack": "bin/spack.js", + "swc": "bin/swc.js", + "swcx": "bin/swcx.js" + }, + "engines": { + "node": ">= 16.14.0" + }, + "peerDependencies": { + "@swc/core": "^1.2.66", + "chokidar": "^4.0.1" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@swc/cli/node_modules/commander": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@swc/cli/node_modules/piscina": { + "version": "4.9.2", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/@swc/cli/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@swc/core": { + "version": "1.5.29", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.8" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.29", + "@swc/core-darwin-x64": "1.5.29", + "@swc/core-linux-arm-gnueabihf": "1.5.29", + "@swc/core-linux-arm64-gnu": "1.5.29", + "@swc/core-linux-arm64-musl": "1.5.29", + "@swc/core-linux-x64-gnu": "1.5.29", + "@swc/core-linux-x64-musl": "1.5.29", + "@swc/core-win32-arm64-msvc": "1.5.29", + "@swc/core-win32-ia32-msvc": "1.5.29", + "@swc/core-win32-x64-msvc": "1.5.29" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.29", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "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/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/inquirer": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", + "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/inquirer-autocomplete-prompt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-2.0.2.tgz", + "integrity": "sha512-Y7RM1dY3KVg11JnFkaQkTT+2Cgmn9K8De/VtrTT2a5grGIoMfkQuYM5Sss+65oiuqg1h1cTsKHG8pkoPsASdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/inquirer": "^8" + } + }, + "node_modules/@types/inquirer-autocomplete-prompt/node_modules/@types/inquirer": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.12.tgz", + "integrity": "sha512-YxURZF2ZsSjU5TAe06tW0M3sL4UI9AMPA6dd8I72uOtppzNafcY38xkYgCZ/vsVOAyNdzHmvtTpLWilOrbP0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/inquirer-fuzzy-path": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.9.tgz", + "integrity": "sha512-hOzDXaPDENzAioMYM520CCe09GnKQQ417v8wU95YNft0hiaL1sKJVtoyWqOODqD6CTq54b5ddSewuK3LJAvg0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/inquirer": "^8", + "@types/inquirer-autocomplete-prompt": "^2" + } + }, + "node_modules/@types/inquirer-fuzzy-path/node_modules/@types/inquirer": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.12.tgz", + "integrity": "sha512-YxURZF2ZsSjU5TAe06tW0M3sL4UI9AMPA6dd8I72uOtppzNafcY38xkYgCZ/vsVOAyNdzHmvtTpLWilOrbP0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/@types/jsdom": { + "version": "20.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/jsdom/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@types/jsdom/node_modules/parse5": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.9", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.34", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/type-utils": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.4", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4" + }, + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "peer": 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": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "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.1.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@verdaccio/auth": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.24", + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/loaders": "8.0.0-next-8.14", + "@verdaccio/signature": "8.0.0-next-8.16", + "debug": "4.4.3", + "lodash": "4.17.21", + "verdaccio-htpasswd": "13.0.0-next-8.24" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/config": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "debug": "4.4.3", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "minimatch": "7.4.6" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/config/node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "minimatch": "7.4.6", + "process-warning": "1.0.0", + "semver": "7.7.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/core/node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/file-locking": { + "version": "10.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lockfile": "1.0.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/hooks": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/logger": "8.0.0-next-8.24", + "debug": "4.4.3", + "got-cjs": "12.5.4", + "handlebars": "4.7.8" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/loaders": { + "version": "8.0.0-next-8.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "debug": "4.4.3", + "lodash": "4.17.21" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/local-storage-legacy": { + "version": "11.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.21", + "@verdaccio/file-locking": "10.3.1", + "@verdaccio/streams": "10.2.1", + "async": "3.2.6", + "debug": "4.4.1", + "lodash": "4.17.21", + "lowdb": "1.0.0", + "mkdirp": "1.0.4" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/local-storage-legacy/node_modules/@verdaccio/core": { + "version": "8.0.0-next-8.21", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "http-errors": "2.0.0", + "http-status-codes": "2.3.0", + "minimatch": "7.4.6", + "process-warning": "1.0.0", + "semver": "7.7.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/local-storage-legacy/node_modules/debug": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@verdaccio/local-storage-legacy/node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@verdaccio/local-storage-legacy/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@verdaccio/logger": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/logger-commons": "8.0.0-next-8.24", + "pino": "9.13.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/logger-commons": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/logger-prettify": "8.0.0-next-8.4", + "colorette": "2.0.20", + "debug": "4.4.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/logger-prettify": { + "version": "8.0.0-next-8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "2.0.20", + "dayjs": "1.11.13", + "lodash": "4.17.21", + "on-exit-leak-free": "2.1.2", + "pino-abstract-transport": "1.2.0", + "sonic-boom": "3.8.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/middleware": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.24", + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/url": "13.0.0-next-8.24", + "debug": "4.4.3", + "express": "4.21.2", + "express-rate-limit": "5.5.1", + "lodash": "4.17.21", + "lru-cache": "7.18.3", + "mime": "2.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/middleware/node_modules/express-rate-limit": { + "version": "5.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@verdaccio/middleware/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@verdaccio/middleware/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@verdaccio/search-indexer": { + "version": "8.0.0-next-8.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/signature": { + "version": "8.0.0-next-8.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/config": "8.0.0-next-8.24", + "@verdaccio/core": "8.0.0-next-8.24", + "debug": "4.4.3", + "jsonwebtoken": "9.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/streams": { + "version": "10.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/tarball": { + "version": "13.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/url": "13.0.0-next-8.24", + "debug": "4.4.3", + "gunzip-maybe": "1.4.2", + "tar-stream": "3.1.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/tarball/node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@verdaccio/ui-theme": { + "version": "8.0.0-next-8.24", + "dev": true, + "license": "MIT" + }, + "node_modules/@verdaccio/url": { + "version": "13.0.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "debug": "4.4.3", + "lodash": "4.17.21", + "validator": "13.15.15" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/utils": { + "version": "8.1.0-next-8.24", + "dev": true, + "license": "MIT", + "dependencies": { + "@verdaccio/core": "8.0.0-next-8.24", + "lodash": "4.17.21", + "minimatch": "7.4.6" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" + } + }, + "node_modules/@verdaccio/utils/node_modules/minimatch": { + "version": "7.4.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xhmikosr/archive-type": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^20.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/bin-check": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "isexe": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/bin-wrapper": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xhmikosr/bin-check": "^7.1.0", + "@xhmikosr/downloader": "^15.2.0", + "@xhmikosr/os-filter-obj": "^3.0.0", + "bin-version-check": "^5.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/decompress": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xhmikosr/decompress-tar": "^8.1.0", + "@xhmikosr/decompress-tarbz2": "^8.1.0", + "@xhmikosr/decompress-targz": "^8.1.0", + "@xhmikosr/decompress-unzip": "^7.1.0", + "graceful-fs": "^4.2.11", + "strip-dirs": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/decompress-tar": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^20.5.0", + "is-stream": "^2.0.1", + "tar-stream": "^3.1.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/decompress-tar/node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/@xhmikosr/decompress-tarbz2": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xhmikosr/decompress-tar": "^8.0.1", + "file-type": "^20.5.0", + "is-stream": "^2.0.1", + "seek-bzip": "^2.0.0", + "unbzip2-stream": "^1.4.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/decompress-targz": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xhmikosr/decompress-tar": "^8.0.1", + "file-type": "^20.5.0", + "is-stream": "^2.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/decompress-unzip": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "file-type": "^20.5.0", + "get-stream": "^6.0.1", + "yauzl": "^3.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/downloader": { + "version": "15.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xhmikosr/archive-type": "^7.1.0", + "@xhmikosr/decompress": "^10.2.0", + "content-disposition": "^0.5.4", + "defaults": "^2.0.2", + "ext-name": "^5.0.0", + "file-type": "^20.5.0", + "filenamify": "^6.0.0", + "get-stream": "^6.0.1", + "got": "^13.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@xhmikosr/downloader/node_modules/defaults": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@xhmikosr/os-filter-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^3.0.0" + }, + "engines": { + "node": "^14.14.0 || >=16.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "peer": 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-formats": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/angular-eslint": { + "version": "20.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/builder": "20.6.0", + "@angular-eslint/eslint-plugin": "20.6.0", + "@angular-eslint/eslint-plugin-template": "20.6.0", + "@angular-eslint/schematics": "20.6.0", + "@angular-eslint/template-parser": "20.6.0", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/apache-md5": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arch": { + "version": "3.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.22", + "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" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "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", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "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 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.26", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/beasties": { + "version": "0.3.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/beasties/node_modules/css-select": { + "version": "6.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/beasties/node_modules/css-what": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bin-version": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "find-versions": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bin-version-check": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bin-version": "^6.0.0", + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "dev": true, + "license": "MIT/X11" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "dev": true, + "license": "ISC", + "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/chownr": { + "version": "3.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.5.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/pump": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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.30001754", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "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/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/clipanion": { + "version": "4.0.0-rc.4", + "dev": true, + "license": "MIT", + "workspaces": [ + "website" + ], + "dependencies": { + "typanion": "^3.8.0" + }, + "peerDependencies": { + "typanion": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "dev": true, + "license": "MIT", + "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/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.46.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/create-jest/node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/create-jest/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/create-jest/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/create-jest/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/create-jest/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/create-jest/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/create-jest/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "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.3.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "dev": true, + "license": "MIT", + "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/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "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.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/cuint": { + "version": "0.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "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/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.250", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.15.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.25.9", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-playwright": { + "version": "1.8.3", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples" + ], + "dependencies": { + "globals": "^13.23.0" + }, + "engines": { + "node": ">=16.6.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-playwright/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-playwright/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "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", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exit-x": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/expect/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expect/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/expect/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/expect/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "4.21.2", + "dev": true, + "license": "MIT", + "peer": 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-rate-limit": { + "version": "7.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ext-list": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-type": { + "version": "20.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "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-cache-directory": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-directory/node_modules/pkg-dir": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "vue-template-compiler": "*", + "webpack": "^5.11.0" + }, + "peerDependenciesMeta": { + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "peer": 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", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.1.0", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzy": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", + "integrity": "sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "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/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "12.2.0", + "dev": true, + "license": "MIT", + "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/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "13.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got-cjs": { + "version": "12.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "4.6.0", + "@szmarczak/http-timer": "4.0.6", + "@types/responselike": "1.0.0", + "cacheable-lookup": "6.1.0", + "cacheable-request": "7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "2.0.0", + "p-cancelable": "2.1.1", + "responselike": "2.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/got/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/got/node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/got/node_modules/cacheable-request": { + "version": "10.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/got/node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/got/node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/normalize-url": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/got/node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.2", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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/http-server/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/http-signature": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.18.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/injection-js": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", + "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", + "license": "ISC", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "figures": "^3.2.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/inquirer-fuzzy-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz", + "integrity": "sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "fuzzy": "^0.1.3", + "inquirer": "^6.0.0", + "inquirer-autocomplete-prompt": "^1.0.2", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-fuzzy-path/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-fuzzy-path/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-fuzzy-path/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/inquirer-prompt-suggest": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/inquirer-prompt-suggest/-/inquirer-prompt-suggest-0.1.0.tgz", + "integrity": "sha512-RC5XKDeBSsf0nBOQ380NloJcI+WTbGNo049aJsXRZXxxnRDCL5PqvftIe81zUPSUqF8hI0UxR+v77L74xJB40w==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "inquirer": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "license": "MIT" + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-prompt-suggest/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "license": "MIT", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-prompt-suggest/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "license": "Apache-2.0", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-prompt-suggest/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/inquirer-search-list": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", + "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", + "license": "MIT", + "dependencies": { + "chalk": "^2.3.0", + "figures": "^2.0.0", + "fuzzy": "^0.1.3", + "inquirer": "^3.3.0" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "license": "MIT" + }, + "node_modules/inquirer-search-list/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-search-list/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer-search-list/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/inquirer-search-list/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer-search-list/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "license": "MIT", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/inquirer-search-list/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer-search-list/node_modules/inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer-search-list/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" + }, + "node_modules/inquirer-search-list/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" } }, "node_modules/inquirer-search-list/node_modules/string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-search-list/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/inquirer/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/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==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "license": "ISC" + }, + "node_modules/inquirer/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==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inspect-with-kind": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "kind-of": "^6.0.2" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "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-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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-interactive": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/iso639-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", + "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "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", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "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.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "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-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/globals": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/source-map": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/cjs-module-lexer": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-runtime": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "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-cli/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest-cli/node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-cli/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "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/jest-cli/node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "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/jest-cli/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-cli/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-cli/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-cli/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-cli/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-cli/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-cli/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-config": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/@jest/globals": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/@jest/source-map": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/cjs-module-lexer": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-environment-node": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-leak-detector": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-runner": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-runtime": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-watcher": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config/node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-config/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-jsdom/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-jsdom/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-jsdom/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-jsdom/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-environment-jsdom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-node/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-node/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-node/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-environment-node/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-environment-node/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-preset-angular": { + "version": "14.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "esbuild-wasm": ">=0.15.13", + "jest-environment-jsdom": "^29.7.0", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0", + "ts-jest": "^29.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "optionalDependencies": { + "esbuild": ">=0.15.13" + }, + "peerDependencies": { + "@angular/compiler-cli": ">=15.0.0 <21.0.0", + "@angular/core": ">=15.0.0 <21.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0 <21.0.0", + "jest": "^29.0.0", + "jsdom": ">=20.0.0", + "typescript": ">=4.8" + }, + "peerDependenciesMeta": { + "jsdom": { + "optional": true + } + } + }, + "node_modules/jest-preset-angular/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-preset-angular/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/ci-info": { + "version": "4.3.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest-runner/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runner/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-runner/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-runner/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runner/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/jest-runtime/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-runtime/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-runtime/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-runtime/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-snapshot/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-snapshot/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-snapshot/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-watcher/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-watcher/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-watcher/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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-watcher/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/jest-watcher/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "20.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.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.2", + "parse5": "^7.1.1", + "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": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.8", + "content-disposition": "~0.5.4", + "content-type": "^1.0.5", + "cookies": "~0.9.1", + "delegates": "^1.0.0", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.5.0", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/koa/node_modules/media-typer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/mime-db": { + "version": "1.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/mime-types": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/type-is": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/langs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", + "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==", + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/less": { + "version": "4.4.2", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/listr2": { + "version": "9.0.1", + "dev": true, + "license": "MIT", + "peer": 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": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "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/listr2/node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "dev": true, + "license": "MIT", + "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.4.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locale-codes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", + "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "license": "MIT", + "dependencies": { + "iso639-codes": "^1.0.1", + "langs": "^2.0.0", + "windows-locale": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lockfile": { + "version": "1.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "signal-exit": "^3.0.2" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "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.2.0", + "dev": true, + "license": "MIT", + "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.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "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/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "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/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lowdb": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lowdb/node_modules/is-promise": { + "version": "2.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lowdb/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.4.7", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.5", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/n3": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.17.2.tgz", + "integrity": "sha512-BxSM52wYFqXrbQQT5WUEzKUn6qpYV+2L4XZLfn3Gblz2kwZ09S+QxC33WNdVEQy2djenFL8SNkrjejEKlvI6+Q==", + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.1.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/n3/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/n3/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ng-mocks": { + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/ng-mocks/-/ng-mocks-14.14.0.tgz", + "integrity": "sha512-ixx3ch5dzjDpp6QdxHPfOOBE/8foInkVxMi/dO6/DWm/LoZbzxsUNu93bwcedaCZEMkHdwXk+gTPQZ1rXMPAMw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/help-me-mom" + }, + "peerDependencies": { + "@angular/common": "5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20", + "@angular/core": "5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20", + "@angular/forms": "5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20", + "@angular/platform-browser": "5.0.0-alpha - 5 || 6.0.0-alpha - 6 || 7.0.0-alpha - 7 || 8.0.0-alpha - 8 || 9.0.0-alpha - 9 || 10.0.0-alpha - 10 || 11.0.0-alpha - 11 || 12.0.0-alpha - 12 || 13.0.0-alpha - 13 || 14.0.0-alpha - 14 || 15.0.0-alpha - 15 || 16.0.0-alpha - 16 || 17.0.0-alpha - 17 || 18.0.0-alpha - 18 || 19.0.0-alpha - 19 || 20.0.0-alpha - 20" + } + }, + "node_modules/ng-packagr": { + "version": "20.3.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@rollup/plugin-json": "^6.1.0", + "@rollup/wasm-node": "^4.24.0", + "ajv": "^8.17.1", + "ansi-colors": "^4.1.3", + "browserslist": "^4.22.1", + "chokidar": "^4.0.1", + "commander": "^14.0.0", + "dependency-graph": "^1.0.0", + "esbuild": "^0.25.0", + "find-cache-directory": "^6.0.0", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.3.1", + "less": "^4.2.0", + "ora": "^8.2.0", + "piscina": "^5.0.0", + "postcss": "^8.4.47", + "rollup-plugin-dts": "^6.2.0", + "rxjs": "^7.8.1", + "sass": "^1.81.0", + "tinyglobby": "^0.2.12" + }, + "bin": { + "ng-packagr": "src/cli/main.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "optionalDependencies": { + "rollup": "^4.24.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^20.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/ng-packagr/node_modules/commander": { + "version": "14.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "11.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "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", + "tinyglobby": "^0.2.12", + "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", + "dev": true, + "license": "MIT", + "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-build-optional-packages/node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "7.5.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "dev": true, + "license": "ISC", + "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-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "dev": true, + "license": "ISC", + "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-registry-fetch": { + "version": "18.0.2", + "dev": true, + "license": "ISC", + "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-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "dev": true, + "license": "ISC", + "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-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.22", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "22.0.3", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": 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.12.0", + "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": "^7.0.5", + "jest-diff": "^30.0.2", + "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.6.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "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": "22.0.3", + "@nx/nx-darwin-x64": "22.0.3", + "@nx/nx-freebsd-x64": "22.0.3", + "@nx/nx-linux-arm-gnueabihf": "22.0.3", + "@nx/nx-linux-arm64-gnu": "22.0.3", + "@nx/nx-linux-arm64-musl": "22.0.3", + "@nx/nx-linux-x64-gnu": "22.0.3", + "@nx/nx-linux-x64-musl": "22.0.3", + "@nx/nx-win32-arm64-msvc": "22.0.3", + "@nx/nx-win32-x64-msvc": "22.0.3" + }, + "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/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/nx/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/nx/node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "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/yaml": { + "version": "2.8.1", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "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": "8.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/cli-spinners": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/onetime": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "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/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "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-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "21.0.0", + "dev": true, + "license": "ISC", + "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": "^10.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": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "dev": true, + "license": "ISC", + "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/pako": { + "version": "0.2.9", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/path/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pino": { + "version": "9.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "slow-redact": "^0.3.0", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pino/node_modules/pino-abstract-transport": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino/node_modules/process-warning": { + "version": "5.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/pino/node_modules/sonic-boom": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/piscina": { + "version": "5.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/playwright": { + "version": "1.56.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.56.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.56.1", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "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.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^2.5.1", + "semver": "^7.6.2" + }, + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "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.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "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.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-url": { + "version": "10.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-url/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/postcss-url/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-url/node_modules/mime": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-url/node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/postcss-url/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/psl": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rambda": { + "version": "9.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/replace-in-file": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.2.0.tgz", + "integrity": "sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "glob": "^8.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/replace-in-file/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/replace-in-file/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/inquirer-search-list/node_modules/strip-ansi": { + "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "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": ">=4" + "node": ">=12" } }, - "node_modules/inquirer-search-list/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/is-arguments": { + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.52.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "6.2.3", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.27.1" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rslog": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6041,2940 +27200,3071 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/safe-stable-stringify": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.94.0", + "dev": true, + "license": "MIT", + "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-embedded": { + "version": "1.93.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.93.3", + "sass-embedded-android-arm": "1.93.3", + "sass-embedded-android-arm64": "1.93.3", + "sass-embedded-android-riscv64": "1.93.3", + "sass-embedded-android-x64": "1.93.3", + "sass-embedded-darwin-arm64": "1.93.3", + "sass-embedded-darwin-x64": "1.93.3", + "sass-embedded-linux-arm": "1.93.3", + "sass-embedded-linux-arm64": "1.93.3", + "sass-embedded-linux-musl-arm": "1.93.3", + "sass-embedded-linux-musl-arm64": "1.93.3", + "sass-embedded-linux-musl-riscv64": "1.93.3", + "sass-embedded-linux-musl-x64": "1.93.3", + "sass-embedded-linux-riscv64": "1.93.3", + "sass-embedded-linux-x64": "1.93.3", + "sass-embedded-unknown-all": "1.93.3", + "sass-embedded-win32-arm64": "1.93.3", + "sass-embedded-win32-x64": "1.93.3" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.93.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "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==", + "node_modules/sass-loader": { + "version": "16.0.6", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "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/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/sax": { + "version": "1.4.3", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "BlueOak-1.0.0", + "optional": true }, - "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==", + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, "engines": { - "node": ">=8" + "node": ">=v12.22.7" } }, - "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==", + "node_modules/scheduler": { + "version": "0.27.0", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "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==", + "node_modules/schema-utils": { + "version": "4.3.3", + "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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==", - "engines": { - "node": ">=8" - } + "node_modules/secure-compare": { + "version": "3.0.1", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/seek-bzip": { + "version": "2.0.0", "dev": true, - "engines": { - "node": ">=0.12.0" + "license": "MIT", + "dependencies": { + "commander": "^6.0.0" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" } }, - "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==", + "node_modules/seek-bzip/node_modules/commander": { + "version": "6.2.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "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==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "node_modules/semver": { + "version": "7.7.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "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==", + "node_modules/semver-regex": { + "version": "4.0.5", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/semver-truncate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" + "semver": "^7.3.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/iso639-codes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/iso639-codes/-/iso639-codes-1.0.1.tgz", - "integrity": "sha512-jdTSv8yn6D7GODDrRtuWG7y3du3aoa+ki5H8h/Y48/NleNAd7Fw/M2niTTLXGH4QnqhJ98hg1JMQtP9csQ31Lg==", - "engines": { - "node": ">=8" - } - }, - "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==", + "node_modules/send": { + "version": "0.19.0", "dev": true, + "license": "MIT", "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" + "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": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "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==", + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "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==", + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "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==", + "node_modules/serialize-javascript": { + "version": "6.0.2", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.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==", + "node_modules/serve-index": { + "version": "1.9.1", "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "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": ">=8" + "node": ">= 0.8.0" } }, - "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==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "ms": "2.0.0" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, + "license": "MIT", "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": ">= 0.6" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", "dev": true, + "license": "MIT", "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.6" } }, - "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==", + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", "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" - }, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/serve-static": { + "version": "1.16.2", "dev": true, + "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "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": ">= 0.8.0" } }, - "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, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "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" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "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": ">= 0.4" } }, - "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==", + "node_modules/setprototypeof": { + "version": "1.2.0", "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "kind-of": "^6.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "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==", + "node_modules/shebang-command": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "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==", + "node_modules/shebang-regex": { + "version": "3.0.0", "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" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "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==", + "node_modules/shell-quote": { + "version": "1.8.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", "dev": true, + "license": "MIT", "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" + "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": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/side-channel-list": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/side-channel-map": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "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": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sigstore": { + "version": "3.1.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/slice-ansi": { + "version": "5.0.0", "dev": true, + "license": "MIT", "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" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "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==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">=12" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/slow-redact": { + "version": "0.3.2", "dev": true, + "license": "MIT" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 6.0.0", + "npm": ">= 3.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==", + "node_modules/sockjs": { + "version": "0.3.24", "dev": true, + "license": "MIT", "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" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "node_modules/socks": { + "version": "2.8.7", "dev": true, + "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 10.0.0", + "npm": ">= 3.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==", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", "dev": true, + "license": "MIT", "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" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 14" } }, - "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==", + "node_modules/sonic-boom": { + "version": "3.8.1", "dev": true, + "license": "MIT", "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" + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.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==", + "node_modules/sort-keys-length": { + "version": "1.0.1", "dev": true, + "license": "MIT", "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" + "sort-keys": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/jest-stare": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jest-stare/-/jest-stare-2.5.2.tgz", - "integrity": "sha512-dvxHXOsiJlvBi0n2dK9pz6RWFTdPB6njc2ZoMpyjmWI+aIL+X1W8OW5mTm1pkv/quy2ocKO/G+GsTe7Bv07xkQ==", + "node_modules/sorted-array-functions": { + "version": "1.3.0", "dev": true, - "dependencies": { - "@jest/reporters": "^29.0.0", - "@jest/test-result": "^29.0.0", - "@jest/types": "^29.0.0", - "@types/jest": "^29.0.0", - "ansi-parser": "^3.2.10", - "bootstrap": "^5.0.0", - "chalk": "^4.1.0", - "chart.js": "^4.1.2", - "diff2html": "^3.4.40", - "holderjs": "^2.9.7", - "jquery": "^3.5.1", - "moment": "^2.27.0", - "mustache": "^4.0.0", - "pkg-up": "^3.0.0", - "popper.js": "^1.16.1", - "yargs": "^17.0.0" - }, - "bin": { - "jest-stare": "lib/jest-stare.js" - }, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.6", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=6.0.0" + "node": ">= 12" } }, - "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==", + "node_modules/source-map-js": { + "version": "1.2.1", "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" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.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==", + "node_modules/source-map-loader": { + "version": "5.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, "engines": { - "node": ">=8.6" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" } }, - "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==", + "node_modules/source-map-support": { + "version": "0.5.19", "dev": true, + "license": "MIT", "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" + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "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==", + "node_modules/spdx-correct": { + "version": "3.2.0", "dev": true, + "license": "Apache-2.0", "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" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.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==", + "node_modules/spdy-transport": { + "version": "3.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "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/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==", + "node_modules/split2": { + "version": "4.2.0", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 10.x" } }, - "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "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/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" }, - "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==", + "node_modules/sshpk": { + "version": "1.18.0", + "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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" + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "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": "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/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==" - }, - "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==", + "node_modules/ssri": { + "version": "12.0.0", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" }, "engines": { - "node": ">=6" + "node": "^18.17.0 || >=20.5.0" } }, - "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==" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "universalify": "^2.0.0" + "escape-string-regexp": "^2.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", "dev": true, - "dependencies": { - "json-buffer": "3.0.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/stackframe": { + "version": "1.3.4", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/langs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/langs/-/langs-2.0.0.tgz", - "integrity": "sha512-v4pxOBEQVN1WBTfB1crhTtxzNLZU9HPWgadlwzWKISJtt6Ku/CnpBrwVy+jFv8StjxsPfwPFzO0CMwdZLJ0/BA==" - }, - "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==", + "node_modules/stdin-discarder": { + "version": "0.2.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/steno": { + "version": "0.4.4", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "graceful-fs": "^4.1.3" } }, - "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/stream-shift": { + "version": "1.0.3", + "dev": true, + "license": "MIT" }, - "node_modules/locale-codes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/locale-codes/-/locale-codes-1.3.1.tgz", - "integrity": "sha512-C7fxGkU4jAuHqavtKj4IhSD2yPEzChFMRfNHjzwIAz9JTbYHtBJDcQQgmJDezBogk9/vvgS7chKMhpVEKavk5A==", + "node_modules/streamroller": { + "version": "3.1.5", + "dev": true, + "license": "MIT", "dependencies": { - "iso639-codes": "^1.0.1", - "langs": "^2.0.0", - "windows-locale": "^1.1.0" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { - "node": ">=8" + "node": ">=8.0" } }, - "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==", + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6 <7 || >=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "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.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==", + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "peer": 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 + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "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==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "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==", + "node_modules/streamx": { + "version": "2.23.0", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "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==", + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "safe-buffer": "~5.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==", + "node_modules/string-length": { + "version": "4.0.2", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "dev": true, + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "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/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/strip-bom": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/strip-dirs": { + "version": "3.0.0", "dev": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" + "inspect-with-kind": "^1.0.5", + "is-plain-obj": "^1.1.0" } }, - "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==", + "node_modules/strip-dirs/node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=0.10.0" } }, - "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==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "node_modules/strtok3": { + "version": "10.3.4", "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "node_modules/style-loader": { + "version": "3.3.4", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "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==", - "dev": true - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "node_modules/stylehacks": { + "version": "6.1.1", "dev": true, - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/n3": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.17.2.tgz", - "integrity": "sha512-BxSM52wYFqXrbQQT5WUEzKUn6qpYV+2L4XZLfn3Gblz2kwZ09S+QxC33WNdVEQy2djenFL8SNkrjejEKlvI6+Q==", + "license": "MIT", "dependencies": { - "queue-microtask": "^1.1.2", - "readable-stream": "^4.0.0" + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": ">=12.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "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/ngx-i18n-combine": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ngx-i18n-combine/-/ngx-i18n-combine-1.2.0.tgz", - "integrity": "sha512-0A15+uyeBovFbm6MpD76UpRBgFL3dH5JOlaT7QvUeVHNyqGwQHzJsczgTbwUkRKde5ALgtQwnlKAkq2uzkmp9A==", + "node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", - "peer": true, "dependencies": { - "app-root-path": "^3.0.0", - "glob": "7.2.0", - "picocolors": "^1.0.0", - "sort-keys": "^4.2.0", - "yargs": "17.3.1" - }, - "bin": { - "ngx-i18n-combine": "bin/cli.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10.12.0" + "node": ">=8" } }, - "node_modules/ngx-i18n-combine/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==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/ngx-i18n-combine/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ngx-i18n-combine/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, + "node_modules/svgo": { + "version": "3.3.2", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@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": "*" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, - "node_modules/ngx-i18n-combine/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 10" } }, - "node_modules/ngx-i18n-combine/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", "license": "MIT", - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "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.0.0" - }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "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-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/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "node_modules/sync-child-process": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "sync-message-port": "^1.0.0" }, "engines": { - "node": "*" + "node": ">=16.0.0" } }, - "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==", + "node_modules/sync-message-port": { + "version": "1.1.3", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=16.0.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==", + "node_modules/synckit": { + "version": "0.11.11", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, - "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==", + "node_modules/tapable": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "dev": true, + "license": "ISC", "dependencies": { - "wrappy": "1" + "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/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", "dev": true, + "license": "ISC", "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" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8" } }, - "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==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", "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" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "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==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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==", + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "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==", + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", "dev": true, + "license": "ISC", "dependencies": { - "p-limit": "^3.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "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==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "BlueOak-1.0.0", - "peer": true + "license": "ISC" }, - "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==", + "node_modules/terser": { + "version": "5.44.1", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "callsites": "^3.0.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "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==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@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": ">=8" + "node": ">= 10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "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==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "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==", + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", "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==", + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { "node": ">=8" } }, - "node_modules/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/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "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==", - "license": "BlueOak-1.0.0", - "peer": true, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "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": ">=16 || 14 >=14.18" + "node": "*" }, "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==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, "license": "ISC", - "peer": true + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "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==", + "node_modules/text-decoder": { + "version": "1.2.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thingies": { + "version": "2.5.0", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "node_modules/thread-stream": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } }, - "node_modules/path/node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "node_modules/through": { + "version": "2.3.8", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "2.0.3" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/picocolors": { + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/tldts": { + "version": "6.1.86", "dev": true, - "engines": { - "node": ">= 6" + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/tldts-core": { + "version": "6.1.86", "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.5", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.14" } }, - "node_modules/pkg-dir/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==", + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=8.0" } }, - "node_modules/pkg-dir/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==", + "node_modules/toidentifier": { + "version": "1.0.1", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/pkg-dir/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==", + "node_modules/token-types": { + "version": "6.1.1", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@borewit/text-codec": "^0.1.0", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" }, "engines": { - "node": ">=6" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/pkg-dir/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==", + "node_modules/tough-cookie": { + "version": "4.1.4", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "p-limit": "^2.2.0" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/tr46": { + "version": "0.0.3", "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, + "license": "MIT" + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/tree-kill": { + "version": "1.2.2", "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "license": "MIT", + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/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==", + "node_modules/ts-api-utils": { + "version": "2.1.0", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/ts-checker-rspack-plugin": { + "version": "1.2.0", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "@babel/code-frame": "^7.27.1", + "@rspack/lite-tapable": "^1.0.1", + "chokidar": "^3.6.0", + "is-glob": "^4.0.3", + "memfs": "^4.50.0", + "minimatch": "^9.0.5", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@rspack/core": "^1.0.0", + "typescript": ">=3.8.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + } } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/ts-checker-rspack-plugin/node_modules/chokidar": { + "version": "3.6.0", "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=4" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { + "version": "4.50.0", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "engines": { - "node": ">= 0.4" + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "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==", + "node_modules/ts-checker-rspack-plugin/node_modules/minimatch": { + "version": "9.0.5", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" - }, + "node_modules/ts-checker-rspack-plugin/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "node_modules/ts-checker-rspack-plugin/node_modules/readdirp": { + "version": "3.6.0", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8.10.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==", + "node_modules/ts-jest": { + "version": "29.4.5", "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.6.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/ts-loader": { + "version": "9.5.4", "dev": true, + "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { - "node": ">= 6" + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "node_modules/ts-node": { + "version": "10.9.1", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "license": "MIT", + "peer": 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 }, - { - "type": "consulting", - "url": "https://feross.org/support" + "@swc/wasm": { + "optional": true } - ] - }, - "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/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" } }, - "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==", + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.2.0", "dev": true, + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tapable": "^2.2.1", + "tsconfig-paths": "^4.1.2" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "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==", + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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/tslib": { + "version": "2.8.1", + "license": "0BSD", + "peer": 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==", + "node_modules/tsscmp": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tuf-js": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "jsesc": "~3.0.2" + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" }, - "bin": { - "regjsparser": "bin/parser" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "node_modules/tunnel-agent": { + "version": "0.6.0", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/replace-in-file": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.2.0.tgz", - "integrity": "sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg==", + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "node_modules/typanion": { + "version": "3.14.0", + "dev": true, + "license": "MIT", + "workspaces": [ + "website" + ] + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "chalk": "^4.1.2", - "glob": "^8.1.0", - "yargs": "^17.7.2" - }, - "bin": { - "replace-in-file": "bin/cli.js" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/replace-in-file/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/replace-in-file/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "peer": true, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=10" + "node": ">= 0.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/typed-assert": { + "version": "1.0.9", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/typescript": { + "version": "5.9.3", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.17" } }, - "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==", + "node_modules/typescript-eslint": { + "version": "8.46.4", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@typescript-eslint/eslint-plugin": "8.46.4", + "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4" + }, + "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 <6.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, "bin": { - "resolve": "bin/resolve" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">= 0.4" + "node": ">=0.8.0" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/unbzip2-stream": { + "version": "1.4.3", "dev": true, + "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" - }, + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/resolve-cwd/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==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "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==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "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==", + "node_modules/union": { + "version": "0.5.0", + "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "qs": "^6.4.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/unique-filename": { + "version": "4.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "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", + "node_modules/unique-slug": { + "version": "5.0.0", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "imurmurhash": "^0.1.4" }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unix-crypt-td-js": { + "version": "1.1.4", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=4", + "yarn": "*" } }, - "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==", + "node_modules/update-browserslist-db": { + "version": "1.1.4", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } }, - "node_modules/rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "node_modules/url-join": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", "dependencies": { - "rx-lite": "*" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/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==", - "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/util-deprecate": { + "version": "1.0.2", + "license": "MIT" }, - "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==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/uuid": { + "version": "8.3.2", "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "uuid": "dist/bin/uuid" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", "dependencies": { - "shebang-regex": "^3.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10.12.0" } }, - "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==", - "engines": { - "node": ">=8" + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/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==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/validate-npm-package-name": { + "version": "6.0.2", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/sort-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", - "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "node_modules/validator": { + "version": "13.15.15", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "is-plain-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "engines": { - "node": ">= 8" + "node": ">= 0.10" } }, - "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==", + "node_modules/varint": { + "version": "6.0.0", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "license": "MIT" }, - "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==", + "node_modules/vary": { + "version": "1.1.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "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/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/verdaccio": { + "version": "6.2.1", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "escape-string-regexp": "^2.0.0" + "@cypress/request": "3.0.9", + "@verdaccio/auth": "8.0.0-next-8.24", + "@verdaccio/config": "8.0.0-next-8.24", + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/hooks": "8.0.0-next-8.24", + "@verdaccio/loaders": "8.0.0-next-8.14", + "@verdaccio/local-storage-legacy": "11.1.1", + "@verdaccio/logger": "8.0.0-next-8.24", + "@verdaccio/middleware": "8.0.0-next-8.24", + "@verdaccio/search-indexer": "8.0.0-next-8.5", + "@verdaccio/signature": "8.0.0-next-8.16", + "@verdaccio/streams": "10.2.1", + "@verdaccio/tarball": "13.0.0-next-8.24", + "@verdaccio/ui-theme": "8.0.0-next-8.24", + "@verdaccio/url": "13.0.0-next-8.24", + "@verdaccio/utils": "8.1.0-next-8.24", + "async": "3.2.6", + "clipanion": "4.0.0-rc.4", + "compression": "1.8.1", + "cors": "2.8.5", + "debug": "4.4.3", + "envinfo": "7.15.0", + "express": "4.21.2", + "JSONStream": "1.3.5", + "lodash": "4.17.21", + "lru-cache": "7.18.3", + "mime": "3.0.0", + "semver": "7.7.2", + "verdaccio-audit": "13.0.0-next-8.24", + "verdaccio-htpasswd": "13.0.0-next-8.24" + }, + "bin": { + "verdaccio": "bin/verdaccio" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "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==", + "node_modules/verdaccio-audit": { + "version": "13.0.0-next-8.24", "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", + "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "@verdaccio/config": "8.0.0-next-8.24", + "@verdaccio/core": "8.0.0-next-8.24", + "express": "4.21.2", + "https-proxy-agent": "5.0.1", + "node-fetch": "cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "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==", + "node_modules/verdaccio-audit/node_modules/agent-base": { + "version": "6.0.2", "dev": true, + "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 6.0.0" } }, - "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==", + "node_modules/verdaccio-audit/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "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==", + "node_modules/verdaccio-audit/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "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==", + "node_modules/verdaccio-htpasswd": { + "version": "13.0.0-next-8.24", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@verdaccio/core": "8.0.0-next-8.24", + "@verdaccio/file-locking": "13.0.0-next-8.6", + "apache-md5": "1.1.8", + "bcryptjs": "2.4.3", + "debug": "4.4.3", + "http-errors": "2.0.0", + "unix-crypt-td-js": "1.1.4" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "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==", + "node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": { + "version": "13.0.0-next-8.6", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "lockfile": "1.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio" } }, - "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==", + "node_modules/verdaccio/node_modules/lru-cache": { + "version": "7.18.3", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==", + "node_modules/verdaccio/node_modules/mime": { + "version": "3.0.0", "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "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==", + "node_modules/verdaccio/node_modules/semver": { + "version": "7.7.2", "dev": true, - "engines": { - "node": ">=8" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/verror": { + "version": "1.10.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "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==", + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">= 0.4" + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14" } }, - "node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "engines": { - "node": ">=0.10.0" + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" } }, - "node_modules/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==", + "node_modules/watchpack": { + "version": "2.4.4", "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/test-exclude/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==", + "node_modules/wbuf": { + "version": "1.7.3", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/test-exclude/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, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "defaults": "^1.0.3" } }, - "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/weak-lru-cache": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "optional": true }, - "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/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/webpack": { + "version": "5.102.1", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "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": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=0.6.0" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "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==", + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">=8.0" + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.50.0", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.12" + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, - "peerDependencies": { - "typescript": ">=4.8.4" + "engines": { + "node": ">= 0.6" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/webpack-dev-server": { + "version": "5.2.2", "dev": true, + "license": "MIT", + "peer": 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" + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^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.9", + "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": { - "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" + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "@swc/core": { + "webpack": { "optional": true }, - "@swc/wasm": { + "webpack-cli": { "optional": true } } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "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/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@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": ">= 0.8.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "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==", + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 10" } }, - "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==", + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - }, - "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==", + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", "dev": true, + "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=4" + "node": ">=8.10.0" } }, - "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==", + "node_modules/webpack-merge": { + "version": "5.10.0", "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "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==", + "node_modules/webpack-node-externals": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/webpack-sources": { + "version": "3.3.3", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 10.0.0" + "node": ">=10.13.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "typed-assert": "^1.0.8" }, - "bin": { - "update-browserslist-db": "cli.js" + "engines": { + "node": ">= 12" }, "peerDependencies": { - "browserslist": ">= 4.21.0" + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "punycode": "^2.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "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==" + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/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/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } }, - "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==", + "node_modules/whatwg-encoding": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "iconv-lite": "0.6.3" }, "engines": { - "node": ">=10.12.0" + "node": ">=12" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/whatwg-mimetype": { + "version": "3.0.0", "dev": true, - "dependencies": { - "makeerror": "1.0.12" + "license": "MIT", + "engines": { + "node": ">=12" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "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, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8989,6 +30279,7 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -9005,27 +30296,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, "node_modules/windows-locale": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.1.3.tgz", "integrity": "sha512-0OlMOPNGj7GTB6C7WmqS3o4eydjnoYj0uwot2KJf7E0JUucwYwzkcvCWQwnuOV60WqDMeGJpSankgveNMj5r0g==", + "license": "MIT", "engines": { "node": ">=v10.24.1" } }, "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, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9041,10 +30341,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, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9059,40 +30357,135 @@ }, "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==" + "dev": true, + "license": "ISC" }, "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==", + "version": "5.0.1", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "peer": true, + "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/wsl-utils": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", "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 + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9108,26 +30501,36 @@ }, "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "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, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9135,10 +30538,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, "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==", + "version": "0.15.1", "license": "MIT", "peer": true } diff --git a/package.json b/package.json index cda82cf1..c3c9460e 100644 --- a/package.json +++ b/package.json @@ -1,78 +1,95 @@ { "name": "@esmf/semantic-ui-schematics", - "version": "", + "version": "0.0.1", "description": "Official ESMF schematic for the Angular CLI to leverage Aspect models for generating Angular components.", - "scripts": { - "build": "tsc -p tsconfig.json", - "build-watch": "tsc -p tsconfig.json --watch", - "prettier": "prettier --config .prettierrc --write './src/**/*{.ts,.js,.json}'", - "test": "jest --reporters default jest-stare", - "test:prettier": "prettier --config .prettierrc --list-different './src/**/*{.ts,.js,.json}'", - "test:coverage": "jest --coverage --reporters default jest-stare", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix" - }, + "license": "mpl-2.0", "keywords": [ "schematic" ], - "files": [ - "src/**", - ".prettierrc" - ], - "author": "", - "license": "mpl-2.0", - "schematics": "./src/collection.json", + "scripts": { + "ng": "nx", + "start": "nx serve demo", + "build": "nx build demo", + "test": "nx test demo", + "lint": "nx lint demo", + "e2e": "nx run demo:e2e" + }, "dependencies": { - "@angular-devkit/core": "19.2.8", - "@angular-devkit/schematics": "19.2.8", + "@angular/common": "~20.3.0", + "@angular/compiler": "~20.3.0", + "@angular/core": "~20.3.0", + "@angular/forms": "~20.3.0", + "@angular/material": "~20.2.0", + "@angular/platform-browser": "~20.3.0", + "@angular/platform-browser-dynamic": "~20.3.0", + "@angular/router": "~20.3.0", "@esmf/aspect-model-loader": "https://github.com/eclipse-esmf/esmf-sdk-js-aspect-model-loader/releases/download/v2.3.3/esmf-aspect-model-loader-2.3.3.tgz", - "@schematics/angular": "19.2.8", - "@types/cli-spinner": "^0.2.3", - "cli-spinner": "^0.2.10", - "fs": "0.0.1-security", + "@nx/devkit": "22.0.4", + "@jsverse/transloco": "^8.2.0", + "@jsverse/transloco-locale": "^8.2.0", "inquirer": "8.2.5", "inquirer-fuzzy-path": "2.3.0", "inquirer-prompt-suggest": "0.1.0", "inquirer-search-list": "^1.2.6", - "ora": "^5.4.1", "path": "^0.12.7", - "prettier": "2.8.8", - "rxjs": "7.x", - "typescript": "5.8.3" + "rxjs": "~7.8.0", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular/cdk": "19.2.14", - "@babel/core": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/preset-typescript": "7.27.0", - "@types/inquirer": "^9.0.7", - "@types/inquirer-fuzzy-path": "2.3.9", - "@types/jest": "29.5.14", - "@types/node": "^22.15.3", - "@types/prettier": "^2.7.3", - "@typescript-eslint/eslint-plugin": "8.31.1", - "@typescript-eslint/parser": "8.31.1", - "eslint": "8.57.0", - "jest": "29.7.0", - "jest-stare": "2.5.2", - "locale-codes": "^1.3.1", - "ts-node": "10.9.2" - }, - "peerDependencies": { - "@angular/animations": "19.x", - "@angular/common": "19.x", - "@angular/forms": "19.x", - "@angular/material": "19.x", - "@angular/platform-browser": "19.x", - "@angular/platform-browser-dynamic": "19.x", - "@jsverse/transloco": "7.x", - "ngx-i18n-combine": "1.x", - "rxjs": "7.x" + "@angular-devkit/build-angular": "~20.3.0", + "@angular-devkit/core": "~20.3.0", + "@angular-devkit/schematics": "~20.3.0", + "@angular/cli": "~20.3.0", + "@angular/compiler-cli": "~20.3.0", + "@angular/language-service": "~20.3.0", + "@eslint/js": "^9.8.0", + "@nx/angular": "22.0.3", + "@nx/devkit": "22.0.4", + "@nx/eslint": "22.0.3", + "@nx/eslint-plugin": "22.0.3", + "@nx/jest": "22.0.4", + "@nx/js": "22.0.4", + "@nx/playwright": "22.0.3", + "@nx/plugin": "^22.0.4", + "@nx/web": "22.0.3", + "@nx/workspace": "22.0.3", + "@playwright/test": "^1.36.0", + "@schematics/angular": "~20.3.0", + "@swc-node/register": "~1.9.1", + "@swc/cli": "~0.6.0", + "@swc/core": "~1.5.7", + "@swc/helpers": "~0.5.11", + "@types/inquirer": "^9.0.9", + "@types/inquirer-fuzzy-path": "^2.3.9", + "@types/jest": "^29.5.12", + "@types/node": "20.19.9", + "@typescript-eslint/utils": "^8.40.0", + "angular-eslint": "^20.3.0", + "autoprefixer": "^10.4.0", + "eslint": "^9.8.0", + "eslint-config-prettier": "^10.0.0", + "eslint-plugin-playwright": "^1.6.2", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-preset-angular": "~14.6.1", + "jest-util": "^29.7.0", + "jsonc-eslint-parser": "^2.1.0", + "ng-mocks": "^14.13.2", + "ng-packagr": "~20.3.0", + "nx": "22.0.3", + "postcss": "^8.4.5", + "postcss-url": "~10.1.3", + "prettier": "^2.6.2", + "ts-jest": "^29.1.0", + "ts-node": "10.9.1", + "tslib": "^2.3.0", + "typescript": "~5.9.2", + "typescript-eslint": "^8.40.0", + "verdaccio": "^6.0.5" }, - "engines": { - "node": ">=18.13.0" + "nx": { + "includedScripts": [] }, - "ng-add": { - "save": "devDependencies" - } + "generators": "./generators.json" } diff --git a/project.json b/project.json new file mode 100644 index 00000000..9ecdb611 --- /dev/null +++ b/project.json @@ -0,0 +1,15 @@ +{ + "name": "@org/source", + "$schema": "node_modules/nx/schemas/project-schema.json", + "includedScripts": [], + "targets": { + "local-registry": { + "executor": "@nx/js:verdaccio", + "options": { + "port": 4873, + "config": ".verdaccio/config.yml", + "storage": "tmp/local-registry/storage" + } + } + } +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..87a9bd1e --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,22 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "module": "esnext", + "lib": ["es2020", "dom"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "baseUrl": ".", + "paths": { + "@esmf/semantic-ui-schematic": ["libs/schematic/src/index.ts"] + } + }, + "exclude": ["node_modules", "tmp"] +}