diff --git a/.env.template b/.env.template index 00209f3..896ef9c 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,5 @@ -API_KEY=x +MANAGEMENT_API_KEY=x ENVIRONMENT_ID=y ADD_TIMESTAMP=true -MODULE_RESOLUTION=node +MODULE_EXTENSION=js +DELIVERY_API_KEY=y diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index fe7f8ac..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-env node */ -module.exports = { - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - parserOptions: { - tsconfigRootDir: __dirname, - project: ['./tsconfig.json'] - }, - rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-namespace': 'off' - }, - root: true -}; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..3b92be7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,19 @@ +name: Lint & Build + +on: + push: + branches: [main] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js from .nvmrc file + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + - run: npm ci + - run: npm run lint + - run: npm run build diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index b61b17d..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Test -on: [pull_request] -jobs: - build: - runs-on: windows-latest - strategy: - matrix: - node-version: [18.x] - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: npm i - - run: npm run test:all diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..480aa6b --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,22 @@ +name: Test + +on: + push: + branches: [main] + pull_request: + +env: + ENVIRONMENT_ID: ${{ secrets.ENVIRONMENT_ID }} + MANAGEMENT_API_KEY: ${{ secrets.MANAGEMENT_API_KEY }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js from .nvmrc file + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + - run: npm ci + - run: npm run test diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..1a2f5bd --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 71f3209..87f2c47 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,11 +1,11 @@ { - "singleQuote": true, - "printWidth": 120, - "proseWrap": "always", - "tabWidth": 4, - "requireConfig": false, - "useTabs": false, - "trailingComma": "none", - "bracketSpacing": true, - "semi": true -} \ No newline at end of file + "singleQuote": true, + "printWidth": 140, + "proseWrap": "always", + "tabWidth": 4, + "requireConfig": false, + "useTabs": false, + "trailingComma": "none", + "bracketSpacing": true, + "semi": true +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 3fa5069..01585ed 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,7 @@ { "typescript.tsdk": "node_modules\\typescript\\lib", -} \ No newline at end of file + "typescript.updateImportsOnFileMove.enabled": "always", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e67ab..e51a852 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,58 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [8.0.0-18](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-17...v8.0.0-18) (2025-02-19) + +## [8.0.0-17](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-16...v8.0.0-17) (2025-02-17) + +## [8.0.0-16](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-15...v8.0.0-16) (2025-02-14) + +## [8.0.0-15](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-14...v8.0.0-15) (2025-02-13) + +## [8.0.0-14](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-13...v8.0.0-14) (2025-02-03) + +## [8.0.0-13](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-12...v8.0.0-13) (2025-01-23) + +## [8.0.0-12](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-11...v8.0.0-12) (2025-01-23) + +## [8.0.0-11](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-10...v8.0.0-11) (2024-11-11) + +## [8.0.0-10](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-9...v8.0.0-10) (2024-11-11) + +## [8.0.0-9](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-8...v8.0.0-9) (2024-11-11) + +## [8.0.0-8](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-7...v8.0.0-8) (2024-10-30) + +## [8.0.0-7](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-6...v8.0.0-7) (2024-10-29) + +## [8.0.0-6](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-5...v8.0.0-6) (2024-10-08) + +## [8.0.0-5](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-4...v8.0.0-5) (2024-10-04) + +## [8.0.0-4](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-3...v8.0.0-4) (2024-10-02) + +## [8.0.0-3](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-2...v8.0.0-3) (2024-10-01) + +## [8.0.0-2](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-1...v8.0.0-2) (2024-09-16) + +## [8.0.0-1](https://github.com/kontent-ai/model-generator-js/compare/v8.0.0-0...v8.0.0-1) (2024-09-16) + + +### Bug Fixes + +* Adds missing references for RichTextElement ([3b92689](https://github.com/kontent-ai/model-generator-js/commit/3b9268918de67a99bbc0831adf7fc17d76917723)) + +## [8.0.0-0](https://github.com/kontent-ai/model-generator-js/compare/v7.4.0...v8.0.0-0) (2024-09-16) + + +### ⚠ BREAKING CHANGES + +* Separates Delivery & Project models + +### Features + +* Separates Delivery & Project models ([a28ec19](https://github.com/kontent-ai/model-generator-js/commit/a28ec195fe0c361a2e75316fd2ea732d1aea1c05)) + ## [7.4.0](https://github.com/kontent-ai/model-generator-js/compare/v7.3.0...v7.4.0) (2024-08-15) diff --git a/LICENSE.md b/LICENSE.md index 4b1c689..a2d4b36 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,9 +1,15 @@ MIT License -Copyright (c) 2022 Kontent s.r.o. +Copyright (c) 2024 Kontent.ai -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 5a1a533..069b743 100644 --- a/README.md +++ b/README.md @@ -4,234 +4,100 @@ # Kontent.ai Model Generator -The purpose of this project is to help you generate `Typescript models` based on [Kontent.ai](https://kontent.ai) item -types. These models can be used with the [Delivery SDK](https://www.npmjs.com/package/@kontent-ai/delivery-sdk) and -enhances your experience by providing strongly typed models. +The purpose of this library is to help you write better code by using strongly typed objects or Typescript models. There are 4 types of +models you can generate: + +1. `delivery-sdk` - Typescript models for [JS Delivery SDK](https://www.npmjs.com/package/@kontent-ai/delivery-sdk) representing Content + types / taxonomies +2. `migration-toolkit` - Typescript models [Migration Toolkit](https://www.npmjs.com/package/@kontent-ai/migration-toolkit) helping you + write migration scripts easier +3. `environment` - Strongly typed objects representing all structural objects within an environment (i.e. content types, workflows, + taxonomies ...). These models help you write scripts because they provide you a straightforward access to objects properties. +4. `items` - Generates `Type` representing all available item codenames for each content type and object representing `id` and `codenames` + properties of all items. This makes it easy and convenient to reference items in your code. + > It is not recommended to use this if your environment contains high number of items. ## Installation -Install package globally so you can use it anywhere: +Install as a `dev dependency` to your project or use `npx` -`npm i @kontent-ai/model-generator -g` +```bash +# Install as dev dependency +npm i --save-dev @kontent-ai/model-generator -## Generate models with CLI +# Run with npx +npx @kontent-ai/model-generator@latest --help +``` + +## Usage Go to folder where you want to create models and run: -`kontent-generate --environmentId=xxx --apiKey=yyy` +```bash +# Models for Delivery SDK +npx @kontent-ai/model-generator@latest delivery --environmentId=x --managementApiKey=y -You may specify other options like: +# Models for Migration Toolkit +npx @kontent-ai/model-generator@latest migration-toolkit --environmentId=x --managementApiKey=y -`kontent-generate --environmentId=xxx --apiKey=yyy --addTimestamp=false --elementResolver=camelCase` +# Environment models used for scripting and strongly typed access to environment objects +npx @kontent-ai/model-generator@latest environment --environmentId=x --managementApiKey=y -## Generate models in code +# Items overview with ids / codenames and Types representing available item codenames +# 'deliveryApiKey' option is required for 'preview' or 'secure' api modes +# 'contentTypes' option is CSV of content type codenames and can be used to narrow down generated items +npx @kontent-ai/model-generator@latest items --environmentId=x --managementApiKey=y --deliveryApiKey=y --apiMode=preview --contentTypes=a,b,c +``` -Apart from generating models via CLI, you may also generate models in code which also gives you some additional -configuration options (such as using custom name resolver). +Run with more options: -```typescript -import { generateModelsAsync } from '@kontent-ai/model-generator'; - -await generateModelsAsync({ - sdkType: 'delivery', - environmentId: 'da5abe9f-fdad-4168-97cd-b3464be2ccb9', - isEnterpriseSubscription: true, - apiKey: 'yyy', - addTimestamp: true, - moduleResolution: 'nodeNext', - addEnvironmentInfo: true, - elementResolver: 'camelCase', - sortConfig: { - sortTaxonomyTerms: true - } -}); +```bash +npx @kontent-ai/model-generator@latest delivery --environmentId=x --managementApiKey=y --moduleFileExtension=js --outputDir=kontent-models --addTimestamp=false ``` -### Customizing generated file names +To learn what options are available use the `help` command: -You may customize the way filenames are stored on file system using the `contentTypeFileResolver` and / or -`taxonomyTypeFileResolver` configuration option: +```bash +npx @kontent-ai/model-generator@latest --help -```typescript -await generateModelsAsync({ - sdkType: 'delivery', - environmentId: 'da5abe9f-fdad-4168-97cd-b3464be2ccb9', - isEnterpriseSubscription: true, - addEnvironmentInfo: true, - apiKey: 'yyy', - moduleResolution: 'nodeNext', - addTimestamp: true, - elementResolver: 'camelCase', - contentTypeFileResolver: (type) => `content_type_${type.codename}`, - taxonomyTypeFileResolver: (taxonomy) => `taxonomy_${taxonomy.codename}` -}); +# or get help for specific command +npx @kontent-ai/model-generator@latest delivery-sdk --help ``` -### Customizing generated content type names - -You may customize name of content types using the `contentTypeResolver` configuration option and taxonomy types with the -`taxonomyTypeResolver` option: +## Use in code ```typescript -await generateModelsAsync({ - sdkType: 'delivery', - environmentId: 'da5abe9f-fdad-4168-97cd-b3464be2ccb9', - isEnterpriseSubscription: true, - apiKey: 'yyy', - moduleResolution: 'nodeNext', - addTimestamp: true, - addEnvironmentInfo: true, - elementResolver: 'camelCase', - contentTypeResolver: (type) => `${textHelper.toPascalCase(type.codename)}Model`, - taxonomyTypeResolver: (taxonomy) => `${textHelper.toPascalCase(taxonomy.codename)}Taxonomy` +import { generateDeliveryModelsAsync, generateEnvironmentModelsAsync, generateMigrationModelsAsync, generateItemsAsync } from '@kontent-ai/model-generator'; + +// delivery-sdk models +await generateDeliveryModelsAsync({ + ... }); -``` -## FAQ - -- If you are getting the `The Subscription API is not supported in your plan` error, set the - `isEnterpriseSubscription` option to false - -## CLI Configuration - -- `environmentId` - Id of the Kontent.ai environment -- `apiKey`- Management API Key -- `outputDir`- Directory where files will be created. Defaults to current directory - `--outputDir=./`. Some other - examples: `--outputDir=./sample` -- `isEnterpriseSubscription` - Indicates if enterprise subscription endpoint can be used to export data. -- `addTimestamp`- Indicates if timestamp is added to generated models -- `addEnvironmentInfo`- Indicates if environment info stamp is added to generated models -- `elementResolver`- Name resolver for elements. Available options are: `camelCase`, `pascalCase`, `snakeCase` -- `contentTypeFileResolver`- Name resolver for content type filenames. Available options are: `camelCase`, - `pascalCase`, `snakeCase` -- `contentTypeSnippetFileResolver`- Name resolver for content type snippet filenames. Available options are: - `camelCase`, `pascalCase`, `snakeCase` -- `taxonomyTypeFileResolver`- Name resolver for taxonomy filenames. Available options are: `camelCase`, `pascalCase`, - `snakeCase` -- `contentTypeResolver`- Name resolver for content type names. Available options are: `camelCase`, `pascalCase`, - `snakeCase` -- `contentTypeSnippetResolver`- Name resolver for content type snippet names. Available options are: `camelCase`, - `pascalCase`, `snakeCase` -- `taxonomyTypeResolver`- Name resolver for taxonomy type names. Available options are: `camelCase`, `pascalCase`, - `snakeCase` -- `sdkType`- Type of sdk for which models are generated. Available options are: `delivery` -- `exportWebhooks` - Indicates if webhooks are exported -- `exportWorkflows` - Indicates if workflows are exported -- `exportAssetFolders` - Indicates if asset folders are exported -- `exportCollections` - Indicates if collections are exported -- `exportLanguages` - Indicates if languages are exported -- `exportRoles` - Indicates if roles are exported. \* Only available for Enterprise subscription plans -- `managementApiUrl` - Sets the url of Management API. -- `moduleResolution` - Module resolution for imports. Available options are: `node`, `nodeNext` - -## Example models - -Generator creates file for each content type in your project. For example: - -`movie.ts` +// migration-toolkit models +await generateMigrationModelsAsync({ + ... +}); -```typescript -import { IContentItem, Elements } from '@kontent-ai/delivery-sdk'; -import { Actor } from './actor'; -import { ReleaseCategory } from '../taxonomies/releasecategory'; - -/** - * Generated by '@kontent-ai/model-generator@5.0.0-3' at 'Thu, 14 Jul 2022 13:58:53 GMT' - * - * Movie - * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c - * Codename: movie - */ -export type Movie = IContentItem<{ - /** - * Title (text) - * Required: true - * Id: 3473187e-dc78-eff2-7099-f690f7042d4a - * Codename: title - */ - title: Elements.TextElement; - - /** - * Plot (rich_text) - * Required: false - * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce - * Codename: plot - */ - plot: Elements.RichTextElement; - - /** - * Released (date_time) - * Required: false - * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 - * Codename: released - */ - released: Elements.DateTimeElement; - - /** - * Length (number) - * Required: false - * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c - * Codename: length - */ - length: Elements.NumberElement; - - /** - * Poster (asset) - * Required: false - * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d - * Codename: poster - */ - poster: Elements.AssetsElement; - - /** - * Category (multiple_choice) - * Required: false - * Id: 9821c252-6414-f549-c17f-cc171dd87713 - * Codename: category - */ - category: Elements.MultipleChoiceElement; - - /** - * Stars (modular_content) - * Required: false - * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 - * Codename: stars - */ - stars: Elements.LinkedItemsElement; - - /** - * SeoName (url_slug) - * Required: false - * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c - * Codename: seoname - */ - seoname: Elements.UrlSlugElement; - - /** - * ReleaseCategory (taxonomy) - * Required: false - * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 - * Codename: releasecategory - */ - releasecategory: Elements.TaxonomyElement; -}>; +// environment overview +await generateEnvironmentModelsAsync({ + ... +}); + +// items +await generateItemsAsync({ + ... +}); ``` -`movietype.ts` +## Sample models -```typescript -/** - * Generated by '@kontent-ai/model-generator@5.0.0' at 'Mon, 28 Mar 2022 14:36:32 GMT' - * - * MovieType - * Id: 365a17e6-1929-27ab-9f67-a9273c846717 - * Codename: movietype - */ -export type MovieType = 'student' | 'film' | 'tv' | 'blockbuster' | 'cinema_only'; -``` +To see how models are generated have a look at following sample generated models: -To learn the complete generator output, see the following folder: -https://github.com/kontent-ai/model-generator-js/tree/master/sample +1. `delivery-sdk` -> https://github.com/kontent-ai/model-generator-js/tree/master/sample/delivery +2. `migration-toolkit` -> https://github.com/kontent-ai/model-generator-js/tree/master/sample/migration +3. `environment` -> https://github.com/kontent-ai/model-generator-js/tree/master/sample/environment +4. `items` -> https://github.com/kontent-ai/model-generator-js/tree/master/sample/items ## Contribution & Feedback diff --git a/clean.ts b/clean.ts deleted file mode 100644 index fa8e185..0000000 --- a/clean.ts +++ /dev/null @@ -1,10 +0,0 @@ -import fs from 'fs'; -import Colors from 'colors'; - -const paths = ['dist']; -for (const path of paths) { - if (fs.existsSync(path)) { - fs.rmSync(path, { recursive: true }); - console.log(`Path '${Colors.yellow(path)}' has been deleted`); - } -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..435e149 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,26 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, { + languageOptions: { + parserOptions: { + project: ['tsconfig.json'], + tsconfigRootDir: import.meta.dirname + } + }, + rules: { + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/naming-convention': [ + 'warn', + { + selector: 'interface', + format: ['PascalCase'], + custom: { + regex: '^I[A-Z]', + match: false + } + } + ] + } +}); diff --git a/lib/cli/actions/delivery-action.ts b/lib/cli/actions/delivery-action.ts new file mode 100644 index 0000000..567e641 --- /dev/null +++ b/lib/cli/actions/delivery-action.ts @@ -0,0 +1,18 @@ +import { generateDeliveryModelsAsync } from '../../generators/delivery/delivery-func.js'; +import { parseModuleFileExtension } from '../arg.utils.js'; +import type { CliArgumentsFetcher } from '../cli.models.js'; +import { commandOptions } from '../command.options.js'; + +export async function deliveryActionAsync(cliFetcher: CliArgumentsFetcher): Promise { + await generateDeliveryModelsAsync({ + createFiles: true, + // required + environmentId: cliFetcher.getRequiredArgumentValue(commandOptions.environmentId.name), + apiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + baseUrl: cliFetcher.getOptionalArgumentValue(commandOptions.managementBaseUrl.name), + outputDir: cliFetcher.getOptionalArgumentValue(commandOptions.outputDir.name), + addTimestamp: cliFetcher.getBooleanArgumentValue(commandOptions.addTimestamp.name, false), + moduleFileExtension: parseModuleFileExtension(cliFetcher.getOptionalArgumentValue(commandOptions.moduleFileExtension.name)) + }); +} diff --git a/lib/cli/actions/environment-action.ts b/lib/cli/actions/environment-action.ts new file mode 100644 index 0000000..8f38ded --- /dev/null +++ b/lib/cli/actions/environment-action.ts @@ -0,0 +1,20 @@ +import { isEnvironmentEntity } from '../../core/type-guards.js'; +import { generateEnvironmentModelsAsync } from '../../generators/environment/environment-func.js'; +import { parseModuleFileExtension } from '../arg.utils.js'; +import type { CliArgumentsFetcher } from '../cli.models.js'; +import { commandOptions } from '../command.options.js'; + +export async function environmentActionAsync(cliFetcher: CliArgumentsFetcher): Promise { + await generateEnvironmentModelsAsync({ + // required + createFiles: true, + environmentId: cliFetcher.getRequiredArgumentValue(commandOptions.environmentId.name), + apiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + entities: cliFetcher.getOptionalArgumentArrayValue(commandOptions.entities.name).filter(isEnvironmentEntity), + baseUrl: cliFetcher.getOptionalArgumentValue(commandOptions.managementBaseUrl.name), + outputDir: cliFetcher.getOptionalArgumentValue(commandOptions.outputDir.name), + addTimestamp: cliFetcher.getBooleanArgumentValue(commandOptions.addTimestamp.name, false), + moduleFileExtension: parseModuleFileExtension(cliFetcher.getOptionalArgumentValue(commandOptions.moduleFileExtension.name)) + }); +} diff --git a/lib/cli/actions/items-action.ts b/lib/cli/actions/items-action.ts new file mode 100644 index 0000000..45b6958 --- /dev/null +++ b/lib/cli/actions/items-action.ts @@ -0,0 +1,24 @@ +import { generateItemsAsync } from '../../generators/items/items-func.js'; +import { parseDeliveryApiMode, parseModuleFileExtension } from '../arg.utils.js'; +import type { CliArgumentsFetcher } from '../cli.models.js'; +import { commandOptions } from '../command.options.js'; + +export async function itemsActionAsync(cliFetcher: CliArgumentsFetcher): Promise { + await generateItemsAsync({ + // required + createFiles: true, + environmentId: cliFetcher.getRequiredArgumentValue(commandOptions.environmentId.name), + apiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + generateTypes: cliFetcher.getBooleanArgumentValue(commandOptions.generateTypes.name, false), + generateObjects: cliFetcher.getBooleanArgumentValue(commandOptions.generateObjects.name, false), + deliveryApiKey: cliFetcher.getOptionalArgumentValue(commandOptions.deliveryApiKey.name), + baseUrl: cliFetcher.getOptionalArgumentValue(commandOptions.managementBaseUrl.name), + deliveryBaseUrl: cliFetcher.getOptionalArgumentValue(commandOptions.deliveryBaseUrl.name), + outputDir: cliFetcher.getOptionalArgumentValue(commandOptions.outputDir.name), + addTimestamp: cliFetcher.getBooleanArgumentValue(commandOptions.addTimestamp.name, false), + apiMode: parseDeliveryApiMode(cliFetcher.getOptionalArgumentValue(commandOptions.apiMode.name)), + filterByTypeCodenames: cliFetcher.getOptionalArgumentArrayValue(commandOptions.contentTypes.name) ?? [], + moduleFileExtension: parseModuleFileExtension(cliFetcher.getOptionalArgumentValue(commandOptions.moduleFileExtension.name)) + }); +} diff --git a/lib/cli/actions/migrate-action.ts b/lib/cli/actions/migrate-action.ts new file mode 100644 index 0000000..6eb0735 --- /dev/null +++ b/lib/cli/actions/migrate-action.ts @@ -0,0 +1,18 @@ +import { generateMigrationModelsAsync } from '../../generators/migration/migration-func.js'; +import { parseModuleFileExtension } from '../arg.utils.js'; +import type { CliArgumentsFetcher } from '../cli.models.js'; +import { commandOptions } from '../command.options.js'; + +export async function migrateActionAsync(cliFetcher: CliArgumentsFetcher): Promise { + await generateMigrationModelsAsync({ + // required + createFiles: true, + environmentId: cliFetcher.getRequiredArgumentValue(commandOptions.environmentId.name), + apiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + baseUrl: cliFetcher.getOptionalArgumentValue(commandOptions.managementBaseUrl.name), + outputDir: cliFetcher.getOptionalArgumentValue(commandOptions.outputDir.name), + addTimestamp: cliFetcher.getBooleanArgumentValue(commandOptions.addTimestamp.name, false), + moduleFileExtension: parseModuleFileExtension(cliFetcher.getOptionalArgumentValue(commandOptions.moduleFileExtension.name)) + }); +} diff --git a/lib/cli/app.ts b/lib/cli/app.ts new file mode 100644 index 0000000..6567f3a --- /dev/null +++ b/lib/cli/app.ts @@ -0,0 +1,29 @@ +#!/usr/bin/env node +import chalk from 'chalk'; +import { match } from 'ts-pattern'; +import { logError } from '../core/error.utils.js'; +import { deliveryActionAsync } from './actions/delivery-action.js'; +import { environmentActionAsync } from './actions/environment-action.js'; +import { itemsActionAsync } from './actions/items-action.js'; +import { migrateActionAsync } from './actions/migrate-action.js'; +import { argumentsFetcherAsync } from './args/args-fetcher.js'; +import { cliArgs } from './commands.js'; + +// This enables --help with all commands, options & samples +cliArgs.registerCommands(); + +try { + const argsFetcher = await argumentsFetcherAsync(); + + await match(argsFetcher.getCliAction()) + .returnType>() + .with('delivery-sdk', async () => await deliveryActionAsync(argsFetcher)) + .with('migration-toolkit', async () => await migrateActionAsync(argsFetcher)) + .with('environment', async () => await environmentActionAsync(argsFetcher)) + .with('items', async () => await itemsActionAsync(argsFetcher)) + .otherwise((action) => { + throw Error(`Invalid action '${chalk.red(action)}'`); + }); +} catch (error) { + logError(error); +} diff --git a/lib/cli/arg.utils.ts b/lib/cli/arg.utils.ts new file mode 100644 index 0000000..75d40c5 --- /dev/null +++ b/lib/cli/arg.utils.ts @@ -0,0 +1,24 @@ +import { defaultDeliveryApiMode, defaultModuleFileExtension } from '../config.js'; +import type { DeliveryApiMode, LiteralUnion, ModuleFileExtension } from '../core/core.models.js'; + +export function parseModuleFileExtension(moduleFileExtension: LiteralUnion | undefined): ModuleFileExtension { + return moduleFileExtensionOptions[moduleFileExtension ?? defaultModuleFileExtension]; +} + +export function parseDeliveryApiMode(apiMode: LiteralUnion | undefined): DeliveryApiMode { + return deliveryApiModeOptions[apiMode ?? defaultDeliveryApiMode]; +} + +export const moduleFileExtensionOptions: Record, ModuleFileExtension> = { + js: 'js', + ts: 'ts', + mts: 'mts', + mjs: 'mjs', + none: 'none' +}; + +export const deliveryApiModeOptions: Record, DeliveryApiMode> = { + default: 'default', + preview: 'preview', + secure: 'secure' +}; diff --git a/lib/cli/args/args-fetcher.ts b/lib/cli/args/args-fetcher.ts new file mode 100644 index 0000000..046adf6 --- /dev/null +++ b/lib/cli/args/args-fetcher.ts @@ -0,0 +1,59 @@ +import chalk from 'chalk'; +import { match } from 'ts-pattern'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import type { CliAction, LiteralUnion } from '../../core/core.models.js'; +import type { CliArgumentsFetcher } from '../cli.models.js'; + +type ArgvResult = { + readonly [x: string]: unknown; + readonly _: readonly (string | number)[]; + readonly $0: string; +}; + +export async function argumentsFetcherAsync(): Promise { + const argv = yargs(hideBin(process.argv)); + const resolvedArgv: ArgvResult = await argv.argv; + + const getOptionalArgumentValue = (argName: string) => { + return resolvedArgv[argName]?.toString(); + }; + + return { + getCliAction(): CliAction { + const command = resolvedArgv._?.[0]?.toString()?.toLowerCase() as LiteralUnion; + + return match(command) + .returnType() + .with('delivery-sdk', () => 'delivery-sdk') + .with('migration-toolkit', () => 'migration-toolkit') + .with('environment', () => 'environment') + .with('items', () => 'items') + .otherwise(() => { + throw Error(`Unsupported command '${chalk.red(command)}'`); + }); + }, + getOptionalArgumentValue, + getRequiredArgumentValue(argName: string): string { + const value = getOptionalArgumentValue(argName); + + if (!value) { + throw Error(`Missing '${chalk.yellow(argName)}' argument value`); + } + + return value; + }, + getBooleanArgumentValue(argName: string, defaultValue: boolean): boolean { + const value = getOptionalArgumentValue(argName); + + if (!value) { + return defaultValue; + } + + return value.toLowerCase() === 'true'.toLowerCase(); + }, + getOptionalArgumentArrayValue(argName: string): readonly string[] { + return getOptionalArgumentValue(argName)?.split(',') ?? []; + } + }; +} diff --git a/lib/cli/args/args-setter.ts b/lib/cli/args/args-setter.ts new file mode 100644 index 0000000..40dd29d --- /dev/null +++ b/lib/cli/args/args-setter.ts @@ -0,0 +1,39 @@ +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import type { CliAction } from '../../core/core.models.js'; +import type { CliArgumentsSetter, Command, CommandOption } from '../cli.models.js'; + +export function argumentsSetter(): CliArgumentsSetter { + const argv = yargs(hideBin(process.argv)); + + return { + withCommand(command: Command): CliArgumentsSetter { + argv.command(command.name, command.description, (yargs) => { + command.examples.forEach((example) => yargs.example(command.name, example)); + command.options.forEach((option) => { + yargs.positional(option.name, { + alias: option.alias, + describe: option.description, + type: option.type, + demandOption: option.isRequired + }); + }); + }); + + return this; + }, + withOption(option: CommandOption): CliArgumentsSetter { + argv.option(option.name, { + alias: option.alias, + description: option.description, + type: option.type, + demandOption: option.isRequired + }); + + return this; + }, + registerCommands(): void { + argv.parseSync(); + } + }; +} diff --git a/lib/cli/cli.models.ts b/lib/cli/cli.models.ts new file mode 100644 index 0000000..8fae6ad --- /dev/null +++ b/lib/cli/cli.models.ts @@ -0,0 +1,48 @@ +import type { CliAction } from '../core/core.models.js'; + +export type CommandOptionNames = + | 'environmentId' + | 'help' + | 'deliveryApiKey' + | 'managementApiKey' + | 'outputDir' + | 'addTimestamp' + | 'moduleFileExtension' + | 'apiMode' + | 'contentTypes' + | 'managementBaseUrl' + | 'deliveryBaseUrl' + | 'entities' + | 'generateTypes' + | 'generateObjects'; + +export type CommandAlias = 'h'; + +export interface Command { + readonly name: TAction; + readonly description: string; + readonly options: readonly CommandOption[]; + readonly examples: readonly string[]; +} + +export interface CommandOption { + readonly name: CommandOptionNames; + readonly isRequired: boolean; + readonly alias?: CommandAlias; + readonly description?: string; + readonly type?: 'boolean' | 'number' | 'string'; +} + +export type CliArgumentsSetter = { + withCommand(command: Command): CliArgumentsSetter; + withOption(option: CommandOption): CliArgumentsSetter; + registerCommands(): void; +}; + +export type CliArgumentsFetcher = { + getCliAction(): CliAction; + getOptionalArgumentValue(argName: CommandOptionNames): string | undefined; + getRequiredArgumentValue(argName: CommandOptionNames): string; + getBooleanArgumentValue(argName: CommandOptionNames, defaultValue: boolean): boolean; + getOptionalArgumentArrayValue(argName: CommandOptionNames): readonly string[]; +}; diff --git a/lib/cli/cli.ts b/lib/cli/cli.ts deleted file mode 100644 index bdb330d..0000000 --- a/lib/cli/cli.ts +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env node -import yargs from 'yargs'; -import { generateModelsAsync } from '../generator.js'; -import { ModuleResolution } from '../models.js'; - -const argv = yargs(process.argv.slice(2)) - .example( - 'kontent-generate --environmentId=xxx --apiKey=yyy', - 'Basic configuration to generate strongly typed models' - ) - .alias('p', 'environmentId') - .describe('p', 'environmentId') - .alias('i', 'environmentId') - .describe('i', 'environmentId') - .alias('k', 'apiKey') - .describe('k', 'Management API Key') - .alias('o', 'outputDir') - .describe('o', 'Directory where generated files will be created') - .alias('a', 'addTimestamp') - .describe('a', 'Indicates if timestamp should be generated') - .alias('e', 'addEnvironmentInfo') - .describe('e', 'Indicates if environment info stamp should be generated') - .alias('t', 'sdkType') - .describe('t', 'Type of sdk for which models are generated. Available options are: delivery') - .alias('m', 'moduleResolution') - .describe('m', 'Module resolution for imports. Available options are: node, nodeNext') - .option('exportLanguages', { - description: 'Indicates if languages are exported' - }) - .option('exportCollections', { - description: 'Indicates if collections are exported' - }) - .option('exportAssetFolders', { - description: 'Indicates if asset folders are exported' - }) - .option('exportWorkflows', { - description: 'Indicates if workflows are exported' - }) - .option('exportWebhooks', { - description: 'Indicates if webhooks are exported' - }) - .option('taxonomyTypeResolver', { - description: 'Name resolver for taxonomy type names. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('contentTypeResolver', { - description: 'Name resolver for content type names. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('contentTypeSnippetResolver', { - description: - 'Name resolver for content type snippet names. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('taxonomyTypeFileResolver', { - description: 'Name resolver for taxonomy filenames. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('contentTypeFileResolver', { - description: 'Name resolver for content type filenames. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('contentTypeSnippetFileResolver', { - description: - 'Name resolver for content type snippet filenames. Available options are: camelCase, pascalCase, snakeCase' - }) - .option('exportRoles', { - description: 'Indicates if roles are exported. Only available for Enterprise subscription plans' - }) - .option('isEnterpriseSubscription', { - description: 'Indicates if enterprise subscription endpoint can be used to export data.' - }) - .option('sortTaxonomyTerms', { - description: 'Indicates if taxonomy terms are sorted alphabetically.' - }) - .option('managementApiUrl', { - description: 'Sets the url of Management API.' - }) - .help('h') - .alias('h', 'help').argv; - -const run = async () => { - const resolvedArgs = (await argv) as any; - - // user config - const environmentId = resolvedArgs.environmentId; - const apiKey = resolvedArgs.apiKey; - const outputDir = resolvedArgs.outputDir; - const addTimestamp = resolvedArgs.addTimestamp; - const addEnvironmentInfo = resolvedArgs.addEnvironmentInfo; - const elementResolver = resolvedArgs.elementResolver; - const contentTypeFileResolver = resolvedArgs.contentTypeFileResolver; - const contentTypeSnippetFileResolver = resolvedArgs.contentTypeSnippetFileResolver; - const taxonomyTypeFileResolver = resolvedArgs.taxonomyTypeFileResolver; - const contentTypeResolver = resolvedArgs.contentTypeResolver; - const taxonomyTypeResolver = resolvedArgs.taxonomyTypeResolver; - const moduleResolution = resolvedArgs.moduleResolution; - const contentTypeSnippetResolver = resolvedArgs.contentTypeSnippetResolver; - const sdkType = resolvedArgs.sdkType; - const exportWebhooks = !resolvedArgs.exportWebhooks ? true : resolvedArgs.exportWebhooks === 'true'; - const sortTaxonomyTerms = !resolvedArgs.sortTaxonomyTerms ? true : resolvedArgs.sortTaxonomyTerms === 'true'; - const exportWorkflows = !resolvedArgs.exportWorkflows ? true : resolvedArgs.exportWorkflows === 'true'; - const exportAssetFolders = !resolvedArgs.exportAssetFolders ? true : resolvedArgs.exportAssetFolders === 'true'; - const exportCollections = !resolvedArgs.exportCollections ? true : resolvedArgs.exportCollections === 'true'; - const exportLanguages = !resolvedArgs.exportLanguages ? true : resolvedArgs.exportLanguages === 'true'; - const exportRoles = !resolvedArgs.exportRoles ? true : resolvedArgs.exportRoles === 'true'; - const isEnterpriseSubscription = !resolvedArgs.isEnterpriseSubscription - ? true - : resolvedArgs.isEnterpriseSubscription === 'true'; - - if (!environmentId) { - throw Error(`Please provide environment id using 'environmentId' argument`); - } - - await generateModelsAsync({ - environmentId: environmentId, - managementApiUrl: resolvedArgs.managementApiUrl, - apiKey: apiKey, - outputDir: outputDir, - isEnterpriseSubscription: isEnterpriseSubscription, - addTimestamp: addTimestamp === 'true' ? true : false, - addEnvironmentInfo: addEnvironmentInfo === 'true' ? true : false, - elementResolver: elementResolver, - contentTypeFileResolver: contentTypeFileResolver, - contentTypeResolver: contentTypeResolver, - taxonomyTypeFileResolver: taxonomyTypeFileResolver, - taxonomyTypeResolver: taxonomyTypeResolver, - contentTypeSnippetFileResolver: contentTypeSnippetFileResolver, - contentTypeSnippetResolver: contentTypeSnippetResolver, - formatOptions: undefined, - sdkType: sdkType ?? 'delivery', - sortConfig: { - sortTaxonomyTerms: sortTaxonomyTerms - }, - moduleResolution: moduleResolution?.toString() === 'node' ? 'node' : 'nodeNext', - exportProjectSettings: { - exportWebhooks: exportWebhooks ?? true, - exportWorkflows: exportWorkflows ?? true, - exportAssetFolders: exportAssetFolders ?? true, - exportCollections: exportCollections ?? true, - exportLanguages: exportLanguages ?? true, - exportRoles: exportRoles ?? true - } - }); -}; - -run(); diff --git a/lib/cli/command.options.ts b/lib/cli/command.options.ts new file mode 100644 index 0000000..d105840 --- /dev/null +++ b/lib/cli/command.options.ts @@ -0,0 +1,60 @@ +import { environmentEntities } from '../core/core.models.js'; +import { deliveryApiModeOptions, moduleFileExtensionOptions } from './arg.utils.js'; +import type { CommandOption, CommandOptionNames } from './cli.models.js'; + +export const commandOptions: { [key in CommandOptionNames]: CommandOption } = { + environmentId: { name: `environmentId`, description: `Id of the environment`, type: 'string', isRequired: true }, + managementApiKey: { name: `managementApiKey`, description: `Management API key`, type: 'string', isRequired: true }, + deliveryApiKey: { name: `deliveryApiKey`, description: `Delivery API key`, type: 'string', isRequired: true }, + outputDir: { + name: `outputDir`, + description: `Relative directory path where directory will be created`, + type: 'string', + isRequired: false + }, + addTimestamp: { + name: `addTimestamp`, + description: `Indicates whether timestamp should be generated for every file`, + type: 'boolean', + isRequired: false + }, + moduleFileExtension: { + name: `moduleFileExtension`, + description: `Module resolution for imports. One of: ${Object.values(moduleFileExtensionOptions).join(', ')}`, + type: 'string', + isRequired: false + }, + apiMode: { + name: `apiMode`, + description: `API mode for Delivery. ${Object.values(deliveryApiModeOptions).join(', ')}`, + type: 'string', + isRequired: false + }, + contentTypes: { + name: `contentTypes`, + description: `Comma separated list of content type codenames. If not provided, all items will be generated`, + type: 'string', + isRequired: false + }, + managementBaseUrl: { name: `managementBaseUrl`, description: `Base URL for Management API`, type: 'string', isRequired: false }, + deliveryBaseUrl: { name: `deliveryBaseUrl`, description: `Base URL for Delivery API`, type: 'string', isRequired: false }, + generateTypes: { + name: `generateTypes`, + description: `Indicates if Typescript types representing data are generated`, + type: 'boolean', + isRequired: false + }, + generateObjects: { + name: `generateObjects`, + description: `Indicates if objects (const variables) representing data are generated`, + type: 'boolean', + isRequired: false + }, + entities: { + name: `entities`, + description: `Comma separated list of entities: ${environmentEntities.join(', ')}`, + type: 'string', + isRequired: false + }, + help: { name: `help`, description: `Shows help message`, type: 'boolean', isRequired: false } +}; diff --git a/lib/cli/commands.ts b/lib/cli/commands.ts new file mode 100644 index 0000000..951a3a2 --- /dev/null +++ b/lib/cli/commands.ts @@ -0,0 +1,72 @@ +import type { CliAction, LibraryType } from '../core/core.models.js'; +import { argumentsSetter } from './args/args-setter.js'; +import { commandOptions } from './command.options.js'; + +export const cliArgs = argumentsSetter() + .withCommand({ + name: 'delivery-sdk', + description: `Generates models for '${'@kontent-ai/delivery-sdk' satisfies LibraryType}' library`, + examples: [ + `kontent-generate ${'delivery-sdk' satisfies CliAction} --${commandOptions.environmentId.name}=x --${commandOptions.managementApiKey.name}=x` + ], + options: [ + commandOptions.environmentId, + commandOptions.managementApiKey, + commandOptions.addTimestamp, + commandOptions.moduleFileExtension, + commandOptions.outputDir, + commandOptions.managementBaseUrl + ] + }) + .withCommand({ + name: 'environment', + description: `Generates strongly typed models representing all objects in the environment. This is useful for creating custom tools or scripts where you need to reference objects within your environment`, + examples: [ + `kontent-generate ${'environment' satisfies CliAction} --${commandOptions.environmentId.name}=x --${commandOptions.managementApiKey.name}=x` + ], + options: [ + commandOptions.environmentId, + commandOptions.managementApiKey, + commandOptions.addTimestamp, + commandOptions.moduleFileExtension, + commandOptions.outputDir, + commandOptions.managementBaseUrl + ] + }) + .withCommand({ + name: 'migration-toolkit', + description: `Generates models for '${'@kontent-ai/migration-toolkit' satisfies LibraryType}' library`, + examples: [ + `kontent-generate ${'migration-toolkit' satisfies CliAction} --${commandOptions.environmentId.name}=x --${commandOptions.managementApiKey.name}=x` + ], + options: [ + commandOptions.environmentId, + commandOptions.managementApiKey, + commandOptions.addTimestamp, + commandOptions.moduleFileExtension, + commandOptions.outputDir, + commandOptions.managementBaseUrl + ] + }) + .withCommand({ + name: 'items', + description: `Overview of all items in the environment and their ids/codenames as well as Type representing all item codenames.`, + examples: [ + `kontent-generate ${'items' satisfies CliAction} --${commandOptions.environmentId.name}=x --${commandOptions.managementApiKey.name}=x --${commandOptions.deliveryApiKey.name}=x --${commandOptions.apiMode.name}=preview --${commandOptions.contentTypes.name}=a,b,c` + ], + options: [ + commandOptions.environmentId, + commandOptions.managementApiKey, + commandOptions.deliveryApiKey, + commandOptions.addTimestamp, + commandOptions.moduleFileExtension, + commandOptions.outputDir, + commandOptions.managementBaseUrl, + commandOptions.apiMode, + commandOptions.contentTypes, + commandOptions.deliveryBaseUrl, + commandOptions.generateTypes, + commandOptions.generateObjects + ] + }) + .withOption(commandOptions.help); diff --git a/lib/common-helper.ts b/lib/common-helper.ts deleted file mode 100644 index 560baee..0000000 --- a/lib/common-helper.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { parse } from 'path'; -import { ContentTypeElements, TaxonomyModels } from '@kontent-ai/management-sdk'; -import { libMetadata } from './meta/index.js'; -import { ModuleResolution } from './models.js'; - -export interface IGeneratedFile { - filename: string; - text: string; -} - -export class CommonHelper { - sortAlphabetically(arrayToSort: T[], propertySelector: (item: T) => string): T[] { - return arrayToSort.sort((a, b) => - propertySelector(a).toLowerCase().localeCompare(propertySelector(b).toLowerCase()) - ); - } - - getAutogenerateNote(addTimestamp: boolean): string { - if (addTimestamp) { - return `Generated by '${libMetadata.name}@${libMetadata.version}' at '${new Date().toUTCString()}'`; - } - - return `Generated by '${libMetadata.name}@${libMetadata.version}'`; - } - - getElementCodename(element: ContentTypeElements.ContentTypeElementModel): string | undefined { - const codename = (element)['codename']; - - return codename ?? undefined; - } - - isElementRequired(element: ContentTypeElements.ContentTypeElementModel): boolean { - const isRequired = (element)['is_required']; - - return isRequired === true; - } - - getElementGuidelines(element: ContentTypeElements.ContentTypeElementModel): string | null { - const guidelines = (element)['guidelines']; - - if (!guidelines) { - return null; - } - - return guidelines; - } - - getImportStatement(data: { - filePath: string; - importValue: string; - moduleResolution: ModuleResolution; - isExternalLib: boolean; - }): string { - let resolvedFilePath: string; - - if (data.moduleResolution === 'nodeNext' && !data.isExternalLib) { - resolvedFilePath = `${data.filePath}.js`; - } else { - resolvedFilePath = data.filePath; - } - - return `import { ${data.importValue} } from '${resolvedFilePath}';`; - } - - getElementTitle( - element: ContentTypeElements.ContentTypeElementModel, - taxonomies: TaxonomyModels.Taxonomy[] - ): string | null { - if (element.type === 'taxonomy') { - const taxonomyElement = element as ContentTypeElements.ITaxonomyElement; - const taxonomyGroupId = taxonomyElement?.taxonomy_group?.id; - - if (!taxonomyGroupId) { - return element.type; - } - - const taxonomy = taxonomies.find((m) => m.id === taxonomyGroupId); - - if (!taxonomy) { - return element.type; - } - - return taxonomy.name; - } - return (element)['name']; - } - - getBarrelExportCode(data: { filenames: string[]; moduleResolution: ModuleResolution }): string { - let code = ''; - - if (data.filenames.length) { - for (let i = 0; i < data.filenames.length; i++) { - const isLast = i === data.filenames.length - 1; - const filename = data.filenames[i]; - const path = parse(filename); - const extension = data.moduleResolution === 'nodeNext' ? '.js' : ''; - code += `export * from '${path.dir}/${path.name}${extension}'`; - - if (!isLast) { - code += `\n`; - } - } - } else { - code = `export {}`; - } - - return code; - } - - escapeNameValue(value: string): string { - return value.replaceAll(`'`, `\\'`); - } -} - -export const commonHelper = new CommonHelper(); diff --git a/lib/config.ts b/lib/config.ts new file mode 100644 index 0000000..0ac9d88 --- /dev/null +++ b/lib/config.ts @@ -0,0 +1,70 @@ +import type { DeliveryApiMode, ModuleFileExtension } from './core/core.models.js'; +import { libMetadata } from './meta/metadata.js'; + +export const defaultModuleFileExtension: ModuleFileExtension = 'js'; +export const defaultDeliveryApiMode: DeliveryApiMode = 'default'; + +export const coreConfig = { + barrelExportFilename: 'index.ts', + kontentTrackingHeaderName: 'X-KC-SOURCE', + kontentTrackingHeaderValue: `${libMetadata.name};${libMetadata.version}` +} as const; + +export const sharedTypesConfig = { + languageCodenames: 'LanguageCodenames', + collectionCodenames: 'CollectionCodenames', + workflowCodenames: 'WorkflowCodenames', + workflowStepCodenames: 'WorkflowStepCodenames', + contentTypeCodenames: 'ContentTypeCodenames', + taxonomyCodenames: 'TaxonomyCodenames', + elementCodenames: 'ElementCodenames' +} as const; + +export const migrationConfig = { + npmPackageName: '@kontent-ai/migration-toolkit', + migrationItemsFolderName: `content-types`, + environmentFolderName: `environment`, + migrationTypesFilename: `migration`, + environmentFilename: `environment`, + + sdkTypeNames: { + system: 'MigrationItemSystem', + item: 'MigrationItem', + elements: 'MigrationElements', + elementModels: 'MigrationElementModels' + }, + + localTypeNames: { + system: 'ItemSystem', + item: 'Item', + codename: 'TCodename', + elements: 'TElements' + } +} as const; + +export const deliveryConfig = { + npmPackageName: '@kontent-ai/delivery-sdk', + contentTypesFolderName: `content-types`, + contentTypeSnippetsFolderName: `content-type-snippets`, + taxonomiesFolderName: `taxonomies`, + typeGuardsFileName: 'delivery.type-guards', + systemTypesFolderName: 'system', + coreCodenamesFilename: 'delivery.codenames', + coreTypeFilename: 'core.type', + coreContentTypeName: 'CoreContentType', + coreDeliveryClientTypeName: 'CoreDeliveryClient', + coreDeliveryClientTypesTypeName: 'CoreClientTypes', + + sdkTypes: { + contentItem: 'IContentItem', + contentItemElements: 'IContentItemElements', + elements: 'Elements', + snippet: 'Snippet', + deliveryClient: 'IDeliveryClient' + } +} as const; + +export const itemsConfig = { + itemsFolderName: 'items', + codenamesFolderName: 'codenames' +} as const; diff --git a/lib/core/comment.utils.ts b/lib/core/comment.utils.ts new file mode 100644 index 0000000..daa5a8c --- /dev/null +++ b/lib/core/comment.utils.ts @@ -0,0 +1,39 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import { libMetadata } from '../meta/metadata.js'; + +export function wrapComment(comment: string): string { + return `/**${toSafeComment(comment)}*/`; +} + +export function toSafeComment(text: string): string { + const replaceContent = ''; + return text.replace(/\/\*/g, replaceContent).replace(/\*\//g, replaceContent); +} + +export function toGuidelinesComment(guidelines: string): string { + return removeLineEndings(guidelines); +} + +export function getEnvironmentInfoComment(data: { + readonly timestampDate?: Date; + readonly environmentInfo: Readonly; +}): string { + return ` +/** +* This file has been auto-generated by '${libMetadata.name}@${libMetadata.version}'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: ${toSafeComment(data.environmentInfo.name)} +* Environment: ${toSafeComment(data.environmentInfo.environment)} +* Id: ${data.environmentInfo.id}${data.timestampDate ? `\n* Generated: ${data.timestampDate.toLocaleString()}` : ''} +* +* ------------------------------------------------------------------------------- +**/`; +} + +function removeLineEndings(value: string): string { + return value.replace(/(\r\n|\n|\r)/g, ' '); +} diff --git a/lib/core/core.models.ts b/lib/core/core.models.ts new file mode 100644 index 0000000..fc606d7 --- /dev/null +++ b/lib/core/core.models.ts @@ -0,0 +1,100 @@ +import type { IDeliveryClient } from '@kontent-ai/delivery-sdk'; +import type { + ContentTypeElements, + ContentTypeModels, + ContentTypeSnippetModels, + ElementModels, + IManagementClient, + TaxonomyModels +} from '@kontent-ai/management-sdk'; + +export type CliAction = 'delivery-sdk' | 'migration-toolkit' | 'environment' | 'items'; +export type LibraryType = '@kontent-ai/migration-toolkit' | '@kontent-ai/delivery-sdk'; +export type ModuleFileExtension = 'js' | 'ts' | 'mjs' | 'mts' | 'none'; + +export const environmentEntities = [ + 'languages', + 'taxonomies', + 'contentTypes', + 'snippets', + 'webhooks', + 'collections', + 'workflows', + 'assetFolders', + 'roles', + 'customApps', + 'previewUrls', + 'spaces' +] as const; + +export type EnvironmentEntity = (typeof environmentEntities)[number]; + +export type CaseType = 'camelCase' | 'pascalCase'; +export type DeliveryApiMode = 'preview' | 'secure' | 'default'; +export type GeneratorManagementClient = Readonly>; +export type GeneratorDeliveryClient = Readonly; +export type LiteralUnion = T | (string & NonNullable); +export type CreateFilesConfig = { readonly createFiles: true; readonly outputDir?: string } | { readonly createFiles: false }; + +export interface ErrorData { + readonly message: string; + readonly isMapiError: boolean; + readonly error: unknown; + + readonly requestData?: string; + readonly requestUrl?: string; + readonly isUnknownError: boolean; +} + +export interface OriginalManagementError { + readonly response?: { + readonly status?: number; + readonly config?: { + readonly url?: string; + readonly data?: string; + }; + readonly data?: { + readonly error_code?: number; + }; + }; +} + +export interface MultipleChoiceOption { + readonly name: string; + readonly codename: string; +} + +export interface FlattenedElement { + readonly title: string; + readonly id: string; + readonly codename: string; + readonly externalId?: string; + readonly type: ElementModels.ElementType; + readonly isRequired: boolean; + readonly guidelines?: string; + readonly allowedContentTypes?: readonly Readonly[]; + readonly originalElement: Readonly; + readonly assignedTaxonomy?: Readonly; + readonly fromSnippet?: Readonly; + readonly multipleChoiceOptions?: readonly Readonly[]; +} + +export interface GeneratedFile { + readonly filename: string; + readonly text: string; +} + +export interface GeneratedSet { + readonly files: readonly GeneratedFile[]; + readonly folderName: string | undefined; +} + +export type ObjectWithCodename = { + readonly codename: string; +}; + +export type ObjectWithName = { + readonly name: string; +}; + +export type ValidateKeys = T; diff --git a/lib/core/core.utils.ts b/lib/core/core.utils.ts new file mode 100644 index 0000000..5f1b89c --- /dev/null +++ b/lib/core/core.utils.ts @@ -0,0 +1,51 @@ +export function uniqueFilter(value: T, index: number, self: readonly T[]): boolean { + return self.indexOf(value) === index; +} + +export const isNotUndefined = (item: T | undefined): item is T => item !== undefined; + +export function getFileNameWithoutExtension(filePath: string): string { + if (!filePath.includes('.')) { + return filePath; + } + return filePath.substring(0, filePath.lastIndexOf('.')); +} + +export function sortAlphabetically(arrayToSort: readonly T[], propertySelector: (item: T) => string): readonly T[] { + return arrayToSort.toSorted((a, b) => propertySelector(a).toLowerCase().localeCompare(propertySelector(b).toLowerCase())); +} + +export function getStringOrUndefinedAsPropertyValue(text: string | undefined): string { + return text ? `'${text}'` : 'undefined'; +} + +export function toSafePropertyValue(value: string): string { + return value.replace(/'/g, ''); +} + +export function toOutputDirPath(outputDir: string | undefined): string { + return outputDir ? `${outputDir}/`.replaceAll('//', '/') : `./`; +} + +export function singleItemToArray(item: T | undefined): readonly T[] { + return item ? [item] : []; +} + +export function findRequired(array: readonly T[], predicate: (item: T, index: number) => boolean, errorMessage: string): T; +export function findRequired(array: readonly T[], predicate: (item: T, index: number) => boolean, errorMessage: () => never): T; +export function findRequired( + array: readonly T[], + predicate: (item: T, index: number) => boolean, + errorMessage: string | (() => never) +): T { + const item = array.find(predicate); + + if (item) { + return item; + } + + if (typeof errorMessage === 'string' || errorMessage instanceof String) { + throw Error(errorMessage.toString()); + } + return errorMessage(); +} diff --git a/lib/core/element.utils.ts b/lib/core/element.utils.ts new file mode 100644 index 0000000..a189363 --- /dev/null +++ b/lib/core/element.utils.ts @@ -0,0 +1,150 @@ +import type { ContentTypeElements, ContentTypeModels, ContentTypeSnippetModels, TaxonomyModels } from '@kontent-ai/management-sdk'; +import { match, P } from 'ts-pattern'; +import type { FlattenedElement, MultipleChoiceOption } from './core.models.js'; +import { isNotUndefined } from './core.utils.js'; + +interface ElementWrapper { + readonly element: Readonly; + readonly fromSnippet: Readonly | undefined; +} + +export function getFlattenedElements(data: { + readonly elements: readonly Readonly[]; + readonly snippets: readonly Readonly[]; + readonly taxonomies: readonly Readonly[]; + readonly types: readonly Readonly[]; +}): readonly FlattenedElement[] { + return data.elements + .flatMap((element) => { + return match(element) + .returnType() + .with({ type: 'snippet' }, (snippetElement) => { + const snippet = data.snippets.find((snippet) => snippet.id === snippetElement.snippet.id); + + if (!snippet) { + throw Error(`Could not find snippet with id '${snippetElement.snippet.id}'`); + } + + return snippet.elements.map((snippetElement) => { + return { + element: snippetElement, + fromSnippet: snippet + }; + }); + }) + .otherwise(() => { + return { + element: element, + fromSnippet: undefined + }; + }); + }) + .map((element) => { + return getFlattenedElement(element, data.taxonomies, data.types); + }) + .filter(isNotUndefined) + .filter((element) => { + return element.type !== 'guidelines'; + }); +} + +function getFlattenedElement( + wrapper: ElementWrapper, + taxonomies: readonly Readonly[], + types: readonly Readonly[] +): Readonly | undefined { + if (!wrapper.element.codename || !wrapper.element.id) { + return undefined; + } + + return { + title: getElementTitle(wrapper.element, taxonomies), + codename: wrapper.element.codename, + id: wrapper.element.id, + type: wrapper.element.type, + isRequired: isElementRequired(wrapper.element), + guidelines: getElementGuidelines(wrapper.element), + externalId: wrapper.element.external_id, + originalElement: wrapper.element, + allowedContentTypes: extractLinkedItemsAllowedTypes(wrapper.element, types), + assignedTaxonomy: extractTaxonomy(wrapper.element, taxonomies), + fromSnippet: wrapper.fromSnippet, + multipleChoiceOptions: extractMultipleChoiceOptions(wrapper.element) + }; +} + +function isElementRequired(element: Readonly): boolean { + return match(element) + .returnType() + .with({ is_required: true }, () => true) + .otherwise(() => false); +} + +function getElementGuidelines(element: Readonly): string | undefined { + return match(element) + .returnType() + .with({ guidelines: P.string }, (element) => element.guidelines) + .otherwise(() => undefined); +} + +function getElementTitle( + element: Readonly, + taxonomies: readonly Readonly[] +): string { + return match(element) + .returnType() + .with({ type: 'taxonomy' }, (taxonomyElement) => { + const taxonomyGroupId = taxonomyElement.taxonomy_group?.id; + + if (!taxonomyGroupId) { + return element.type; + } + + const taxonomy = taxonomies.find((m) => m.id === taxonomyGroupId); + return taxonomy?.name ?? element.type; + }) + .with({ name: P.string }, (element) => element.name) + .otherwise(() => 'invalidTitle'); +} + +function extractLinkedItemsAllowedTypes( + element: Readonly, + types: readonly Readonly[] +): readonly Readonly[] { + const allowedTypeIds = match(element) + .returnType() + .with({ type: P.union('modular_content', 'subpages', 'rich_text') }, (elementWithAllowedContentTypes) => { + return elementWithAllowedContentTypes.allowed_content_types?.map((m) => m.id).filter(isNotUndefined) ?? []; + }) + .otherwise(() => []); + + return allowedTypeIds.map((id) => types.find((m) => m.id === id)).filter(isNotUndefined); +} + +function extractMultipleChoiceOptions( + element: Readonly +): readonly MultipleChoiceOption[] | undefined { + return match(element) + .returnType() + .with({ type: 'multiple_choice' }, (multipleChoiceElement) => { + return multipleChoiceElement.options.map((option) => { + return { + codename: option.codename ?? '', + name: option.name + }; + }); + }) + .otherwise(() => undefined); +} + +function extractTaxonomy( + element: Readonly, + taxonomies: readonly Readonly[] +): Readonly | undefined { + return match(element) + .returnType | undefined>() + .with({ type: 'taxonomy' }, (taxonomyElement) => { + return taxonomies.find((m) => m.id === taxonomyElement.taxonomy_group?.id); + }) + .otherwise(() => undefined); +} diff --git a/lib/core/error.utils.ts b/lib/core/error.utils.ts new file mode 100644 index 0000000..49efa7a --- /dev/null +++ b/lib/core/error.utils.ts @@ -0,0 +1,62 @@ +import { SharedModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import { match, P } from 'ts-pattern'; +import type { ErrorData, OriginalManagementError } from './core.models.js'; + +export function logError(error: unknown): void { + const errorData = extractErrorData(error); + + if (errorData.isUnknownError) { + console.error(error); + } + + if (errorData.requestData) { + console.log(`${chalk.red('Request data')}: ${errorData.requestData}`); + } + + if (errorData.requestUrl) { + console.log(`${chalk.red('Request url')}: ${errorData.requestUrl}`); + } + + console.error(`${chalk.red('Error:')} ${errorData.message}`); +} + +export function extractErrorData(error: unknown): ErrorData { + return match(error) + .returnType() + .with(P.instanceOf(SharedModels.ContentManagementBaseKontentError), (error) => { + const originalError = error.originalError as OriginalManagementError | undefined; + const validationErrorMessage = error.validationErrors.length + ? `: ${error.validationErrors.map((m) => m.message).join(', ')}` + : ''; + + return { + message: `${error.message}${validationErrorMessage}`, + requestData: originalError?.response?.config?.data, + requestUrl: originalError?.response?.config?.url, + error: error, + isUnknownError: false, + isMapiError: true + }; + }) + .with(P.instanceOf(Error), (error) => { + return { + message: error.message, + requestData: undefined, + requestUrl: undefined, + error: error, + isUnknownError: true, + isMapiError: false + }; + }) + .otherwise(() => { + return { + message: `Unknown error`, + requestData: undefined, + requestUrl: undefined, + error: error, + isUnknownError: true, + isMapiError: false + }; + }); +} diff --git a/lib/core/importer.ts b/lib/core/importer.ts new file mode 100644 index 0000000..c1c4572 --- /dev/null +++ b/lib/core/importer.ts @@ -0,0 +1,27 @@ +import { parse } from 'path'; +import type { LibraryType, LiteralUnion, ModuleFileExtension } from './core.models.js'; +import { getFileNameWithoutExtension, sortAlphabetically } from './core.utils.js'; + +export function importer(moduleFileExtension: ModuleFileExtension) { + const importExtension = moduleFileExtension === 'none' ? '' : `.${moduleFileExtension}`; + + return { + importType: (data: { readonly filePathOrPackage: LiteralUnion; readonly importValue: string }): string => { + const isExternalLib = !data.filePathOrPackage.endsWith('.js') && !data.filePathOrPackage.endsWith('.ts'); + const resolvedFilePath = isExternalLib + ? data.filePathOrPackage + : `${getFileNameWithoutExtension(data.filePathOrPackage)}${importExtension}`; + + return `import type { ${data.importValue} } from '${resolvedFilePath}';`; + }, + getBarrelExportCode(filenames: readonly string[]): string { + if (!filenames.length) { + return 'export {}'; + } + return sortAlphabetically(filenames, (filename) => filename).reduce((barrelCode, filename) => { + const path = parse(filename); + return `${barrelCode} export * from '${path.dir}/${path.name}${importExtension}';`; + }, ''); + } + }; +} diff --git a/lib/core/resolvers.ts b/lib/core/resolvers.ts new file mode 100644 index 0000000..01e9008 --- /dev/null +++ b/lib/core/resolvers.ts @@ -0,0 +1,108 @@ +import type { ContentTypeElements, ContentTypeModels, ContentTypeSnippetModels, TaxonomyModels } from '@kontent-ai/management-sdk'; +import { createHash } from 'crypto'; +import { match, P } from 'ts-pattern'; +import type { CaseType, ObjectWithCodename, ObjectWithName } from './core.models.js'; + +/** File name resolvers */ +export type FilenameResolver> = undefined | CaseType | ((item: T & ObjectWithCodename) => string); +export type MapObjectToFileName = ObjectWithCodename> = (item: T, addExtension: boolean) => string; + +export type ContentTypeFileNameResolver = FilenameResolver; +export type ContentTypeSnippetFileNameResolver = FilenameResolver; +export type TaxonomyTypeFileNameResolver = FilenameResolver; + +/** Name resolvers */ +export type NameResolver> = undefined | CaseType | ((item: T & ObjectWithName) => string); +export type MapObjectToName = ObjectWithName> = (item: T) => string; + +export type ElementNameResolver = (element: Readonly) => string | undefined; +export type ContentTypeNameResolver = NameResolver; +export type ContentTypeSnippetNameResolver = NameResolver; +export type TaxonomyNameResolver = NameResolver; + +export function mapFilename(resolver: FilenameResolver): MapObjectToFileName { + return (item, addExtension) => { + return addExtensionToFilename( + match(resolver) + .returnType() + .with(P.instanceOf(Function), (resolver) => resolver(item)) + .with(undefined, () => item.codename) + .otherwise((resolverType) => resolveCase(item.codename, resolverType)), + addExtension + ); + }; +} + +export function mapName( + resolver: NameResolver, + defaultCase: CaseType, + options?: { + readonly prefix?: string; + readonly suffix?: string; + } +): MapObjectToName { + return (item) => + (options?.prefix ? options.prefix : '') + + match(resolver) + .returnType() + .with(P.instanceOf(Function), (resolver) => resolver(item)) + .with(undefined, () => resolveCase(item.name, defaultCase)) + .otherwise((resolverType) => resolveCase(item.name, resolverType)) + + (options?.suffix ? options.suffix : ''); +} + +export function resolveCase(text: string, resolverType: CaseType): string { + return match(resolverType) + .returnType() + .with('camelCase', () => toCamelCase(text)) + .with('pascalCase', () => toPascalCase(text)) + .exhaustive(); +} + +export function resolvePropertyName(value: string): string { + const propertyName = toCamelCase(value); + + if (propertyName.length === 0) { + // to prevent empty string being used as property name, use hash + return getPropertyStringHash(value); + } + + return prefixWithUnderscoreWhenStartsWithNonAlpha(propertyName); +} + +function addExtensionToFilename(filename: string, addExtension: boolean): string { + return `${filename}${addExtension ? '.ts' : ''}`; +} + +function toPascalCase(text: string): string { + return prefixWithUnderscoreWhenStartsWithNonAlpha( + toSafeStringCode( + text + .replace(/[_-]+/g, ' ') + .replace(/(?:^\w|[A-Z]|\b\w|\s+|\d\w)/g, (match, index) => (index === 0 ? match.toUpperCase() : match.toUpperCase())) + .replace(/\s+/g, '') + ) + ); +} + +function toCamelCase(text: string): string { + return toPascalCase(text).replace(/^\w/, (s) => s.toLowerCase()); +} + +function getPropertyStringHash(text: string): string { + const hash = createHash('sha256'); + hash.update(text); + return `_${hash.digest('hex')}`.slice(0, 10); +} + +function toSafeStringCode(text: string): string { + const replaceWith = ''; + return text.replace(/[\s-]/g, replaceWith).replace(/[^a-zA-Z0-9_]/g, replaceWith); +} + +function prefixWithUnderscoreWhenStartsWithNonAlpha(text: string): string { + if (/^[^a-zA-Z]/.test(text)) { + return `_${text.replace(/^_+/, '')}`; + } + return text; +} diff --git a/lib/core/type-guards.ts b/lib/core/type-guards.ts new file mode 100644 index 0000000..0476238 --- /dev/null +++ b/lib/core/type-guards.ts @@ -0,0 +1,5 @@ +import { environmentEntities, type EnvironmentEntity } from './core.models.js'; + +export function isEnvironmentEntity(value: string | undefined | null): value is EnvironmentEntity { + return typeof value === 'string' && (environmentEntities as readonly string[]).includes(value); +} diff --git a/lib/fetch/delivery-kontent-fetcher.ts b/lib/fetch/delivery-kontent-fetcher.ts new file mode 100644 index 0000000..e286747 --- /dev/null +++ b/lib/fetch/delivery-kontent-fetcher.ts @@ -0,0 +1,49 @@ +import { HttpService } from '@kontent-ai/core-sdk'; +import type { ClientTypes, IContentItem, ItemsFeedQuery } from '@kontent-ai/delivery-sdk'; +import { createDeliveryClient } from '@kontent-ai/delivery-sdk'; +import chalk from 'chalk'; +import { coreConfig } from '../config.js'; +import type { DeliveryApiMode, GeneratorDeliveryClient } from '../core/core.models.js'; +import { sortAlphabetically } from '../core/core.utils.js'; + +export function deliveryKontentFetcher(config: { + readonly environmentId: string; + readonly apiKey: string | undefined; + readonly baseUrl?: string; + readonly apiMode: DeliveryApiMode; +}) { + const client: GeneratorDeliveryClient = createDeliveryClient({ + environmentId: config.environmentId, + defaultQueryConfig: { + usePreviewMode: config.apiMode === 'preview', + useSecuredMode: config.apiMode === 'secure', + customHeaders: [ + { + header: coreConfig.kontentTrackingHeaderName, + value: coreConfig.kontentTrackingHeaderValue + } + ] + }, + secureApiKey: config.apiMode === 'secure' ? config.apiKey : undefined, + previewApiKey: config.apiMode === 'preview' ? config.apiKey : undefined, + proxy: { + baseUrl: config.baseUrl + }, + httpService: new HttpService({ logErrorsToConsole: false }) + }); + + const getItemsQuery = (filterByTypeCodenames: readonly string[]): ItemsFeedQuery => { + return filterByTypeCodenames.length > 0 ? client.itemsFeed().types(filterByTypeCodenames.map((m) => m)) : client.itemsFeed(); + }; + + return { + async getItemsAsync(filterByTypeCodenames: readonly string[]): Promise[]> { + const items = sortAlphabetically( + (await getItemsQuery(filterByTypeCodenames).toAllPromise()).data.items, + (m) => m.system.codename + ); + console.log(`Fetched '${chalk.yellow(items.length.toString())}' content items`); + return items; + } + }; +} diff --git a/lib/fetch/management-kontent-fetcher.ts b/lib/fetch/management-kontent-fetcher.ts new file mode 100644 index 0000000..1330f8a --- /dev/null +++ b/lib/fetch/management-kontent-fetcher.ts @@ -0,0 +1,191 @@ +import { HttpService } from '@kontent-ai/core-sdk'; +import type { + AssetFolderModels, + CollectionModels, + ContentItemModels, + ContentTypeModels, + ContentTypeSnippetModels, + CustomAppModels, + EnvironmentModels, + LanguageModels, + PreviewModels, + RoleModels, + SpaceModels, + TaxonomyModels, + WebhookModels, + WorkflowModels +} from '@kontent-ai/management-sdk'; +import { createManagementClient } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import { coreConfig } from '../config.js'; +import { toSafeComment } from '../core/comment.utils.js'; +import type { GeneratorManagementClient } from '../core/core.models.js'; +import { extractErrorData } from '../core/error.utils.js'; + +export type ManagementKontentFetcher = { + getEnvironmentInfoAsync(): Promise>; + getItemsAsync(): Promise[]>; + getWorkflowsAsync(): Promise[]>; + getRolesAsync(): Promise[]>; + getAssetFoldersAsync(): Promise[]>; + getCollectionsAsync(): Promise[]>; + getWebhooksAsync(): Promise[]>; + getLanguagesAsync(): Promise[]>; + getTypesAsync(): Promise[]>; + getSnippetsAsync(): Promise[]>; + getTaxonomiesAsync(): Promise[]>; + getCustomApps(): Promise[]>; + getSpaces(): Promise[]>; + getPreviewUrlConfiguration(): Promise>; +}; + +export function managementKontentFetcher(config: { + readonly environmentId: string; + readonly apiKey: string; + readonly baseUrl?: string; +}): ManagementKontentFetcher { + const client: GeneratorManagementClient = createManagementClient({ + environmentId: config.environmentId, + apiKey: config.apiKey, + baseUrl: config.baseUrl, + httpService: new HttpService({ logErrorsToConsole: false }), + headers: [{ header: coreConfig.kontentTrackingHeaderName, value: coreConfig.kontentTrackingHeaderValue }] + }); + + return { + async getEnvironmentInfoAsync(): Promise> { + const projectInformation = (await client.environmentInformation().toPromise()).data; + console.log(`Project '${chalk.cyan(toSafeComment(projectInformation.project.name))}'`); + console.log(`Environment '${chalk.cyan(toSafeComment(projectInformation.project.environment))}'\n`); + return projectInformation.project; + }, + async getItemsAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => + ( + await client + .listContentItems() + .withListQueryConfig({ + responseFetched: (response) => { + console.log(`Fetched '${chalk.yellow(response.data.items.length.toString())}' content items`); + } + }) + .toAllPromise() + ).data.items, + itemType: 'total content items' + }); + }, + async getWorkflowsAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listWorkflows().toPromise()).data, + itemType: 'workflows' + }); + }, + async getRolesAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listRoles().toPromise()).data.roles, + itemType: 'roles', + // roles are available only for enterprise subscriptions + returnEmptyArrayOnMapiError: true + }); + }, + async getAssetFoldersAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listAssetFolders().toPromise()).data.items, + itemType: 'asset folders' + }); + }, + async getCollectionsAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listCollections().toPromise()).data.collections, + itemType: 'collections' + }); + }, + async getWebhooksAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listWebhooks().toPromise()).data.webhooks, + itemType: 'webhooks' + }); + }, + async getLanguagesAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listLanguages().toAllPromise()).data.items, + itemType: 'languages' + }); + }, + async getTypesAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listContentTypes().toAllPromise()).data.items, + itemType: 'types' + }); + }, + async getSnippetsAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listContentTypeSnippets().toAllPromise()).data.items, + itemType: 'snippets' + }); + }, + async getTaxonomiesAsync(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listTaxonomies().toAllPromise()).data.items, + itemType: 'taxonomies' + }); + }, + async getCustomApps(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listCustomApps().toPromise()).data.items, + itemType: 'custom apps' + }); + }, + async getSpaces(): Promise[]> { + return await fetchItemsAsync({ + fetch: async () => (await client.listSpaces().toPromise()).data, + itemType: 'spaces' + }); + }, + async getPreviewUrlConfiguration(): Promise> { + return (await client.getPreviewConfiguration().toPromise()).data; + } + }; +} + +async function fetchItemsAsync({ + fetch, + itemType, + returnEmptyArrayOnMapiError +}: { + readonly fetch: () => Promise; + readonly returnEmptyArrayOnMapiError?: boolean; + readonly itemType: + | 'taxonomies' + | 'types' + | 'snippets' + | 'languages' + | 'spaces' + | 'webhooks' + | 'collections' + | 'custom apps' + | 'roles' + | 'asset folders' + | 'workflows' + | 'total content items'; +}): Promise { + try { + const data = await fetch(); + console.log(`Fetched '${chalk.yellow(data.length.toString())}' ${itemType}`); + return data; + } catch (error) { + if (!returnEmptyArrayOnMapiError) { + throw error; + } + + const errorData = extractErrorData(error); + + if (errorData.isMapiError) { + console.warn(`${chalk.red('Skip fetching ' + itemType)}: ${errorData.message}`); + return []; + } + + throw error; + } +} diff --git a/lib/file-helper.ts b/lib/file-helper.ts deleted file mode 100644 index 67332df..0000000 --- a/lib/file-helper.ts +++ /dev/null @@ -1,29 +0,0 @@ -import Colors from 'colors'; -import { Options } from 'prettier'; -import { formatHelper } from './format-helper.js'; -import * as fs from 'fs'; - -export class FileHelper { - async createFileOnFsAsync(text: string, filename: string, formatOptions: Options | undefined): Promise { - const finalFilename = `${filename}`; - try { - const contentToStore = await formatHelper.formatCodeAsync(text, formatOptions); - - fs.writeFileSync('./' + finalFilename, contentToStore); - console.log(`Created '${Colors.yellow(finalFilename)}'`); - } catch (error) { - console.log(`Failed to format file '${Colors.red(filename)}'. Skipping prettier for this file.`); - - const contentToStore = text; - - fs.writeFileSync('./' + finalFilename, contentToStore); - console.log(`Created '${Colors.yellow(finalFilename)}'`); - } - } - - createDir(dirPath: string): void { - fs.mkdirSync(dirPath, { recursive: true }); - } -} - -export const fileHelper = new FileHelper(); diff --git a/lib/files/file-manager.ts b/lib/files/file-manager.ts new file mode 100644 index 0000000..264225a --- /dev/null +++ b/lib/files/file-manager.ts @@ -0,0 +1,117 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import * as fs from 'fs'; +import { dirname } from 'path'; +import type { Options } from 'prettier'; +import { coreConfig } from '../config.js'; +import { getEnvironmentInfoComment } from '../core/comment.utils.js'; +import type { GeneratedFile, GeneratedSet, ModuleFileExtension } from '../core/core.models.js'; +import { toOutputDirPath } from '../core/core.utils.js'; +import { importer as _importer } from '../core/importer.js'; +import { formatCodeAsync } from '../format/formatter.js'; + +export function fileManager(config: { + readonly moduleFileExtension: ModuleFileExtension; + readonly outputDir?: string; + readonly formatOptions?: Readonly; + readonly environmentInfo: Readonly; + readonly addTimestamp: boolean; +}) { + const fixedOutputDir = toOutputDirPath(config.outputDir); + const importer = _importer(config.moduleFileExtension); + + const createFileOnFs = (text: string, filePath: string): void => { + const fullFilePath = `${fixedOutputDir.endsWith('/') ? fixedOutputDir : `${fixedOutputDir}/`}${filePath}`; + const fileContent = `${getEnvironmentInfoComment({ + environmentInfo: config.environmentInfo, + timestampDate: config.addTimestamp ? new Date() : undefined + })}\n\n${text}`; + + ensureDirectoryExistence(fullFilePath); + fs.writeFileSync('./' + fullFilePath, fileContent, {}); + console.log(`Created '${chalk.yellow(fullFilePath)}'`); + }; + + const getFormattedCodeAsync = async (code: string, filePath: string): Promise => { + try { + if (filePath.endsWith('.ts')) { + return await formatCodeAsync(code, config.formatOptions); + } + return code; + } catch { + console.log(`Failed to format file '${chalk.red(filePath)}'. Skipping prettier.`); + return code; + } + }; + + const ensureDirectoryExistence = (filePath: string): void => { + const resolvedDirname = dirname(filePath); + if (fs.existsSync(resolvedDirname)) { + return; + } + ensureDirectoryExistence(resolvedDirname); + fs.mkdirSync(resolvedDirname); + }; + + const createFiles = (files: readonly GeneratedFile[]): void => { + for (const file of files) { + createFileOnFs(file.text, file.filename); + } + }; + + const getSetFolder = (set: GeneratedSet): string => { + return set.folderName ? `${set.folderName}/` : ''; + }; + + const getSetFiles = (set: GeneratedSet): readonly GeneratedFile[] => { + const setFolder = getSetFolder(set); + const setFiles: readonly GeneratedFile[] = set.files.map((file) => { + return { + filename: `${setFolder}${file.filename}`, + text: file.text + }; + }); + + if (!set.folderName) { + return setFiles; + } + + return [ + ...setFiles, + { + filename: `${setFolder}${coreConfig.barrelExportFilename}`, + text: importer.getBarrelExportCode(set.files.map((m) => `./${m.filename}`)) + } + ]; + }; + + const getSetsBarrelExportFiles = (sets: readonly GeneratedSet[]): GeneratedFile => { + return { + filename: coreConfig.barrelExportFilename, + text: importer.getBarrelExportCode( + sets.flatMap((set) => { + if (!set.folderName) { + // include file paths themselves if there is no folder + return set.files.map((file) => `./${file.filename}`); + } + + return `./${getSetFolder(set)}${coreConfig.barrelExportFilename}`; + }) + ) + }; + }; + + return { + getSetFilesAsync: async (sets: readonly GeneratedSet[]): Promise => { + return await Promise.all( + [...sets.flatMap((set) => getSetFiles(set)), getSetsBarrelExportFiles(sets)].map>(async (file) => { + return { + filename: file.filename, + text: await getFormattedCodeAsync(file.text, file.filename) + }; + }) + ); + }, + createFiles + }; +} diff --git a/lib/format-helper.ts b/lib/format-helper.ts deleted file mode 100644 index 5617c8e..0000000 --- a/lib/format-helper.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Options, format } from 'prettier'; - -export class FormatHelper { - async formatCodeAsync(code: string, options?: Options): Promise { - const formatOptions: Options = options - ? options - : { - parser: 'typescript', - singleQuote: true, - printWidth: 120, - tabWidth: 4, - useTabs: false, - trailingComma: 'none', - bracketSpacing: true, - semi: true - }; - - return await format(code, formatOptions); - } -} - -export const formatHelper = new FormatHelper(); diff --git a/lib/format/formatter.ts b/lib/format/formatter.ts new file mode 100644 index 0000000..90bb16e --- /dev/null +++ b/lib/format/formatter.ts @@ -0,0 +1,18 @@ +import type { Options} from 'prettier'; +import { format } from 'prettier'; + +export async function formatCodeAsync(code: string, options?: Readonly): Promise { + return await format( + code, + options ?? { + parser: 'typescript', + singleQuote: true, + printWidth: 140, + tabWidth: 4, + useTabs: false, + trailingComma: 'none', + bracketSpacing: true, + semi: true + } + ); +} diff --git a/lib/generator.ts b/lib/generator.ts deleted file mode 100644 index 2cf71fc..0000000 --- a/lib/generator.ts +++ /dev/null @@ -1,317 +0,0 @@ -import Colors from 'colors'; -import { IGenerateModelsConfig, ModuleResolution } from './models.js'; -import { deliveryContentTypeGenerator } from './generators/delivery/delivery-content-type.generator.js'; -import { projectGenerator } from './generators/index.js'; -import { - AssetFolderModels, - CollectionModels, - createManagementClient, - LanguageModels, - RoleModels, - WebhookModels, - WorkflowModels -} from '@kontent-ai/management-sdk'; -import { deliveryTaxonomylGenerator as deliveryTaxonomyGenerator } from './generators/delivery/delivery-taxonomy.generator.js'; -import { commonHelper } from './common-helper.js'; -import { parse } from 'path'; -import { fileHelper } from './file-helper.js'; - -export async function generateModelsAsync(config: IGenerateModelsConfig): Promise { - console.log(Colors.green(`Model generator started \n`)); - - const outputDir: string = config.outputDir ? `${config.outputDir}/`.replaceAll('//', '/') : `./`; - - const contentTypesFolderName: string = `content-types/`; - const contentTypeSnippetsFolderName: string = `content-type-snippets/`; - const taxonomiesFolderName: string = `taxonomies/`; - const projectFolderName: string = `project/`; - - const contentTypesFolderPath: string = `${outputDir}${contentTypesFolderName}`; - const contentTypeSnippetsFolderPath: string = `${outputDir}${contentTypeSnippetsFolderName}`; - const taxonomiesFolderPath: string = `${outputDir}${taxonomiesFolderName}`; - const projectFolderPath: string = `${outputDir}${projectFolderName}`; - - try { - if (config.sdkType === 'delivery') { - console.log(`Generating '${Colors.yellow('delivery')}' models\n`); - - // prepare directories - fileHelper.createDir(contentTypesFolderPath); - fileHelper.createDir(contentTypeSnippetsFolderPath); - fileHelper.createDir(taxonomiesFolderPath); - fileHelper.createDir(projectFolderPath); - - const managementClient = createManagementClient({ - environmentId: config.environmentId, - apiKey: config.apiKey, - baseUrl: config.managementApiUrl - }); - - const moduleResolution: ModuleResolution = config.moduleResolution ?? 'node'; - - const projectInformation = (await managementClient.environmentInformation().toPromise()).data; - console.log(`Project '${Colors.yellow(projectInformation.project.name)}'`); - console.log(`Environment '${Colors.yellow(projectInformation.project.environment)}'\n`); - console.log(`Module resolution '${Colors.yellow(moduleResolution)}'\n`); - - const types = commonHelper.sortAlphabetically( - (await managementClient.listContentTypes().toAllPromise()).data.items, - (item) => item.name - ); - const snippets = commonHelper.sortAlphabetically( - (await managementClient.listContentTypeSnippets().toAllPromise()).data.items, - (item) => item.name - ); - const taxonomies = commonHelper.sortAlphabetically( - (await managementClient.listTaxonomies().toAllPromise()).data.items, - (item) => item.name - ); - - console.log(`Found '${Colors.yellow(types.length.toString())}' types`); - console.log(`Found '${Colors.yellow(snippets.length.toString())}' content type snippets`); - console.log(`Found '${Colors.yellow(taxonomies.length.toString())}' taxonomies`); - - const workflows: WorkflowModels.Workflow[] = []; - const roles: RoleModels.Role[] = []; - const assetFolders: AssetFolderModels.AssetFolder[] = []; - const collections: CollectionModels.Collection[] = []; - const webhooks: WebhookModels.Webhook[] = []; - const languages: LanguageModels.LanguageModel[] = []; - - const exportAllProjectSettings = config.exportProjectSettings ? false : true; - - if (config.exportProjectSettings?.exportWorkflows || exportAllProjectSettings) { - workflows.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listWorkflows().toPromise()).data, - (item) => item.name - ) - ); - console.log(`Found '${Colors.yellow(workflows.length.toString())}' workflows`); - } else { - console.log(`Skipping '${Colors.red('workflows')}' export`); - } - - if (config.isEnterpriseSubscription) { - if (config.exportProjectSettings?.exportRoles || exportAllProjectSettings) { - roles.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listRoles().toPromise()).data.roles, - (item) => item.name - ) - ); - console.log(`Found '${Colors.yellow(roles.length.toString())}' roles`); - } else { - console.log(`Skipping '${Colors.red('roles')}' export`); - } - } else { - console.log(`Skipping '${Colors.red('roles')}' export because enterprise subscription is disabled`); - } - - if (config.exportProjectSettings?.exportAssetFolders || exportAllProjectSettings) { - assetFolders.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listAssetFolders().toPromise()).data.items, - (item) => item.name - ) - ); - console.log( - `Found '${Colors.yellow(projectGenerator.getAssetFoldersCount(assetFolders).toString())}' asset folders` - ); - } else { - console.log(`Skipping '${Colors.red('asset folders')}' export`); - } - - if (config.exportProjectSettings?.exportCollections || exportAllProjectSettings) { - collections.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listCollections().toPromise()).data.collections, - (item) => item.name - ) - ); - console.log(`Found '${Colors.yellow(collections.length.toString())}' collections`); - } else { - console.log(`Skipping '${Colors.red('collections')}' export`); - } - - if (config.exportProjectSettings?.exportWebhooks || exportAllProjectSettings) { - webhooks.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listWebhooks().toPromise()).data.webhooks, - (item) => item.name - ) - ); - console.log(`Found '${Colors.yellow(webhooks.length.toString())}' webhooks`); - } else { - console.log(`Skipping '${Colors.red('webhooks')}' export`); - } - - if (config.exportProjectSettings?.exportLanguages || exportAllProjectSettings) { - languages.push( - ...commonHelper.sortAlphabetically( - (await managementClient.listLanguages().toAllPromise()).data.items, - (item) => item.name - ) - ); - console.log(`Found '${Colors.yellow(languages.length.toString())}' languages`); - } else { - console.log(`Skipping '${Colors.red('languages')}' export`); - } - - console.log(''); - - // create content type models - const deliveryModels = await deliveryContentTypeGenerator.generateModelsAsync({ - outputDir: outputDir, - types: types, - typeFolderName: contentTypesFolderName, - taxonomyFolderName: taxonomiesFolderName, - typeSnippetsFolderName: contentTypeSnippetsFolderName, - taxonomies: taxonomies, - snippets: snippets, - addTimestamp: config.addTimestamp, - addEnvironmentInfo: config.addEnvironmentInfo, - elementResolver: config.elementResolver, - contentTypeFileNameResolver: config.contentTypeFileResolver, - contentTypeResolver: config.contentTypeResolver, - taxonomyFileResolver: config.taxonomyTypeFileResolver, - taxonomyResolver: config.taxonomyTypeResolver, - contentTypeSnippetFileNameResolver: config.contentTypeSnippetFileResolver, - contentTypeSnippetResolver: config.contentTypeSnippetResolver, - moduleResolution: moduleResolution - }); - - // create taxonomy types - const taxonomyFiles = await deliveryTaxonomyGenerator.generateTaxonomyTypesAsync({ - taxonomies: taxonomies, - outputDir: outputDir, - taxonomyFolderName: taxonomiesFolderName, - addTimestamp: config.addTimestamp, - fileResolver: config.taxonomyTypeFileResolver, - taxonomyResolver: config.taxonomyTypeResolver - }); - - // create project structure - const projectFiles = await projectGenerator.generateProjectModel({ - outputDir: outputDir, - environmentInfo: projectInformation.project, - addTimestamp: config.addTimestamp, - formatOptions: config.formatOptions, - addEnvironmentInfo: config.addEnvironmentInfo, - languages: languages, - taxonomies: taxonomies, - types: types, - workflows: workflows, - assetFolders: assetFolders, - collections: collections, - roles: roles, - snippets: snippets, - webhooks: webhooks, - projectFolderName: projectFolderName, - sortConfig: config.sortConfig ?? { - sortTaxonomyTerms: true - } - }); - - // create barrel export - const barrelExportFilename: string = 'index.ts'; - - // content types - for (const file of deliveryModels.contentTypeFiles) { - await fileHelper.createFileOnFsAsync(file.text, file.filename, config.formatOptions); - } - const contentTypeBarrelCode = commonHelper.getBarrelExportCode({ - moduleResolution: moduleResolution, - filenames: [ - ...deliveryModels.contentTypeFiles.map((m) => { - const path = parse(m.filename); - return `./${path.name}`; - }) - ] - }); - const contentTypeBarrelExportPath: string = `${contentTypesFolderPath}${barrelExportFilename}`; - await fileHelper.createFileOnFsAsync( - contentTypeBarrelCode, - contentTypeBarrelExportPath, - config.formatOptions - ); - - // content type snippets - for (const file of deliveryModels.snippetFiles) { - await fileHelper.createFileOnFsAsync(file.text, file.filename, config.formatOptions); - } - const contentTypeSnippetsBarrelCode = commonHelper.getBarrelExportCode({ - moduleResolution: moduleResolution, - filenames: [ - ...deliveryModels.snippetFiles.map((m) => { - const path = parse(m.filename); - return `./${path.name}`; - }) - ] - }); - const contentTypeSnippetsBarrelExportPath: string = `${contentTypeSnippetsFolderPath}${barrelExportFilename}`; - await fileHelper.createFileOnFsAsync( - contentTypeSnippetsBarrelCode, - contentTypeSnippetsBarrelExportPath, - config.formatOptions - ); - - // taxonomies - for (const file of taxonomyFiles) { - await fileHelper.createFileOnFsAsync(file.text, file.filename, config.formatOptions); - } - const taxonomiesBarrelCode = commonHelper.getBarrelExportCode({ - moduleResolution: moduleResolution, - filenames: [ - ...taxonomyFiles.map((m) => { - const path = parse(m.filename); - return `./${path.name}`; - }) - ] - }); - const taxonomiesBarrelExportPath: string = `${taxonomiesFolderPath}${barrelExportFilename}`; - await fileHelper.createFileOnFsAsync( - taxonomiesBarrelCode, - taxonomiesBarrelExportPath, - config.formatOptions - ); - - // project barrel - for (const file of projectFiles) { - await fileHelper.createFileOnFsAsync(file.text, file.filename, config.formatOptions); - } - const projectBarrelCode = commonHelper.getBarrelExportCode({ - moduleResolution: moduleResolution, - filenames: [ - ...projectFiles.map((m) => { - const path = parse(m.filename); - return `./${path.name}`; - }) - ] - }); - const projectBarrelExportPath: string = `${projectFolderPath}${barrelExportFilename}`; - await fileHelper.createFileOnFsAsync(projectBarrelCode, projectBarrelExportPath, config.formatOptions); - - // main barrel - const mainBarrelCode = commonHelper.getBarrelExportCode({ - moduleResolution: moduleResolution, - filenames: [ - `./${projectFolderName}index`, - `./${contentTypesFolderName}index`, - `./${contentTypeSnippetsFolderName}index`, - `./${taxonomiesFolderName}index` - ] - }); - const mainBarrelExportPath: string = `${outputDir}${barrelExportFilename}`; - await fileHelper.createFileOnFsAsync(mainBarrelCode, mainBarrelExportPath, config.formatOptions); - } else if (config.sdkType === 'management') { - console.log('Not available yet'); - } else { - throw Error(`Unsupported 'sdkType'. Supported values are: delivery, management`); - } - console.log(Colors.green(`\nCompleted`)); - } catch (error) { - console.log(Colors.red(`Failed with error:`)); - throw error; - } -} diff --git a/lib/generators/delivery/delivery-content-type.generator.ts b/lib/generators/delivery/delivery-content-type.generator.ts index 02390b8..3e77c4a 100644 --- a/lib/generators/delivery/delivery-content-type.generator.ts +++ b/lib/generators/delivery/delivery-content-type.generator.ts @@ -1,847 +1,571 @@ -import Colors from 'colors'; -import { commonHelper, IGeneratedFile } from '../../common-helper.js'; -import { - ContentTypeResolver, - ElementResolver, +import type { CollectionModels, EnvironmentModels, LanguageModels, TaxonomyModels, WorkflowModels } from '@kontent-ai/management-sdk'; +import { ContentTypeModels, ContentTypeSnippetModels } from '@kontent-ai/management-sdk'; +import { match, P } from 'ts-pattern'; +import { coreConfig, deliveryConfig, sharedTypesConfig } from '../../config.js'; +import { toGuidelinesComment, wrapComment } from '../../core/comment.utils.js'; +import type { FlattenedElement, GeneratedFile, GeneratedSet, ModuleFileExtension } from '../../core/core.models.js'; +import { isNotUndefined, sortAlphabetically, uniqueFilter } from '../../core/core.utils.js'; +import { getFlattenedElements } from '../../core/element.utils.js'; +import { importer as _importer } from '../../core/importer.js'; +import type { ContentTypeFileNameResolver, - TaxonomyTypeFileNameResolver, - TaxonomyTypeResolver, - ContentTypeSnippetResolver, + ContentTypeNameResolver, ContentTypeSnippetFileNameResolver, - ModuleResolution -} from '../../models.js'; -import { - ContentTypeElements, - ContentTypeModels, - ContentTypeSnippetModels, - ElementModels, - TaxonomyModels -} from '@kontent-ai/management-sdk'; + ContentTypeSnippetNameResolver, + TaxonomyNameResolver, + TaxonomyTypeFileNameResolver +} from '../../core/resolvers.js'; +import { mapFilename, mapName } from '../../core/resolvers.js'; import { - MapContentTypeToDeliveryTypeName, - MapContentTypeIdToObject, - MapContentTypeToFileName, - MapElementToName, - getMapContentTypeToDeliveryTypeName, - getMapContentTypeIdToObject, - getMapContentTypeToFileName, - getMapElementToName, - MapTaxonomyToFileName, - MapTaxonomyName, - getMapTaxonomyName, - getMapTaxonomyToFileName, - MapTaxonomyIdTobject, - getMapTaxonomyIdTobject, - MapContentTypeSnippetToFileName, - MapContentTypeSnippetToDeliveryTypeName, - getMapContentTypeSnippetToDeliveryTypeName, - getMapContentTypeSnippetToFileName, - MapContentTypeSnippetIdToObject, - getMapContentTypeSnippetIdToObject -} from './delivery-mappers.js'; -import { textHelper } from '../../text-helper.js'; - -interface IExtendedContentTypeElement { - type: ElementModels.ElementType; - element: ContentTypeElements.ContentTypeElementModel; - mappedType: string | undefined; - mappedName: string | undefined; - snippet?: ContentTypeSnippetModels.ContentTypeSnippet; + getCollectionCodenamesType, + getContentTypeCodenamesType, + getElementCodenamesType, + getLanguageCodenamesType, + getTaxonomyCodenamesType, + getWorkflowCodenamesType, + getWorkflowStepCodenamesType +} from '../shared/type-codename.generator.js'; + +interface ExtractImportsResult { + readonly typeName: string; + readonly imports: readonly string[]; + readonly contentTypeExtends: string | undefined; } -interface IExtractImportsResult { - imports: string[]; - contentTypeSnippetExtensions: string[]; - processedElements: IExtendedContentTypeElement[]; +type ContentTypeOrSnippet = Readonly; + +export interface DeliveryContentTypeGeneratorConfig { + readonly moduleFileExtension: ModuleFileExtension; + + readonly environmentData: { + readonly environment: Readonly; + readonly types: readonly Readonly[]; + readonly snippets: readonly Readonly[]; + readonly workflows: readonly Readonly[]; + readonly languages: readonly Readonly[]; + readonly collections: readonly Readonly[]; + readonly taxonomies: readonly Readonly[]; + }; + + readonly fileResolvers?: { + readonly contentType?: ContentTypeFileNameResolver; + readonly snippet?: ContentTypeSnippetFileNameResolver; + readonly taxonomy?: TaxonomyTypeFileNameResolver; + }; + + readonly nameResolvers?: { + readonly contentType?: ContentTypeNameResolver; + readonly snippet?: ContentTypeSnippetNameResolver; + readonly taxonomy?: TaxonomyNameResolver; + }; } -export class DeliveryContentTypeGenerator { - private readonly deliveryNpmPackageName: string = '@kontent-ai/delivery-sdk'; - - async generateModelsAsync(data: { - outputDir: string; - typeFolderName: string; - typeSnippetsFolderName: string; - taxonomyFolderName: string; - types: ContentTypeModels.ContentType[]; - taxonomies: TaxonomyModels.Taxonomy[]; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - elementResolver?: ElementResolver; - contentTypeFileNameResolver?: ContentTypeFileNameResolver; - contentTypeSnippetFileNameResolver?: ContentTypeSnippetFileNameResolver; - contentTypeResolver?: ContentTypeResolver; - contentTypeSnippetResolver?: ContentTypeSnippetResolver; - taxonomyFileResolver?: TaxonomyTypeFileNameResolver; - taxonomyResolver?: TaxonomyTypeResolver; - moduleResolution: ModuleResolution; - }): Promise<{ contentTypeFiles: IGeneratedFile[]; snippetFiles: IGeneratedFile[] }> { - const typeFiles: IGeneratedFile[] = []; - const snippetFiles: IGeneratedFile[] = []; - - let addNewLineAfterResolvers: boolean = false; - - if (data.elementResolver) { - addNewLineAfterResolvers = true; - console.log( - `Using '${Colors.yellow( - data.elementResolver instanceof Function ? 'custom' : data.elementResolver - )}' name resolver for content type elements` - ); - } - - if (data.contentTypeFileNameResolver) { - addNewLineAfterResolvers = true; - console.log( - `Using '${Colors.yellow( - data.contentTypeFileNameResolver instanceof Function ? 'custom' : data.contentTypeFileNameResolver - )}' name resolver for content type filenames` - ); - } - - if (data.contentTypeSnippetFileNameResolver) { - addNewLineAfterResolvers = true; - console.log( - `Using '${Colors.yellow( - data.contentTypeSnippetFileNameResolver instanceof Function - ? 'custom' - : data.contentTypeSnippetFileNameResolver - )}' name resolver for content type snippet filenames` - ); +export function deliveryContentTypeGenerator(config: DeliveryContentTypeGeneratorConfig) { + const fileResolvers = { + snippet: mapFilename(config.fileResolvers?.snippet), + contentType: mapFilename(config.fileResolvers?.contentType), + taxonomy: mapFilename(config.fileResolvers?.taxonomy) + }; + + const importer = _importer(config.moduleFileExtension); + + const nameResolvers = { + snippet: mapName(config.nameResolvers?.snippet, 'pascalCase'), + contentType: mapName(config.nameResolvers?.contentType, 'pascalCase'), + taxonomy: mapName(config.nameResolvers?.taxonomy, 'pascalCase') + }; + + const getContentTypeSystemImports = (): readonly string[] => { + return [ + importer.importType({ + filePathOrPackage: `../${deliveryConfig.systemTypesFolderName}/${coreConfig.barrelExportFilename}`, + importValue: [deliveryConfig.coreContentTypeName].join(', ') + }) + ]; + }; + + const getSnippetImports = (snippets: readonly Readonly[]): readonly string[] => { + if (snippets.length === 0) { + return []; } - if (data.contentTypeResolver) { - addNewLineAfterResolvers = true; - console.log( - `Using '${Colors.yellow( - data.contentTypeResolver instanceof Function ? 'custom' : data.contentTypeResolver - )}' name resolver for content types` - ); + return [ + importer.importType({ + filePathOrPackage: `../${deliveryConfig.contentTypeSnippetsFolderName}/${coreConfig.barrelExportFilename}`, + importValue: snippets + .map((snippet) => nameResolvers.snippet(snippet)) + .map((m) => m) + .filter(uniqueFilter) + .join(', ') + }) + ]; + }; + + const getReferencedTypeImports = (typeOrSnippet: ContentTypeOrSnippet, elements: readonly FlattenedElement[]): readonly string[] => { + const referencedTypeNames = elements + // only take elements that are not from snippets + .filter((m) => !m.fromSnippet) + .map((flattenedElement) => { + return match(flattenedElement) + .returnType() + .with( + P.union({ type: 'modular_content' }, { type: 'subpages' }, { type: 'rich_text' }), + (alementWithAllowedContentTypes) => { + return (alementWithAllowedContentTypes.allowedContentTypes ?? []) + .filter((allowedContentType) => { + // filter self-referencing types as they do not need to be importer + if (allowedContentType.codename === typeOrSnippet.codename) { + return false; + } + return true; + }) + .map((allowedContentType) => { + return nameResolvers.contentType(allowedContentType); + }); + } + ) + .otherwise(() => []); + }) + .flatMap((m) => m) + .filter(isNotUndefined) + .filter(uniqueFilter); + + if (referencedTypeNames.length === 0) { + return []; } - if (data.contentTypeSnippetResolver) { - addNewLineAfterResolvers = true; - console.log( - `Using '${Colors.yellow( - data.contentTypeSnippetResolver instanceof Function ? 'custom' : data.contentTypeSnippetResolver - )}' name resolver for content type snippets` - ); - } + return [ + importer.importType({ + filePathOrPackage: + typeOrSnippet instanceof ContentTypeSnippetModels.ContentTypeSnippet + ? `../${deliveryConfig.contentTypesFolderName}/${coreConfig.barrelExportFilename}` + : `./${coreConfig.barrelExportFilename}`, + importValue: referencedTypeNames.join(', ') + }) + ]; + }; + + const getReferencedTaxonomyImports = (elements: readonly FlattenedElement[]): readonly string[] => { + const taxonomyTypeNames = elements + // only take elements that are not from snippets + .filter((m) => !m.fromSnippet) + .map((flattenedElement) => { + return match(flattenedElement) + .returnType() + .with({ type: 'taxonomy' }, (taxonomyElement) => { + if (!taxonomyElement.assignedTaxonomy) { + throw Error(`Invalid taxonomy for element '${taxonomyElement.codename}'`); + } + + return nameResolvers.taxonomy(taxonomyElement.assignedTaxonomy); + }) + .otherwise(() => undefined); + }) + .filter(isNotUndefined) + .filter(uniqueFilter); - if (addNewLineAfterResolvers) { - console.log(''); + if (taxonomyTypeNames.length === 0) { + return []; } - for (const contentTypeSnippet of data.snippets) { - try { - const file = this.createContentTypeSnippetModel({ - outputDir: data.outputDir, - snippet: contentTypeSnippet, - snippets: data.snippets, - taxonomies: data.taxonomies, - typeFolderName: data.typeFolderName, - typeSnippetsFolderName: data.typeSnippetsFolderName, - taxonomyFolderName: data.taxonomyFolderName, - contentTypeSnippetNameMap: getMapContentTypeSnippetToDeliveryTypeName( - data.contentTypeSnippetResolver - ), - contentTypeSnippetFileNameMap: getMapContentTypeSnippetToFileName( - data.contentTypeSnippetFileNameResolver - ), - contentTypeNameMap: getMapContentTypeToDeliveryTypeName(data.contentTypeResolver), - contentTypeObjectMap: getMapContentTypeIdToObject(data.types), - contentTypeSnippetObjectMap: getMapContentTypeSnippetIdToObject(data.snippets), - contentTypeFileNameMap: getMapContentTypeToFileName(data.contentTypeFileNameResolver), - elementNameMap: getMapElementToName(data.elementResolver), - taxonomyNameMap: getMapTaxonomyName(data.taxonomyResolver), - taxonomyFileNameMap: getMapTaxonomyToFileName(data.taxonomyFileResolver), - taxonomyObjectMap: getMapTaxonomyIdTobject(data.taxonomies), - addTimestamp: data.addTimestamp, - addEnvironmentInfo: data.addEnvironmentInfo, - moduleResolution: data.moduleResolution - }); - snippetFiles.push(file); - } catch (error) { - console.error(error); - throw Error( - `Failed to process content type snippet '${contentTypeSnippet.codename}' (${contentTypeSnippet.name})` - ); - } - } + return [ + importer.importType({ + filePathOrPackage: `../${deliveryConfig.taxonomiesFolderName}/${coreConfig.barrelExportFilename}`, + importValue: taxonomyTypeNames.join(', ') + }) + ]; + }; - for (const type of data.types) { - try { - const file = this.createContentTypeModel({ - moduleResolution: data.moduleResolution, - outputDir: data.outputDir, - type: type, - snippets: data.snippets, - taxonomies: data.taxonomies, - typeFolderName: data.typeFolderName, - typeSnippetsFolderName: data.typeSnippetsFolderName, - taxonomyFolderName: data.taxonomyFolderName, - contentTypeSnippetNameMap: getMapContentTypeSnippetToDeliveryTypeName( - data.contentTypeSnippetResolver - ), - contentTypeSnippetFileNameMap: getMapContentTypeSnippetToFileName( - data.contentTypeSnippetFileNameResolver - ), - contentTypeNameMap: getMapContentTypeToDeliveryTypeName(data.contentTypeResolver), - contentTypeObjectMap: getMapContentTypeIdToObject(data.types), - contentTypeFileNameMap: getMapContentTypeToFileName(data.contentTypeFileNameResolver), - contentTypeSnippetObjectMap: getMapContentTypeSnippetIdToObject(data.snippets), - elementNameMap: getMapElementToName(data.elementResolver), - taxonomyNameMap: getMapTaxonomyName(data.taxonomyResolver), - taxonomyFileNameMap: getMapTaxonomyToFileName(data.taxonomyFileResolver), - taxonomyObjectMap: getMapTaxonomyIdTobject(data.taxonomies), - addTimestamp: data.addTimestamp, - addEnvironmentInfo: data.addEnvironmentInfo - }); - typeFiles.push(file); - } catch (error) { - console.error(error); - throw Error(`Failed to process content type '${type.codename}' (${type.name})`); - } - } + const getContentTypeModelImports = (data: { + readonly contentType: Readonly; + readonly flattenedElements: readonly FlattenedElement[]; + }): ExtractImportsResult => { + const snippets = data.flattenedElements.map((flattenedElement) => flattenedElement.fromSnippet).filter(isNotUndefined); return { - contentTypeFiles: typeFiles, - snippetFiles: snippetFiles + imports: sortAlphabetically( + [ + ...getContentTypeSystemImports(), + ...getReferencedTypeImports(data.contentType, data.flattenedElements), + ...getReferencedTaxonomyImports(data.flattenedElements), + ...getSnippetImports(snippets) + ] + .filter(isNotUndefined) + .filter(uniqueFilter), + (importValue) => importValue + ), + contentTypeExtends: snippets.length + ? `& ${sortAlphabetically( + snippets.map((snippet) => nameResolvers.snippet(snippet)).filter(uniqueFilter), + (snippetName) => snippetName + ).join(' & ')}` + : undefined, + typeName: nameResolvers.contentType(data.contentType) }; - } - - private getContentTypeImports(data: { - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeSnippetNameMap: MapContentTypeSnippetToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - contentTypeSnippetObjectMap: MapContentTypeSnippetIdToObject; - contentTypeFileNameMap: MapContentTypeToFileName; - contentTypeSnippetFileNameMap: MapContentTypeSnippetToFileName; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - taxonomyFileNameMap: MapTaxonomyToFileName; - elementNameMap: MapElementToName; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - contentType?: ContentTypeModels.ContentType; - contentTypeSnippet?: ContentTypeSnippetModels.ContentTypeSnippet; - typeFolderName: string; - typeSnippetsFolderName: string; - taxonomyFolderName: string; - moduleResolution: ModuleResolution; - }): IExtractImportsResult { - const imports: string[] = []; - const contentTypeSnippetExtensions: string[] = []; - const processedTypeIds: string[] = []; - const processedTaxonomyIds: string[] = []; - - const extendedElements: IExtendedContentTypeElement[] = this.getExtendedElements({ - elementNameMap: data.elementNameMap, - contentType: data.contentType, - contentTypeSnippet: data.contentTypeSnippet, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap - }); - - for (const extendedElement of extendedElements) { - const element = extendedElement.element; - - if (element.type === 'taxonomy') { - const taxonomy = this.extractUsedTaxonomy(element, data.taxonomyObjectMap); - - if (!taxonomy) { - continue; - } - - if (processedTaxonomyIds.includes(taxonomy.id)) { - continue; - } - - processedTaxonomyIds.push(taxonomy.id); - - const taxonomyName: string = data.taxonomyNameMap(taxonomy); - const fileName: string = `../${data.taxonomyFolderName}${data.taxonomyFileNameMap(taxonomy, false)}`; - - imports.push( - commonHelper.getImportStatement({ - moduleResolution: data.moduleResolution, - filePath: fileName, - importValue: `type ${taxonomyName}`, - isExternalLib: false - }) - ); - } else if (element.type === 'modular_content' || element.type === 'subpages') { - // extract referenced types - const referencedTypes = this.extractLinkedItemsAllowedTypes(element, data.contentTypeObjectMap); - - for (const referencedType of referencedTypes) { - if (processedTypeIds.includes(referencedType.id)) { - // type was already processed, no need to import it multiple times - continue; - } - - // filter 'self referencing' types as they don't need to be imported - if (data.contentType?.id === referencedType.id) { - continue; - } - - processedTypeIds.push(referencedType.id); - - const typeName: string = data.contentTypeNameMap(referencedType); - const fileName: string = `${data.contentTypeFileNameMap(referencedType, false)}`; - - const filePath: string = data.contentTypeSnippet - ? `../${data.typeFolderName}${fileName}` - : `./${fileName}`; - - imports.push( - commonHelper.getImportStatement({ - moduleResolution: data.moduleResolution, - filePath: filePath, - importValue: `type ${typeName}`, - isExternalLib: false - }) - ); - } - } else if (element.type === 'snippet') { - const contentTypeSnipped = this.extractUsedSnippet(element, data.contentTypeSnippetObjectMap); - - const typeName: string = data.contentTypeSnippetNameMap(contentTypeSnipped); - const filePath: string = `../${data.typeSnippetsFolderName}${data.contentTypeSnippetFileNameMap( - contentTypeSnipped, - false - )}`; - - imports.push( - commonHelper.getImportStatement({ - moduleResolution: data.moduleResolution, - filePath: filePath, - importValue: `type ${typeName}`, - isExternalLib: false - }) - ); + }; - contentTypeSnippetExtensions.push(typeName); - } - } + const getSnippetModelImports = (data: { + readonly snippet: Readonly; + readonly flattenedElements: readonly FlattenedElement[]; + }): ExtractImportsResult => { + const snippets = data.flattenedElements.map((flattenedElement) => flattenedElement.fromSnippet).filter(isNotUndefined); return { - imports: commonHelper.sortAlphabetically(imports, (item) => item), - contentTypeSnippetExtensions: contentTypeSnippetExtensions, - processedElements: extendedElements + imports: sortAlphabetically( + [ + ...getReferencedTypeImports(data.snippet, data.flattenedElements), + ...getReferencedTaxonomyImports(data.flattenedElements), + ...getSnippetImports(snippets) + ] + .filter(isNotUndefined) + .filter(uniqueFilter), + (importValue) => importValue + ), + contentTypeExtends: undefined, + typeName: nameResolvers.snippet(data.snippet) }; - } - - private getModelCode(data: { - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeSnippetNameMap: MapContentTypeSnippetToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - contentTypeSnippetObjectMap: MapContentTypeSnippetIdToObject; - contentTypeFileNameMap: MapContentTypeToFileName; - contentTypeSnippetFileNameMap: MapContentTypeSnippetToFileName; - elementNameMap: MapElementToName; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - taxonomyFileNameMap: MapTaxonomyToFileName; - contentType?: ContentTypeModels.ContentType; - contentTypeSnippet?: ContentTypeSnippetModels.ContentTypeSnippet; - taxonomies: TaxonomyModels.Taxonomy[]; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - typeFolderName: string; - typeSnippetsFolderName: string; - taxonomyFolderName: string; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - moduleResolution: ModuleResolution; - }): string { - const importResult = this.getContentTypeImports({ - elementNameMap: data.elementNameMap, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeSnippetNameMap: data.contentTypeSnippetNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - contentTypeFileNameMap: data.contentTypeFileNameMap, - contentTypeSnippetFileNameMap: data.contentTypeSnippetFileNameMap, - contentTypeSnippetObjectMap: data.contentTypeSnippetObjectMap, - taxonomyFileNameMap: data.taxonomyFileNameMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap, - snippets: data.snippets, - contentType: data.contentType, - contentTypeSnippet: data.contentTypeSnippet, - typeFolderName: data.typeFolderName, - typeSnippetsFolderName: data.typeSnippetsFolderName, - taxonomyFolderName: data.taxonomyFolderName, - moduleResolution: data.moduleResolution + }; + + const getTypeDeliverySdkImports = ( + typeOrSnippet: ContentTypeOrSnippet, + flattenedElements: readonly FlattenedElement[] + ): readonly string[] => { + return sortAlphabetically( + [ + ...(typeOrSnippet instanceof ContentTypeSnippetModels.ContentTypeSnippet ? [deliveryConfig.sdkTypes.snippet] : []), + ...(flattenedElements.length ? [deliveryConfig.sdkTypes.elements] : []) + ], + (importValue) => importValue + ); + }; + + const getSnippetCode = (snippet: Readonly): string => { + const flattenedElements = getFlattenedElements({ + elements: snippet.elements, + snippets: config.environmentData.snippets, + taxonomies: config.environmentData.taxonomies, + types: config.environmentData.types }); - const topLevelImports: string[] = ['type IContentItem']; - - if (importResult.processedElements.filter((m) => m.type !== 'snippet' && m.type !== 'guidelines').length) { - // add 'Elements' import only if there is > 1 elements in content type - topLevelImports.push('type Elements'); - } - - let code = commonHelper.getImportStatement({ - moduleResolution: data.moduleResolution, - filePath: this.deliveryNpmPackageName, - importValue: `${topLevelImports.join(', ')}`, - isExternalLib: true + const importsResult = getSnippetModelImports({ + snippet, + flattenedElements }); - if (importResult.imports.length) { - for (const importItem of importResult.imports) { - code += `${importItem}`; - } - - code += `\n`; - } - - let comment: string = ''; - let typeName: string = ''; - let typeExtends: string = ''; - - if (data.contentType) { - comment = this.getContentTypeComment(data.contentType); - typeName = data.contentTypeNameMap(data.contentType); + const nameOfTypeRepresentingAllElementCodenames = getNameOfTypeRepresentingAllElementCodenames(snippet); + + return ` +${importer.importType({ + filePathOrPackage: deliveryConfig.npmPackageName, + importValue: `${getTypeDeliverySdkImports(snippet, flattenedElements).join(', ')}` +})} +${importsResult.imports.join('\n')} + +${wrapComment(` +* ${snippet.name} +* +* Id: ${snippet.id} +* Codename: ${snippet.codename} +`)} +export type ${importsResult.typeName} = ${deliveryConfig.sdkTypes.snippet}<${nameOfTypeRepresentingAllElementCodenames}, +${getElementsCode(flattenedElements)}>; + +${wrapComment(` +* Type representing all available element codenames for ${snippet.name} +`)} +${getContentTypeElementCodenamesType(nameOfTypeRepresentingAllElementCodenames, flattenedElements)} +`; + }; + + const getContentTypeCode = (contentType: Readonly): string => { + const flattenedElements = getFlattenedElements({ + elements: contentType.elements, + snippets: config.environmentData.snippets, + taxonomies: config.environmentData.taxonomies, + types: config.environmentData.types + }); - if (importResult.contentTypeSnippetExtensions.length) { - typeExtends = `& ${importResult.contentTypeSnippetExtensions.join(' & ')}`; - } - } else if (data.contentTypeSnippet) { - comment = this.getContentTypeSnippetComment(data.contentTypeSnippet); - typeName = data.contentTypeSnippetNameMap(data.contentTypeSnippet); - } + const importsResult = getContentTypeModelImports({ + contentType, + flattenedElements + }); - code += ` -/** -* ${commonHelper.getAutogenerateNote(data.addTimestamp)} + const nameOfTypeRepresentingAllElementCodenames = getNameOfTypeRepresentingAllElementCodenames(contentType); + + return ` +${importer.importType({ + filePathOrPackage: deliveryConfig.npmPackageName, + importValue: `${getTypeDeliverySdkImports(contentType, flattenedElements).join(', ')}` +})} +${importsResult.imports.join('\n')} + +${wrapComment(` +* ${contentType.name} +* +* Id: ${contentType.id} +* Codename: ${contentType.codename} +`)} +export type ${importsResult.typeName} = ${deliveryConfig.coreContentTypeName}< +${nameOfTypeRepresentingAllElementCodenames}, +${getElementsCode(flattenedElements)}${importsResult.contentTypeExtends ? ` ${importsResult.contentTypeExtends}` : ''}, +'${contentType.codename}'> + +${wrapComment(` +* Type representing all available element codenames for ${contentType.name} +`)} +${getContentTypeElementCodenamesType(nameOfTypeRepresentingAllElementCodenames, flattenedElements)}; + +${wrapComment(` +* Type guard for ${contentType.name} * -* ${comment} -*/ -export type ${typeName} = IContentItem<{ - ${this.getElementsCode({ - contentTypeObjectMap: data.contentTypeObjectMap, - contentTypeNameMap: data.contentTypeNameMap, - contentType: data.contentType, - contentTypeSnippet: data.contentTypeSnippet, - snippets: data.snippets, - elementNameMap: data.elementNameMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap, - taxonomies: data.taxonomies - })} -}>${typeExtends}; +* Id: ${contentType.id} +* Codename: ${contentType.codename} +`)} +${getContentItemTypeGuardFunction(contentType)}; `; - return code; - } - - private createContentTypeModel(data: { - outputDir: string; - type: ContentTypeModels.ContentType; - typeFolderName: string; - typeSnippetsFolderName: string; - taxonomyFolderName: string; - taxonomies: TaxonomyModels.Taxonomy[]; - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeSnippetNameMap: MapContentTypeSnippetToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - contentTypeFileNameMap: MapContentTypeToFileName; - contentTypeSnippetFileNameMap: MapContentTypeSnippetToFileName; - contentTypeSnippetObjectMap: MapContentTypeSnippetIdToObject; - elementNameMap: MapElementToName; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - taxonomyFileNameMap: MapTaxonomyToFileName; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - moduleResolution: ModuleResolution; - }): IGeneratedFile { - const filename: string = `${data.outputDir}${data.typeFolderName}${data.contentTypeFileNameMap( - data.type, - true - )}`; - const code = this.getModelCode({ - contentTypeFileNameMap: data.contentTypeFileNameMap, - contentTypeSnippetFileNameMap: data.contentTypeSnippetFileNameMap, - contentTypeSnippetNameMap: data.contentTypeSnippetNameMap, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - contentTypeSnippetObjectMap: data.contentTypeSnippetObjectMap, - contentType: data.type, - contentTypeSnippet: undefined, - snippets: data.snippets, - taxonomies: data.taxonomies, - typeFolderName: data.typeFolderName, - typeSnippetsFolderName: data.typeSnippetsFolderName, - taxonomyFolderName: data.taxonomyFolderName, - addTimestamp: data.addTimestamp, - addEnvironmentInfo: data.addEnvironmentInfo, - elementNameMap: data.elementNameMap, - taxonomyFileNameMap: data.taxonomyFileNameMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap, - moduleResolution: data.moduleResolution - }); + }; + const createTypeModel = (type: Readonly): GeneratedFile => { return { - filename: filename, - text: code + filename: fileResolvers.contentType(type, true), + text: getContentTypeCode(type) }; - } - - private createContentTypeSnippetModel(data: { - outputDir: string; - snippet: ContentTypeSnippetModels.ContentTypeSnippet; - typeSnippetsFolderName: string; - taxonomyFolderName: string; - typeFolderName: string; - taxonomies: TaxonomyModels.Taxonomy[]; - contentTypeSnippetNameMap: MapContentTypeSnippetToDeliveryTypeName; - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeFileNameMap: MapContentTypeToFileName; - contentTypeObjectMap: MapContentTypeIdToObject; - contentTypeSnippetFileNameMap: MapContentTypeSnippetToFileName; - contentTypeSnippetObjectMap: MapContentTypeSnippetIdToObject; - elementNameMap: MapElementToName; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - taxonomyFileNameMap: MapTaxonomyToFileName; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - moduleResolution: ModuleResolution; - }): IGeneratedFile { - const filename: string = `${data.outputDir}${data.typeSnippetsFolderName}${data.contentTypeSnippetFileNameMap( - data.snippet, - true - )}`; - const code = this.getModelCode({ - contentTypeFileNameMap: data.contentTypeFileNameMap, - contentTypeSnippetFileNameMap: data.contentTypeSnippetFileNameMap, - contentTypeSnippetNameMap: data.contentTypeSnippetNameMap, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - contentTypeSnippetObjectMap: data.contentTypeSnippetObjectMap, - contentType: undefined, - contentTypeSnippet: data.snippet, - snippets: data.snippets, - taxonomies: data.taxonomies, - typeFolderName: data.typeFolderName, - typeSnippetsFolderName: data.typeSnippetsFolderName, - taxonomyFolderName: data.taxonomyFolderName, - addTimestamp: data.addTimestamp, - addEnvironmentInfo: data.addEnvironmentInfo, - elementNameMap: data.elementNameMap, - taxonomyFileNameMap: data.taxonomyFileNameMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap, - moduleResolution: data.moduleResolution - }); + }; + const createSnippetModel = (type: Readonly): GeneratedFile => { return { - filename: filename, - text: code + filename: fileResolvers.contentType(type, true), + text: getSnippetCode(type) }; - } - - private getContentTypeComment(contentType: ContentTypeModels.ContentType): string { - let comment: string = `${contentType.name}`; - - comment += `\n* Id: ${contentType.id}`; - comment += `\n* Codename: ${contentType.codename}`; - - return comment; - } - - private getContentTypeSnippetComment(contentTypeSnippet: ContentTypeSnippetModels.ContentTypeSnippet): string { - let comment: string = `${contentTypeSnippet.name}`; - - comment += `\n* Id: ${contentTypeSnippet.id}`; - comment += `\n* Codename: ${contentTypeSnippet.codename}`; - - return comment; - } - - private getElementComment( - extendedElement: IExtendedContentTypeElement, - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - const element = extendedElement.element; - const isRequired = commonHelper.isElementRequired(element); - const guidelines = commonHelper.getElementGuidelines(element); - const name = commonHelper.getElementTitle(element, taxonomies); - const codename = commonHelper.getElementCodename(element); + }; - let comment: string = '/**'; + const getElementsCode = (flattenedElements: readonly FlattenedElement[]): string => { + const filteredElements = flattenedElements + // filter out elements that are from snippets + .filter((m) => !m.fromSnippet); - if (name) { - comment += `\n* ${name} (${element.type})`; + if (filteredElements.length === 0) { + return `Record`; } - comment += `\n* Required: ${isRequired ? 'true' : 'false'}`; - comment += `\n* Id: ${element.id}`; + return ( + filteredElements.reduce((code, element) => { + const mappedType = mapElementType(element); - if (codename) { - comment += `\n* Codename: ${codename}`; - } - - if (extendedElement.snippet) { - comment += `\n* From snippet: ${extendedElement.snippet.name}`; - comment += `\n* Snippet codename: ${extendedElement.snippet.codename}`; - } + if (!mappedType) { + return code; + } - if (guidelines) { - comment += `\n*`; - comment += `\n* ${textHelper.removeLineEndings(guidelines)}`; + return (code += ` + ${wrapComment(` + * ${element.title} + * + * Type: ${element.type} + * Required: ${element.isRequired ? 'true' : 'false'} + * Codename: ${element.codename} + * Id: ${element.id}${element.guidelines ? `\n* Guidelines: ${toGuidelinesComment(element.guidelines)}` : ''} + `)} + readonly ${element.codename}: ${deliveryConfig.sdkTypes.elements}.${mappedType};`); + }, '{') + '}' + ); + }; + + const getNameOfTypeRepresentingAllElementCodenames = (typeOrSnippet: ContentTypeOrSnippet): string => { + return `${ + typeOrSnippet instanceof ContentTypeModels.ContentType + ? nameResolvers.contentType(typeOrSnippet) + : nameResolvers.snippet(typeOrSnippet) + }ElementCodenames`; + }; + + const getContentTypeElementCodenamesType = (typeName: string, flattenedElements: readonly FlattenedElement[]): string => { + if (flattenedElements.length === 0) { + return `export type ${typeName} = never`; } + return `export type ${typeName} = ${flattenedElements.map((element) => `'${element.codename}'`).join(' | ')};`; + }; + + const mapElementType = (element: FlattenedElement): string | undefined => { + return match(element) + .returnType() + .with({ type: 'text' }, () => 'TextElement') + .with({ type: 'number' }, () => 'NumberElement') + .with({ type: 'modular_content' }, (linkedItemsElement) => { + return `LinkedItemsElement<${ + linkedItemsElement.allowedContentTypes?.length + ? getLinkedItemsAllowedTypes(linkedItemsElement.allowedContentTypes).join(' | ') + : deliveryConfig.coreContentTypeName + }>`; + }) + .with({ type: 'subpages' }, (linkedItemsElement) => { + return `LinkedItemsElement<${ + linkedItemsElement.allowedContentTypes?.length + ? getLinkedItemsAllowedTypes(linkedItemsElement.allowedContentTypes).join(' | ') + : deliveryConfig.coreContentTypeName + }>`; + }) + .with({ type: 'asset' }, () => 'AssetsElement') + .with({ type: 'date_time' }, () => 'DateTimeElement') + .with({ type: 'rich_text' }, (richTextElement) => { + return `RichTextElement<${ + richTextElement.allowedContentTypes?.length + ? getLinkedItemsAllowedTypes(richTextElement.allowedContentTypes).join(' | ') + : deliveryConfig.coreContentTypeName + }>`; + }) + .with({ type: 'multiple_choice' }, (multipleChoiceElement) => { + if (!multipleChoiceElement.multipleChoiceOptions?.length) { + return 'MultipleChoiceElement'; + } + return `MultipleChoiceElement<${multipleChoiceElement.multipleChoiceOptions.map((option) => `'${option.codename}'`).join(' | ')}>`; + }) + .with({ type: 'url_slug' }, () => 'UrlSlugElement') + .with({ type: 'taxonomy' }, (taxonomyElement) => { + if (!taxonomyElement.assignedTaxonomy) { + return `TaxonomyElement`; + } - comment += '\n*/'; - - return comment; - } - - private getElementsCode(data: { - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - elementNameMap: MapElementToName; - contentType?: ContentTypeModels.ContentType; - contentTypeSnippet?: ContentTypeSnippetModels.ContentTypeSnippet; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - taxonomies: TaxonomyModels.Taxonomy[]; - }): string { - const extendedElements: IExtendedContentTypeElement[] = this.getExtendedElements({ - elementNameMap: data.elementNameMap, - contentType: data.contentType, - contentTypeSnippet: data.contentTypeSnippet, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap - }); - - let code = ''; - for (let i = 0; i < extendedElements.length; i++) { - const extendedElement = extendedElements[i]; - const element = extendedElement.element; - - const codename = commonHelper.getElementCodename(element); - - if (!codename) { - throw Error(`Invalid codename for element '${element.id}'`); - } - - const elementName = extendedElement.mappedName; - - if (!elementName) { - // skip element if its not resolver - continue; - } - - if (!extendedElement.mappedType) { - // element type not supported - continue; - } - - code += `${this.getElementComment(extendedElement, data.taxonomies)}\n`; - code += `${elementName}: Elements.${extendedElement.mappedType};`; + return `TaxonomyElement<${nameResolvers.taxonomy(taxonomyElement.assignedTaxonomy)}, '${taxonomyElement.codename}'>`; + }) + .with({ type: 'custom' }, () => 'CustomElement') + .otherwise(() => undefined); + }; - if (i !== extendedElements.length - 1) { - code += '\n\n'; - } + const getLinkedItemsAllowedTypes = (types: readonly Readonly[]): readonly string[] => { + if (!types.length) { + return [deliveryConfig.sdkTypes.contentItem]; } - return code; - } - - private mapElementType(data: { - snippet?: ContentTypeSnippetModels.ContentTypeSnippet; - element: ContentTypeElements.ContentTypeElementModel; - elementNameMap: MapElementToName; - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - }): IExtendedContentTypeElement { - const elementType = data.element.type; - let mappedType: string | undefined; - - if (elementType === 'text') { - mappedType = 'TextElement'; - } else if (elementType === 'number') { - mappedType = 'NumberElement'; - } else if (elementType === 'modular_content' || elementType === 'subpages') { - mappedType = `LinkedItemsElement<${this.getLinkedItemsAllowedTypes( - data.element, - data.contentTypeNameMap, - data.contentTypeObjectMap - ).join(' | ')}>`; - } else if (elementType === 'asset') { - mappedType = 'AssetsElement'; - } else if (elementType === 'date_time') { - mappedType = 'DateTimeElement'; - } else if (elementType === 'rich_text') { - mappedType = 'RichTextElement'; - } else if (elementType === 'multiple_choice') { - mappedType = 'MultipleChoiceElement'; - } else if (elementType === 'url_slug') { - mappedType = 'UrlSlugElement'; - } else if (elementType === 'taxonomy') { - const taxonomyName = this.getTaxonomyTypeName(data.element, data.taxonomyNameMap, data.taxonomyObjectMap); - - if (taxonomyName) { - mappedType = `TaxonomyElement<${taxonomyName}>`; - } else { - mappedType = `TaxonomyElement`; - } - } else if (elementType === 'custom') { - mappedType = 'CustomElement'; - } else if (elementType === 'snippet') { - mappedType = undefined; - } else { - mappedType = undefined; - } + return types.map((type) => nameResolvers.contentType(type)); + }; + + const getCoreContentTypeFile = (): GeneratedFile => { + const sdkImports = [ + deliveryConfig.sdkTypes.contentItem, + deliveryConfig.sdkTypes.contentItemElements, + deliveryConfig.sdkTypes.deliveryClient + ] as const; + + const codenameImports = [ + sharedTypesConfig.contentTypeCodenames, + sharedTypesConfig.collectionCodenames, + sharedTypesConfig.languageCodenames, + sharedTypesConfig.workflowCodenames, + sharedTypesConfig.workflowStepCodenames, + sharedTypesConfig.elementCodenames, + sharedTypesConfig.taxonomyCodenames + ] as const; + + const contentTypeGenericArgName: string = 'TContentTypeCodename'; + const elementsGenericArgName: string = 'TElements'; + const elementCodenamesGenericArgName: string = 'TElementCodenames'; + return { - mappedType: mappedType, - type: elementType, - snippet: data.snippet, - element: data.element, - mappedName: data.elementNameMap(data.element) + filename: `${deliveryConfig.coreTypeFilename}.ts`, + text: ` + ${importer.importType({ + filePathOrPackage: deliveryConfig.npmPackageName, + importValue: `${sdkImports.join(', ')}` + })} + ${importer.importType({ + filePathOrPackage: `./${deliveryConfig.coreCodenamesFilename}.ts`, + importValue: `${codenameImports.join(', ')}` + })} + + ${wrapComment(`\n * Core content type used in favor of default '${deliveryConfig.sdkTypes.contentItem}'\n`)} + export type ${deliveryConfig.coreContentTypeName}< + ${elementCodenamesGenericArgName} extends string = string, + ${elementsGenericArgName} extends ${deliveryConfig.sdkTypes.contentItemElements}<${elementCodenamesGenericArgName}> = ${deliveryConfig.sdkTypes.contentItemElements}<${elementCodenamesGenericArgName}>, + ${contentTypeGenericArgName} extends ${sharedTypesConfig.contentTypeCodenames} = ${sharedTypesConfig.contentTypeCodenames} + > = ${deliveryConfig.sdkTypes.contentItem}< + ${elementsGenericArgName}, + ${contentTypeGenericArgName}, + ${sharedTypesConfig.languageCodenames}, + ${sharedTypesConfig.collectionCodenames}, + ${sharedTypesConfig.workflowCodenames}, + ${sharedTypesConfig.workflowStepCodenames} + >; + + ${wrapComment(`\n * Core types for '${deliveryConfig.sdkTypes.deliveryClient}'\n`)} + export type ${deliveryConfig.coreDeliveryClientTypesTypeName} = { + readonly collectionCodenames: ${sharedTypesConfig.collectionCodenames}; + readonly contentItemType: ${deliveryConfig.coreContentTypeName}; + readonly contentTypeCodenames: ${sharedTypesConfig.contentTypeCodenames}; + readonly elementCodenames: ${sharedTypesConfig.elementCodenames}; + readonly languageCodenames: ${sharedTypesConfig.languageCodenames}; + readonly taxonomyCodenames: ${sharedTypesConfig.taxonomyCodenames}; + readonly workflowCodenames: ${sharedTypesConfig.workflowCodenames}; + readonly worfklowStepCodenames: ${sharedTypesConfig.workflowStepCodenames}; + }; + + ${wrapComment(`\n * Typed delivery client in favor of default '${deliveryConfig.sdkTypes.deliveryClient}'\n`)} + export type ${deliveryConfig.coreDeliveryClientTypeName} = IDeliveryClient<${deliveryConfig.coreDeliveryClientTypesTypeName}>; + ` }; - } - - private getExtendedElements(data: { - contentType?: ContentTypeModels.ContentType; - contentTypeSnippet?: ContentTypeSnippetModels.ContentTypeSnippet; - elementNameMap: MapElementToName; - contentTypeNameMap: MapContentTypeToDeliveryTypeName; - contentTypeObjectMap: MapContentTypeIdToObject; - taxonomyObjectMap: MapTaxonomyIdTobject; - taxonomyNameMap: MapTaxonomyName; - }): IExtendedContentTypeElement[] { - const extendedElements: IExtendedContentTypeElement[] = []; - - const elements = data.contentType ? data.contentType.elements : data.contentTypeSnippet?.elements ?? []; - - for (const element of elements) { - extendedElements.push( - this.mapElementType({ - element: element, - elementNameMap: data.elementNameMap, - contentTypeNameMap: data.contentTypeNameMap, - contentTypeObjectMap: data.contentTypeObjectMap, - taxonomyNameMap: data.taxonomyNameMap, - taxonomyObjectMap: data.taxonomyObjectMap, - snippet: undefined - }) - ); - } - - return commonHelper.sortAlphabetically(extendedElements, (item) => item.mappedName ?? ''); - } - - private getTaxonomyTypeName( - element: ContentTypeElements.ContentTypeElementModel, - taxonomyNameMap: MapTaxonomyName, - taxonomyObjectMap: MapTaxonomyIdTobject - ): string | undefined { - const taxonomy = this.extractUsedTaxonomy(element, taxonomyObjectMap); - - if (!taxonomy) { - return undefined; - } - - return taxonomyNameMap(taxonomy); - } + }; - private getLinkedItemsAllowedTypes( - element: ContentTypeElements.ContentTypeElementModel, - contentTypeNameMap: MapContentTypeToDeliveryTypeName, - contentTypeObjectMap: MapContentTypeIdToObject - ): string[] { - const allowedTypes = this.extractLinkedItemsAllowedTypes(element, contentTypeObjectMap); - - if (!allowedTypes.length) { - return ['IContentItem']; - } - - const allowedTypeNames: string[] = allowedTypes.map((m) => contentTypeNameMap(m)) ?? []; - - return allowedTypeNames; - } - - private extractLinkedItemsAllowedTypes( - element: ContentTypeElements.ContentTypeElementModel, - contentTypeObjectMap: MapContentTypeIdToObject - ): ContentTypeModels.ContentType[] { - const allowedTypeIds: string[] = []; - - const codename = commonHelper.getElementCodename(element); - - if (element.type === 'modular_content') { - const linkedItemsElement: ContentTypeElements.ILinkedItemsElement = element; - - if (linkedItemsElement?.allowed_content_types?.length) { - allowedTypeIds.push(...(linkedItemsElement.allowed_content_types?.map((m) => m.id as string) ?? [])); - } - } else if (element.type === 'subpages') { - const subpagesItemsElement: ContentTypeElements.ISubpagesElement = element; - - if (subpagesItemsElement?.allowed_content_types?.length) { - allowedTypeIds.push(...(subpagesItemsElement.allowed_content_types?.map((m) => m.id as string) ?? [])); - } - } else { - throw Error( - `Expected 'modular_content' or 'subpages' but got '${element.type}' for element '${codename}' with id '${element.id}'` - ); - } - - return allowedTypeIds.map((id) => contentTypeObjectMap(id)); - } + const getCodenamesFile = (): GeneratedFile => { + return { + filename: `${deliveryConfig.coreCodenamesFilename}.ts`, + text: ` + ${wrapComment(`\n * Type representing all languages\n`)} + ${getLanguageCodenamesType(config.environmentData.languages)} - private extractUsedSnippet( - element: ContentTypeElements.ContentTypeElementModel, - contentTypeSnippetObjectMap: MapContentTypeSnippetIdToObject - ): ContentTypeSnippetModels.ContentTypeSnippet { - if (element.type !== 'snippet') { - throw Error(`Expected 'snippet' but got '${element.type}' for element '${element.codename}'`); - } + ${wrapComment(`\n * Type representing all content types\n`)} + ${getContentTypeCodenamesType(config.environmentData.types)} - const snippetElement: ContentTypeElements.ISnippetElement = element; + ${wrapComment(`\n * Type representing all collections\n`)} + ${getCollectionCodenamesType(config.environmentData.collections)} - const snippedId = snippetElement.snippet.id; - if (!snippedId) { - throw Error(`Invalid snippet id for taxonomy element '${element.id}'`); - } + ${wrapComment(`\n * Type representing all workflows\n`)} + ${getWorkflowCodenamesType(config.environmentData.workflows)} - return contentTypeSnippetObjectMap(snippedId); - } + ${wrapComment(`\n * Type representing all taxonomies\n`)} + ${getTaxonomyCodenamesType(config.environmentData.taxonomies)} - private extractUsedTaxonomy( - element: ContentTypeElements.ContentTypeElementModel, - taxonomyObjectMap: MapTaxonomyIdTobject - ): TaxonomyModels.Taxonomy | undefined { - const codename = commonHelper.getElementCodename(element); - - if (element.type !== 'taxonomy') { - throw Error( - `Expected 'taxonomy' but got '${element.type}' for element '${codename}' with id '${element.id}'` - ); - } + ${wrapComment(`\n * Type representing all worksflow steps across all workflows\n`)} + ${getWorkflowStepCodenamesType(config.environmentData.workflows)} - const taxonomyElement: ContentTypeElements.ITaxonomyElement = element; + ${wrapComment(`\n * Type representing all element codenames across all content types\n`)} + ${getElementCodenamesType(config.environmentData.types, config.environmentData.snippets)} + ` + }; + }; + + const getContentItemTypeGuardFunction = (contentType: Readonly): string => { + const nameResolvers = { + contentItemTypeGuardFunctionName: mapName(config.nameResolvers?.contentType, 'pascalCase', { + prefix: 'is' + }), + contentItemTypeName: mapName(config.nameResolvers?.contentType, 'pascalCase') + }; - const taxonomyGroupId = taxonomyElement.taxonomy_group.id; - if (!taxonomyGroupId) { - throw Error(`Invalid taxonomy group id for taxonomy element '${element.id}'`); + return `export function ${nameResolvers.contentItemTypeGuardFunctionName(contentType)}(item: ${deliveryConfig.coreContentTypeName} | undefined | null): item is ${nameResolvers.contentItemTypeName(contentType)} { + return item?.system?.type === '${contentType.codename}'; + }`; + }; + + return { + generateModels: (): { + readonly contentTypeFiles: GeneratedSet; + readonly snippetFiles: GeneratedSet; + } => { + return { + contentTypeFiles: { + folderName: deliveryConfig.contentTypesFolderName, + files: config.environmentData.types.map((type) => createTypeModel(type)) + }, + snippetFiles: { + folderName: deliveryConfig.contentTypeSnippetsFolderName, + files: config.environmentData.snippets.map((contentTypeSnippet) => createSnippetModel(contentTypeSnippet)) + } + }; + }, + getSystemFiles(): GeneratedSet { + return { + folderName: deliveryConfig.systemTypesFolderName, + files: [getCoreContentTypeFile(), getCodenamesFile()] + }; } - - return taxonomyObjectMap(taxonomyGroupId); - } + }; } - -export const deliveryContentTypeGenerator = new DeliveryContentTypeGenerator(); diff --git a/lib/generators/delivery/delivery-func.ts b/lib/generators/delivery/delivery-func.ts new file mode 100644 index 0000000..6cccdfb --- /dev/null +++ b/lib/generators/delivery/delivery-func.ts @@ -0,0 +1,120 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import type { Options } from 'prettier'; +import type { CliAction, CreateFilesConfig, GeneratedFile, GeneratedSet, ModuleFileExtension } from '../../core/core.models.js'; +import type { + ContentTypeFileNameResolver, + ContentTypeNameResolver, + ContentTypeSnippetFileNameResolver, + ContentTypeSnippetNameResolver, + TaxonomyNameResolver, + TaxonomyTypeFileNameResolver +} from '../../core/resolvers.js'; +import { managementKontentFetcher as _kontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { fileManager as _fileManager } from '../../files/file-manager.js'; +import { deliveryContentTypeGenerator } from './delivery-content-type.generator.js'; +import { deliveryTaxonomyGenerator } from './delivery-taxonomy.generator.js'; + +export type GenerateDeliveryModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly apiKey: string; + + readonly moduleFileExtension: ModuleFileExtension; + readonly baseUrl?: string; + readonly formatOptions?: Readonly; + + readonly fileResolvers?: { + readonly taxonomy?: TaxonomyTypeFileNameResolver; + readonly contentType?: ContentTypeFileNameResolver; + readonly snippet?: ContentTypeSnippetFileNameResolver; + }; + + readonly nameResolvers?: { + readonly contentType?: ContentTypeNameResolver; + readonly snippet?: ContentTypeSnippetNameResolver; + readonly taxonomy?: TaxonomyNameResolver; + }; +} & CreateFilesConfig; + +export async function generateDeliveryModelsAsync(config: GenerateDeliveryModelsConfig): Promise { + console.log(chalk.green(`Model generator started \n`)); + console.log(`Generating '${chalk.yellow('delivery-sdk' satisfies CliAction)}' models\n`); + + const { contentTypeFiles, snippetFiles, taxonomyFiles, environmentInfo, systemFiles } = await getFilesAsync(config); + + const fileManager = _fileManager({ + ...config, + environmentInfo + }); + + const setFiles = await fileManager.getSetFilesAsync([contentTypeFiles, snippetFiles, taxonomyFiles, systemFiles]); + + if (config.createFiles) { + fileManager.createFiles(setFiles); + } + + console.log(chalk.green(`\nCompleted`)); + + return setFiles; +} + +async function getFilesAsync(config: GenerateDeliveryModelsConfig): Promise<{ + readonly contentTypeFiles: GeneratedSet; + readonly snippetFiles: GeneratedSet; + readonly taxonomyFiles: GeneratedSet; + readonly systemFiles: GeneratedSet; + readonly environmentInfo: Readonly; +}> { + const kontentFetcher = _kontentFetcher({ + environmentId: config.environmentId, + apiKey: config.apiKey, + baseUrl: config.baseUrl + }); + + const environmentInfo = await kontentFetcher.getEnvironmentInfoAsync(); + + const [taxonomies, types, snippets, languages, collections, workflows] = await Promise.all([ + kontentFetcher.getTaxonomiesAsync(), + kontentFetcher.getTypesAsync(), + kontentFetcher.getSnippetsAsync(), + kontentFetcher.getLanguagesAsync(), + kontentFetcher.getCollectionsAsync(), + kontentFetcher.getWorkflowsAsync() + ]); + + const deliveryGenerator = deliveryContentTypeGenerator({ + moduleFileExtension: config.moduleFileExtension, + environmentData: { + environment: environmentInfo, + types, + snippets, + taxonomies, + languages, + collections, + workflows + }, + fileResolvers: config.fileResolvers, + nameResolvers: config.nameResolvers + }); + + const { contentTypeFiles, snippetFiles } = deliveryGenerator.generateModels(); + + const taxonomyFiles = deliveryTaxonomyGenerator({ + moduleFileExtension: config.moduleFileExtension, + environmentData: { + environment: environmentInfo, + taxonomies: taxonomies + }, + fileResolvers: config.fileResolvers, + nameResolvers: config.nameResolvers + }).generateTaxonomyTypes(); + + return { + contentTypeFiles, + snippetFiles, + taxonomyFiles, + environmentInfo, + systemFiles: deliveryGenerator.getSystemFiles() + }; +} diff --git a/lib/generators/delivery/delivery-mappers.ts b/lib/generators/delivery/delivery-mappers.ts deleted file mode 100644 index 4b66dc1..0000000 --- a/lib/generators/delivery/delivery-mappers.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { - ContentTypeElements, - ContentTypeModels, - ContentTypeSnippetModels, - TaxonomyModels -} from '@kontent-ai/management-sdk'; -import { textHelper } from '../../text-helper.js'; -import { - ContentTypeFileNameResolver, - ContentTypeResolver, - ContentTypeSnippetFileNameResolver, - ContentTypeSnippetResolver, - ElementResolver, - TaxonomyTypeFileNameResolver, - TaxonomyTypeResolver -} from '../../models.js'; -import { nameHelper } from '../../name-helper.js'; -import { commonHelper } from '../../common-helper.js'; - -export type MapContentTypeToDeliveryTypeName = (contentType: ContentTypeModels.ContentType) => string; -export type MapContentTypeSnippetToDeliveryTypeName = ( - contentTypeSnippet: ContentTypeSnippetModels.ContentTypeSnippet -) => string; -export type MapContentTypeIdToObject = (id: string) => ContentTypeModels.ContentType; -export type MapContentTypeSnippetIdToObject = (id: string) => ContentTypeSnippetModels.ContentTypeSnippet; -export type MapContentTypeToFileName = (contentType: ContentTypeModels.ContentType, addExtension: boolean) => string; -export type MapContentTypeSnippetToFileName = ( - contentTypeSnippet: ContentTypeSnippetModels.ContentTypeSnippet, - addExtension: boolean -) => string; -export type MapElementToName = (element: ContentTypeElements.ContentTypeElementModel) => string | undefined; - -export type MapTaxonomyName = (taxonomy: TaxonomyModels.Taxonomy) => string; -export type MapTaxonomyIdTobject = (id: string) => TaxonomyModels.Taxonomy; -export type MapTaxonomyToFileName = (taxonomy: TaxonomyModels.Taxonomy, addExtension: boolean) => string; - -export function getMapContentTypeToDeliveryTypeName(resolver?: ContentTypeResolver): MapContentTypeToDeliveryTypeName { - return (contentType) => { - return nameHelper.getDeliveryContentTypeName({ - type: contentType, - contentTypeResolver: resolver - }); - }; -} - -export function getMapContentTypeSnippetToDeliveryTypeName( - resolver?: ContentTypeSnippetResolver -): MapContentTypeSnippetToDeliveryTypeName { - return (contentTypeSnippet) => { - return nameHelper.getDeliveryContentTypeSnippetName({ - snippet: contentTypeSnippet, - contentTypeResolver: resolver - }); - }; -} - -export function getMapContentTypeIdToObject(types: ContentTypeModels.ContentType[]): MapContentTypeIdToObject { - return (id) => { - const contentType = types.find((m) => m.id === id); - - if (!contentType) { - throw Error( - `Could not find content type with id '${id}'. This may be caused by references to deleted types and can be fixed within Kontent.ai app.` - ); - } - - return contentType; - }; -} - -export function getMapContentTypeSnippetIdToObject( - snippets: ContentTypeSnippetModels.ContentTypeSnippet[] -): MapContentTypeSnippetIdToObject { - return (id) => { - const snippet = snippets.find((m) => m.id === id); - - if (!snippet) { - throw Error( - `Could not find content type snippet with id '${id}'. This may be caused by references to deleted snippets and can be fixed within Kontent.ai app.` - ); - } - - return snippet; - }; -} - -export function getMapContentTypeToFileName(resolver?: ContentTypeFileNameResolver): MapContentTypeToFileName { - return (contentType, addExtension) => { - const fileName = nameHelper.getDeliveryContentTypeFilename({ - type: contentType, - addExtension: addExtension, - fileResolver: resolver - }); - return `${fileName}`; - }; -} - -export function getMapContentTypeSnippetToFileName( - resolver?: ContentTypeSnippetFileNameResolver -): MapContentTypeSnippetToFileName { - return (snippet, addExtension) => { - const fileName = nameHelper.getDeliveryContentTypeSnippetFilename({ - snippet: snippet, - addExtension: addExtension, - fileResolver: resolver - }); - return `${fileName}`; - }; -} - -export function getMapElementToName(resolver?: ElementResolver): MapElementToName { - return (element) => { - if (!element) { - return undefined; - } - - const codename = commonHelper.getElementCodename(element); - - if (!codename) { - return undefined; - } - const elementName = getElementName({ - elementCodename: codename, - elementResolver: resolver - }); - - return elementName; - }; -} - -export function getMapTaxonomyName(resolver?: TaxonomyTypeResolver): MapTaxonomyName { - return (taxonomy) => { - return nameHelper.getDeliveryTaxonomyTypeName({ - taxonomy: taxonomy, - taxonomyResolver: resolver - }); - }; -} - -export function getMapTaxonomyToFileName(resolver?: TaxonomyTypeFileNameResolver): MapTaxonomyToFileName { - return (taxonomy, addExtension) => { - const fileName = nameHelper.getDeliveryTaxonomyFilename({ - taxonomy: taxonomy, - addExtension: addExtension, - fileResolver: resolver - }); - return `${fileName}`; - }; -} - -export function getMapTaxonomyIdTobject(taxonomies: TaxonomyModels.Taxonomy[]): MapTaxonomyIdTobject { - return (id) => { - const taxonomy = taxonomies.find((m) => m.id === id); - - if (!taxonomy) { - throw Error(`Could not find taxonomy with id '${id}'`); - } - - return taxonomy; - }; -} - -function getElementName(config: { elementCodename: string; elementResolver?: ElementResolver }): string { - if (!config.elementResolver) { - return config.elementCodename; - } - - if (config.elementResolver instanceof Function) { - return config.elementResolver('', config.elementCodename); - } - - return textHelper.resolveTextWithDefaultResolver(config.elementCodename, config.elementResolver); -} diff --git a/lib/generators/delivery/delivery-taxonomy.generator.ts b/lib/generators/delivery/delivery-taxonomy.generator.ts index 017d6a9..8b8e785 100644 --- a/lib/generators/delivery/delivery-taxonomy.generator.ts +++ b/lib/generators/delivery/delivery-taxonomy.generator.ts @@ -1,144 +1,98 @@ -import { TaxonomyTypeFileNameResolver, TaxonomyTypeResolver } from '../../models.js'; -import Colors from 'colors'; -import { commonHelper, IGeneratedFile } from '../../common-helper.js'; -import { TaxonomyModels } from '@kontent-ai/management-sdk'; -import { - MapTaxonomyToFileName, - MapTaxonomyName, - getMapTaxonomyToFileName, - getMapTaxonomyName -} from './delivery-mappers.js'; - -export class DeliveryTaxonomyGenerator { - async generateTaxonomyTypesAsync(config: { - outputDir: string; - taxonomies: TaxonomyModels.Taxonomy[]; - taxonomyFolderName: string; - addTimestamp: boolean; - fileResolver?: TaxonomyTypeFileNameResolver; - taxonomyResolver?: TaxonomyTypeResolver; - }): Promise { - const files: IGeneratedFile[] = []; - - if (config.taxonomyResolver) { - console.log( - `Using '${Colors.yellow( - config.taxonomyResolver instanceof Function ? 'custom' : config.taxonomyResolver - )}' name resolver for taxonomy type` - ); - } - - if (config.fileResolver) { - console.log( - `Using '${Colors.yellow( - config.fileResolver instanceof Function ? 'custom' : config.fileResolver - )}' name resolver for taxonomy filename` - ); - } - - if (config.fileResolver || config.taxonomyResolver) { - console.log('\n'); - } - - for (const taxonomy of config.taxonomies) { - const file = this.generateModels({ - outputDir: config.outputDir, - taxonomy: taxonomy, - taxonomyFolderName: config.taxonomyFolderName, - addTimestamp: config.addTimestamp, - taxonomyNameMap: getMapTaxonomyName(config.taxonomyResolver), - taxonomyFileNameMap: getMapTaxonomyToFileName(config.fileResolver) - }); - - files.push(file); - } - - return files; - } - - private getTaxonomyComment(taxonomy: TaxonomyModels.Taxonomy): string { - let comment: string = `${taxonomy.name}`; - - comment += `\n* Id: ${taxonomy.id}`; - comment += `\n* Codename: ${taxonomy.codename}`; - - return comment; - } +import type { EnvironmentModels, TaxonomyModels } from '@kontent-ai/management-sdk'; +import { deliveryConfig } from '../../config.js'; +import { wrapComment } from '../../core/comment.utils.js'; +import type { GeneratedFile, GeneratedSet, ModuleFileExtension } from '../../core/core.models.js'; +import type { TaxonomyNameResolver, TaxonomyTypeFileNameResolver } from '../../core/resolvers.js'; +import { mapFilename, mapName } from '../../core/resolvers.js'; + +export interface DeliveryTaxonomyGeneratorConfig { + readonly moduleFileExtension: ModuleFileExtension; + + readonly environmentData: { + readonly environment: Readonly; + readonly taxonomies: readonly Readonly[]; + }; + + readonly fileResolvers?: { + readonly taxonomy?: TaxonomyTypeFileNameResolver; + }; + readonly nameResolvers?: { + readonly taxonomy?: TaxonomyNameResolver; + }; +} - private generateModels(data: { - outputDir: string; - taxonomy: TaxonomyModels.Taxonomy; - taxonomyFolderName: string; - addTimestamp: boolean; - taxonomyFileNameMap: MapTaxonomyToFileName; - taxonomyNameMap: MapTaxonomyName; - }): IGeneratedFile { - const filename = `${data.outputDir}${data.taxonomyFolderName}${data.taxonomyFileNameMap(data.taxonomy, true)}`; - const code = this.getModelCode({ - taxonomy: data.taxonomy, - addTimestamp: data.addTimestamp, - taxonomyNameMap: data.taxonomyNameMap - }); +export function deliveryTaxonomyGenerator(config: DeliveryTaxonomyGeneratorConfig) { + const taxonomyFileNameMap = mapFilename(config.fileResolvers?.taxonomy); + const taxonomyNameMap = mapName(config.nameResolvers?.taxonomy, 'pascalCase'); + const taxonomyValuesNameMap = mapName(config.nameResolvers?.taxonomy, 'camelCase', { suffix: 'Values' }); + const taxonomyTypeGuardFunctionName = mapName(config.nameResolvers?.taxonomy, 'pascalCase', { + prefix: 'is' + }); + const generateTaxonomyTypes = (): GeneratedSet => { return { - filename: filename, - text: code + folderName: deliveryConfig.taxonomiesFolderName, + files: config.environmentData.taxonomies.map((taxonomy) => { + return getTaxonomyFile(taxonomy); + }) }; - } + }; - private getModelCode(config: { - taxonomyNameMap: MapTaxonomyName; - taxonomy: TaxonomyModels.Taxonomy; - addTimestamp: boolean; - }): string { - const code = ` -/** -* ${commonHelper.getAutogenerateNote(config.addTimestamp)} -* -* ${this.getTaxonomyComment(config.taxonomy)} -*/ -export type ${config.taxonomyNameMap(config.taxonomy)} = ${this.getTaxonomyTermsCode(config.taxonomy)}; + const getTaxonomyFile = (taxonomy: Readonly): GeneratedFile => { + return { + filename: taxonomyFileNameMap(taxonomy, true), + text: getModelCode(taxonomy) + }; + }; + + const getTaxonomyTypeGuardFunction = (taxonomy: Readonly): string => { + return `export function ${taxonomyTypeGuardFunctionName(taxonomy)}(value: string | undefined | null): value is ${taxonomyNameMap(taxonomy)} { + return typeof value === 'string' && (${taxonomyValuesNameMap(taxonomy)} as readonly string[]).includes(value); + }`; + }; + + const getTaxonomyValuesCode = (taxonomy: Readonly): string => { + return `export const ${taxonomyValuesNameMap(taxonomy)} = [${getTaxonomyTermCodenames(taxonomy.terms) + .map((m) => `'${m}'`) + .join(', ')}] as const;`; + }; + + const getModelCode = (taxonomy: Readonly): string => { + return ` + +${wrapComment(` + * All taxonomy codename values for ${taxonomy.name} + * + * Codename: ${taxonomy.codename} + * Id: ${taxonomy.id} +`)} + ${getTaxonomyValuesCode(taxonomy)} + +${wrapComment(` + * Type representing ${taxonomy.name} taxonomy + * + * Codename: ${taxonomy.codename} + * Id: ${taxonomy.id} +`)} +export type ${taxonomyNameMap(taxonomy)} = typeof ${taxonomyValuesNameMap(taxonomy)}[number]; + +${wrapComment(` + * Type guard for ${taxonomy.name} + * + * Codename: ${taxonomy.codename} + * Id: ${taxonomy.id} +`)} +${getTaxonomyTypeGuardFunction(taxonomy)} `; - return code; - } - - private getTaxonomyTermsCode(taxonomy: TaxonomyModels.Taxonomy): string { - const taxonomyTermCodenames: string[] = []; - this.getTaxonomyTermCodenames(taxonomy.terms, taxonomyTermCodenames); - - if (!taxonomyTermCodenames.length) { - return `''`; - } - - let code: string = ''; - - const sortedTaxonomyTerms: string[] = commonHelper.sortAlphabetically(taxonomyTermCodenames, (item) => item); + }; - for (let i = 0; i < sortedTaxonomyTerms.length; i++) { - const term = sortedTaxonomyTerms[i]; - const isLast = i === sortedTaxonomyTerms.length - 1; + const getTaxonomyTermCodenames = (taxonomyTerms: readonly Readonly[]): readonly string[] => { + return taxonomyTerms.reduce((codenames, taxonomyTerm) => { + return codenames.concat(getTaxonomyTermCodenames(taxonomyTerm.terms), taxonomyTerm.codename); + }, []); + }; - code += `'${term}'`; - - if (!isLast) { - code += ` | `; - } - } - - return code; - } - - private getTaxonomyTermCodenames(taxonomyTerms: TaxonomyModels.Taxonomy[], resolvedCodenames: string[]): void { - for (const taxonomyTerm of taxonomyTerms) { - if (!resolvedCodenames.includes(taxonomyTerm.codename)) { - resolvedCodenames.push(taxonomyTerm.codename); - } - - if (taxonomyTerm.terms.length) { - this.getTaxonomyTermCodenames(taxonomyTerm.terms, resolvedCodenames); - } - } - } + return { + generateTaxonomyTypes + }; } - -export const deliveryTaxonomylGenerator = new DeliveryTaxonomyGenerator(); diff --git a/lib/generators/environment/environment-func.ts b/lib/generators/environment/environment-func.ts new file mode 100644 index 0000000..471f078 --- /dev/null +++ b/lib/generators/environment/environment-func.ts @@ -0,0 +1,168 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import type { Options } from 'prettier'; +import { defaultModuleFileExtension } from '../../config.js'; +import { + environmentEntities, + type CliAction, + type CreateFilesConfig, + type EnvironmentEntity, + type GeneratedFile, + type GeneratedSet, + type ModuleFileExtension +} from '../../core/core.models.js'; +import { uniqueFilter } from '../../core/core.utils.js'; +import { managementKontentFetcher as _kontentFetcher, type ManagementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { fileManager as _fileManager } from '../../files/file-manager.js'; +import { environmentGenerator as _environmentGenerator, type EnvironmentEntities } from './environment.generator.js'; + +export type GenerateEnvironmentModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly apiKey: string; + + readonly entities?: readonly EnvironmentEntity[]; + readonly moduleFileExtension: ModuleFileExtension; + readonly baseUrl?: string; + readonly formatOptions?: Readonly; +} & CreateFilesConfig; + +export async function generateEnvironmentModelsAsync(config: GenerateEnvironmentModelsConfig): Promise { + console.log(chalk.green(`Model generator started \n`)); + console.log(`Generating '${chalk.yellow('environment' satisfies CliAction)}' models\n`); + + const { environmentFiles, environmentInfo } = await getModelsAsync(config); + + const fileManager = _fileManager({ + ...config, + environmentInfo + }); + + const setFiles = await fileManager.getSetFilesAsync([environmentFiles]); + + if (config.createFiles) { + fileManager.createFiles(setFiles); + } + + console.log(chalk.green(`\nCompleted`)); + + return setFiles; +} + +async function getModelsAsync(config: GenerateEnvironmentModelsConfig): Promise<{ + readonly environmentFiles: GeneratedSet; + readonly moduleFileExtension: ModuleFileExtension; + readonly environmentInfo: Readonly; +}> { + const moduleFileExtension: ModuleFileExtension = config.moduleFileExtension ?? defaultModuleFileExtension; + const kontentFetcher = _kontentFetcher({ + environmentId: config.environmentId, + apiKey: config.apiKey, + baseUrl: config.baseUrl + }); + + const entitiesToCreate: readonly EnvironmentEntity[] = config.entities ?? environmentEntities; // default to all entities export + + const environmentInfo = await kontentFetcher.getEnvironmentInfoAsync(); + const entities = await getEntitiesAsync({ + kontentFetcher, + entitiesConfig: entitiesToCreate + }); + + return { + environmentInfo, + environmentFiles: _environmentGenerator({ + environmentInfo, + environmentEntities: entities, + entitiesToCreate: entitiesToCreate + }).generateEnvironmentModels(), + moduleFileExtension: moduleFileExtension + }; +} + +async function getEntitiesAsync({ + kontentFetcher, + entitiesConfig +}: { + kontentFetcher: ManagementKontentFetcher; + entitiesConfig: readonly EnvironmentEntity[]; +}): Promise { + const entitiesToFetch = getEntitiesToFetchFromApi(entitiesConfig); + + const [ + languages, + taxonomies, + contentTypes, + snippets, + collections, + workflows, + webhooks, + assetFolders, + roles, + customApps, + spaces, + previewUrls + ] = await Promise.all([ + fetchEntity({ canFetch: () => entitiesToFetch.includes('languages'), fetch: () => kontentFetcher.getLanguagesAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('taxonomies'), fetch: () => kontentFetcher.getTaxonomiesAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('contentTypes'), fetch: () => kontentFetcher.getTypesAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('snippets'), fetch: () => kontentFetcher.getSnippetsAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('collections'), fetch: () => kontentFetcher.getCollectionsAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('workflows'), fetch: () => kontentFetcher.getWorkflowsAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('webhooks'), fetch: () => kontentFetcher.getWebhooksAsync() }), + fetchEntity({ + canFetch: () => entitiesToFetch.includes('assetFolders'), + fetch: () => kontentFetcher.getAssetFoldersAsync() + }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('roles'), fetch: () => kontentFetcher.getRolesAsync() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('customApps'), fetch: () => kontentFetcher.getCustomApps() }), + fetchEntity({ canFetch: () => entitiesToFetch.includes('spaces'), fetch: () => kontentFetcher.getSpaces() }), + fetchEntity({ + canFetch: () => entitiesToFetch.includes('previewUrls'), + fetch: () => kontentFetcher.getPreviewUrlConfiguration() + }) + ]); + + return { + assetFolders, + collections, + languages, + roles, + snippets, + taxonomies, + contentTypes, + webhooks, + workflows, + customApps, + previewUrls, + spaces + }; +} + +function getEntitiesToFetchFromApi(entityTypes: readonly EnvironmentEntity[]): readonly EnvironmentEntity[] { + return ( + [ + ...entityTypes, + // when requesting snippets or content types, we need to fetch taxonomies & (snippets or types) as well + // this is is because we need these entities to narrow down types for elements + ...(entityTypes.includes('contentTypes') || entityTypes.includes('snippets') + ? (['taxonomies', 'snippets', 'contentTypes'] satisfies readonly EnvironmentEntity[]) + : []), + // when requesting preview urls, we need to fetch spaces & content types as well + ...(entityTypes.includes('previewUrls') ? (['spaces', 'contentTypes'] satisfies readonly EnvironmentEntity[]) : []) + ] satisfies readonly EnvironmentEntity[] + ).filter(uniqueFilter); +} + +function fetchEntity({ + canFetch, + fetch +}: { + canFetch: () => boolean; + fetch: () => Promise<(T extends Array ? readonly Array[] : T) | undefined>; +}): Promise<(T extends Array ? readonly Array[] : T) | undefined> { + if (!canFetch()) { + return Promise.resolve(undefined); + } + return fetch(); +} diff --git a/lib/generators/environment/environment.generator.ts b/lib/generators/environment/environment.generator.ts new file mode 100644 index 0000000..3489e2e --- /dev/null +++ b/lib/generators/environment/environment.generator.ts @@ -0,0 +1,543 @@ +import type { + AssetFolderModels, + CollectionModels, + ContentTypeElements, + ContentTypeModels, + ContentTypeSnippetModels, + CustomAppModels, + EnvironmentModels, + LanguageModels, + PreviewModels, + RoleModels, + SpaceModels, + TaxonomyModels, + WebhookModels, + WorkflowModels +} from '@kontent-ai/management-sdk'; +import { match } from 'ts-pattern'; +import { toGuidelinesComment, wrapComment } from '../../core/comment.utils.js'; +import type { EnvironmentEntity, FlattenedElement, GeneratedFile, GeneratedSet, ValidateKeys } from '../../core/core.models.js'; +import { findRequired, getStringOrUndefinedAsPropertyValue, isNotUndefined, toSafePropertyValue } from '../../core/core.utils.js'; +import { getFlattenedElements } from '../../core/element.utils.js'; +import { resolvePropertyName } from '../../core/resolvers.js'; + +type WorkflowStep = { + readonly name: string; + readonly codename: string; + readonly id: string; +}; + +export type EnvironmentEntities = ValidateKeys< + EnvironmentEntity, + { + readonly contentTypes: readonly Readonly[] | undefined; + readonly languages: readonly Readonly[] | undefined; + readonly taxonomies: readonly Readonly[] | undefined; + readonly workflows: readonly Readonly[] | undefined; + readonly assetFolders: readonly Readonly[] | undefined; + readonly collections: readonly Readonly[] | undefined; + readonly roles: readonly Readonly[] | undefined; + readonly snippets: readonly Readonly[] | undefined; + readonly webhooks: readonly Readonly[] | undefined; + readonly customApps: readonly Readonly[] | undefined; + readonly spaces: readonly Readonly[] | undefined; + readonly previewUrls: Readonly | undefined; + } +>; + +export type EnvironmentGeneratorConfig = { + readonly environmentInfo: Readonly; + readonly environmentEntities: EnvironmentEntities; + readonly entitiesToCreate: readonly EnvironmentEntity[]; +}; + +export function environmentGenerator(config: EnvironmentGeneratorConfig) { + const generateEnvironmentModels = (): GeneratedSet => { + return { + folderName: undefined, + files: [ + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'languages', + filename: 'languages.ts', + exportedConstName: 'languages', + entities: config.environmentEntities.languages, + getCode: getLanguages + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'collections', + filename: 'collections.ts', + exportedConstName: 'collections', + entities: config.environmentEntities.collections, + getCode: getCollections + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'contentTypes', + filename: 'contentTypes.ts', + exportedConstName: 'contentTypes', + entities: config.environmentEntities.contentTypes, + getCode: getContentTypes + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'snippets', + filename: 'contentTypeSnippets.ts', + exportedConstName: 'contentTypeSnippets', + entities: config.environmentEntities.snippets, + getCode: getSnippets + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'workflows', + filename: 'workflows.ts', + exportedConstName: 'workflows', + entities: config.environmentEntities.workflows, + getCode: getWorkflows + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'roles', + filename: 'roles.ts', + exportedConstName: 'roles', + entities: config.environmentEntities.roles, + getCode: getRoles + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'assetFolders', + filename: 'assetFolders.ts', + exportedConstName: 'assetFolders', + entities: config.environmentEntities.assetFolders, + getCode: getAssetFolders + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'webhooks', + filename: 'webhooks.ts', + exportedConstName: 'webhooks', + entities: config.environmentEntities.webhooks, + getCode: getWebhooks + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'taxonomies', + filename: 'taxonomies.ts', + exportedConstName: 'taxonomies', + entities: config.environmentEntities.taxonomies, + getCode: getTaxonomies + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'customApps', + filename: 'customApps.ts', + exportedConstName: 'customApps', + entities: config.environmentEntities.customApps, + getCode: getCustomApps + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'spaces', + filename: 'spaces.ts', + exportedConstName: 'spaces', + entities: config.environmentEntities.spaces, + getCode: getSpaces + }), + getEntityFile({ + entitiesToCreate: config.entitiesToCreate, + entitiesProp: 'previewUrls', + filename: 'previewUrls.ts', + exportedConstName: 'previewUrls', + entities: config.environmentEntities.previewUrls, + getCode: getPreviewUrls + }) + ].filter(isNotUndefined) + }; + }; + + const getEntityFile = ({ + entities, + getCode, + filename, + entitiesToCreate, + exportedConstName, + entitiesProp + }: { + readonly entitiesToCreate: readonly EnvironmentEntity[]; + readonly entitiesProp: TProp; + readonly filename: string; + readonly exportedConstName: string; + readonly entities: EnvironmentEntities[TProp]; + readonly getCode: (entities: NonNullable) => string; + }): GeneratedFile | undefined => { + if (!entities || !entitiesToCreate.includes(entitiesProp)) { + return undefined; + } + + return { + filename: filename, + text: wrapInConst({ constName: exportedConstName, text: getCode(entities) }) + }; + }; + + const getLanguages = (languages: readonly Readonly[]): string => { + return languages.reduce((code, language, index) => { + const isLast = index === languages.length - 1; + + return `${code}\n + ${wrapComment(` + * ${language.name} + `)} + ${resolvePropertyName(language.codename)}: { + name: '${toSafePropertyValue(language.name)}', + codename: '${language.codename}', + id: '${language.id}', + isActive: ${language.isActive ? 'true' : 'false'}, + isDefault: ${language.isDefault ? 'true' : 'false'}, + fallbackLanguageId: ${getStringOrUndefinedAsPropertyValue(language.fallbackLanguage?.id)}, + externalId: ${getStringOrUndefinedAsPropertyValue(language.externalId)}, + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getWorkflows = (workflows: readonly Readonly[]): string => { + return workflows.reduce((code, workflow, index) => { + const isLast = index === workflows.length - 1; + + return `${code}\n + ${wrapComment(` + * ${workflow.name} + `)} + ${workflow.codename}: { + name: '${toSafePropertyValue(workflow.name)}', + codename: '${workflow.codename}', + id: '${workflow.id}', + steps: ${getWorkflowSteps(workflow)} + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getCustomApps = (customApps: readonly Readonly[]): string => { + return customApps.reduce((code, customApp, index) => { + const isLast = index === customApps.length - 1; + + return `${code}\n + ${wrapComment(` + * ${customApp.name} + `)} + ${resolvePropertyName(customApp.codename)}: { + name: '${toSafePropertyValue(customApp.name)}', + codename: ${customApp.codename}, + sourceUrl: '${customApp.source_url}' + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getSpaces = (spaces: readonly Readonly[]): string => { + return spaces.reduce((code, space, index) => { + const isLast = index === spaces.length - 1; + + return `${code}\n + ${wrapComment(` + * ${space.name} + `)} + ${resolvePropertyName(space.codename)}: { + name: '${toSafePropertyValue(space.name)}', + codename: '${space.codename}', + id: '${space.id}' + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getPreviewUrls = (previewConfiguration: Readonly): string => { + const spaces = config.environmentEntities.spaces; + const contentTypes = config.environmentEntities.contentTypes; + + if (!spaces) { + throw new Error('Spaces are expected to be present in the environment entities.'); + } + + if (!contentTypes) { + throw new Error('Content types are expected to be present in the environment entities.'); + } + + return ` + ${wrapComment(` + * Preview configuration + `)} + spaceDomains: { ${previewConfiguration.spaceDomains.reduce((code, spaceDomain, index) => { + const isLast = index === previewConfiguration.spaceDomains.length - 1; + const space = findRequired( + spaces, + (m) => m.id === spaceDomain.space.id, + `Space with id '${spaceDomain.space.id}' not found.` + ); + + return `${code}\n + ${space.codename}: { + spaceName: '${toSafePropertyValue(space.name)}', + spaceCodename: '${space.codename}', + domain: '${spaceDomain.domain}' + }${!isLast ? ',\n' : ''}`; + }, '')} }, + previewUrlPatterns: { ${previewConfiguration.previewUrlPatterns.reduce((code, previewUrlPattern, index) => { + const isLast = index === previewConfiguration.previewUrlPatterns.length - 1; + const contentType = findRequired( + contentTypes, + (m) => m.id === previewUrlPattern.contentType.id, + `Content type with id '${previewUrlPattern.contentType.id}' not found.` + ); + + return `${code}\n + ${contentType.codename}: { + contentTypeName: '${toSafePropertyValue(contentType.name)}', + contentTypeCodename: '${contentType.codename}', + urlPatterns: { ${previewUrlPattern.urlPatterns.reduce((code, urlPattern, index) => { + const isLast = index === previewUrlPattern.urlPatterns.length - 1; + const space = config.environmentEntities.spaces?.find((m) => m.id === urlPattern.space?.id); + + return `${code}\n + ${space?.codename ?? 'default'}: { + spaceName: ${getStringOrUndefinedAsPropertyValue(space?.name)}, + spaceCodename: ${getStringOrUndefinedAsPropertyValue(space?.codename)}, + url: '${urlPattern.urlPattern}', + }${!isLast ? ',\n' : ''}`; + }, '')} } + }${!isLast ? ',\n' : ''}`; + }, '')} } + `; + }; + + const getAssetFolders = (assetFolders: readonly Readonly[], isFirstLevel = true): string => { + return ( + assetFolders.reduce( + (code, assetFolder, index) => { + const isLast = index === assetFolders.length - 1; + + return `${code}\n + ${wrapComment(` + * ${assetFolder.name} + `)} + ${assetFolder.codename}: { + name: '${toSafePropertyValue(assetFolder.name)}', + codename: '${assetFolder.codename}', + id: '${assetFolder.id}', + externalId: ${getStringOrUndefinedAsPropertyValue(assetFolder.externalId)}, + folders: ${getAssetFolders(assetFolder.folders, false)}}${!isLast ? ',\n' : ''}`; + }, + !isFirstLevel ? '{' : '' + ) + (!isFirstLevel ? '}' : '') + ); + }; + + const getSnippets = (snippets: readonly Readonly[]): string => { + return snippets.reduce((code, snippet, index) => { + const isLast = index === snippets.length - 1; + + return `${code}\n + ${wrapComment(` + * ${snippet.name} + `)} + ${snippet.codename}: { + name: '${toSafePropertyValue(snippet.name)}', + codename: '${snippet.codename}', + id: '${snippet.id}', + externalId: ${getStringOrUndefinedAsPropertyValue(snippet.externalId)}, + elements: {${getContentTypeElements(snippet.elements)}} + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getContentTypes = (contentTypes: readonly Readonly[]): string => { + return contentTypes.reduce((code, contentType, index) => { + const isLast = index === contentTypes.length - 1; + + return `${code}\n + ${wrapComment(` + * ${contentType.name} + `)} + ${contentType.codename}: { + name: '${toSafePropertyValue(contentType.name)}', + codename: '${contentType.codename}', + id: '${contentType.id}', + externalId: ${getStringOrUndefinedAsPropertyValue(contentType.externalId)}, + elements: {${getContentTypeElements(contentType.elements)}} + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getContentTypeElements = (elements: readonly Readonly[]): string => { + if (!config.environmentEntities.snippets) { + throw new Error('Snippets are expected to be present in the environment entities.'); + } + if (!config.environmentEntities.taxonomies) { + throw new Error('Taxonomies are expected to be present in the environment entities.'); + } + if (!config.environmentEntities.contentTypes) { + throw new Error('Content types are expected to be present in the environment entities.'); + } + + const flattenedElements = getFlattenedElements({ + elements: elements, + snippets: config.environmentEntities.snippets, + taxonomies: config.environmentEntities.taxonomies, + types: config.environmentEntities.contentTypes + }); + + return flattenedElements.reduce((code, element, index) => { + const isLast = index === flattenedElements.length - 1; + const elementOptions = getElementOptionsCode(element); + + return `${code} + ${wrapComment(` + * ${element.title} (${element.type})${element.guidelines ? `\n* Guidelines: ${toGuidelinesComment(element.guidelines)}` : ''} + `)} + ${element.codename}: { + name: '${toSafePropertyValue(element.title)}', + codename: '${element.codename}', + id: '${element.id}', + externalId: ${getStringOrUndefinedAsPropertyValue(element.externalId)}, + required: ${element.isRequired}, + type: '${element.type}' + ${elementOptions ? `, options: ${elementOptions}` : ''} + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getElementOptionsCode = (flattenedElement: FlattenedElement): string | undefined => { + return match(flattenedElement.originalElement) + .returnType() + .with({ type: 'multiple_choice' }, (element) => { + return ( + element.options.reduce((code, option, index) => { + const isLast = index === element.options.length - 1; + return `${code}\n + ${wrapComment(` + * ${option.name} + `)} + ${option.codename ? option.codename : resolvePropertyName(option.name)}: { + name: '${toSafePropertyValue(option.name)}', + id: '${option.id}', + codename: ${getStringOrUndefinedAsPropertyValue(option.codename)}, + externalId: ${getStringOrUndefinedAsPropertyValue(option.external_id)} + }${!isLast ? ',\n' : ''}`; + }, '{') + '}' + ); + }) + .otherwise(() => undefined); + }; + + const getTaxonomies = (taxonomies: readonly Readonly[]): string => { + return taxonomies.reduce((code, taxonomy, index) => { + const isLast = index === taxonomies.length - 1; + + return `${code}\n + ${wrapComment(` + * ${taxonomy.codename} + `)} + ${taxonomy.codename}: { + name: '${toSafePropertyValue(taxonomy.name)}', + codename: '${taxonomy.codename}', + externalId: ${getStringOrUndefinedAsPropertyValue(taxonomy.externalId)}, + id: '${taxonomy.id}', + ${getTaxonomyTerms(taxonomy.terms)} + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getCollections = (collections: readonly Readonly[]): string => { + return collections.reduce((code, collection, index) => { + const isLast = index === collections.length - 1; + + return `${code}\n + ${wrapComment(` + * ${collection.name} + `)} + ${collection.codename}: { + name: '${toSafePropertyValue(collection.name)}', + codename: '${collection.codename}', + id: '${collection.id}' + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getRoles = (roles: readonly Readonly[]): string => { + return roles.reduce((code, role, index) => { + const isLast = index === roles.length - 1; + + return `${code}\n + ${wrapComment(` + * ${role.name} + `)} + ${resolvePropertyName(role.codename ?? role.name)}: { + name: '${toSafePropertyValue(role.name)}', + codename: ${getStringOrUndefinedAsPropertyValue(role.codename)}, + id: '${role.id}' + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getWebhooks = (webhooks: readonly Readonly[]): string => { + return webhooks.reduce((code, webhook, index) => { + const isLast = index === webhooks.length - 1; + + return `${code}\n + ${wrapComment(` + * ${webhook.name} + `)} + ${resolvePropertyName(webhook.name)}: { + name: '${toSafePropertyValue(webhook.name)}', + url: '${webhook.url}', + id: '${webhook.id}' + }${!isLast ? ',\n' : ''}`; + }, ''); + }; + + const getTaxonomyTerms = (terms: readonly Readonly[]): string => { + return ( + terms.reduce((code, term, index) => { + const isLast = index === terms.length - 1; + + return `${code}\n + ${wrapComment(` + * ${term.name} + `)} + ${term.codename}: { + name: '${toSafePropertyValue(term.name)}', + codename: '${term.codename}', + id: '${term.id}', + externalId: ${getStringOrUndefinedAsPropertyValue(term.externalId)}, + ${getTaxonomyTerms(term.terms)} + }${!isLast ? ',\n' : ''}`; + }, 'terms: {') + '}' + ); + }; + + const getWorkflowSteps = (workflow: Readonly): string => { + // The order of these steps should reflect the order in which they appear in the Kontent UI + const steps: readonly WorkflowStep[] = [...workflow.steps, workflow.scheduledStep, workflow.publishedStep, workflow.archivedStep]; + + return `{${steps.reduce((code, step) => { + return ( + code + + ` + ${step.codename}: { + name: '${toSafePropertyValue(step.name)}', + codename: '${step.codename}', + id: '${step.id}' + },` + ); + }, ``)}}`; + }; + + const wrapInConst = ({ constName, text }: { readonly constName: string; readonly text: string }): string => { + return `export const ${constName} = { + ${text} + } as const;`; + }; + + return { + generateEnvironmentModels + }; +} diff --git a/lib/generators/index.ts b/lib/generators/index.ts deleted file mode 100644 index 21a4a69..0000000 --- a/lib/generators/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './delivery/delivery-content-type.generator.js'; -export * from './project/project.generator.js'; diff --git a/lib/generators/items/items-func.ts b/lib/generators/items/items-func.ts new file mode 100644 index 0000000..99406ca --- /dev/null +++ b/lib/generators/items/items-func.ts @@ -0,0 +1,93 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import type { Options } from 'prettier'; +import type { + CliAction, + CreateFilesConfig, + DeliveryApiMode, + GeneratedFile, + GeneratedSet, + ModuleFileExtension +} from '../../core/core.models.js'; +import { singleItemToArray } from '../../core/core.utils.js'; +import { deliveryKontentFetcher as _deliveryKontentFetcher } from '../../fetch/delivery-kontent-fetcher.js'; +import { managementKontentFetcher as _managementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { fileManager as _fileManager } from '../../files/file-manager.js'; +import { itemsGenerator as _itemsGenerator } from './items.generator.js'; + +export type GenerateItemsModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly apiKey: string; + readonly moduleFileExtension: ModuleFileExtension; + readonly apiMode: DeliveryApiMode; + readonly filterByTypeCodenames: readonly string[]; + readonly generateTypes: boolean; + readonly generateObjects: boolean; + + readonly deliveryApiKey?: string; + readonly baseUrl?: string; + readonly deliveryBaseUrl?: string; + readonly formatOptions?: Readonly; +} & CreateFilesConfig; + +export async function generateItemsAsync(config: GenerateItemsModelsConfig): Promise { + console.log(chalk.green(`Model generator started \n`)); + console.log(`Generating '${chalk.yellow('items' satisfies CliAction)}' models\n`); + + const { itemFiles, environmentInfo, codenameFiles } = await getFilesAsync(config); + + const fileManager = _fileManager({ + ...config, + environmentInfo + }); + + const setFiles = await fileManager.getSetFilesAsync([...singleItemToArray(itemFiles), ...singleItemToArray(codenameFiles)]); + + if (config.createFiles) { + fileManager.createFiles(setFiles); + } + + console.log(chalk.green(`\nCompleted`)); + + return setFiles; +} + +async function getFilesAsync(config: GenerateItemsModelsConfig): Promise<{ + readonly itemFiles: GeneratedSet | undefined; + readonly codenameFiles: GeneratedSet | undefined; + readonly environmentInfo: Readonly; +}> { + const deliveryKontentFetcher = _deliveryKontentFetcher({ + environmentId: config.environmentId, + apiMode: config.apiMode, + apiKey: config.deliveryApiKey, + baseUrl: config.deliveryBaseUrl + }); + + const managementKontentFetcher = _managementKontentFetcher({ + environmentId: config.environmentId, + apiKey: config.apiKey, + baseUrl: config.baseUrl + }); + + const environmentInfo = await managementKontentFetcher.getEnvironmentInfoAsync(); + + const [items, types] = await Promise.all([ + deliveryKontentFetcher.getItemsAsync(config.filterByTypeCodenames), + managementKontentFetcher.getTypesAsync() + ]); + + const itemsGenerator = _itemsGenerator({ + environmentData: { + types: types, + items: items + } + }); + + return { + itemFiles: config.generateObjects ? itemsGenerator.getItemFiles() : undefined, + codenameFiles: config.generateTypes ? itemsGenerator.getCodenameFiles() : undefined, + environmentInfo + }; +} diff --git a/lib/generators/items/items.generator.ts b/lib/generators/items/items.generator.ts new file mode 100644 index 0000000..7860eb9 --- /dev/null +++ b/lib/generators/items/items.generator.ts @@ -0,0 +1,105 @@ +import type { IContentItem } from '@kontent-ai/delivery-sdk'; +import type { ContentTypeModels } from '@kontent-ai/management-sdk'; +import Chalk from 'chalk'; +import { itemsConfig } from '../../config.js'; +import { toSafeComment, wrapComment } from '../../core/comment.utils.js'; +import type { GeneratedSet } from '../../core/core.models.js'; +import { resolveCase } from '../../core/resolvers.js'; + +export interface ItemGeneratorConfig { + readonly environmentData: { + readonly items: readonly Readonly[]; + readonly types: readonly Readonly[]; + }; +} + +export function itemsGenerator(config: ItemGeneratorConfig) { + const getItemCodenameType = (typeCodename: string, items: readonly Readonly[]): string => { + return `export type ${resolveCase(typeCodename, 'pascalCase')}Codenames = ${items.map((item) => `'${item.system.codename}'`).join(' | ')};`; + }; + + const getItemCodenamesProp = (typeCodename: string, items: readonly Readonly[]): string => { + const values = items.reduce((code, item, index) => { + const isLast = index === items.length - 1; + + return `${code}\n + ${wrapComment(` + * ${item.system.name} + `)} + ${item.system.codename}: { + codename: '${item.system.codename}', + id: '${item.system.id}' + }${!isLast ? ',\n' : ''}`; + }, ''); + + return `export const ${typeCodename}Items = { + ${values} + } as const;`; + }; + + const groupItemsByType = (items: readonly Readonly[]): Map[]> => { + return items.reduce[]>>((itemsByType, item) => { + const existingGroupItems = itemsByType.get(item.system.type); + if (existingGroupItems) { + itemsByType.set(item.system.type, [...existingGroupItems, item]); + } else { + itemsByType.set(item.system.type, [item]); + } + + return itemsByType; + }, new Map[]>()); + }; + + return { + getItemFiles(): GeneratedSet { + return { + folderName: itemsConfig.itemsFolderName, + files: Array.from(groupItemsByType(config.environmentData.items)).map(([typeCodename, items]) => { + const type = config.environmentData.types.find((t) => t.codename.toLowerCase() === typeCodename.toLowerCase()); + + if (!type) { + throw new Error(`Type with codename '${Chalk.red(typeCodename)}' not found`); + } + + return { + filename: `${typeCodename}.items.ts`, + text: ` + ${wrapComment(`\n * Object representing identifiers of available items + * + * ${toSafeComment(type.name)} + * + * Codename: ${type.codename} + * Id: ${type.id} + * Codename: ${typeCodename}\n`)} + ${getItemCodenamesProp(typeCodename, items)}` + }; + }) + }; + }, + getCodenameFiles(): GeneratedSet { + return { + folderName: itemsConfig.codenamesFolderName, + files: Array.from(groupItemsByType(config.environmentData.items)).map(([typeCodename, items]) => { + const type = config.environmentData.types.find((t) => t.codename.toLowerCase() === typeCodename.toLowerCase()); + + if (!type) { + throw new Error(`Type with codename '${Chalk.red(typeCodename)}' not found`); + } + + return { + filename: `${typeCodename}.codenames.ts`, + text: ` + ${wrapComment(`\n * Type representing available item codenames + * + * ${toSafeComment(type.name)} + * + * Codename: ${type.codename} + * Id: ${type.id} + * Codename: ${typeCodename}\n`)} + ${getItemCodenameType(typeCodename, items)}` + }; + }) + }; + } + }; +} diff --git a/lib/generators/migration/migration-func.ts b/lib/generators/migration/migration-func.ts new file mode 100644 index 0000000..61e1d82 --- /dev/null +++ b/lib/generators/migration/migration-func.ts @@ -0,0 +1,83 @@ +import type { EnvironmentModels } from '@kontent-ai/management-sdk'; +import chalk from 'chalk'; +import type { Options } from 'prettier'; +import type { CliAction, CreateFilesConfig, GeneratedFile, GeneratedSet, ModuleFileExtension } from '../../core/core.models.js'; +import { managementKontentFetcher as _kontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { fileManager as _fileManager } from '../../files/file-manager.js'; +import { migrationGenerator as _migrationGenerator } from './migration.generator.js'; + +export type GenerateMigrationModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly apiKey: string; + readonly moduleFileExtension: ModuleFileExtension; + + readonly baseUrl?: string; + readonly formatOptions?: Readonly; +} & CreateFilesConfig; + +export async function generateMigrationModelsAsync(config: GenerateMigrationModelsConfig): Promise { + console.log(chalk.green(`Model generator started \n`)); + console.log(`Generating '${chalk.yellow('migration-toolkit' satisfies CliAction)}' models\n`); + + const { migrationItemFiles, migrationTypeFiles, environmentInfo, environmentFiles } = await getFilesAsync(config); + + const fileManager = _fileManager({ + ...config, + environmentInfo + }); + + const setFiles = await fileManager.getSetFilesAsync([migrationItemFiles, migrationTypeFiles, environmentFiles]); + + if (config.createFiles) { + fileManager.createFiles(setFiles); + } + + console.log(chalk.green(`\nCompleted`)); + + return setFiles; +} + +async function getFilesAsync(config: GenerateMigrationModelsConfig): Promise<{ + readonly migrationTypeFiles: GeneratedSet; + readonly migrationItemFiles: GeneratedSet; + readonly environmentFiles: GeneratedSet; + readonly environmentInfo: Readonly; +}> { + const kontentFetcher = _kontentFetcher({ + environmentId: config.environmentId, + apiKey: config.apiKey, + baseUrl: config.baseUrl + }); + + const environmentInfo = await kontentFetcher.getEnvironmentInfoAsync(); + + const [languages, taxonomies, types, snippets, collections, workflows] = await Promise.all([ + kontentFetcher.getLanguagesAsync(), + kontentFetcher.getTaxonomiesAsync(), + kontentFetcher.getTypesAsync(), + kontentFetcher.getSnippetsAsync(), + kontentFetcher.getCollectionsAsync(), + kontentFetcher.getWorkflowsAsync() + ]); + + const migrationGenerator = _migrationGenerator({ + moduleFileExtension: config.moduleFileExtension, + environmentData: { + environment: environmentInfo, + taxonomies: taxonomies, + languages: languages, + workflows: workflows, + types: types, + snippets: snippets, + collections: collections + } + }); + + return { + migrationTypeFiles: migrationGenerator.getMigrationTypeFiles(), + migrationItemFiles: migrationGenerator.getMigrationItemFiles(), + environmentFiles: migrationGenerator.getEnvironmentFiles(), + environmentInfo + }; +} diff --git a/lib/generators/migration/migration.generator.ts b/lib/generators/migration/migration.generator.ts new file mode 100644 index 0000000..931864b --- /dev/null +++ b/lib/generators/migration/migration.generator.ts @@ -0,0 +1,187 @@ +import type { + CollectionModels, + ContentTypeModels, + ContentTypeSnippetModels, + EnvironmentModels, + LanguageModels, + TaxonomyModels, + WorkflowModels +} from '@kontent-ai/management-sdk'; +import { match } from 'ts-pattern'; +import { migrationConfig, sharedTypesConfig } from '../../config.js'; +import { toGuidelinesComment, wrapComment } from '../../core/comment.utils.js'; +import type { FlattenedElement, GeneratedFile, GeneratedSet, ModuleFileExtension } from '../../core/core.models.js'; +import { getFlattenedElements } from '../../core/element.utils.js'; +import { importer as _importer } from '../../core/importer.js'; +import { resolveCase } from '../../core/resolvers.js'; +import { + getCollectionCodenamesType, + getContentTypeCodenamesType, + getLanguageCodenamesType, + getWorkflowCodenamesType, + getWorkflowStepCodenamesType +} from '../shared/type-codename.generator.js'; + +export interface MigrationGeneratorConfig { + readonly moduleFileExtension: ModuleFileExtension; + + readonly environmentData: { + readonly environment: Readonly; + readonly types: readonly Readonly[]; + readonly workflows: readonly Readonly[]; + readonly languages: readonly Readonly[]; + readonly collections: readonly Readonly[]; + readonly snippets: readonly Readonly[]; + readonly taxonomies: readonly Readonly[]; + }; +} + +export function migrationGenerator(config: MigrationGeneratorConfig) { + const importer = _importer(config.moduleFileExtension); + + const getMigrationItemType = (type: Readonly): GeneratedFile => { + return { + filename: `${type.codename}.ts`, + text: ` + ${importer.importType({ + filePathOrPackage: migrationConfig.npmPackageName, + importValue: migrationConfig.sdkTypeNames.elementModels + })} + ${importer.importType({ + filePathOrPackage: `../${migrationConfig.migrationTypesFilename}.ts`, + importValue: migrationConfig.localTypeNames.item + })} + + ${wrapComment(` + * ${type.name} + * + * Codename: ${type.codename} + * Id: ${type.id} + `)} + export type ${resolveCase(type.name, 'pascalCase')}Item = ${migrationConfig.localTypeNames.item}< + '${type.codename}', + { + ${getFlattenedElements({ + elements: type.elements, + snippets: config.environmentData.snippets, + taxonomies: config.environmentData.taxonomies, + types: config.environmentData.types + }) + .map((element) => { + return ` + ${wrapComment(` + * ${element.title} + * + * Type: ${element.type} + * Required: ${element.isRequired ? 'true' : 'false'} + * Codename: ${element.codename} + * Id: ${element.id}${element.guidelines ? `\n* Guidelines: ${toGuidelinesComment(element.guidelines)}` : ''} + `)} + readonly ${element.codename}: ${getElementPropType(element)}`; + }) + .join(',\n')}, + } + >;` + }; + }; + + return { + getEnvironmentFiles(): GeneratedSet { + return { + folderName: migrationConfig.environmentFolderName, + files: [ + { + filename: `${migrationConfig.environmentFilename}.ts`, + text: ` + ${wrapComment(`\n * Type representing all languages\n`)} + ${getLanguageCodenamesType(config.environmentData.languages)} + + ${wrapComment(`\n * Type representing all content types\n`)} + ${getContentTypeCodenamesType(config.environmentData.types)} + + ${wrapComment(`\n * Type representing all collections\n`)} + ${getCollectionCodenamesType(config.environmentData.collections)} + + ${wrapComment(`\n * Type representing all workflows\n`)} + ${getWorkflowCodenamesType(config.environmentData.workflows)} + + ${wrapComment(`\n * Type representing all worksflow steps across all workflows\n`)} + ${getWorkflowStepCodenamesType(config.environmentData.workflows)} + ` + } + ] + }; + }, + getMigrationTypeFiles(): GeneratedSet { + return { + folderName: undefined, + files: [ + { + filename: `${migrationConfig.migrationTypesFilename}.ts`, + text: ` + ${importer.importType({ + filePathOrPackage: migrationConfig.npmPackageName, + importValue: `${migrationConfig.sdkTypeNames.item}, ${migrationConfig.sdkTypeNames.system}, ${migrationConfig.sdkTypeNames.elements}` + })} + ${importer.importType({ + filePathOrPackage: `./${migrationConfig.environmentFolderName}/${migrationConfig.environmentFilename}.ts`, + importValue: `${sharedTypesConfig.collectionCodenames}, ${sharedTypesConfig.contentTypeCodenames}, ${sharedTypesConfig.languageCodenames}, ${sharedTypesConfig.workflowCodenames}, ${sharedTypesConfig.workflowStepCodenames}` + })} + + ${wrapComment('\n * System object shared by all individual content type models\n')} + ${getSystemType()} + + ${wrapComment('\n * Item object shared by all individual content type models\n')} + ${getItemType()} + ` + } + ] + }; + }, + getMigrationItemFiles(): GeneratedSet { + return { + folderName: migrationConfig.migrationItemsFolderName, + files: config.environmentData.types.map((type) => getMigrationItemType(type)) + }; + } + }; +} + +function getElementPropType(element: Readonly): string { + return match(element.type) + .returnType() + .with('text', () => `${migrationConfig.sdkTypeNames.elementModels}.TextElement`) + .with('asset', () => `${migrationConfig.sdkTypeNames.elementModels}.AssetElement`) + .with('custom', () => `${migrationConfig.sdkTypeNames.elementModels}.CustomElement`) + .with('date_time', () => `${migrationConfig.sdkTypeNames.elementModels}.DateTimeElement`) + .with('rich_text', () => `${migrationConfig.sdkTypeNames.elementModels}.RichTextElement`) + .with('number', () => `${migrationConfig.sdkTypeNames.elementModels}.NumberElement`) + .with('multiple_choice', () => `${migrationConfig.sdkTypeNames.elementModels}.MultipleChoiceElement`) + .with('subpages', () => `${migrationConfig.sdkTypeNames.elementModels}.SubpagesElement`) + .with('taxonomy', () => `${migrationConfig.sdkTypeNames.elementModels}.TaxonomyElement`) + .with('url_slug', () => `${migrationConfig.sdkTypeNames.elementModels}.UrlSlugElement`) + .with('modular_content', () => `${migrationConfig.sdkTypeNames.elementModels}.LinkedItemsElement`) + .with('guidelines', () => { + throw new Error('Guidelines are not supported'); + }) + .with('snippet', () => { + throw new Error('Snippets are not supported'); + }) + .exhaustive(); +} + +function getItemType(): string { + return `export type ${migrationConfig.localTypeNames.item}< + ${migrationConfig.localTypeNames.codename} extends ${sharedTypesConfig.contentTypeCodenames}, + ${migrationConfig.localTypeNames.elements} extends ${migrationConfig.sdkTypeNames.elements} = ${migrationConfig.sdkTypeNames.elements}, + > = ${migrationConfig.sdkTypeNames.item}<${migrationConfig.localTypeNames.elements}, ${migrationConfig.localTypeNames.system}<${migrationConfig.localTypeNames.codename}>, ${sharedTypesConfig.workflowStepCodenames}>;`; +} + +function getSystemType(): string { + return `export type ${migrationConfig.localTypeNames.system}<${migrationConfig.localTypeNames.codename} extends ${sharedTypesConfig.contentTypeCodenames}> = ${migrationConfig.sdkTypeNames.system}< + ${migrationConfig.localTypeNames.codename}, + ${sharedTypesConfig.languageCodenames}, + ${sharedTypesConfig.collectionCodenames}, + ${sharedTypesConfig.workflowCodenames} +>;`; +} diff --git a/lib/generators/project/project.generator.ts b/lib/generators/project/project.generator.ts deleted file mode 100644 index 991b35e..0000000 --- a/lib/generators/project/project.generator.ts +++ /dev/null @@ -1,743 +0,0 @@ -import { Options } from 'prettier'; -import { commonHelper, IGeneratedFile } from '../../common-helper.js'; -import { textHelper } from '../../text-helper.js'; -import { - AssetFolderModels, - CollectionModels, - ContentTypeElements, - ContentTypeModels, - ContentTypeSnippetModels, - LanguageModels, - EnvironmentModels, - RoleModels, - TaxonomyModels, - WebhookModels, - WorkflowModels -} from '@kontent-ai/management-sdk'; -import { camelCasePropertyNameResolver } from '@kontent-ai/delivery-sdk'; -import { ISortConfig } from '../../models.js'; - -interface IProjectCodeResult { - filename: string; - code: string; -} - -interface IWorkflowStep { - name: string; - codename: string; - id: string; -} - -interface IExtendedContentTypeElement { - element: ContentTypeElements.ContentTypeElementModel; - snippet?: ContentTypeSnippetModels.ContentTypeSnippet; - mappedName: string | undefined; -} - -export class ProjectGenerator { - generateProjectModel(data: { - outputDir: string; - environmentInfo: EnvironmentModels.EnvironmentInformationModel; - types: ContentTypeModels.ContentType[]; - languages: LanguageModels.LanguageModel[]; - taxonomies: TaxonomyModels.Taxonomy[]; - workflows: WorkflowModels.Workflow[]; - assetFolders: AssetFolderModels.AssetFolder[]; - collections: CollectionModels.Collection[]; - roles: RoleModels.Role[]; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - webhooks: WebhookModels.Webhook[]; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - projectFolderName: string; - sortConfig: ISortConfig; - formatOptions?: Options; - }): IGeneratedFile[] { - const projectCodes = this.getProjectModelCode({ - environmentInfo: data.environmentInfo, - types: data.types, - addTimestamp: data.addTimestamp, - formatOptions: data.formatOptions, - languages: data.languages, - taxonomies: data.taxonomies, - workflows: data.workflows, - assetFolders: data.assetFolders, - collections: data.collections, - roles: data.roles, - snippets: data.snippets, - webhooks: data.webhooks, - sortConfig: data.sortConfig - }); - - let headerCode = ` -/** -* ${commonHelper.getAutogenerateNote(data.addTimestamp)}`; - - if (data.addEnvironmentInfo) { - headerCode += ` -* -* ${this.getEnvironmentComment(data.environmentInfo)}`; - } - - headerCode += ` -*/`; - - const generatedFiles: IGeneratedFile[] = []; - - for (const projectCode of projectCodes) { - const filePath = `${data.outputDir}${data.projectFolderName}${projectCode.filename}`; - - generatedFiles.push({ - filename: filePath, - text: headerCode + '\n' + projectCode.code - }); - } - - return generatedFiles; - } - - getAssetFoldersCount(folders: AssetFolderModels.AssetFolder[], count: number = 0): number { - count += folders.length; - - for (const folder of folders) { - if (folder.folders) { - count = this.getAssetFoldersCount(folder.folders, count); - } - } - - return count; - } - - private getEnvironmentComment(environmentInfo: EnvironmentModels.EnvironmentInformationModel): string { - let comment: string = `Project name: ${textHelper.toSafeName(environmentInfo.name, 'space')}`; - - comment += `\n* Environment: ${environmentInfo.environment}`; - comment += `\n* Environment Id: ${environmentInfo.id}`; - - return comment; - } - - private getContentTypeComment(contentType: ContentTypeModels.ContentType): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(contentType.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getContentTypeSnippetComment(snippet: ContentTypeSnippetModels.ContentTypeSnippet): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(snippet.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getWorkflowComment(workflow: WorkflowModels.Workflow): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(workflow.name, 'space')}`; - comment += `\n* Archived step Id: ${workflow.archivedStep.id}`; - comment += `\n* Published step Id: ${workflow.publishedStep.id}`; - comment += `\n*/`; - - return comment; - } - - private getAssetFolderComment(assetFolder: AssetFolderModels.AssetFolder): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(assetFolder.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getLanguageComment(language: LanguageModels.LanguageModel): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(language.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getElementName( - element: ContentTypeElements.ContentTypeElementModel, - taxonomies: TaxonomyModels.Taxonomy[] - ): string | undefined { - if ((element as any)['name']) { - return (element as any)['name']; - } - - if (element.type === 'taxonomy') { - const taxonomy = taxonomies.find( - (m) => m.id.toLowerCase() === element.taxonomy_group.id?.toLocaleLowerCase() - ); - - if (!taxonomy) { - throw Error(`Invalid taxonomy with id '${element.taxonomy_group.id}'`); - } - - return taxonomy.name; - } - - return undefined; - } - - private getElementComment( - element: ContentTypeElements.ContentTypeElementModel, - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - let comment: string = `/**`; - const guidelines = commonHelper.getElementGuidelines(element); - const name = commonHelper.getElementTitle(element, taxonomies); - - if (name) { - comment += `\n* ${textHelper.toSafeName(name, 'space')} (${element.type})`; - } - - if (guidelines) { - comment += `\n*`; - comment += `\n* ${textHelper.removeLineEndings(guidelines)}`; - } - - comment += `\n*/`; - - return comment; - } - - private getTaxonomyComment(taxonomy: TaxonomyModels.Taxonomy): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(taxonomy.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getCollectionComment(collection: CollectionModels.Collection): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(collection.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getRoleComment(role: RoleModels.Role): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(role.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getWebhookComment(webhook: WebhookModels.Webhook): string { - let comment: string = `/**`; - - comment += `\n* ${textHelper.toSafeName(webhook.name, 'space')}`; - comment += `\n*/`; - - return comment; - } - - private getProjectModelCode(data: { - environmentInfo: EnvironmentModels.EnvironmentInformationModel; - types: ContentTypeModels.ContentType[]; - languages: LanguageModels.LanguageModel[]; - taxonomies: TaxonomyModels.Taxonomy[]; - workflows: WorkflowModels.Workflow[]; - snippets: ContentTypeSnippetModels.ContentTypeSnippet[]; - assetFolders: AssetFolderModels.AssetFolder[]; - collections: CollectionModels.Collection[]; - roles: RoleModels.Role[]; - webhooks: WebhookModels.Webhook[]; - addTimestamp: boolean; - sortConfig: ISortConfig; - formatOptions?: Options; - }): IProjectCodeResult[] { - const result: IProjectCodeResult[] = [ - { - code: `export const languages = { - ${this.getProjectLanguages(data.languages)} - } as const;`, - filename: 'languages.ts' - }, - { - code: `export const collections = { - ${this.getCollections(data.collections)} - } as const;`, - filename: 'collections.ts' - }, - { - code: `export const contentTypes = { - ${this.getProjectContentTypes(data.types, data.snippets, data.taxonomies)} - } as const;`, - filename: 'contentTypes.ts' - }, - { - code: `export const contentTypeSnippets = { - ${this.getProjectContentTypeSnippets(data.snippets, data.taxonomies)} - } as const;`, - filename: 'contentTypeSnippets.ts' - }, - { - code: `export const taxonomies = { - ${this.getProjectTaxonomies(data.taxonomies, data.sortConfig)} - } as const;`, - filename: 'taxonomies.ts' - }, - { - code: `export const workflows = { - ${this.getProjectWorkflows(data.workflows)} - } as const;`, - filename: 'workflows.ts' - }, - { - code: `export const roles = { - ${this.getRoles(data.roles)} - } as const;`, - filename: 'roles.ts' - }, - { - code: `export const assetFolders = ${this.getAssetFolders(data.assetFolders)} as const;`, - filename: 'assetFolders.ts' - }, - { - code: `export const webhooks = { - ${this.getWebhooks(data.webhooks)} - } as const;`, - filename: 'webhooks.ts' - } - ]; - - return result; - } - - private getProjectLanguages(languages: LanguageModels.LanguageModel[]): string { - let code: string = ``; - for (let i = 0; i < languages.length; i++) { - const language = languages[i]; - const isLast = i === languages.length - 1; - code += `\n`; - code += `${this.getLanguageComment(language)}\n`; - code += `${camelCasePropertyNameResolver('', language.codename)}: { - codename: '${language.codename}', - id: '${language.id}', - isActive: ${language.isActive ? 'true' : 'false'}, - isDefault: ${language.isDefault ? 'true' : 'false'}, - fallbackLanguageId: ${this.getStringOrUndefined(language.fallbackLanguage?.id)}, - externalId: ${this.getStringOrUndefined(language.externalId)}, - name: '${commonHelper.escapeNameValue(language.name)}'}`; - code += `${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getStringOrUndefined(text?: string): string { - if (!text) { - return 'undefined'; - } - return `'${text}'`; - } - - private getProjectWorkflows(workflows: WorkflowModels.Workflow[]): string { - let code: string = ``; - for (let i = 0; i < workflows.length; i++) { - const workflow = workflows[i]; - const isLast = i === workflows.length - 1; - - code += `\n`; - code += `${this.getWorkflowComment(workflow)}\n`; - code += `${workflow.codename}: { - codename: '${workflow.codename}', - id: '${workflow.id}', - name: '${commonHelper.escapeNameValue(workflow.name)}', - steps: ${this.getProjectWorkflowSteps(workflow)} - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getAssetFolders(assetFolders: AssetFolderModels.AssetFolder[]): string { - let code: string = `{`; - for (let i = 0; i < assetFolders.length; i++) { - const assetFolder = assetFolders[i]; - const isLast = i === assetFolders.length - 1; - - code += `\n`; - code += `${this.getAssetFolderComment(assetFolder)}\n`; - code += `${camelCasePropertyNameResolver('', assetFolder.name)}: { - id: '${assetFolder.id}', - name: '${commonHelper.escapeNameValue(assetFolder.name)}', - externalId: ${this.getStringOrUndefined(assetFolder.externalId)}, - folders: ${this.getAssetFolders(assetFolder.folders)}}${!isLast ? ',\n' : ''}`; - } - - code += '}'; - - return code; - } - - private getProjectContentTypeSnippets( - snippets: ContentTypeSnippetModels.ContentTypeSnippet[], - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - let code: string = ``; - for (let i = 0; i < snippets.length; i++) { - const snippet = snippets[i]; - const isLast = i === snippets.length - 1; - - code += `\n`; - code += `${this.getContentTypeSnippetComment(snippet)}\n`; - code += `${snippet.codename}: { - codename: '${snippet.codename}', - id: '${snippet.id}', - externalId: ${this.getStringOrUndefined(snippet.externalId)}, - name: '${commonHelper.escapeNameValue(snippet.name)}', - elements: {${this.getContentTypeSnippetElements(snippet, taxonomies)}} - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getProjectContentTypes( - contentTypes: ContentTypeModels.ContentType[], - snippets: ContentTypeSnippetModels.ContentTypeSnippet[], - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - let code: string = ``; - for (let i = 0; i < contentTypes.length; i++) { - const contentType = contentTypes[i]; - const isLast = i === contentTypes.length - 1; - - code += `\n`; - code += `${this.getContentTypeComment(contentType)}\n`; - code += `${contentType.codename}: { - codename: '${contentType.codename}', - id: '${contentType.id}', - externalId: ${this.getStringOrUndefined(contentType.externalId)}, - name: '${commonHelper.escapeNameValue(contentType.name)}', - elements: {${this.getContentTypeElements(contentType, snippets, taxonomies)}} - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getContentTypeElements( - contentType: ContentTypeModels.ContentType, - snippets: ContentTypeSnippetModels.ContentTypeSnippet[], - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - let code: string = ''; - - const extendedElements: IExtendedContentTypeElement[] = this.getExtendedElements( - contentType, - snippets, - taxonomies - ); - - for (let i = 0; i < extendedElements.length; i++) { - const extendedElement = extendedElements[i]; - const element = extendedElement.element; - const codename = commonHelper.getElementCodename(element); - const name = this.getElementName(element, taxonomies); - - if (!name) { - // element does not have a name (e.g. guidelines) - continue; - } - - if (!codename) { - // element does not have codename - continue; - } - - const isLast = i === extendedElements.length - 1; - - const isRequired = commonHelper.isElementRequired(element); - - const elementOptions = this.getElementOptions(element); - - code += `\n`; - code += `${this.getElementComment(element, taxonomies)}\n`; - code += `${codename}: { - codename: '${codename}', - id: '${element.id}', - externalId: ${this.getStringOrUndefined(element.external_id)}, - name: '${commonHelper.escapeNameValue(name)}', - required: ${isRequired}, - type: '${element.type}' - ${elementOptions ? `, options: ${elementOptions}` : ''} - ${ - extendedElement.snippet - ? `, snippetCodename: ${this.getStringOrUndefined(extendedElement.snippet?.codename)}` - : '' - } - - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getElementOptions(element: ContentTypeElements.ContentTypeElementModel): string | undefined { - if (element.type === 'multiple_choice') { - let stronglyTypedOptions: string = `{`; - - for (let i = 0; i < element.options.length; i++) { - const isLast = i === element.options.length - 1; - const option = element.options[i]; - - stronglyTypedOptions += `${option.codename}: { - name: '${textHelper.toSafeName(option.name, 'space')}', - id: '${option.id}', - codename: '${option.codename}', - externalId: ${this.getStringOrUndefined(option.external_id)} - }`; - - stronglyTypedOptions += !isLast ? ',\n' : ''; - } - - stronglyTypedOptions += `}`; - - return stronglyTypedOptions; - } - - return undefined; - } - - private getContentTypeSnippetElements( - snippet: ContentTypeSnippetModels.ContentTypeSnippet, - taxonomies: TaxonomyModels.Taxonomy[] - ): string { - let code: string = ''; - - for (let i = 0; i < snippet.elements.length; i++) { - const element = snippet.elements[i]; - const codename = commonHelper.getElementCodename(element); - const name = this.getElementName(element, taxonomies); - - if (!name) { - // element does not have a name (e.g. guidelines) - continue; - } - - if (!codename) { - // element does not have codename - continue; - } - - const isLast = i === snippet.elements.length - 1; - - const isRequired = commonHelper.isElementRequired(element); - - code += `\n`; - code += `${this.getElementComment(element, taxonomies)}\n`; - code += `${codename}: { - codename: '${codename}', - id: '${element.id}', - externalId: ${this.getStringOrUndefined(element.external_id)}, - name: '${commonHelper.escapeNameValue(name)}', - required: ${isRequired}, - type: '${element.type}', - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getExtendedElements( - contentType: ContentTypeModels.ContentType, - snippets: ContentTypeSnippetModels.ContentTypeSnippet[], - taxonomies: TaxonomyModels.Taxonomy[] - ): IExtendedContentTypeElement[] { - const extendedElements: IExtendedContentTypeElement[] = []; - for (const element of contentType.elements) { - if (element.type === 'snippet') { - // get snippet elements - const snippetElement: ContentTypeElements.ISnippetElement = element; - const snippet = snippets.find((m) => m.id === snippetElement.snippet.id); - - if (!snippet) { - throw Error( - `Could not find content type snippet with id '${snippetElement.snippet.id}'. This snippet is used in type '${contentType.codename}'` - ); - } - extendedElements.push( - ...snippet.elements.map((mElement) => { - const extendedElement: IExtendedContentTypeElement = { - element: mElement, - snippet: snippet, - mappedName: this.getElementName(mElement, taxonomies) - }; - - return extendedElement; - }) - ); - } else { - extendedElements.push({ - element: element, - snippet: undefined, - mappedName: this.getElementName(element, taxonomies) - }); - } - } - - return commonHelper.sortAlphabetically(extendedElements, (item) => item.mappedName ?? ''); - } - - private getProjectTaxonomies(taxonomies: TaxonomyModels.Taxonomy[], sortConfig: ISortConfig): string { - let code: string = ``; - for (let i = 0; i < taxonomies.length; i++) { - const taxonomy = taxonomies[i]; - const isLast = i === taxonomies.length - 1; - - code += `\n`; - code += `${this.getTaxonomyComment(taxonomy)}\n`; - code += `${taxonomy.codename}: { - codename: '${taxonomy.codename}', - id: '${taxonomy.id}', - externalId: ${this.getStringOrUndefined(taxonomy.externalId)}, - name: '${commonHelper.escapeNameValue(taxonomy.name)}', - ${this.getProjectTaxonomiesTerms(taxonomy.terms, sortConfig)} - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getCollections(collections: CollectionModels.Collection[]): string { - let code: string = ``; - for (let i = 0; i < collections.length; i++) { - const collection = collections[i]; - const isLast = i === collections.length - 1; - - code += `\n`; - code += `${this.getCollectionComment(collection)}\n`; - code += `${collection.codename}: { - codename: '${collection.codename}', - id: '${collection.id}', - name: '${commonHelper.escapeNameValue(collection.name)}' - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getRoles(roles: RoleModels.Role[]): string { - let code: string = ``; - for (let i = 0; i < roles.length; i++) { - const role = roles[i]; - const isLast = i === roles.length - 1; - - code += `\n`; - code += `${this.getRoleComment(role)}\n`; - code += `${camelCasePropertyNameResolver('', role.name)}: { - codename: ${role.codename ? "'" + role.codename + "'" : undefined}, - id: '${role.id}', - name: '${commonHelper.escapeNameValue(role.name)}' - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getWebhooks(webhooks: WebhookModels.Webhook[]): string { - let code: string = ``; - for (let i = 0; i < webhooks.length; i++) { - const webhook = webhooks[i]; - const isLast = i === webhooks.length - 1; - - code += `\n`; - code += `${this.getWebhookComment(webhook)}\n`; - code += `${camelCasePropertyNameResolver('', webhook.name)}: { - url: '${webhook.url}', - id: '${webhook.id}', - name: '${commonHelper.escapeNameValue(webhook.name)}' - }${!isLast ? ',\n' : ''}`; - } - - return code; - } - - private getProjectTaxonomiesTerms(terms: TaxonomyModels.Taxonomy[], sortConfig: ISortConfig): string { - if (terms.length === 0) { - return `terms: {}`; - } - - const sortedTerms: TaxonomyModels.Taxonomy[] = sortConfig.sortTaxonomyTerms - ? commonHelper.sortAlphabetically(terms, (item) => item.name) - : terms; - - let code: string = `terms: {`; - for (let i = 0; i < sortedTerms.length; i++) { - const term = sortedTerms[i]; - const isLast = i === sortedTerms.length - 1; - code += `${term.codename}: { - codename: '${term.codename}', - id: '${term.id}', - externalId: ${this.getStringOrUndefined(term.externalId)}, - name: '${commonHelper.escapeNameValue(term.name)}', - ${this.getProjectTaxonomiesTerms(term.terms, sortConfig)} - }${!isLast ? ',\n' : ''}`; - } - code += '}'; - - return code; - } - - private getProjectWorkflowSteps(workflow: WorkflowModels.Workflow): string { - const steps: IWorkflowStep[] = [ - { - codename: workflow.archivedStep.codename, - id: workflow.archivedStep.id, - name: workflow.archivedStep.name - }, - { - codename: workflow.publishedStep.codename, - id: workflow.publishedStep.id, - name: workflow.publishedStep.name - }, - { - codename: workflow.scheduledStep.codename, - id: workflow.scheduledStep.id, - name: workflow.scheduledStep.name - } - ]; - - for (const step of workflow.steps) { - steps.push({ - codename: step.codename, - id: step.id, - name: step.name - }); - } - - const code: string = ` - { - ${steps.map((step) => { - return ` - ${step.codename}: { - name: '${commonHelper.escapeNameValue(step.name)}', - codename: '${step.codename}', - id: '${step.id}' - } - `; - })} - } - `; - - return code; - } -} - -export const projectGenerator = new ProjectGenerator(); diff --git a/lib/generators/shared/type-codename.generator.ts b/lib/generators/shared/type-codename.generator.ts new file mode 100644 index 0000000..201a6ed --- /dev/null +++ b/lib/generators/shared/type-codename.generator.ts @@ -0,0 +1,69 @@ +import type { + CollectionModels, + ContentTypeModels, + ContentTypeSnippetModels, + LanguageModels, + TaxonomyModels, + WorkflowModels +} from '@kontent-ai/management-sdk'; +import { match, P } from 'ts-pattern'; +import { sharedTypesConfig } from '../../config.js'; +import type { ObjectWithCodename } from '../../core/core.models.js'; +import { isNotUndefined, sortAlphabetically, uniqueFilter } from '../../core/core.utils.js'; + +export function getLanguageCodenamesType(languages: readonly Readonly[]): string { + return getTypeWithCodenames(sharedTypesConfig.languageCodenames, languages); +} + +export function getContentTypeCodenamesType(types: readonly Readonly[]): string { + return getTypeWithCodenames(sharedTypesConfig.contentTypeCodenames, types); +} + +export function getWorkflowCodenamesType(workflows: readonly Readonly[]): string { + return getTypeWithCodenames(sharedTypesConfig.workflowCodenames, workflows); +} + +export function getTaxonomyCodenamesType(taxonomies: readonly Readonly[]): string { + return getTypeWithCodenames(sharedTypesConfig.taxonomyCodenames, taxonomies); +} + +export function getCollectionCodenamesType(collections: readonly Readonly[]): string { + return getTypeWithCodenames(sharedTypesConfig.collectionCodenames, collections); +} + +export function getWorkflowStepCodenamesType(workflows: readonly Readonly[]): string { + return getTypeWithCodenames( + sharedTypesConfig.workflowStepCodenames, + workflows.flatMap((workflow) => [...workflow.steps, workflow.publishedStep, workflow.archivedStep, workflow.scheduledStep]) + ); +} + +export function getElementCodenamesType( + types: readonly Readonly[], + snippets: readonly Readonly[] +): string { + return getTypeWithCodenames( + sharedTypesConfig.elementCodenames, + [...types, ...snippets].flatMap((type) => + type.elements + .map((element) => + match(element) + .returnType() + .with({ codename: P.nonNullable }, (elementWithCodename) => { + return elementWithCodename; + }) + .otherwise(() => undefined) + ) + .filter(isNotUndefined) + ) + ); +} + +function getTypeWithCodenames(typeName: string, items: readonly ObjectWithCodename[]): string { + if (!items.length) { + return `export type ${typeName} = never`; + } + return `export type ${typeName} = ${sortAlphabetically(items.map((item) => `'${item.codename}'`).filter(uniqueFilter), (m) => m).join( + ' | ' + )};`; +} diff --git a/lib/index.ts b/lib/index.ts deleted file mode 100644 index 1369907..0000000 --- a/lib/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './common-helper.js'; -export * from './text-helper.js'; -export * from './name-helper.js'; -export * from './models.js'; -export * from './generator.js'; - -export * from './generators/index.js'; diff --git a/lib/meta/index.ts b/lib/meta/index.ts deleted file mode 100644 index 09e6464..0000000 --- a/lib/meta/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './metadata.js'; \ No newline at end of file diff --git a/lib/meta/metadata.ts b/lib/meta/metadata.ts index 0281976..52df318 100644 --- a/lib/meta/metadata.ts +++ b/lib/meta/metadata.ts @@ -1,6 +1,7 @@ export const libMetadata = { + host: 'npmjs.com', name: '@kontent-ai/model-generator', - timestamp: 'Thu, 15 Aug 2024 09:05:18 GMT', - version: '7.4.0' + timestamp: 'Wed, 19 Feb 2025 15:12:40 GMT', + version: '8.0.0-18' }; diff --git a/lib/models.ts b/lib/models.ts deleted file mode 100644 index e31855f..0000000 --- a/lib/models.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { PropertyNameResolver } from '@kontent-ai/delivery-sdk'; -import { ContentTypeModels, ContentTypeSnippetModels, TaxonomyModels } from '@kontent-ai/management-sdk'; -import { Options } from 'prettier'; - - -export type ModuleResolution = 'nodeNext' | 'node'; -export type DefaultResolverType = 'camelCase' | 'pascalCase' | 'snakeCase'; -export type SdkType = 'delivery' | 'management'; -export type ElementResolver = DefaultResolverType | PropertyNameResolver; - -export type ContentTypeFileNameResolver = - | DefaultResolverType - | ((contentType: ContentTypeModels.ContentType) => string); -export type ContentTypeSnippetFileNameResolver = - | DefaultResolverType - | ((contentTypeSnippet: ContentTypeSnippetModels.ContentTypeSnippet) => string); -export type TaxonomyTypeFileNameResolver = DefaultResolverType | ((taxonomy: TaxonomyModels.Taxonomy) => string); - -export type ContentTypeResolver = DefaultResolverType | ((contentType: ContentTypeModels.ContentType) => string); -export type ContentTypeSnippetResolver = - | DefaultResolverType - | ((contentTypeSnippet: ContentTypeSnippetModels.ContentTypeSnippet) => string); -export type TaxonomyTypeResolver = DefaultResolverType | ((taxonomy: TaxonomyModels.Taxonomy) => string); - -export interface IExportProjectSettings { - exportWebhooks: boolean; - exportWorkflows: boolean; - exportRoles: boolean; - exportAssetFolders: boolean; - exportCollections: boolean; - exportLanguages: boolean; -} - -export interface IGenerateModelsConfig { - environmentId: string; - addTimestamp: boolean; - addEnvironmentInfo: boolean; - isEnterpriseSubscription: boolean; - sdkType: SdkType; - apiKey: string; - moduleResolution?: ModuleResolution; - managementApiUrl?: string; - - /** - * Determines what content structure objects are exported. - * If not set, all objects are exported - */ - exportProjectSettings?: IExportProjectSettings; - outputDir?: string; - sortConfig?: ISortConfig; - contentTypeFileResolver?: ContentTypeFileNameResolver; - contentTypeSnippetFileResolver?: ContentTypeSnippetFileNameResolver; - taxonomyTypeFileResolver?: TaxonomyTypeFileNameResolver; - contentTypeResolver?: ContentTypeResolver; - contentTypeSnippetResolver?: ContentTypeSnippetResolver; - taxonomyTypeResolver?: TaxonomyTypeResolver; - elementResolver?: ElementResolver; - formatOptions?: Options; -} - -export interface ISortConfig { - sortTaxonomyTerms: boolean; -} diff --git a/lib/name-helper.ts b/lib/name-helper.ts deleted file mode 100644 index 7b095a4..0000000 --- a/lib/name-helper.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { ContentTypeModels, ContentTypeSnippetModels, TaxonomyModels } from '@kontent-ai/management-sdk'; -import { - ContentTypeFileNameResolver, - ContentTypeResolver, - TaxonomyTypeFileNameResolver, - TaxonomyTypeResolver -} from './models.js'; -import { textHelper } from './text-helper.js'; - -export class NameHelper { - getDeliveryContentTypeFilename(data: { - type: ContentTypeModels.ContentType; - addExtension: boolean; - fileResolver?: ContentTypeFileNameResolver; - }): string { - if (data.fileResolver instanceof Function) { - return `${data.fileResolver(data.type)}${data.addExtension ? '.ts' : ''}`; - } - - let filename: string; - - if (!data.fileResolver) { - filename = `${data.type.codename}`; - } else { - filename = `${textHelper.resolveTextWithDefaultResolver(data.type.codename, data.fileResolver)}`; - } - - return `${filename}${data.addExtension ? '.ts' : ''}`; - } - - getDeliveryContentTypeSnippetFilename(data: { - snippet: ContentTypeSnippetModels.ContentTypeSnippet; - addExtension: boolean; - fileResolver?: ContentTypeFileNameResolver; - }): string { - if (data.fileResolver instanceof Function) { - return `${data.fileResolver(data.snippet)}${data.addExtension ? '.ts' : ''}`; - } - - let filename: string; - - if (!data.fileResolver) { - filename = `${data.snippet.codename}`; - } else { - filename = `${textHelper.resolveTextWithDefaultResolver(data.snippet.codename, data.fileResolver)}`; - } - - return `${filename}${data.addExtension ? '.ts' : ''}`; - } - - getDeliveryContentTypeName(data: { - type: ContentTypeModels.ContentType; - contentTypeResolver?: ContentTypeResolver; - }): string { - if (!data.contentTypeResolver) { - return textHelper.toPascalCase(data.type.name); - } - - if (data.contentTypeResolver instanceof Function) { - return `${data.contentTypeResolver(data.type)}`; - } - - return `${textHelper.resolveTextWithDefaultResolver(data.type.name, data.contentTypeResolver)}`; - } - - getDeliveryContentTypeSnippetName(data: { - snippet: ContentTypeSnippetModels.ContentTypeSnippet; - contentTypeResolver?: ContentTypeResolver; - }): string { - if (!data.contentTypeResolver) { - return textHelper.toPascalCase(data.snippet.name); - } - - if (data.contentTypeResolver instanceof Function) { - return `${data.contentTypeResolver(data.snippet)}`; - } - - return `${textHelper.resolveTextWithDefaultResolver(data.snippet.name, data.contentTypeResolver)}`; - } - - getDeliveryTaxonomyFilename(data: { - taxonomy: TaxonomyModels.Taxonomy; - fileResolver?: TaxonomyTypeFileNameResolver; - addExtension: boolean; - }): string { - if (data.fileResolver instanceof Function) { - return `${data.fileResolver(data.taxonomy)}${data.addExtension ? '.ts' : ''}`; - } - - let filename: string; - - if (!data.fileResolver) { - filename = `${data.taxonomy.codename}`; - } else { - filename = `${textHelper.resolveTextWithDefaultResolver(data.taxonomy.codename, data.fileResolver)}`; - } - - return `${filename}${data.addExtension ? '.ts' : ''}`; - } - - getDeliveryTaxonomyTypeName(data: { - taxonomy: TaxonomyModels.Taxonomy; - taxonomyResolver?: TaxonomyTypeResolver; - }): string { - if (!data.taxonomyResolver) { - return textHelper.toPascalCase(data.taxonomy.name); - } - - if (data.taxonomyResolver instanceof Function) { - return `${data.taxonomyResolver(data.taxonomy)}`; - } - - return `${textHelper.resolveTextWithDefaultResolver(data.taxonomy.name, data.taxonomyResolver)}`; - } -} - -export const nameHelper = new NameHelper(); diff --git a/lib/public_api.ts b/lib/public_api.ts new file mode 100644 index 0000000..c49ec16 --- /dev/null +++ b/lib/public_api.ts @@ -0,0 +1,9 @@ +/* + * Public API + */ +export type { CaseType, DeliveryApiMode, ModuleFileExtension } from './core/core.models.js'; +export { resolveCase } from './core/resolvers.js'; +export { generateDeliveryModelsAsync, type GenerateDeliveryModelsConfig } from './generators/delivery/delivery-func.js'; +export { generateEnvironmentModelsAsync, type GenerateEnvironmentModelsConfig } from './generators/environment/environment-func.js'; +export { generateItemsAsync, type GenerateItemsModelsConfig } from './generators/items/items-func.js'; +export { generateMigrationModelsAsync, type GenerateMigrationModelsConfig } from './generators/migration/migration-func.js'; diff --git a/lib/text-helper.ts b/lib/text-helper.ts deleted file mode 100644 index b095045..0000000 --- a/lib/text-helper.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - camelCasePropertyNameResolver, - pascalCasePropertyNameResolver, - snakeCasePropertyNameResolver -} from '@kontent-ai/delivery-sdk'; -import { DefaultResolverType } from './models.js'; - -export class TextHelper { - resolveTextWithDefaultResolver(text: string, resolverType: DefaultResolverType): string { - if (resolverType === 'camelCase') { - return this.toCamelCase(text); - } - - if (resolverType === 'pascalCase') { - return this.toPascalCase(text); - } - - if (resolverType === 'snakeCase') { - return this.toSnakeCase(text); - } - - throw Error(`Invalid name resolver '${resolverType}'. Available options are: camelCase, pascalCase, snakeCase`); - } - - toPascalCase(text: string): string { - // use element resolver from SDK as it provides required functionality - return this.toSafeName(pascalCasePropertyNameResolver('', text), 'nothing'); - } - - toCamelCase(text: string): string { - // use element resolver from SDK as it provides required functionality - return this.toSafeName(camelCasePropertyNameResolver('', text), 'nothing'); - } - - toSnakeCase(text: string): string { - // use element resolver from SDK as it provides required functionality - return this.toSafeName(snakeCasePropertyNameResolver('', text), 'nothing'); - } - - toAlphanumeric(value: string): string { - return value.replace(/\W/g, ''); - } - - removeLineEndings(value: string): string { - return value.replace(/(\r\n|\n|\r)/gm, ''); - } - - toSafeName(text: string, replaceWith: 'space' | 'nothing'): string { - const replaceContent = replaceWith === 'space' ? ' ' : ''; - return text.replace(/[\s-]/g, replaceContent).replace(/[^a-zA-Z0-9_]/g, replaceContent); - } -} - -export const textHelper = new TextHelper(); diff --git a/package-lock.json b/package-lock.json index 157645c..7b90b29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,52 @@ { "name": "@kontent-ai/model-generator", - "version": "7.4.0", + "version": "8.0.0-18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@kontent-ai/model-generator", - "version": "7.4.0", + "version": "8.0.0-18", "license": "MIT", "dependencies": { - "@kontent-ai/delivery-sdk": "14.11.0", - "@kontent-ai/management-sdk": "7.2.0", - "colors": "1.4.0", - "prettier": "3.3.3", + "@kontent-ai/delivery-sdk": "16.0.0-0", + "@kontent-ai/management-sdk": "7.6.1", + "chalk": "5.4.1", + "prettier": "3.5.1", + "ts-pattern": "5.6.2", "yargs": "17.7.2" }, "bin": { - "kontent-generate": "dist/es2022/lib/cli/cli.js" + "kontent-generate": "dist/cli/app.js" }, "devDependencies": { - "@types/node": "20.14.11", - "@types/prettier": "3.0.0", - "@types/yargs": "17.0.32", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/parser": "7.16.1", - "dotenv-cli": "7.4.2", - "eslint": "8.57.0", + "@eslint/js": "9.20.0", + "@kontent-ai/migration-toolkit": "2.4.0", + "@types/eslint__js": "8.42.3", + "@types/node": "22.13.4", + "@types/yargs": "17.0.33", + "dotenv-cli": "8.0.0", + "eslint": "9.20.1", "standard-version": "9.5.0", - "tsx": "4.16.2", - "typescript": "5.5.3" + "tsx": "4.19.3", + "typescript": "5.7.3", + "typescript-eslint": "8.24.1", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.0.6" }, "engines": { "node": ">= 20" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -48,502 +54,521 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/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==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/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==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "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/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -551,78 +576,82 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "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/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/js": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", + "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", + "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.11.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.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/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -630,6 +659,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -638,26 +668,56 @@ "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/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=6.9.0" } }, - "node_modules/@kontent-ai/core-sdk": { + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kontent-ai-consulting/tools-analytics": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@kontent-ai-consulting/tools-analytics/-/tools-analytics-0.0.7.tgz", + "integrity": "sha512-grkW8hEe4vij3R5uZ0K4DuQiR1HvJhdPqoTF/z/q++8xA2X0X0orgRLbWNgyC9XYuSUiCbojmT64zBJf32RKkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kontent-ai/core-sdk": "10.7.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@kontent-ai-consulting/tools-analytics/node_modules/@kontent-ai/core-sdk": { "version": "10.7.0", "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.7.0.tgz", "integrity": "sha512-NNS1jatzMzp+XBWNc45bcbZjTFTs4szAFJxKn9oj/4p4+ZXucqYXBs88KCUotXmCCcoeUiFAFn8aQUF2aiTM+Q==", + "dev": true, + "license": "MIT", "dependencies": { "axios": "1.7.4" }, @@ -665,1425 +725,3839 @@ "node": ">= 20" } }, - "node_modules/@kontent-ai/delivery-sdk": { - "version": "14.11.0", - "resolved": "https://registry.npmjs.org/@kontent-ai/delivery-sdk/-/delivery-sdk-14.11.0.tgz", - "integrity": "sha512-Te54qob53ls1Rr/cu8+5zRydHU++JX5Nj9U+RJ2ck9aVqpHvrqpNkuKDc2MoFyzC9tRvfF0w4LdBnWuLtFPrZg==", + "node_modules/@kontent-ai-consulting/tools-analytics/node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dev": true, + "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "10.7.0", - "url-parse": "1.5.10", - "uuid": "10.0.0" - }, - "engines": { - "node": ">= 18" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@kontent-ai/management-sdk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@kontent-ai/management-sdk/-/management-sdk-7.2.0.tgz", - "integrity": "sha512-vfEzmQDrDdKj+4evxoCjBE/Cpr5FT1L7KdOjwISk5MSaQsUxl8hrBYL7UDo8ln/J5LIO/6aOwxJ7aY4yAwI9yw==", + "node_modules/@kontent-ai/core-sdk": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.9.0.tgz", + "integrity": "sha512-eLGG4qW+5kcJua+C02sYCcIQCnbBCpM27zyx6ONxv7bDTJrXtBQd5GSvdbOe+sjGTKIx5hLEeeQSIPoymriPow==", + "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "10.7.0", - "mime": "3.0.0" + "axios": "1.7.9" }, "engines": { "node": ">= 20" } }, - "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, + "node_modules/@kontent-ai/delivery-sdk": { + "version": "16.0.0-0", + "resolved": "https://registry.npmjs.org/@kontent-ai/delivery-sdk/-/delivery-sdk-16.0.0-0.tgz", + "integrity": "sha512-MIvy7SY6C2l6Gny2vBx4pExrRnNed7Eg3MGw0ey7MEZ1xerfGkCoTSvbdQEfsKMfxV/mbKbUkXKlOOF1DgUxbQ==", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@kontent-ai/core-sdk": "10.9.0" }, "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": ">= 20" } }, - "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, + "node_modules/@kontent-ai/management-sdk": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@kontent-ai/management-sdk/-/management-sdk-7.6.1.tgz", + "integrity": "sha512-xPcQXyjpleqi639acMzpOJAx7fPh9Zs9PDBYW4tYgYwfOGYYw9c2zGm2IbhLWh3ppmuxXET1FZWT+egJVguOOQ==", + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@kontent-ai/core-sdk": "10.9.0", + "mime": "3.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" + "node": ">= 20" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==", - "deprecated": "This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.", + "node_modules/@kontent-ai/migration-toolkit": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/migration-toolkit/-/migration-toolkit-2.4.0.tgz", + "integrity": "sha512-zhJf2un51WcxBW9LZ28YxnYF9yPs+IWiVV7EqDpMir+nmOwcJecbsw2dgUWdOIxT7WdRqk+tpdYKgFgavKb/cg==", "dev": true, + "license": "MIT", "dependencies": { - "prettier": "*" + "@kontent-ai-consulting/tools-analytics": "0.0.7", + "@kontent-ai/management-sdk": "7.5.1", + "browser-or-node": "3.0.0", + "buffer": "6.0.3", + "bytes": "3.1.2", + "chalk": "5.4.1", + "deep-equal": "2.2.3", + "dotenv": "16.4.7", + "jszip": "3.10.1", + "mime": "4.0.6", + "ora": "8.1.1", + "p-limit": "6.2.0", + "prompts": "2.4.2", + "ts-pattern": "5.6.0", + "yargs": "17.7.2", + "zod": "3.24.1" + }, + "bin": { + "kontent-ai-migration-toolkit": "dist/es2022/node/cli/app.js" + }, + "engines": { + "node": ">=20" } }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/@kontent-ai/core-sdk": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.8.0.tgz", + "integrity": "sha512-6o5kn+ANhJ7vCucWXunxy1qCSSDsN3F86zdLXzPnFaK/qOf4BJGnPda81Alvnt4N7n4e1m9J7uP0tm3tQ/W25Q==", "dev": true, + "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "axios": "1.7.7" + }, + "engines": { + "node": ">= 20" } }, - "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": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/@kontent-ai/management-sdk": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@kontent-ai/management-sdk/-/management-sdk-7.5.1.tgz", + "integrity": "sha512-sx7cwRq3kqamKOm3hNk5nZN5b/B1d+OiPBz9mJRJKG9Oz8ovaQsnKPxVDvvBS50fA5B+iiClXZtV0cWq/Hf2cA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@kontent-ai/core-sdk": "10.8.0", + "mime": "3.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 20" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/@kontent-ai/management-sdk/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4" + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=10.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", - "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/mime": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz", + "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==", "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=16" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "node_modules/@kontent-ai/migration-toolkit/node_modules/ts-pattern": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.6.0.tgz", + "integrity": "sha512-SL8u60X5+LoEy9tmQHWCdPc2hhb2pKI6I1tU5Jue3v8+iRqZdcT3mWPwKKJy1fMfky6uha82c8ByHAE8PMhKHw==", "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "MIT" }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "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, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 8" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "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, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "node": ">= 8" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", - "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "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, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "eslint-visitor-keys": "^3.4.3" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 8" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "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==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "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/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], "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" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", + "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.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.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", + "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.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.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.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.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", + "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.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.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true, + "license": "MIT", + "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.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.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.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "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.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", + "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.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.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.24.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/@vitest/expect": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", + "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", + "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.6", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", + "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", + "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.6", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", + "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.6", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", + "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", + "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.6", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, + "license": "MIT" + }, + "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, + "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/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "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==", + "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/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-3.0.0.tgz", + "integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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/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, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "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" + }, + "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.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/cliui/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/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-config-spec": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "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, + "license": "MIT" + }, + "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==", + "dev": true, + "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-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-8.0.0.tgz", + "integrity": "sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotgitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/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, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/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, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotgitignore/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "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/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "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.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", + "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.11.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.20.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "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.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.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-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "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": "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, + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "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, + "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-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, + "license": "ISC", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.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, + "license": "MIT", + "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, + "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/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "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, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "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", + "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/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/get-pkg-repo/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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "ISC", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/get-pkg-repo/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/get-pkg-repo/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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/get-pkg-repo/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==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "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/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "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/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, + "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": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" }, "engines": { "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, - "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/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "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==", + "node_modules/git-semver-tags/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "license": "BSD", "dependencies": { - "color-name": "~1.1.4" + "ini": "^1.3.2" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" }, "engines": { - "node": ">=7.0.0" + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "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/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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, - "node_modules/colors": { + "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "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.8" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" + "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": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, + "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": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, + "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": { - "q": "^1.5.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { - "q": "^1.5.1" + "lru-cache": "^6.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", + "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, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 4" } }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "dependencies": { - "q": "^1.5.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.8.19" } }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "dependencies": { - "q": "^1.5.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { - "q": "^1.5.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "q": "^1.5.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "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==", "dev": true, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "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==", "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "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, + "license": "MIT", "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" + "hasown": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "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, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": 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==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "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, + "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "is-extglob": "^2.1.1" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "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, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=0.12.0" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">=8" + "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==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotenv-cli": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.4.2.tgz", - "integrity": "sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "dotenv": "^16.3.0", - "dotenv-expand": "^10.0.0", - "minimist": "^1.2.6" + "call-bound": "^1.0.3" }, - "bin": { - "dotenv": "cli.js" - } - }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotgitignore/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/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotgitignore/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/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "text-extensions": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/dotgitignore/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/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dotgitignore/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/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotgitignore/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/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotgitignore/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/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" }, - "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==", + "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==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } + "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "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==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "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, + "license": "MIT" }, - "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/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "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" + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, "bin": { - "eslint": "bin/eslint.js" + "JSONStream": "bin.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "*" } }, - "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/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", "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" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "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/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, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" } }, - "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/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=6" } }, - "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/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, + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8.0" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "immediate": "~3.0.5" } }, - "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/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==", "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "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/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "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/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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true, + "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, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" - }, + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2091,357 +4565,286 @@ "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==", + "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/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/meow/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, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "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/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/meow/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, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "p-locate": "^4.1.0" }, "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==", + "node_modules/meow/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, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "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==", + "node_modules/meow/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, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=8" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/meow/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==", + "dev": true, + "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@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": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "node": ">=8" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.*" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/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==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node": ">=8" } }, - "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "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" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-pkg-repo/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" } }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "node": ">=8" } }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" + "semver": "bin/semver" } }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "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, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "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, + "license": "MIT", "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=8.6" } }, - "node_modules/git-semver-tags/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, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "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, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "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" + "mime-db": "1.52.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.6" } }, - "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/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/glob/node_modules/minimatch": { + "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, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2449,1208 +4852,1563 @@ "node": "*" } }, - "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/graphemer": { + "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, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": ">=0.4.7" + "node": ">=10" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, "engines": { - "node": ">=6" + "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==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "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": ">= 4" + "node": ">= 0.8.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/ora": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", + "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "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": ">=6" + "node": ">=18" }, "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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, + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "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==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "node_modules/p-locate/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, + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/p-locate/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": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "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==", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "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/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "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, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "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, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, + "license": "MIT", "dependencies": { - "text-extensions": "^1.0.0" + "pify": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "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==", - "dev": true + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" }, - "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/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "license": "MIT", + "engines": { + "node": ">= 14.16" } }, - "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-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "node_modules/json-parse-even-better-errors": { + "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/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/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 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "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==", "dev": true, - "engines": [ - "node >= 0.2.0" - ] + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz", + "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==", + "license": "MIT", "bin": { - "JSONStream": "bin.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": "*" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "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, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "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==", + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=0.6.0", + "teleport": ">=0.2.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==", - "dev": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/load-json-file/node_modules/pify": { + "node_modules/read-pkg-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, "engines": { "node": ">=4" } }, - "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/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/meow/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/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/meow/node_modules/hosted-git-info": { + "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, - "node_modules/meow/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/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/meow/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/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/meow/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/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "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/meow/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/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "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" - } + "license": "MIT" }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, + "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==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "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, + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "bin": { - "semver": "bin/semver" + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@types/estree": "1.0.6" }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "bin": { - "mime": "cli.js" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" + "node_modules/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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "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/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "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==", "dev": true, + "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": ">=4" + "node": ">= 0.4" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "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/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "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": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { - "wrappy": "1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "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" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.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": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "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==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" }, "engines": { - "node": ">=4" + "node": "*" } }, - "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/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "engines": { - "node": ">=8" + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" } }, - "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/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "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/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/standard-version": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "bin": { + "standard-version": "bin/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "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-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/standard-version/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/standard-version/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==", "dev": true, - "engines": { - "node": ">=8.6" + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=4" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/standard-version/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==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=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==", + "node_modules/standard-version/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==", "dev": true, - "engines": { - "node": ">= 0.8.0" + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node_modules/standard-version/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "node_modules/standard-version/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==", + "dev": true, + "license": "MIT" }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/standard-version/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "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/standard-version/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "node_modules/standard-version/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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": ">=4" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/standard-version/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "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/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/standard-version/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==", "dev": true, + "license": "MIT", "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "node_modules/standard-version/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==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/standard-version/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", + "dev": true, + "license": "ISC" + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { + "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "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, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "pify": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "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, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">=0.10" } }, - "node_modules/readable-stream": { + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3660,668 +6418,994 @@ "node": ">= 6" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.0.0 || >=20.0.0" } }, - "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==", + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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, + "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" + "is-number": "^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.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==", + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/ts-pattern": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.6.2.tgz", + "integrity": "sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==", + "license": "MIT" + }, + "node_modules/tsconfck": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" }, "bin": { - "rimraf": "bin.js" + "tsx": "dist/cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "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/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, - "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" + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8" + "node": ">=14.17" } }, - "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==", + "node_modules/typescript-eslint": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", + "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" + }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "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/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "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, + "license": "BSD-2-Clause", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "punycode": "^2.1.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/vite": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", "dev": true, + "license": "MIT", "dependencies": { - "through": "2" + "esbuild": "^0.24.2", + "postcss": "^8.5.2", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": "*" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/vite-node": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", + "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "^3.0.0" + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" }, - "bin": { - "standard-version": "bin/cli.js" + "peerDependencies": { + "vite": "*" }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/standard-version/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==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-name": "1.1.3" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/standard-version/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==", - "dev": true - }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/standard-version/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/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/standard-version/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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" - }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", - "dev": 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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "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/vite/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "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/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "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/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=0.10" + "node": ">=18" } }, - "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==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "readable-stream": "3" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "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/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">=18" } }, - "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, - "dependencies": { - "esbuild": "~0.21.5", - "get-tsconfig": "^4.7.5" - }, + "hasInstallScript": true, + "license": "MIT", "bin": { - "tsx": "dist/cli.mjs" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "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==", + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/vitest": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", + "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@vitest/expect": "3.0.6", + "@vitest/mocker": "3.0.6", + "@vitest/pretty-format": "^3.0.6", + "@vitest/runner": "3.0.6", + "@vitest/snapshot": "3.0.6", + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.6", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">= 0.8.0" - } - }, - "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" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.6", + "@vitest/ui": "3.0.6", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "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" + }, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node-which": "bin/node-which" }, "engines": { - "node": ">=14.17" + "node": ">= 8" } }, - "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": 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/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.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==", - "dev": true - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, "bin": { - "node-which": "bin/node-which" + "why-is-node-running": "cli.js" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, "node_modules/word-wrap": { @@ -4329,6 +7413,7 @@ "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" } @@ -4337,12 +7422,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "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", @@ -4355,17 +7442,53 @@ "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==", - "dev": true + "node_modules/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/wrap-ansi/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/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } @@ -4374,6 +7497,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -4382,12 +7506,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4406,29 +7532,83 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, + "node_modules/yargs/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/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/yargs/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/yargs/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==", + "license": "ISC", "engines": { "node": ">=12" } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 5a1b2af..285426d 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "@kontent-ai/model-generator", - "version": "7.4.0", - "description": "This utility generates strongly-typed models based on Content Types in a Kontent.ai project. These models can be used with SDKs", + "version": "8.0.0-18", + "description": "This utility generates strongly-typed models for Delivery JS SDK, Migration toolkit or just general scripting to improve the experience when referencing Kontent.ai related objects.", "bin": { - "kontent-generate": "./dist/es2022/lib/cli/cli.js" + "kontent-generate": "./dist/cli/app.js" }, "repository": { "type": "git", @@ -22,46 +22,55 @@ "Kontent Model Generator", "Kontent.ai strongly typed models" ], - "preferGlobal": true, - "exports": "./dist/es2022/lib/index.js", - "types": "./dist/es2022/lib/index.d.ts", + "exports": "./dist/public_api.js", + "types": "./dist/public_api.d.ts", "type": "module", "scripts": { - "release": "npm run lint:check && standard-version && npm run update:version", - "release:major": "npm run lint:check && standard-version --release-as major && npm run update:version", - "release:major:beta": "npm run lint:check && standard-version --prerelease --release-as major && npm run update:version", - "release:beta": "standard-version --prerelease", - "prerelease:standard": "standard-version --prerelease", - "prerelease:major": "standard-version --prerelease --release-as major", - "prepublishOnly": "npm run lint:check && npm run build && npm run push:tags", + "release": "standard-version && npm run update:version", + "release:major": "standard-version --release-as major && npm run update:version", + "release:major:beta": "standard-version --prerelease --release-as major && npm run update:version", + "release:beta": "standard-version --prerelease && npm run update:version", + "prerelease:standard": "standard-version --prerelease && npm run update:version", + "prerelease:major": "standard-version --prerelease --release-as major && npm run update:version", + "prepublishOnly": "npm run build && npm run push:tags", "publish:beta": "npm publish --tag=next", - "build:es2022": "tsc --p tsconfig.es2022.json", - "build": "npm run clean && npm run build:es2022", - "test:all": "npm run build && npm run test:delivery-models", - "test:delivery-models": "tsx scripts/generate-delivery-models", - "test:help": "npm run build && cd sample && node ../dist/es2022/lib/cli/cli -h", - "lint:check": "npx eslint lib", - "clean": "tsx clean.ts", + "build": "npm run clean && npm run lint:fix && tsc --p tsconfig.build.json", + "test": "vitest run --config=vitest.config.ts", + "update:snapshots": "vitest run --update", + "sample:delivery": "tsx scripts/samples/delivery-sample", + "sample:environment": "tsx scripts/samples/environment-sample", + "sample:migration": "tsx scripts/samples/migration-sample", + "sample:items": "tsx scripts/samples/item-sample", + "sample:all": "npm run sample:delivery && npm run sample:environment && npm run sample:migration && npm run sample:items", + "show:help": "tsx lib/cli/app --help", + "show:help:delivery-sdk": "tsx lib/cli/app delivery-sdk --help", + "lint": "eslint lib", + "lint:fix": "eslint lib --fix", + "clean": "tsx scripts/clean.ts", "push:tags": "git push --tags", "update:version": "tsx ./scripts/update-version.ts" }, "dependencies": { - "yargs": "17.7.2", - "prettier": "3.3.3", - "colors": "1.4.0", - "@kontent-ai/delivery-sdk": "14.11.0", - "@kontent-ai/management-sdk": "7.2.0" + "@kontent-ai/delivery-sdk": "16.0.0-0", + "@kontent-ai/management-sdk": "7.6.1", + "chalk": "5.4.1", + "prettier": "3.5.1", + "ts-pattern": "5.6.2", + "yargs": "17.7.2" }, "devDependencies": { - "@types/yargs": "17.0.32", + "@eslint/js": "9.20.0", + "@kontent-ai/migration-toolkit": "2.4.0", + "@types/eslint__js": "8.42.3", + "@types/node": "22.13.4", + "@types/yargs": "17.0.33", + "dotenv-cli": "8.0.0", + "eslint": "9.20.1", "standard-version": "9.5.0", - "typescript": "5.5.3", - "@types/node": "20.14.11", - "@types/prettier": "3.0.0", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/parser": "7.16.1", - "eslint": "8.57.0", - "tsx": "4.16.2", - "dotenv-cli": "7.4.2" + "tsx": "4.19.3", + "typescript": "5.7.3", + "typescript-eslint": "8.24.1", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.0.6" } } diff --git a/sample/content-types/actor.ts b/sample/content-types/actor.ts deleted file mode 100644 index cc9a3b7..0000000 --- a/sample/content-types/actor.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type IContentItem, type Elements } from '@kontent-ai/delivery-sdk'; -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Actor - * Id: 58099989-319f-495f-aa36-cb3710854e36 - * Codename: actor - */ -export type Actor = IContentItem<{ - /** - * First name (text) - * Required: true - * Id: 14dd70e5-c42d-f111-9640-c82b443edf1d - * Codename: first_name - * - * This is the first name of the actor - */ - first_name: Elements.TextElement; - - /** - * Last name (text) - * Required: true - * Id: 9f7a0dd4-af3a-95ca-0358-400c14ce7075 - * Codename: last_name - */ - last_name: Elements.TextElement; - - /** - * Photo (asset) - * Required: false - * Id: eaec9ba3-9624-6875-04ec-80d0b2e00781 - * Codename: photo - */ - photo: Elements.AssetsElement; - - /** - * Url (url_slug) - * Required: false - * Id: c8658782-f209-a573-9c85-430fb4e3e9f0 - * Codename: url - */ - url: Elements.UrlSlugElement; -}>; diff --git a/sample/content-types/movie.ts b/sample/content-types/movie.ts deleted file mode 100644 index 965996e..0000000 --- a/sample/content-types/movie.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { type IContentItem, type Elements } from '@kontent-ai/delivery-sdk'; -import { type Actor } from './actor.js'; -import { type ReleaseCategory } from '../taxonomies/releasecategory.js'; - -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Movie - * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c - * Codename: movie - */ -export type Movie = IContentItem<{ - /** - * Category (multiple_choice) - * Required: false - * Id: 9821c252-6414-f549-c17f-cc171dd87713 - * Codename: category - */ - category: Elements.MultipleChoiceElement; - - /** - * Length (number) - * Required: false - * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c - * Codename: length - */ - length: Elements.NumberElement; - - /** - * Plot (rich_text) - * Required: false - * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce - * Codename: plot - */ - plot: Elements.RichTextElement; - - /** - * Poster (asset) - * Required: false - * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d - * Codename: poster - */ - poster: Elements.AssetsElement; - - /** - * ReleaseCategory (taxonomy) - * Required: false - * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 - * Codename: releasecategory - */ - releasecategory: Elements.TaxonomyElement; - - /** - * Released (date_time) - * Required: false - * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 - * Codename: released - */ - released: Elements.DateTimeElement; - - /** - * SeoName (url_slug) - * Required: false - * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c - * Codename: seoname - */ - seoname: Elements.UrlSlugElement; - - /** - * Stars (modular_content) - * Required: false - * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 - * Codename: stars - */ - stars: Elements.LinkedItemsElement; - - /** - * Title (text) - * Required: true - * Id: 3473187e-dc78-eff2-7099-f690f7042d4a - * Codename: title - */ - title: Elements.TextElement; -}>; diff --git a/sample/delivery/content-type-snippets/index.ts b/sample/delivery/content-type-snippets/index.ts new file mode 100644 index 0000000..87c4dcf --- /dev/null +++ b/sample/delivery/content-type-snippets/index.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export {}; diff --git a/sample/delivery/content-types/actor.ts b/sample/delivery/content-types/actor.ts new file mode 100644 index 0000000..8af0557 --- /dev/null +++ b/sample/delivery/content-types/actor.ts @@ -0,0 +1,82 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Actor + * + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export type Actor = CoreContentType< + ActorElementCodenames, + { + /** + * Url + * + * Type: url_slug + * Required: false + * Codename: url + * Id: c8658782-f209-a573-9c85-430fb4e3e9f0 + */ + readonly url: Elements.UrlSlugElement; + /** + * First name + * + * Type: text + * Required: true + * Codename: first_name + * Id: 14dd70e5-c42d-f111-9640-c82b443edf1d + * Guidelines: This is the first name of the actor + */ + readonly first_name: Elements.TextElement; + /** + * Last name + * + * Type: text + * Required: true + * Codename: last_name + * Id: 9f7a0dd4-af3a-95ca-0358-400c14ce7075 + */ + readonly last_name: Elements.TextElement; + /** + * Photo + * + * Type: asset + * Required: false + * Codename: photo + * Id: eaec9ba3-9624-6875-04ec-80d0b2e00781 + */ + readonly photo: Elements.AssetsElement; + }, + 'actor' +>; + +/** + * Type representing all available element codenames for Actor + */ +export type ActorElementCodenames = 'url' | 'first_name' | 'last_name' | 'photo'; + +/** + * Type guard for Actor + * + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export function isActor(item: CoreContentType | undefined | null): item is Actor { + return item?.system?.type === 'actor'; +} diff --git a/sample/delivery/content-types/index.ts b/sample/delivery/content-types/index.ts new file mode 100644 index 0000000..b6005db --- /dev/null +++ b/sample/delivery/content-types/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './actor.js'; +export * from './movie.js'; diff --git a/sample/delivery/content-types/movie.ts b/sample/delivery/content-types/movie.ts new file mode 100644 index 0000000..c527cab --- /dev/null +++ b/sample/delivery/content-types/movie.ts @@ -0,0 +1,139 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { Actor } from './index.js'; +import type { CoreContentType } from '../system/index.js'; +import type { ReleaseCategory } from '../taxonomies/index.js'; + +/** + * Movie + * + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export type Movie = CoreContentType< + MovieElementCodenames, + { + /** + * Title + * + * Type: text + * Required: true + * Codename: title + * Id: 3473187e-dc78-eff2-7099-f690f7042d4a + */ + readonly title: Elements.TextElement; + /** + * Plot + * + * Type: rich_text + * Required: false + * Codename: plot + * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce + */ + readonly plot: Elements.RichTextElement; + /** + * Released + * + * Type: date_time + * Required: false + * Codename: released + * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 + */ + readonly released: Elements.DateTimeElement; + /** + * Length + * + * Type: number + * Required: false + * Codename: length + * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c + */ + readonly length: Elements.NumberElement; + /** + * Poster + * + * Type: asset + * Required: false + * Codename: poster + * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d + */ + readonly poster: Elements.AssetsElement; + /** + * Category + * + * Type: multiple_choice + * Required: false + * Codename: category + * Id: 9821c252-6414-f549-c17f-cc171dd87713 + */ + readonly category: Elements.MultipleChoiceElement< + 'sci_fi' | 'documentary' | 'action' | 'romance' | 'animation' | 'comedy' | 'adventure' | 'drama' + >; + /** + * Stars + * + * Type: modular_content + * Required: false + * Codename: stars + * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 + */ + readonly stars: Elements.LinkedItemsElement; + /** + * SeoName + * + * Type: url_slug + * Required: false + * Codename: seoname + * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c + */ + readonly seoname: Elements.UrlSlugElement; + /** + * ReleaseCategory + * + * Type: taxonomy + * Required: false + * Codename: releasecategory + * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 + */ + readonly releasecategory: Elements.TaxonomyElement; + }, + 'movie' +>; + +/** + * Type representing all available element codenames for Movie + */ +export type MovieElementCodenames = + | 'title' + | 'plot' + | 'released' + | 'length' + | 'poster' + | 'category' + | 'stars' + | 'seoname' + | 'releasecategory'; + +/** + * Type guard for Movie + * + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export function isMovie(item: CoreContentType | undefined | null): item is Movie { + return item?.system?.type === 'movie'; +} diff --git a/sample/delivery/index.ts b/sample/delivery/index.ts new file mode 100644 index 0000000..abbe6a5 --- /dev/null +++ b/sample/delivery/index.ts @@ -0,0 +1,19 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './content-type-snippets/index.js'; +export * from './content-types/index.js'; +export * from './system/index.js'; +export * from './taxonomies/index.js'; diff --git a/sample/delivery/system/core.type.ts b/sample/delivery/system/core.type.ts new file mode 100644 index 0000000..762a6a5 --- /dev/null +++ b/sample/delivery/system/core.type.ts @@ -0,0 +1,53 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { IContentItem, IContentItemElements, IDeliveryClient } from '@kontent-ai/delivery-sdk'; +import type { + ContentTypeCodenames, + CollectionCodenames, + LanguageCodenames, + WorkflowCodenames, + WorkflowStepCodenames, + ElementCodenames, + TaxonomyCodenames +} from './delivery.codenames.js'; + +/** + * Core content type used in favor of default 'IContentItem' + */ +export type CoreContentType< + TElementCodenames extends string = string, + TElements extends IContentItemElements = IContentItemElements, + TContentTypeCodename extends ContentTypeCodenames = ContentTypeCodenames +> = IContentItem; + +/** + * Core types for 'IDeliveryClient' + */ +export type CoreClientTypes = { + readonly collectionCodenames: CollectionCodenames; + readonly contentItemType: CoreContentType; + readonly contentTypeCodenames: ContentTypeCodenames; + readonly elementCodenames: ElementCodenames; + readonly languageCodenames: LanguageCodenames; + readonly taxonomyCodenames: TaxonomyCodenames; + readonly workflowCodenames: WorkflowCodenames; + readonly worfklowStepCodenames: WorkflowStepCodenames; +}; + +/** + * Typed delivery client in favor of default 'IDeliveryClient' + */ +export type CoreDeliveryClient = IDeliveryClient; diff --git a/sample/delivery/system/delivery.codenames.ts b/sample/delivery/system/delivery.codenames.ts new file mode 100644 index 0000000..bbb3cca --- /dev/null +++ b/sample/delivery/system/delivery.codenames.ts @@ -0,0 +1,62 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Type representing all languages + */ +export type LanguageCodenames = 'cz' | 'en' | 'German'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = 'actor' | 'movie'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'default'; + +/** + * Type representing all taxonomies + */ +export type TaxonomyCodenames = 'movietype' | 'releasecategory'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft' | 'published' | 'ready_to_publish' | 'review' | 'scheduled'; + +/** + * Type representing all element codenames across all content types + */ +export type ElementCodenames = + | 'category' + | 'first_name' + | 'last_name' + | 'length' + | 'photo' + | 'plot' + | 'poster' + | 'releasecategory' + | 'released' + | 'seoname' + | 'stars' + | 'title' + | 'url'; diff --git a/sample/delivery/system/index.ts b/sample/delivery/system/index.ts new file mode 100644 index 0000000..9484d8b --- /dev/null +++ b/sample/delivery/system/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './core.type.js'; +export * from './delivery.codenames.js'; diff --git a/sample/delivery/taxonomies/index.ts b/sample/delivery/taxonomies/index.ts new file mode 100644 index 0000000..c5c3ccc --- /dev/null +++ b/sample/delivery/taxonomies/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './movietype.js'; +export * from './releasecategory.js'; diff --git a/sample/delivery/taxonomies/movietype.ts b/sample/delivery/taxonomies/movietype.ts new file mode 100644 index 0000000..b28bf6c --- /dev/null +++ b/sample/delivery/taxonomies/movietype.ts @@ -0,0 +1,40 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * All taxonomy codename values for MovieType + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export const movieTypeValues = ['student', 'tv', 'blockbuster', 'cinema_only', 'film'] as const; + +/** + * Type representing MovieType taxonomy + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export type MovieType = (typeof movieTypeValues)[number]; + +/** + * Type guard for MovieType + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export function isMovieType(value: string | undefined | null): value is MovieType { + return typeof value === 'string' && (movieTypeValues as readonly string[]).includes(value); +} diff --git a/sample/delivery/taxonomies/releasecategory.ts b/sample/delivery/taxonomies/releasecategory.ts new file mode 100644 index 0000000..b1709c1 --- /dev/null +++ b/sample/delivery/taxonomies/releasecategory.ts @@ -0,0 +1,40 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * All taxonomy codename values for ReleaseCategory + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export const releaseCategoryValues = ['global_release', 'us_only', 'local_release'] as const; + +/** + * Type representing ReleaseCategory taxonomy + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export type ReleaseCategory = (typeof releaseCategoryValues)[number]; + +/** + * Type guard for ReleaseCategory + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export function isReleaseCategory(value: string | undefined | null): value is ReleaseCategory { + return typeof value === 'string' && (releaseCategoryValues as readonly string[]).includes(value); +} diff --git a/sample/environment/assetFolders.ts b/sample/environment/assetFolders.ts new file mode 100644 index 0000000..fe9671a --- /dev/null +++ b/sample/environment/assetFolders.ts @@ -0,0 +1,71 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const assetFolders = { + /** + * my folder A + */ + my_folder_a: { + name: 'my folder A', + codename: 'my_folder_a', + id: '6bb4814a-6a5c-4b8c-836e-7f83b008d5d1', + externalId: undefined, + folders: { + /** + * my folder nested A + */ + my_folder_nested_a: { + name: 'my folder nested A', + codename: 'my_folder_nested_a', + id: '555784e5-e92e-4a86-b40b-d642afbf7b4e', + externalId: undefined, + folders: { + /** + * even more nested A + */ + even_more_nested_a: { + name: 'even more nested A', + codename: 'even_more_nested_a', + id: 'd26940cc-6c8d-41e6-93a0-0748c854b100', + externalId: undefined, + folders: {} + }, + + /** + * even more nested B + */ + even_more_nested_b: { + name: 'even more nested B', + codename: 'even_more_nested_b', + id: '97fc4b03-98d2-44b4-8e03-b223a013b0b6', + externalId: undefined, + folders: {} + } + } + } + } + }, + + /** + * my folder B + */ + my_folder_b: { + name: 'my folder B', + codename: 'my_folder_b', + id: '58d1c135-42cb-43c2-a2cd-c615e0a36e83', + externalId: undefined, + folders: {} + } +} as const; diff --git a/sample/environment/collections.ts b/sample/environment/collections.ts new file mode 100644 index 0000000..f7f6172 --- /dev/null +++ b/sample/environment/collections.ts @@ -0,0 +1,25 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const collections = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000' + } +} as const; diff --git a/sample/environment/contentTypeSnippets.ts b/sample/environment/contentTypeSnippets.ts new file mode 100644 index 0000000..6928689 --- /dev/null +++ b/sample/environment/contentTypeSnippets.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const contentTypeSnippets = {} as const; diff --git a/sample/environment/contentTypes.ts b/sample/environment/contentTypes.ts new file mode 100644 index 0000000..7b00eb0 --- /dev/null +++ b/sample/environment/contentTypes.ts @@ -0,0 +1,276 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const contentTypes = { + /** + * Actor + */ + actor: { + name: 'Actor', + codename: 'actor', + id: '58099989-319f-495f-aa36-cb3710854e36', + externalId: undefined, + elements: { + /** + * Url (url_slug) + */ + url: { + name: 'Url', + codename: 'url', + id: 'c8658782-f209-a573-9c85-430fb4e3e9f0', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * First name (text) + * Guidelines: This is the first name of the actor + */ + first_name: { + name: 'First name', + codename: 'first_name', + id: '14dd70e5-c42d-f111-9640-c82b443edf1d', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Last name (text) + */ + last_name: { + name: 'Last name', + codename: 'last_name', + id: '9f7a0dd4-af3a-95ca-0358-400c14ce7075', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Photo (asset) + */ + photo: { + name: 'Photo', + codename: 'photo', + id: 'eaec9ba3-9624-6875-04ec-80d0b2e00781', + externalId: undefined, + required: false, + type: 'asset' + } + } + }, + + /** + * Movie + */ + movie: { + name: 'Movie', + codename: 'movie', + id: 'b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: '3473187e-dc78-eff2-7099-f690f7042d4a', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Plot (rich_text) + */ + plot: { + name: 'Plot', + codename: 'plot', + id: 'f7ee4f27-27fd-a19b-3c5c-102aae1c50ce', + externalId: undefined, + required: false, + type: 'rich_text' + }, + + /** + * Released (date_time) + */ + released: { + name: 'Released', + codename: 'released', + id: '5ccf4644-0d65-5d96-9a32-f4ea21974d51', + externalId: undefined, + required: false, + type: 'date_time' + }, + + /** + * Length (number) + */ + length: { + name: 'Length', + codename: 'length', + id: '7e8ecfab-a419-27ee-d8ec-8adb76fd007c', + externalId: undefined, + required: false, + type: 'number' + }, + + /** + * Poster (asset) + */ + poster: { + name: 'Poster', + codename: 'poster', + id: 'a39a7237-9503-a1ae-8431-5b6cdb85ae9d', + externalId: undefined, + required: false, + type: 'asset' + }, + + /** + * Category (multiple_choice) + */ + category: { + name: 'Category', + codename: 'category', + id: '9821c252-6414-f549-c17f-cc171dd87713', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Sci-fi + */ + sci_fi: { + name: 'Sci-fi', + id: 'b087f774-1f57-9aa8-dab5-2ca88a646824', + codename: 'sci_fi', + externalId: undefined + }, + + /** + * Documentary + */ + documentary: { + name: 'Documentary', + id: '19c5e959-c24a-4863-0b4d-453cdef8fe9d', + codename: 'documentary', + externalId: undefined + }, + + /** + * Action + */ + action: { + name: 'Action', + id: '7d453309-8d74-9607-80c4-36dcc1bd005f', + codename: 'action', + externalId: undefined + }, + + /** + * Romance + */ + romance: { + name: 'Romance', + id: '60550cc7-c986-a59f-b069-7565862fe1c1', + codename: 'romance', + externalId: undefined + }, + + /** + * Animation + */ + animation: { + name: 'Animation', + id: '54c0590d-6a94-a69a-902d-fceea4fa62f8', + codename: 'animation', + externalId: undefined + }, + + /** + * Comedy + */ + comedy: { + name: 'Comedy', + id: 'd2fe357f-894e-9bc3-550c-c2c400d99c6b', + codename: 'comedy', + externalId: undefined + }, + + /** + * Adventure + */ + adventure: { + name: 'Adventure', + id: 'cd8389b0-7628-7739-7b14-3225a50212c1', + codename: 'adventure', + externalId: undefined + }, + + /** + * Drama + */ + drama: { + name: 'Drama', + id: '051e74de-f2e0-f405-9ad5-5263221e46f2', + codename: 'drama', + externalId: undefined + } + } + }, + + /** + * Stars (modular_content) + */ + stars: { + name: 'Stars', + codename: 'stars', + id: 'aa26a55d-19f8-7501-fea3-b0d9b1eeac71', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * SeoName (url_slug) + */ + seoname: { + name: 'SeoName', + codename: 'seoname', + id: '756cc91a-a090-60f9-a7f0-f505bfbe046c', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * ReleaseCategory (taxonomy) + */ + releasecategory: { + name: 'ReleaseCategory', + codename: 'releasecategory', + id: '65f2fd44-1856-bc2b-17c2-decb0635e3d2', + externalId: undefined, + required: false, + type: 'taxonomy' + } + } + } +} as const; diff --git a/sample/environment/customApps.ts b/sample/environment/customApps.ts new file mode 100644 index 0000000..f709351 --- /dev/null +++ b/sample/environment/customApps.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const customApps = {} as const; diff --git a/sample/environment/index.ts b/sample/environment/index.ts new file mode 100644 index 0000000..d477c10 --- /dev/null +++ b/sample/environment/index.ts @@ -0,0 +1,27 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './assetFolders.js'; +export * from './collections.js'; +export * from './contentTypes.js'; +export * from './contentTypeSnippets.js'; +export * from './customApps.js'; +export * from './languages.js'; +export * from './previewUrls.js'; +export * from './roles.js'; +export * from './spaces.js'; +export * from './taxonomies.js'; +export * from './webhooks.js'; +export * from './workflows.js'; diff --git a/sample/environment/languages.ts b/sample/environment/languages.ts new file mode 100644 index 0000000..4750490 --- /dev/null +++ b/sample/environment/languages.ts @@ -0,0 +1,55 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const languages = { + /** + * English + */ + en: { + name: 'English', + codename: 'en', + id: '00000000-0000-0000-0000-000000000000', + isActive: true, + isDefault: true, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * cz + */ + cz: { + name: 'cz', + codename: 'cz', + id: '41ccb26f-ceab-04d0-6ffa-9c7c5358aa8f', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * German + */ + german: { + name: 'German', + codename: 'German', + id: '14f7bcc0-4fd6-4b77-8c22-70e5ccfdae1d', + isActive: false, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + } +} as const; diff --git a/sample/environment/previewUrls.ts b/sample/environment/previewUrls.ts new file mode 100644 index 0000000..aabf51c --- /dev/null +++ b/sample/environment/previewUrls.ts @@ -0,0 +1,64 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const previewUrls = { + /** + * Preview configuration + */ + spaceDomains: { + movies: { + spaceName: 'Movies', + spaceCodename: 'movies', + domain: 'https://siteA.com' + }, + + global: { + spaceName: 'Global', + spaceCodename: 'global', + domain: 'https://siteB.com' + } + }, + previewUrlPatterns: { + actor: { + contentTypeName: 'Actor', + contentTypeCodename: 'actor', + urlPatterns: { + default: { + spaceName: undefined, + spaceCodename: undefined, + url: 'https://sample.com/{codename}' + } + } + }, + + movie: { + contentTypeName: 'Movie', + contentTypeCodename: 'movie', + urlPatterns: { + movies: { + spaceName: 'Movies', + spaceCodename: 'movies', + url: 'https://sample.com/movieA/{itemId}' + }, + + global: { + spaceName: 'Global', + spaceCodename: 'global', + url: 'https://sample.com/movieB/{itemId}' + } + } + } + } +} as const; diff --git a/sample/environment/roles.ts b/sample/environment/roles.ts new file mode 100644 index 0000000..11d27bb --- /dev/null +++ b/sample/environment/roles.ts @@ -0,0 +1,52 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const roles = { + /** + * Content contributor + */ + contentContributor: { + name: 'Content contributor', + codename: undefined, + id: 'dca0ac85-274f-429e-b00e-6f74bf917051' + }, + + /** + * Reviewer + */ + reviewer: { + name: 'Reviewer', + codename: undefined, + id: '94478afa-d898-45dd-8300-ba61b6e0eb4b' + }, + + /** + * Project manager + */ + projectManager: { + name: 'Project manager', + codename: 'project-manager', + id: 'af95ac37-4efa-4b92-aa26-db773cd172c6' + }, + + /** + * Developer + */ + developer: { + name: 'Developer', + codename: undefined, + id: 'b3994090-0818-4969-816b-f4c5d3e526f3' + } +} as const; diff --git a/sample/environment/spaces.ts b/sample/environment/spaces.ts new file mode 100644 index 0000000..82f0510 --- /dev/null +++ b/sample/environment/spaces.ts @@ -0,0 +1,34 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const spaces = { + /** + * Movies + */ + movies: { + name: 'Movies', + codename: 'movies', + id: 'ae7187c1-b38b-4356-8ebc-4f9f4d84496a' + }, + + /** + * Global + */ + global: { + name: 'Global', + codename: 'global', + id: '2de65a86-d41c-4fea-ba0b-9cf61584a6d5' + } +} as const; diff --git a/sample/environment/taxonomies.ts b/sample/environment/taxonomies.ts new file mode 100644 index 0000000..b522aba --- /dev/null +++ b/sample/environment/taxonomies.ts @@ -0,0 +1,126 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const taxonomies = { + /** + * movietype + */ + movietype: { + name: 'MovieType', + codename: 'movietype', + externalId: undefined, + id: '365a17e6-1929-27ab-9f67-a9273c846717', + terms: { + /** + * Student + */ + student: { + name: 'Student', + codename: 'student', + id: 'b107e12c-124d-705f-1029-c0dfdd0b2438', + externalId: undefined, + terms: {} + }, + + /** + * Film + */ + film: { + name: 'Film', + codename: 'film', + id: '5a2a1927-41a4-294f-5d89-cf0cc045e943', + externalId: undefined, + terms: { + /** + * TV + */ + tv: { + name: 'TV', + codename: 'tv', + id: '47511b09-6c39-fa04-ff59-7c47551e827f', + externalId: undefined, + terms: {} + }, + + /** + * Blockbuster + */ + blockbuster: { + name: 'Blockbuster', + codename: 'blockbuster', + id: '875a4657-1dcd-0415-cb3a-892078f5991a', + externalId: undefined, + terms: {} + }, + + /** + * Cinema only + */ + cinema_only: { + name: 'Cinema only', + codename: 'cinema_only', + id: 'e15c4e32-ab7c-57a2-1b66-d8e3566a1dd2', + externalId: undefined, + terms: {} + } + } + } + } + }, + + /** + * releasecategory + */ + releasecategory: { + name: 'ReleaseCategory', + codename: 'releasecategory', + externalId: undefined, + id: '09b6a348-0f86-7a68-4af3-7cab9a5c60b7', + terms: { + /** + * Global release + */ + global_release: { + name: 'Global release', + codename: 'global_release', + id: '4acaf439-9f3a-f34a-6211-d3fc6ec7152e', + externalId: undefined, + terms: {} + }, + + /** + * US only + */ + us_only: { + name: 'US only', + codename: 'us_only', + id: 'b03d990a-55a9-601e-dd5c-aa2edc8698ca', + externalId: undefined, + terms: {} + }, + + /** + * Local release + */ + local_release: { + name: 'Local release', + codename: 'local_release', + id: '37e55484-f0dc-14eb-bf2a-b0293a0d1b1f', + externalId: undefined, + terms: {} + } + } + } +} as const; diff --git a/sample/environment/webhooks.ts b/sample/environment/webhooks.ts new file mode 100644 index 0000000..c49d564 --- /dev/null +++ b/sample/environment/webhooks.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const webhooks = {} as const; diff --git a/sample/environment/workflows.ts b/sample/environment/workflows.ts new file mode 100644 index 0000000..166ad02 --- /dev/null +++ b/sample/environment/workflows.ts @@ -0,0 +1,57 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export const workflows = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + steps: { + draft: { + name: 'Draft', + codename: 'draft', + id: 'e3ef0816-2203-4456-bfdc-a735b4f339ab' + }, + review: { + name: 'Review', + codename: 'review', + id: 'c5682935-f5a2-4514-8025-57d8bdf7558d' + }, + ready_to_publish: { + name: 'Ready to publish', + codename: 'ready_to_publish', + id: 'aaee1d73-f0cc-4185-9e49-844d161c3634' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'f05b8a85-c6cc-429a-ac6d-21d5edd268fe' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + } +} as const; diff --git a/sample/items/codenames/actor.codenames.ts b/sample/items/codenames/actor.codenames.ts new file mode 100644 index 0000000..1c96101 --- /dev/null +++ b/sample/items/codenames/actor.codenames.ts @@ -0,0 +1,38 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Type representing available item codenames + * + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export type ActorCodenames = + | 'anne_hathaway' + | 'bill_nighy' + | 'billy_crystal' + | 'christian_bale' + | 'domhnall_gleeson' + | 'jessica_chastain' + | 'joel_edgerton' + | 'kristen_wiig' + | 'matt_damon' + | 'nathalie_boltt' + | 'rachel_mcadams' + | 'sharlto_copley' + | 'tom_hardy'; diff --git a/sample/items/codenames/index.ts b/sample/items/codenames/index.ts new file mode 100644 index 0000000..0f5e042 --- /dev/null +++ b/sample/items/codenames/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './actor.codenames.js'; +export * from './movie.codenames.js'; diff --git a/sample/items/codenames/movie.codenames.ts b/sample/items/codenames/movie.codenames.ts new file mode 100644 index 0000000..290a1ee --- /dev/null +++ b/sample/items/codenames/movie.codenames.ts @@ -0,0 +1,25 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Type representing available item codenames + * + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export type MovieCodenames = '_the_dark_knight_rises' | 'about_time' | 'district_9' | 'monsters__inc_' | 'the_martian' | 'warrior'; diff --git a/sample/items/index.ts b/sample/items/index.ts new file mode 100644 index 0000000..fd35983 --- /dev/null +++ b/sample/items/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './codenames/index.js'; +export * from './items/index.js'; diff --git a/sample/items/items/actor.items.ts b/sample/items/items/actor.items.ts new file mode 100644 index 0000000..7ee4fb8 --- /dev/null +++ b/sample/items/items/actor.items.ts @@ -0,0 +1,129 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Object representing identifiers of available items + * + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export const actorItems = { + /** + * Anne Hathaway + */ + anne_hathaway: { + codename: 'anne_hathaway', + id: '04f3fe64-2d62-4db3-84d5-06776c47f543' + }, + + /** + * Bill Nighy + */ + bill_nighy: { + codename: 'bill_nighy', + id: 'cddc7576-38b3-4de2-9fb9-2d1ce16daa8b' + }, + + /** + * Billy Crystal + */ + billy_crystal: { + codename: 'billy_crystal', + id: '3e99ea61-7d47-49f0-b271-5757061658ab' + }, + + /** + * Christian Bale + */ + christian_bale: { + codename: 'christian_bale', + id: 'f0e9e9fa-91e8-40d5-9527-b7e0ae51fc54' + }, + + /** + * Domhnall Gleeson + */ + domhnall_gleeson: { + codename: 'domhnall_gleeson', + id: 'c37b94d2-56e1-4e0a-9f14-547fe194e0d9' + }, + + /** + * Jessica Chastain + */ + jessica_chastain: { + codename: 'jessica_chastain', + id: 'a67aacfa-b400-444d-b53e-df1766065034' + }, + + /** + * Joel Edgerton + */ + joel_edgerton: { + codename: 'joel_edgerton', + id: '3294e4b0-e58b-49d7-85fa-5bc9a86556ec' + }, + + /** + * Kristen Wiig + */ + kristen_wiig: { + codename: 'kristen_wiig', + id: '2df17777-b347-4590-be05-cb256bf718e9' + }, + + /** + * Matt Damon + */ + matt_damon: { + codename: 'matt_damon', + id: '69a1cbb3-fcc9-4f50-8631-8298fe106cd5' + }, + + /** + * Nathalie Boltt + */ + nathalie_boltt: { + codename: 'nathalie_boltt', + id: '11b2170c-6df8-48d6-af66-4ddafa2a425a' + }, + + /** + * Rachel McAdams + */ + rachel_mcadams: { + codename: 'rachel_mcadams', + id: '10145fa6-b074-4d2e-9a18-07cf23dff33d' + }, + + /** + * Sharlto Copley + */ + sharlto_copley: { + codename: 'sharlto_copley', + id: 'c10783cb-c8b8-4fec-8f44-7323ffc3227b' + }, + + /** + * Tom Hardy + */ + tom_hardy: { + codename: 'tom_hardy', + id: 'd1557cb1-d7ec-4d04-9742-f86b52bc34fc' + } +} as const; diff --git a/sample/items/items/index.ts b/sample/items/items/index.ts new file mode 100644 index 0000000..d337003 --- /dev/null +++ b/sample/items/items/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './actor.items.js'; +export * from './movie.items.js'; diff --git a/sample/items/items/movie.items.ts b/sample/items/items/movie.items.ts new file mode 100644 index 0000000..d7a1c31 --- /dev/null +++ b/sample/items/items/movie.items.ts @@ -0,0 +1,73 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Object representing identifiers of available items + * + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export const movieItems = { + /** + * The Dark Knight Rises + */ + _the_dark_knight_rises: { + codename: '_the_dark_knight_rises', + id: 'e9ff5385-0f10-469a-8525-98189e295c0d' + }, + + /** + * About Time + */ + about_time: { + codename: 'about_time', + id: 'f5d741ec-e500-4285-97f0-a30196a655bd' + }, + + /** + * District 9 + */ + district_9: { + codename: 'district_9', + id: 'e0b67f90-790c-4509-8679-5ca2df42f3b8' + }, + + /** + * Monsters, Inc. + */ + monsters__inc_: { + codename: 'monsters__inc_', + id: '00e96c5c-22a2-4ecf-811d-28881d1d2eda' + }, + + /** + * The Martian + */ + the_martian: { + codename: 'the_martian', + id: 'e9ac3dd7-8129-4f9a-9112-eb24d84d3ecd' + }, + + /** + * Warrior + */ + warrior: { + codename: 'warrior', + id: '325e2acb-1c14-47f6-af9a-27bc8b6c16fe' + } +} as const; diff --git a/sample/migration/content-types/actor.ts b/sample/migration/content-types/actor.ts new file mode 100644 index 0000000..cc2c357 --- /dev/null +++ b/sample/migration/content-types/actor.ts @@ -0,0 +1,69 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { Item } from '../migration.js'; + +/** + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + */ +export type ActorItem = Item< + 'actor', + { + /** + * Url + * + * Type: url_slug + * Required: false + * Codename: url + * Id: c8658782-f209-a573-9c85-430fb4e3e9f0 + */ + readonly url: MigrationElementModels.UrlSlugElement; + + /** + * First name + * + * Type: text + * Required: true + * Codename: first_name + * Id: 14dd70e5-c42d-f111-9640-c82b443edf1d + * Guidelines: This is the first name of the actor + */ + readonly first_name: MigrationElementModels.TextElement; + + /** + * Last name + * + * Type: text + * Required: true + * Codename: last_name + * Id: 9f7a0dd4-af3a-95ca-0358-400c14ce7075 + */ + readonly last_name: MigrationElementModels.TextElement; + + /** + * Photo + * + * Type: asset + * Required: false + * Codename: photo + * Id: eaec9ba3-9624-6875-04ec-80d0b2e00781 + */ + readonly photo: MigrationElementModels.AssetElement; + } +>; diff --git a/sample/migration/content-types/index.ts b/sample/migration/content-types/index.ts new file mode 100644 index 0000000..b6005db --- /dev/null +++ b/sample/migration/content-types/index.ts @@ -0,0 +1,17 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './actor.js'; +export * from './movie.js'; diff --git a/sample/migration/content-types/movie.ts b/sample/migration/content-types/movie.ts new file mode 100644 index 0000000..bf79023 --- /dev/null +++ b/sample/migration/content-types/movie.ts @@ -0,0 +1,118 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { Item } from '../migration.js'; + +/** + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + */ +export type MovieItem = Item< + 'movie', + { + /** + * Title + * + * Type: text + * Required: true + * Codename: title + * Id: 3473187e-dc78-eff2-7099-f690f7042d4a + */ + readonly title: MigrationElementModels.TextElement; + + /** + * Plot + * + * Type: rich_text + * Required: false + * Codename: plot + * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce + */ + readonly plot: MigrationElementModels.RichTextElement; + + /** + * Released + * + * Type: date_time + * Required: false + * Codename: released + * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 + */ + readonly released: MigrationElementModels.DateTimeElement; + + /** + * Length + * + * Type: number + * Required: false + * Codename: length + * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c + */ + readonly length: MigrationElementModels.NumberElement; + + /** + * Poster + * + * Type: asset + * Required: false + * Codename: poster + * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d + */ + readonly poster: MigrationElementModels.AssetElement; + + /** + * Category + * + * Type: multiple_choice + * Required: false + * Codename: category + * Id: 9821c252-6414-f549-c17f-cc171dd87713 + */ + readonly category: MigrationElementModels.MultipleChoiceElement; + + /** + * Stars + * + * Type: modular_content + * Required: false + * Codename: stars + * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 + */ + readonly stars: MigrationElementModels.LinkedItemsElement; + + /** + * SeoName + * + * Type: url_slug + * Required: false + * Codename: seoname + * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c + */ + readonly seoname: MigrationElementModels.UrlSlugElement; + + /** + * ReleaseCategory + * + * Type: taxonomy + * Required: false + * Codename: releasecategory + * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 + */ + readonly releasecategory: MigrationElementModels.TaxonomyElement; + } +>; diff --git a/sample/migration/environment/environment.ts b/sample/migration/environment/environment.ts new file mode 100644 index 0000000..99f86f7 --- /dev/null +++ b/sample/migration/environment/environment.ts @@ -0,0 +1,39 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +/** + * Type representing all languages + */ +export type LanguageCodenames = 'cz' | 'en' | 'German'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = 'actor' | 'movie'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'default'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft' | 'published' | 'ready_to_publish' | 'review' | 'scheduled'; diff --git a/sample/migration/environment/index.ts b/sample/migration/environment/index.ts new file mode 100644 index 0000000..d44dc53 --- /dev/null +++ b/sample/migration/environment/index.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './environment.js'; diff --git a/sample/migration/index.ts b/sample/migration/index.ts new file mode 100644 index 0000000..4a7ed79 --- /dev/null +++ b/sample/migration/index.ts @@ -0,0 +1,18 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export * from './content-types/index.js'; +export * from './environment/index.js'; +export * from './migration.js'; diff --git a/sample/migration/migration.ts b/sample/migration/migration.ts new file mode 100644 index 0000000..a6d8b63 --- /dev/null +++ b/sample/migration/migration.ts @@ -0,0 +1,42 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-17'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { MigrationItem, MigrationItemSystem, MigrationElements } from '@kontent-ai/migration-toolkit'; +import type { + CollectionCodenames, + ContentTypeCodenames, + LanguageCodenames, + WorkflowCodenames, + WorkflowStepCodenames +} from './environment/environment.js'; + +/** + * System object shared by all individual content type models + */ +export type ItemSystem = MigrationItemSystem< + TCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames +>; + +/** + * Item object shared by all individual content type models + */ +export type Item = MigrationItem< + TElements, + ItemSystem, + WorkflowStepCodenames +>; diff --git a/sample/project/collections.ts b/sample/project/collections.ts deleted file mode 100644 index f65ac10..0000000 --- a/sample/project/collections.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ -export const collections = { - /** - * Default - */ - default: { - codename: 'default', - id: '00000000-0000-0000-0000-000000000000', - name: 'Default' - } -} as const; diff --git a/sample/project/contentTypeSnippets.ts b/sample/project/contentTypeSnippets.ts deleted file mode 100644 index ecac6d1..0000000 --- a/sample/project/contentTypeSnippets.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ -export const contentTypeSnippets = {} as const; diff --git a/sample/project/roles.ts b/sample/project/roles.ts deleted file mode 100644 index 2c99a6e..0000000 --- a/sample/project/roles.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ -export const roles = { - /** - * Content contributor - */ - contentContributor: { - codename: undefined, - id: 'dca0ac85-274f-429e-b00e-6f74bf917051', - name: 'Content contributor' - }, - - /** - * Developer - */ - developer: { - codename: undefined, - id: 'b3994090-0818-4969-816b-f4c5d3e526f3', - name: 'Developer' - }, - - /** - * Project manager - */ - projectManager: { - codename: 'project-manager', - id: 'af95ac37-4efa-4b92-aa26-db773cd172c6', - name: 'Project manager' - }, - - /** - * Reviewer - */ - reviewer: { - codename: undefined, - id: '94478afa-d898-45dd-8300-ba61b6e0eb4b', - name: 'Reviewer' - } -} as const; diff --git a/sample/project/webhooks.ts b/sample/project/webhooks.ts deleted file mode 100644 index 01b5489..0000000 --- a/sample/project/webhooks.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ -export const webhooks = {} as const; diff --git a/sample/taxonomies/movietype.ts b/sample/taxonomies/movietype.ts deleted file mode 100644 index 0ca5beb..0000000 --- a/sample/taxonomies/movietype.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * MovieType - * Id: 365a17e6-1929-27ab-9f67-a9273c846717 - * Codename: movietype - */ -export type MovieType = 'blockbuster' | 'cinema_only' | 'film' | 'student' | 'tv'; diff --git a/sample/taxonomies/releasecategory.ts b/sample/taxonomies/releasecategory.ts deleted file mode 100644 index bf1e256..0000000 --- a/sample/taxonomies/releasecategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * ReleaseCategory - * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 - * Codename: releasecategory - */ -export type ReleaseCategory = 'global_release' | 'local_release' | 'us_only'; diff --git a/scripts/clean.ts b/scripts/clean.ts new file mode 100644 index 0000000..fbfde8c --- /dev/null +++ b/scripts/clean.ts @@ -0,0 +1,5 @@ +import { deleteFolderRecursive } from './utils/script.utils.js'; + +for (const path of ['dist']) { + deleteFolderRecursive(path); +} diff --git a/scripts/file-version-script.ts b/scripts/file-version-script.ts deleted file mode 100644 index 6fa9253..0000000 --- a/scripts/file-version-script.ts +++ /dev/null @@ -1,29 +0,0 @@ -import fs from 'fs'; -import Colors from 'colors'; -import PackageJson from '../package.json' assert { type: 'json' }; - -export const createVersionFile = (date: Date, versionPath: string, propertyName: string) => { - console.log(Colors.cyan(`\nCreating version file at '${versionPath}' with prop '${propertyName}'`)); - createFile(date, versionPath, propertyName); -}; - -function createFile(date: Date, filePath: string, propName: string) { - const timestamp = date.toUTCString(); - - const src = ` -export const ${propName} = { - name: '${PackageJson.name}', - timestamp: '${timestamp}', - version: '${PackageJson.version}' -}; -`; - - fs.writeFile(filePath, src, { flag: 'w' }, (err) => { - if (err) { - return console.log(Colors.red(err.message)); - } - - console.log(Colors.green(`Updating version ${Colors.yellow(PackageJson.version)}`)); - console.log(`${Colors.green('Writing version to ')}${Colors.yellow(filePath)}\n`); - }); -} diff --git a/scripts/generate-delivery-models.ts b/scripts/generate-delivery-models.ts deleted file mode 100644 index 824781f..0000000 --- a/scripts/generate-delivery-models.ts +++ /dev/null @@ -1,57 +0,0 @@ -import * as dotenv from 'dotenv'; -import { rmSync } from 'fs'; -import { ModuleResolution, generateModelsAsync } from '../lib/index.js'; -import Colors from 'colors'; - -const outputDir: string = './sample'; - -const run = async () => { - // needed to load .env environment to current process when run via package.json script - dotenv.config({ - path: './.env' - }); - - // delete existing models - console.log(`Deleting existing folder '${Colors.yellow(outputDir)}'`); - rmSync(outputDir, { - recursive: true, - force: true - }); - - console.log(`Folder '${Colors.yellow(outputDir)}' deleted successfully`); - - const environmentVar = 'ENVIRONMENT_ID'; - const moduleResolutionVar = 'MODULE_RESOLUTION'; - const apiKeyVar = 'API_KEY'; - - const environmentId = process.env[environmentVar]; - const apiKey = process.env[apiKeyVar]; - const moduleResolution = process.env[moduleResolutionVar]; - - if (!moduleResolutionVar) { - throw Error(`Missing '${Colors.red(moduleResolutionVar)}' env variable`); - } - - if (!environmentId) { - throw Error(`Missing '${Colors.red(environmentVar)}' env variable`); - } - if (!apiKey) { - throw Error(`Missing '${Colors.red(apiKeyVar)}' env variable`); - } - - await generateModelsAsync({ - addTimestamp: false, - environmentId: environmentId, - apiKey: apiKey, - moduleResolution: moduleResolution?.toLowerCase() === 'node' ? 'node' : 'nodeNext', - sdkType: 'delivery', - isEnterpriseSubscription: true, - addEnvironmentInfo: true, - outputDir: outputDir, - sortConfig: { - sortTaxonomyTerms: true - } - }); -}; - -run(); diff --git a/scripts/samples/delivery-sample.ts b/scripts/samples/delivery-sample.ts new file mode 100644 index 0000000..841dd01 --- /dev/null +++ b/scripts/samples/delivery-sample.ts @@ -0,0 +1,18 @@ +import { generateDeliveryModelsAsync } from '../../lib/generators/delivery/delivery-func.js'; +import { deleteFolderRecursive, runScriptAsync } from '../utils/script.utils.js'; + +const outputDir: string = './sample/delivery'; + +await runScriptAsync(async (config) => { + deleteFolderRecursive(outputDir); + + await generateDeliveryModelsAsync({ + createFiles: true, + addTimestamp: false, + environmentId: config.environmentId, + apiKey: config.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + outputDir: outputDir, + fileResolvers: { contentType: 'camelCase', snippet: 'camelCase', taxonomy: 'camelCase' } + }); +}); diff --git a/scripts/samples/environment-sample.ts b/scripts/samples/environment-sample.ts new file mode 100644 index 0000000..d4863e2 --- /dev/null +++ b/scripts/samples/environment-sample.ts @@ -0,0 +1,18 @@ +import { generateEnvironmentModelsAsync } from '../../lib/generators/environment/environment-func.js'; +import { deleteFolderRecursive, runScriptAsync } from '../utils/script.utils.js'; + +const outputDir: string = './sample/environment'; + +await runScriptAsync(async (config) => { + deleteFolderRecursive(outputDir); + + await generateEnvironmentModelsAsync({ + createFiles: true, + entities: undefined, + addTimestamp: false, + environmentId: config.environmentId, + apiKey: config.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + outputDir: outputDir + }); +}); diff --git a/scripts/samples/item-sample.ts b/scripts/samples/item-sample.ts new file mode 100644 index 0000000..d691a54 --- /dev/null +++ b/scripts/samples/item-sample.ts @@ -0,0 +1,22 @@ +import { generateItemsAsync } from '../../lib/generators/items/items-func.js'; +import { deleteFolderRecursive, runScriptAsync } from '../utils/script.utils.js'; + +const outputDir: string = './sample/items'; + +await runScriptAsync(async (config) => { + deleteFolderRecursive(outputDir); + + await generateItemsAsync({ + createFiles: true, + addTimestamp: false, + environmentId: config.environmentId, + apiKey: config.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + outputDir: outputDir, + apiMode: 'default', + deliveryApiKey: config.deliveryApiKey, + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true + }); +}); diff --git a/scripts/samples/migration-sample.ts b/scripts/samples/migration-sample.ts new file mode 100644 index 0000000..a7741c7 --- /dev/null +++ b/scripts/samples/migration-sample.ts @@ -0,0 +1,17 @@ +import { generateMigrationModelsAsync } from '../../lib/generators/migration/migration-func.js'; +import { deleteFolderRecursive, runScriptAsync } from '../utils/script.utils.js'; + +const outputDir: string = './sample/migration'; + +await runScriptAsync(async (config) => { + deleteFolderRecursive(outputDir); + + await generateMigrationModelsAsync({ + createFiles: true, + addTimestamp: false, + environmentId: config.environmentId, + apiKey: config.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + outputDir: outputDir + }); +}); diff --git a/scripts/update-version.ts b/scripts/update-version.ts index e1ecbff..88dc078 100644 --- a/scripts/update-version.ts +++ b/scripts/update-version.ts @@ -1,8 +1,10 @@ -import { createVersionFile } from './file-version-script.js'; +import packageJson from '../package.json' with { type: 'json' }; +import { createVersionFile } from './utils/script.utils.js'; -const date = new Date(); - -const versionFilePath = './lib/meta/metadata.ts'; -const versionProp = 'libMetadata'; - -createVersionFile(date, versionFilePath, versionProp); +createVersionFile({ + date: new Date(), + filePath: './lib/meta/metadata.ts', + propertyName: 'libMetadata', + packageName: packageJson.name, + packageVersion: packageJson.version +}); diff --git a/scripts/utils/environment.utils.ts b/scripts/utils/environment.utils.ts new file mode 100644 index 0000000..595f840 --- /dev/null +++ b/scripts/utils/environment.utils.ts @@ -0,0 +1,19 @@ +import chalk from 'chalk'; +import * as dotenv from 'dotenv'; + +// needed to load .env environment to current process when run via package.json script +dotenv.config(); + +export function getEnvironmentRequiredValue(variableName: string): string { + const value = getEnvironmentOptionalValue(variableName); + + if (!value) { + throw new Error(`Missing environment variable '${chalk.red(variableName)}'`); + } + + return value; +} + +export function getEnvironmentOptionalValue(variableName: string): string | undefined { + return process.env?.[variableName]; +} diff --git a/scripts/utils/script.utils.ts b/scripts/utils/script.utils.ts new file mode 100644 index 0000000..f06b13b --- /dev/null +++ b/scripts/utils/script.utils.ts @@ -0,0 +1,65 @@ +import chalk from 'chalk'; +import fs, { rmSync } from 'fs'; +import { parseModuleFileExtension } from '../../lib/cli/arg.utils.js'; +import type { ModuleFileExtension } from '../../lib/core/core.models.js'; +import { logError } from '../../lib/core/error.utils.js'; +import { getEnvironmentRequiredValue } from './environment.utils.js'; + +export async function runScriptAsync( + func: (config: { + readonly managementApiKey: string; + readonly deliveryApiKey: string; + readonly environmentId: string; + readonly moduleFileExtension: ModuleFileExtension; + }) => Promise +): Promise { + try { + await func({ + deliveryApiKey: getEnvironmentRequiredValue('DELIVERY_API_KEY'), + environmentId: getEnvironmentRequiredValue('ENVIRONMENT_ID'), + managementApiKey: getEnvironmentRequiredValue('MANAGEMENT_API_KEY'), + moduleFileExtension: parseModuleFileExtension(getEnvironmentRequiredValue('MODULE_EXTENSION')) + }); + } catch (error) { + logError(error); + } +} + +export function createVersionFile({ + date, + filePath, + propertyName, + packageName, + packageVersion +}: { + readonly date: Date; + readonly filePath: string; + readonly propertyName: string; + readonly packageName: string; + readonly packageVersion: string; +}): void { + console.log(chalk.cyan(`\nCreating version file at '${filePath}' with prop '${propertyName}'`)); + console.log(chalk.green(`Updating version ${chalk.yellow(packageVersion)}`)); + + const src = ` +export const ${propertyName} = { + host: 'npmjs.com', + name: '${packageName}', + timestamp: '${date.toUTCString()}', + version: '${packageVersion}' +}; +`; + + console.log(`${chalk.green('Writing version to ')}${chalk.yellow(filePath)}\n`); + fs.writeFileSync(filePath, src, { flag: 'w' }); +} + +export function deleteFolderRecursive(path: string): void { + console.log(`Deleting existing folder '${chalk.yellow(path)}'`); + rmSync(path, { + recursive: true, + force: true + }); + + console.log(`Folder '${chalk.yellow(path)}' deleted successfully`); +} diff --git a/tests/core/comment.spec.ts b/tests/core/comment.spec.ts new file mode 100644 index 0000000..d90ed8e --- /dev/null +++ b/tests/core/comment.spec.ts @@ -0,0 +1,101 @@ +import { describe, expect, it } from 'vitest'; +import { getEnvironmentInfoComment, toGuidelinesComment, toSafeComment, wrapComment } from '../../lib/core/comment.utils.js'; +import { formatCodeAsync } from '../../lib/format/formatter.js'; +import { libMetadata } from '../../lib/meta/metadata.js'; + +describe(`Comments - wrapComment`, () => { + it('Text should be wrapped in JS comments', () => { + expect(wrapComment(`Hello`)).toStrictEqual(`/**Hello*/`); + }); +}); + +describe(`Comments - toSafeComment`, () => { + it('Comment should not include certain special characters that would break the comment', () => { + expect(toSafeComment(`Hello*/`)).toStrictEqual(`Hello`); + expect(toSafeComment(`/*Hello`)).toStrictEqual(`Hello`); + expect(toSafeComment(`/*Hello*/`)).toStrictEqual(`Hello`); + }); +}); + +describe(`Comments - toGuidelinesComment`, () => { + it('In guidelines all line endings should be replaced with space', () => { + expect(toGuidelinesComment(`LineA\nLineB\nLineC`)).toStrictEqual(`LineA LineB LineC`); + }); +}); + +describe(`Comments - getEnvironmentInfoComment`, () => { + it('Environment comment should be valid and without timestamp', async () => { + const environment = 'dev'; + const name = 'test'; + const id = '123'; + + expect( + await formatCodeAsync( + getEnvironmentInfoComment({ + environmentInfo: { + environment: environment, + id: id, + name: name + }, + timestampDate: undefined + }) + ) + ).toStrictEqual( + await formatCodeAsync( + ` + /** + * This file has been auto-generated by '${libMetadata.name}@${libMetadata.version}'. + * + * (c) Kontent.ai + * + * ------------------------------------------------------------------------------- + * + * Project: ${name} + * Environment: ${environment} + * Id: ${id} + * + * ------------------------------------------------------------------------------- + **/` + ) + ); + }); + + it('Environment comment should be valid and with timestamp', async () => { + const environment = 'dev'; + const name = 'test'; + const id = '123'; + + const date = new Date(); + + expect( + await formatCodeAsync( + getEnvironmentInfoComment({ + environmentInfo: { + environment: environment, + id: id, + name: name + }, + timestampDate: date + }) + ) + ).toStrictEqual( + await formatCodeAsync( + ` + /** + * This file has been auto-generated by '${libMetadata.name}@${libMetadata.version}'. + * + * (c) Kontent.ai + * + * ------------------------------------------------------------------------------- + * + * Project: ${name} + * Environment: ${environment} + * Id: ${id} + * Generated: ${date.toLocaleString()} + * + * ------------------------------------------------------------------------------- + **/` + ) + ); + }); +}); diff --git a/tests/core/core.spec.ts b/tests/core/core.spec.ts new file mode 100644 index 0000000..2f38ceb --- /dev/null +++ b/tests/core/core.spec.ts @@ -0,0 +1,70 @@ +import { describe, expect, it } from 'vitest'; +import { + getFileNameWithoutExtension, + getStringOrUndefinedAsPropertyValue, + isNotUndefined, + singleItemToArray, + sortAlphabetically, + toOutputDirPath, + toSafePropertyValue, + uniqueFilter +} from '../../lib/core/core.utils.js'; + +describe('Core - uniqueFilter', () => { + it('Array should contain only unique values', () => { + expect(['a', 'b', 'c', 'c', 'c', 'b', 'a'].filter(uniqueFilter)).toStrictEqual(['a', 'b', 'c']); + }); +}); + +describe('Core - sortAlphabetically', () => { + it('Array should be sorted alphabetically', () => { + expect(sortAlphabetically(['d', 'a', 'c', 'b', 'e'], (m) => m)).toStrictEqual(['a', 'b', 'c', 'd', 'e']); + }); +}); + +describe('Core - singleItemToArray', () => { + it('Should wrap item in an array', () => { + expect(singleItemToArray('a')).toStrictEqual(['a']); + expect(singleItemToArray(1)).toStrictEqual([1]); + }); +}); + +describe('Core - isNotUndefined', () => { + it('Array should contain only defined values', () => { + expect([undefined, 'a', 'b', 'c', undefined, undefined].filter(isNotUndefined)).toStrictEqual(['a', 'b', 'c']); + }); +}); + +describe('Core - toSafePropertyValue', () => { + it('Should escape all apostrophes', () => { + expect(toSafePropertyValue(`'''va'''lue''''`)).toStrictEqual('value'); + }); +}); + +describe('Core - toOutputDirPath', () => { + it(`Should default to './' when path is not defined`, () => { + expect(toOutputDirPath(undefined)).toStrictEqual('./'); + }); + + it(`Should default to './' when path is not defined`, () => { + expect(toOutputDirPath(`..//path//to//dir`)).toStrictEqual('../path/to/dir/'); + }); +}); + +describe('Core - getStringOrUndefinedAsPropertyValue', () => { + it('Gets string within apostrophes when its defined', () => { + expect(getStringOrUndefinedAsPropertyValue('value')).toStrictEqual(`'value'`); + }); + + it(`Gets 'undefined' value when string is not defined`, () => { + expect(getStringOrUndefinedAsPropertyValue(undefined)).toStrictEqual('undefined'); + }); +}); + +describe('Core - getFileNameWithoutExtension', () => { + it('Gets filename without the extension', () => { + expect(getFileNameWithoutExtension('file.ts')).toStrictEqual('file'); + expect(getFileNameWithoutExtension('file.js')).toStrictEqual('file'); + expect(getFileNameWithoutExtension('file')).toStrictEqual('file'); + }); +}); diff --git a/tests/core/importer.spec.ts b/tests/core/importer.spec.ts new file mode 100644 index 0000000..af0d8e5 --- /dev/null +++ b/tests/core/importer.spec.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from 'vitest'; +import { importer as _importer } from '../../lib/core/importer.js'; +import { formatCodeAsync } from '../../lib/format/formatter.js'; +import type { ModuleFileExtension } from '../../lib/public_api.js'; + +for (const moduleFileExtension of ['js', 'ts', 'mjs', 'mts', 'none'] satisfies ModuleFileExtension[]) { + describe(`Importer - ${moduleFileExtension}`, () => { + const importer = _importer(moduleFileExtension); + const expectedExtension = moduleFileExtension === 'none' ? '' : `.${moduleFileExtension}`; + + it('Empty barrel code', () => { + expect(importer.getBarrelExportCode([])).toStrictEqual('export {}'); + }); + + it('Files should be ordered and exported types should be valid', async () => { + const inputFiles: readonly string[] = ['./dir/fileC', './dir/fileB', './dir/fileA']; + + expect(await formatCodeAsync(importer.getBarrelExportCode(inputFiles))).toStrictEqual( + await formatCodeAsync(` +export * from './dir/fileA${expectedExtension}'; +export * from './dir/fileB${expectedExtension}'; +export * from './dir/fileC${expectedExtension}'; +`) + ); + }); + + it('Import from external library is valid', () => { + expect( + importer.importType({ + filePathOrPackage: '@kontent-ai/delivery-sdk', + importValue: 'ContentItem' + }) + ).toStrictEqual(`import type { ContentItem } from '@kontent-ai/delivery-sdk';`); + }); + + const fileImports: readonly string[] = ['./dir/fileA.js', './fileB.ts']; + + for (const filesToImport of fileImports) { + const fileWithoutExtension = filesToImport.replace(/\.js|\.ts/, ''); + it(`Import from internal file is valid and uses extension '${expectedExtension}'`, () => { + expect( + importer.importType({ + filePathOrPackage: filesToImport, + importValue: 'Item' + }) + ).toStrictEqual(`import type { Item } from '${fileWithoutExtension}${expectedExtension}';`); + }); + } + }); +} diff --git a/tests/core/resolvers.spec.ts b/tests/core/resolvers.spec.ts new file mode 100644 index 0000000..e7c71cb --- /dev/null +++ b/tests/core/resolvers.spec.ts @@ -0,0 +1,151 @@ +import { describe, expect, it } from 'vitest'; +import { mapFilename, mapName, resolveCase, resolvePropertyName } from '../../lib/core/resolvers.js'; + +type CaseResolverTest = { + readonly text: string; + readonly pascalCase: string; + readonly camelCase: string; +}; + +describe('Resolvers - mapName', () => { + it('Custom name should be used when function is used as arg (camelCase)', () => { + expect(mapName((item) => `${item.name}custom`, 'camelCase')({ name: 'x' })).toStrictEqual('xcustom'); + }); + + it('Custom name should be used when function is used as arg (pascalCase)', () => { + expect(mapName((item) => `${item.name}Custom`, 'pascalCase')({ name: 'X' })).toStrictEqual('XCustom'); + }); + + it('Prefix should be applied to name', () => { + expect(mapName(() => `custom`, 'camelCase', { prefix: 'x_' })({ name: '' })).toStrictEqual('x_custom'); + }); + + it('Suffix should be applied to name', () => { + expect(mapName(() => `custom`, 'camelCase', { suffix: '_x' })({ name: '' })).toStrictEqual('custom_x'); + }); + + it('Default case should be used when resolver is undefined (camelCase)', () => { + expect(mapName(undefined, 'camelCase')({ name: 'FirstName' })).toStrictEqual('firstName'); + }); + + it('Default case should be used when resolver is undefined (pascalCase)', () => { + expect(mapName(undefined, 'pascalCase')({ name: 'firstName' })).toStrictEqual('FirstName'); + }); + + it('Given case should be used instead of default one (camelCase)', () => { + expect(mapName('camelCase', 'pascalCase')({ name: 'FirstName' })).toStrictEqual('firstName'); + }); + + it('Given case should be used instead of default one (pascalCase)', () => { + expect(mapName('pascalCase', 'camelCase')({ name: 'firstName' })).toStrictEqual('FirstName'); + }); +}); + +describe('Resolvers - resolvePropertyName', () => { + it('Property name should always be in camelCase', () => { + expect(resolvePropertyName('FirstName')).toStrictEqual('firstName'); + }); + + it('Property name should have special characters stripped', () => { + expect(resolvePropertyName('#FirstName')).toStrictEqual('firstName'); + expect(resolvePropertyName('.FirstName')).toStrictEqual('firstName'); + expect(resolvePropertyName(' FirstName#?!')).toStrictEqual('firstName'); + }); + + it('Property name should be prefixed with underscore when it starts with number characters', () => { + expect(resolvePropertyName('1FirstName')).toStrictEqual('_1FirstName'); + expect(resolvePropertyName('111FirstName')).toStrictEqual('_111FirstName'); + }); + + it('Random string should be generated when property name is empty', () => { + expect(resolvePropertyName('').length).toBeGreaterThan(0); + expect(resolvePropertyName('').length).toBeLessThan(15); + }); +}); + +describe('Resolvers - mapFilename', () => { + it('File extension should be added', () => { + expect(mapFilename((item) => `${item.codename}`)({ codename: 'x' }, true)).toStrictEqual('x.ts'); + }); + + it('File extension should not be added', () => { + expect(mapFilename((item) => `${item.codename}`)({ codename: 'x' }, false)).toStrictEqual('x'); + }); + + it('Codename should be used as is when resolver is undefined', () => { + expect(mapFilename(undefined)({ codename: 'firstName' }, true)).toStrictEqual('firstName.ts'); + }); + + it('Filename should be in camelCase', () => { + expect(mapFilename('camelCase')({ codename: 'FirstName' }, true)).toStrictEqual('firstName.ts'); + }); + + it('Filename should be in pascalCase', () => { + expect(mapFilename('pascalCase')({ codename: 'firstName' }, true)).toStrictEqual('FirstName.ts'); + }); +}); + +describe('Case resolvers', () => { + const testCases: readonly CaseResolverTest[] = [ + { + text: 'First Name', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'first_name', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'first-name', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'FirstName', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'FIRSTNAME', + camelCase: 'fIRSTNAME', + pascalCase: 'FIRSTNAME' + }, + { + text: 'firstName', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'first@name', + camelCase: 'firstName', + pascalCase: 'FirstName' + }, + { + text: 'first1name', + camelCase: 'first1Name', + pascalCase: 'First1Name' + }, + { + text: 'first name@last', + camelCase: 'firstNameLast', + pascalCase: 'FirstNameLast' + }, + { + text: '✏️ first name ✏️ ', + camelCase: 'firstName', + pascalCase: 'FirstName' + } + ]; + + for (const testCase of testCases) { + it('Should resolve to valid camel case format', () => { + expect(resolveCase(testCase.text, 'camelCase')).toStrictEqual(testCase.camelCase); + }); + + it('Should resolve to valid pascal case format', () => { + expect(resolveCase(testCase.text, 'pascalCase')).toStrictEqual(testCase.pascalCase); + }); + } +}); diff --git a/tests/generators/type-codename.generator.spec.ts b/tests/generators/type-codename.generator.spec.ts new file mode 100644 index 0000000..81d70d8 --- /dev/null +++ b/tests/generators/type-codename.generator.spec.ts @@ -0,0 +1,139 @@ +import type { + CollectionModels, + ContentTypeModels, + ContentTypeSnippetModels, + LanguageModels, + TaxonomyModels, + WorkflowContracts, + WorkflowModels +} from '@kontent-ai/management-sdk'; +import { describe, expect, it } from 'vitest'; +import { sharedTypesConfig } from '../../lib/config.js'; +import type { ObjectWithCodename } from '../../lib/core/core.models.js'; +import { sortAlphabetically, uniqueFilter } from '../../lib/core/core.utils.js'; +import { + getCollectionCodenamesType, + getContentTypeCodenamesType, + getElementCodenamesType, + getLanguageCodenamesType, + getTaxonomyCodenamesType, + getWorkflowCodenamesType, + getWorkflowStepCodenamesType +} from '../../lib/generators/shared/type-codename.generator.js'; + +type GeneratorTypeRecord = { + readonly getTypes: >(items: readonly T[]) => string; + readonly propertyName: string; + readonly sampleItems: readonly Readonly[]; + readonly expectedTypeItems: readonly string[]; +}; + +const generatorTypeRecords: readonly GeneratorTypeRecord[] = [ + { + getTypes: (items) => getLanguageCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.languageCodenames, + sampleItems: ['c', 'a', 'b', 'c'].map((codename) => ({ codename })), + expectedTypeItems: ['a', 'b', 'c'] + }, + { + getTypes: (items) => getCollectionCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.collectionCodenames, + sampleItems: ['c', 'a', 'b', 'c'].map((codename) => ({ codename })), + expectedTypeItems: ['a', 'b', 'c'] + }, + { + getTypes: (items) => getContentTypeCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.contentTypeCodenames, + sampleItems: ['c', 'a', 'b', 'c'].map((codename) => ({ codename })), + expectedTypeItems: ['a', 'b', 'c'] + }, + { + getTypes: (items) => getTaxonomyCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.taxonomyCodenames, + sampleItems: ['c', 'a', 'b', 'c'].map((codename) => ({ codename })), + expectedTypeItems: ['a', 'b', 'c'] + }, + { + getTypes: (items) => getWorkflowCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.workflowCodenames, + sampleItems: ['c', 'a', 'b', 'c'].map & ObjectWithCodename>((codename, index) => ({ + codename: codename, + steps: [ + { + codename: `${index}${codename}` + } + ] as unknown as WorkflowContracts.IWorkflowStepNewContract[] + })), + expectedTypeItems: ['a', 'b', 'c'] + }, + { + getTypes: (items) => getWorkflowStepCodenamesType(items as unknown as readonly Readonly[]), + propertyName: sharedTypesConfig.workflowStepCodenames, + sampleItems: ['c', 'a', 'b'].map & ObjectWithCodename>((codename, index) => ({ + codename: codename, + archivedStep: { + codename: 'archived' + } as WorkflowContracts.IWorkflowArchivedStepContract, + publishedStep: { + codename: 'published' + } as WorkflowContracts.IWorkflowPublishedStepContract, + scheduledStep: { + codename: 'scheduled' + } as WorkflowContracts.IWorkflowScheduledStepContract, + steps: [ + { + codename: `${index}${codename}` + } + ] as unknown as WorkflowContracts.IWorkflowStepNewContract[] + })), + expectedTypeItems: ['0c', '1a', '2b', 'archived', 'published', 'scheduled'] + } +]; + +describe(`Type codenames generators`, () => { + for (const generatorTypeRecord of generatorTypeRecords) { + it(`${generatorTypeRecord.propertyName} - Empty array should resolve to type 'never'`, () => { + expect(generatorTypeRecord.getTypes([])).toStrictEqual(`export type ${generatorTypeRecord.propertyName} = never`); + }); + + it(`${generatorTypeRecord.propertyName} - Correct type with values should be generated`, () => { + expect(generatorTypeRecord.getTypes(generatorTypeRecord.sampleItems)).toStrictEqual( + `export type ${generatorTypeRecord.propertyName} = ${generatorTypeRecord.expectedTypeItems.map((codename) => `'${codename}'`).join(' | ')};` + ); + }); + } +}); + +describe(`Element codenames generators`, () => { + it(`Empty array should resolve to type 'never'`, () => { + expect(getElementCodenamesType([], [])).toStrictEqual(`export type ${sharedTypesConfig.elementCodenames} = never`); + }); + + it(`Unique element codenames accross types & snippets`, () => { + const typeElementCodenames: readonly string[] = ['a', 'b', 'c', 'a', 'b', 'c']; + const snippetsElementCodenames: readonly string[] = ['d', 'f', 'c', 'a', 'g', 'a']; + + expect( + getElementCodenamesType( + [ + { + elements: typeElementCodenames.map((codename) => ({ codename })) + } + ] as Readonly[], + [ + { + elements: snippetsElementCodenames.map((codename) => ({ codename })) + } + ] as Readonly[] + ) + ).toStrictEqual( + `export type ${sharedTypesConfig.elementCodenames} = ${sortAlphabetically( + [...snippetsElementCodenames, ...typeElementCodenames], + (m) => m + ) + .filter(uniqueFilter) + .map((codename) => `'${codename}'`) + .join(' | ')};` + ); + }); +}); diff --git a/tests/integration/generated-models.spec.ts b/tests/integration/generated-models.spec.ts new file mode 100644 index 0000000..4fbe802 --- /dev/null +++ b/tests/integration/generated-models.spec.ts @@ -0,0 +1,89 @@ +import { describe, expect, it } from 'vitest'; +import type { CliAction, GeneratedFile } from '../../lib/core/core.models.js'; +import { formatCodeAsync } from '../../lib/format/formatter.js'; +import { + generateDeliveryModelsAsync, + generateEnvironmentModelsAsync, + generateItemsAsync, + generateMigrationModelsAsync +} from '../../lib/public_api.js'; +import { getEnvironmentRequiredValue } from '../../scripts/utils/environment.utils.js'; + +type SnapshotModelsTest = { + readonly cliAction: CliAction; + readonly getFilesAsync: () => Promise; +}; + +const snapshotTests: readonly SnapshotModelsTest[] = [ + { + cliAction: 'delivery-sdk', + getFilesAsync: async () => + await generateDeliveryModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: getEnvironmentRequiredValue('ENVIRONMENT_ID'), + apiKey: getEnvironmentRequiredValue('MANAGEMENT_API_KEY'), + moduleFileExtension: 'js' + }) + }, + { + cliAction: 'environment', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: getEnvironmentRequiredValue('ENVIRONMENT_ID'), + apiKey: getEnvironmentRequiredValue('MANAGEMENT_API_KEY'), + moduleFileExtension: 'js' + }) + }, + { + cliAction: 'items', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: getEnvironmentRequiredValue('ENVIRONMENT_ID'), + apiKey: getEnvironmentRequiredValue('MANAGEMENT_API_KEY'), + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true + }) + }, + { + cliAction: 'migration-toolkit', + getFilesAsync: async () => + await generateMigrationModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: getEnvironmentRequiredValue('ENVIRONMENT_ID'), + apiKey: getEnvironmentRequiredValue('MANAGEMENT_API_KEY'), + moduleFileExtension: 'js' + }) + } +]; + +for (const snapshot of snapshotTests) { + describe(`Models - ${snapshot.cliAction}`, async () => { + const files = await snapshot.getFilesAsync(); + + it(`Number of generated files & names should match`, async () => { + const filename = `./snapshots/${snapshot.cliAction}/_filesList.json`; + + await expect( + await formatCodeAsync(JSON.stringify(files.map<{ filename: string }>((file) => ({ filename: file.filename }))), { + parser: 'json' + }) + ).toMatchFileSnapshot(filename, `Invalid file '${filename}'`); + }); + + it(`Code of generated models should match snapshots`, async () => { + for (const file of files) { + const filename = `./snapshots/${snapshot.cliAction}/${file.filename}`; + await expect(file.text).toMatchFileSnapshot(filename, `Invalid file '${filename}'`); + } + }); + }); +} diff --git a/tests/integration/snapshots/delivery-sdk/_filesList.json b/tests/integration/snapshots/delivery-sdk/_filesList.json new file mode 100644 index 0000000..4ef3783 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/_filesList.json @@ -0,0 +1,13 @@ +[ + { "filename": "content-types/actor.ts" }, + { "filename": "content-types/movie.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "content-type-snippets/index.ts" }, + { "filename": "taxonomies/movietype.ts" }, + { "filename": "taxonomies/releasecategory.ts" }, + { "filename": "taxonomies/index.ts" }, + { "filename": "system/core.type.ts" }, + { "filename": "system/delivery.codenames.ts" }, + { "filename": "system/index.ts" }, + { "filename": "index.ts" } +] diff --git a/sample/content-type-snippets/index.ts b/tests/integration/snapshots/delivery-sdk/content-type-snippets/index.ts similarity index 100% rename from sample/content-type-snippets/index.ts rename to tests/integration/snapshots/delivery-sdk/content-type-snippets/index.ts diff --git a/tests/integration/snapshots/delivery-sdk/content-types/actor.ts b/tests/integration/snapshots/delivery-sdk/content-types/actor.ts new file mode 100644 index 0000000..684be5a --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/content-types/actor.ts @@ -0,0 +1,67 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Actor + * + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export type Actor = CoreContentType< + ActorElementCodenames, + { + /** + * Url + * + * Type: url_slug + * Required: false + * Codename: url + * Id: c8658782-f209-a573-9c85-430fb4e3e9f0 + */ + readonly url: Elements.UrlSlugElement; + /** + * First name + * + * Type: text + * Required: true + * Codename: first_name + * Id: 14dd70e5-c42d-f111-9640-c82b443edf1d + * Guidelines: This is the first name of the actor + */ + readonly first_name: Elements.TextElement; + /** + * Last name + * + * Type: text + * Required: true + * Codename: last_name + * Id: 9f7a0dd4-af3a-95ca-0358-400c14ce7075 + */ + readonly last_name: Elements.TextElement; + /** + * Photo + * + * Type: asset + * Required: false + * Codename: photo + * Id: eaec9ba3-9624-6875-04ec-80d0b2e00781 + */ + readonly photo: Elements.AssetsElement; + }, + 'actor' +>; + +/** + * Type representing all available element codenames for Actor + */ +export type ActorElementCodenames = 'url' | 'first_name' | 'last_name' | 'photo'; + +/** + * Type guard for Actor + * + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export function isActor(item: CoreContentType | undefined | null): item is Actor { + return item?.system?.type === 'actor'; +} diff --git a/sample/content-types/index.ts b/tests/integration/snapshots/delivery-sdk/content-types/index.ts similarity index 100% rename from sample/content-types/index.ts rename to tests/integration/snapshots/delivery-sdk/content-types/index.ts diff --git a/tests/integration/snapshots/delivery-sdk/content-types/movie.ts b/tests/integration/snapshots/delivery-sdk/content-types/movie.ts new file mode 100644 index 0000000..4811b87 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/content-types/movie.ts @@ -0,0 +1,124 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { Actor } from './index.js'; +import type { CoreContentType } from '../system/index.js'; +import type { ReleaseCategory } from '../taxonomies/index.js'; + +/** + * Movie + * + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export type Movie = CoreContentType< + MovieElementCodenames, + { + /** + * Title + * + * Type: text + * Required: true + * Codename: title + * Id: 3473187e-dc78-eff2-7099-f690f7042d4a + */ + readonly title: Elements.TextElement; + /** + * Plot + * + * Type: rich_text + * Required: false + * Codename: plot + * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce + */ + readonly plot: Elements.RichTextElement; + /** + * Released + * + * Type: date_time + * Required: false + * Codename: released + * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 + */ + readonly released: Elements.DateTimeElement; + /** + * Length + * + * Type: number + * Required: false + * Codename: length + * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c + */ + readonly length: Elements.NumberElement; + /** + * Poster + * + * Type: asset + * Required: false + * Codename: poster + * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d + */ + readonly poster: Elements.AssetsElement; + /** + * Category + * + * Type: multiple_choice + * Required: false + * Codename: category + * Id: 9821c252-6414-f549-c17f-cc171dd87713 + */ + readonly category: Elements.MultipleChoiceElement< + 'sci_fi' | 'documentary' | 'action' | 'romance' | 'animation' | 'comedy' | 'adventure' | 'drama' + >; + /** + * Stars + * + * Type: modular_content + * Required: false + * Codename: stars + * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 + */ + readonly stars: Elements.LinkedItemsElement; + /** + * SeoName + * + * Type: url_slug + * Required: false + * Codename: seoname + * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c + */ + readonly seoname: Elements.UrlSlugElement; + /** + * ReleaseCategory + * + * Type: taxonomy + * Required: false + * Codename: releasecategory + * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 + */ + readonly releasecategory: Elements.TaxonomyElement; + }, + 'movie' +>; + +/** + * Type representing all available element codenames for Movie + */ +export type MovieElementCodenames = + | 'title' + | 'plot' + | 'released' + | 'length' + | 'poster' + | 'category' + | 'stars' + | 'seoname' + | 'releasecategory'; + +/** + * Type guard for Movie + * + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export function isMovie(item: CoreContentType | undefined | null): item is Movie { + return item?.system?.type === 'movie'; +} diff --git a/sample/index.ts b/tests/integration/snapshots/delivery-sdk/index.ts similarity index 78% rename from sample/index.ts rename to tests/integration/snapshots/delivery-sdk/index.ts index 855039b..9c462b0 100644 --- a/sample/index.ts +++ b/tests/integration/snapshots/delivery-sdk/index.ts @@ -1,4 +1,4 @@ -export * from './project/index.js'; -export * from './content-types/index.js'; export * from './content-type-snippets/index.js'; +export * from './content-types/index.js'; +export * from './system/index.js'; export * from './taxonomies/index.js'; diff --git a/tests/integration/snapshots/delivery-sdk/system/core.type.ts b/tests/integration/snapshots/delivery-sdk/system/core.type.ts new file mode 100644 index 0000000..d6daeac --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/system/core.type.ts @@ -0,0 +1,38 @@ +import type { IContentItem, IContentItemElements, IDeliveryClient } from '@kontent-ai/delivery-sdk'; +import type { + ContentTypeCodenames, + CollectionCodenames, + LanguageCodenames, + WorkflowCodenames, + WorkflowStepCodenames, + ElementCodenames, + TaxonomyCodenames +} from './delivery.codenames.js'; + +/** + * Core content type used in favor of default 'IContentItem' + */ +export type CoreContentType< + TElementCodenames extends string = string, + TElements extends IContentItemElements = IContentItemElements, + TContentTypeCodename extends ContentTypeCodenames = ContentTypeCodenames +> = IContentItem; + +/** + * Core types for 'IDeliveryClient' + */ +export type CoreClientTypes = { + readonly collectionCodenames: CollectionCodenames; + readonly contentItemType: CoreContentType; + readonly contentTypeCodenames: ContentTypeCodenames; + readonly elementCodenames: ElementCodenames; + readonly languageCodenames: LanguageCodenames; + readonly taxonomyCodenames: TaxonomyCodenames; + readonly workflowCodenames: WorkflowCodenames; + readonly worfklowStepCodenames: WorkflowStepCodenames; +}; + +/** + * Typed delivery client in favor of default 'IDeliveryClient' + */ +export type CoreDeliveryClient = IDeliveryClient; diff --git a/tests/integration/snapshots/delivery-sdk/system/delivery.codenames.ts b/tests/integration/snapshots/delivery-sdk/system/delivery.codenames.ts new file mode 100644 index 0000000..481df94 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/system/delivery.codenames.ts @@ -0,0 +1,47 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = 'cz' | 'en' | 'German'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = 'actor' | 'movie'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'default'; + +/** + * Type representing all taxonomies + */ +export type TaxonomyCodenames = 'movietype' | 'releasecategory'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft' | 'published' | 'ready_to_publish' | 'review' | 'scheduled'; + +/** + * Type representing all element codenames across all content types + */ +export type ElementCodenames = + | 'category' + | 'first_name' + | 'last_name' + | 'length' + | 'photo' + | 'plot' + | 'poster' + | 'releasecategory' + | 'released' + | 'seoname' + | 'stars' + | 'title' + | 'url'; diff --git a/tests/integration/snapshots/delivery-sdk/system/index.ts b/tests/integration/snapshots/delivery-sdk/system/index.ts new file mode 100644 index 0000000..decb2dc --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/system/index.ts @@ -0,0 +1,2 @@ +export * from './core.type.js'; +export * from './delivery.codenames.js'; diff --git a/sample/taxonomies/index.ts b/tests/integration/snapshots/delivery-sdk/taxonomies/index.ts similarity index 100% rename from sample/taxonomies/index.ts rename to tests/integration/snapshots/delivery-sdk/taxonomies/index.ts diff --git a/tests/integration/snapshots/delivery-sdk/taxonomies/movietype.ts b/tests/integration/snapshots/delivery-sdk/taxonomies/movietype.ts new file mode 100644 index 0000000..e37b873 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/taxonomies/movietype.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for MovieType + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export const movieTypeValues = ['student', 'tv', 'blockbuster', 'cinema_only', 'film'] as const; + +/** + * Type representing MovieType taxonomy + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export type MovieType = (typeof movieTypeValues)[number]; + +/** + * Type guard for MovieType + * + * Codename: movietype + * Id: 365a17e6-1929-27ab-9f67-a9273c846717 + */ +export function isMovieType(value: string | undefined | null): value is MovieType { + return typeof value === 'string' && (movieTypeValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/taxonomies/releasecategory.ts b/tests/integration/snapshots/delivery-sdk/taxonomies/releasecategory.ts new file mode 100644 index 0000000..5e93f6a --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/taxonomies/releasecategory.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for ReleaseCategory + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export const releaseCategoryValues = ['global_release', 'us_only', 'local_release'] as const; + +/** + * Type representing ReleaseCategory taxonomy + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export type ReleaseCategory = (typeof releaseCategoryValues)[number]; + +/** + * Type guard for ReleaseCategory + * + * Codename: releasecategory + * Id: 09b6a348-0f86-7a68-4af3-7cab9a5c60b7 + */ +export function isReleaseCategory(value: string | undefined | null): value is ReleaseCategory { + return typeof value === 'string' && (releaseCategoryValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/environment/_filesList.json b/tests/integration/snapshots/environment/_filesList.json new file mode 100644 index 0000000..d9f31d0 --- /dev/null +++ b/tests/integration/snapshots/environment/_filesList.json @@ -0,0 +1,15 @@ +[ + { "filename": "languages.ts" }, + { "filename": "collections.ts" }, + { "filename": "contentTypes.ts" }, + { "filename": "contentTypeSnippets.ts" }, + { "filename": "workflows.ts" }, + { "filename": "roles.ts" }, + { "filename": "assetFolders.ts" }, + { "filename": "webhooks.ts" }, + { "filename": "taxonomies.ts" }, + { "filename": "customApps.ts" }, + { "filename": "spaces.ts" }, + { "filename": "previewUrls.ts" }, + { "filename": "index.ts" } +] diff --git a/sample/project/assetFolders.ts b/tests/integration/snapshots/environment/assetFolders.ts similarity index 77% rename from sample/project/assetFolders.ts rename to tests/integration/snapshots/environment/assetFolders.ts index 39e128f..52805e3 100644 --- a/sample/project/assetFolders.ts +++ b/tests/integration/snapshots/environment/assetFolders.ts @@ -1,33 +1,29 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ export const assetFolders = { /** * my folder A */ - myFolderA: { - id: '6bb4814a-6a5c-4b8c-836e-7f83b008d5d1', + my_folder_a: { name: 'my folder A', + codename: 'my_folder_a', + id: '6bb4814a-6a5c-4b8c-836e-7f83b008d5d1', externalId: undefined, folders: { /** * my folder nested A */ - myFolderNestedA: { - id: '555784e5-e92e-4a86-b40b-d642afbf7b4e', + my_folder_nested_a: { name: 'my folder nested A', + codename: 'my_folder_nested_a', + id: '555784e5-e92e-4a86-b40b-d642afbf7b4e', externalId: undefined, folders: { /** * even more nested A */ - evenMoreNestedA: { - id: 'd26940cc-6c8d-41e6-93a0-0748c854b100', + even_more_nested_a: { name: 'even more nested A', + codename: 'even_more_nested_a', + id: 'd26940cc-6c8d-41e6-93a0-0748c854b100', externalId: undefined, folders: {} }, @@ -35,9 +31,10 @@ export const assetFolders = { /** * even more nested B */ - evenMoreNestedB: { - id: '97fc4b03-98d2-44b4-8e03-b223a013b0b6', + even_more_nested_b: { name: 'even more nested B', + codename: 'even_more_nested_b', + id: '97fc4b03-98d2-44b4-8e03-b223a013b0b6', externalId: undefined, folders: {} } @@ -49,9 +46,10 @@ export const assetFolders = { /** * my folder B */ - myFolderB: { - id: '58d1c135-42cb-43c2-a2cd-c615e0a36e83', + my_folder_b: { name: 'my folder B', + codename: 'my_folder_b', + id: '58d1c135-42cb-43c2-a2cd-c615e0a36e83', externalId: undefined, folders: {} } diff --git a/tests/integration/snapshots/environment/collections.ts b/tests/integration/snapshots/environment/collections.ts new file mode 100644 index 0000000..48dfbc8 --- /dev/null +++ b/tests/integration/snapshots/environment/collections.ts @@ -0,0 +1,10 @@ +export const collections = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000' + } +} as const; diff --git a/tests/integration/snapshots/environment/contentTypeSnippets.ts b/tests/integration/snapshots/environment/contentTypeSnippets.ts new file mode 100644 index 0000000..a77a655 --- /dev/null +++ b/tests/integration/snapshots/environment/contentTypeSnippets.ts @@ -0,0 +1 @@ +export const contentTypeSnippets = {} as const; diff --git a/sample/project/contentTypes.ts b/tests/integration/snapshots/environment/contentTypes.ts similarity index 90% rename from sample/project/contentTypes.ts rename to tests/integration/snapshots/environment/contentTypes.ts index f0a96f6..f981279 100644 --- a/sample/project/contentTypes.ts +++ b/tests/integration/snapshots/environment/contentTypes.ts @@ -1,30 +1,34 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ export const contentTypes = { /** * Actor */ actor: { + name: 'Actor', codename: 'actor', id: '58099989-319f-495f-aa36-cb3710854e36', externalId: undefined, - name: 'Actor', elements: { + /** + * Url (url_slug) + */ + url: { + name: 'Url', + codename: 'url', + id: 'c8658782-f209-a573-9c85-430fb4e3e9f0', + externalId: undefined, + required: false, + type: 'url_slug' + }, + /** * First name (text) - * - * This is the first name of the actor + * Guidelines: This is the first name of the actor */ first_name: { + name: 'First name', codename: 'first_name', id: '14dd70e5-c42d-f111-9640-c82b443edf1d', externalId: undefined, - name: 'First name', required: true, type: 'text' }, @@ -33,10 +37,10 @@ export const contentTypes = { * Last name (text) */ last_name: { + name: 'Last name', codename: 'last_name', id: '9f7a0dd4-af3a-95ca-0358-400c14ce7075', externalId: undefined, - name: 'Last name', required: true, type: 'text' }, @@ -45,24 +49,12 @@ export const contentTypes = { * Photo (asset) */ photo: { + name: 'Photo', codename: 'photo', id: 'eaec9ba3-9624-6875-04ec-80d0b2e00781', externalId: undefined, - name: 'Photo', required: false, type: 'asset' - }, - - /** - * Url (url_slug) - */ - url: { - codename: 'url', - id: 'c8658782-f209-a573-9c85-430fb4e3e9f0', - externalId: undefined, - name: 'Url', - required: false, - type: 'url_slug' } } }, @@ -71,64 +63,155 @@ export const contentTypes = { * Movie */ movie: { + name: 'Movie', codename: 'movie', id: 'b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c', externalId: undefined, - name: 'Movie', elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: '3473187e-dc78-eff2-7099-f690f7042d4a', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Plot (rich_text) + */ + plot: { + name: 'Plot', + codename: 'plot', + id: 'f7ee4f27-27fd-a19b-3c5c-102aae1c50ce', + externalId: undefined, + required: false, + type: 'rich_text' + }, + + /** + * Released (date_time) + */ + released: { + name: 'Released', + codename: 'released', + id: '5ccf4644-0d65-5d96-9a32-f4ea21974d51', + externalId: undefined, + required: false, + type: 'date_time' + }, + + /** + * Length (number) + */ + length: { + name: 'Length', + codename: 'length', + id: '7e8ecfab-a419-27ee-d8ec-8adb76fd007c', + externalId: undefined, + required: false, + type: 'number' + }, + + /** + * Poster (asset) + */ + poster: { + name: 'Poster', + codename: 'poster', + id: 'a39a7237-9503-a1ae-8431-5b6cdb85ae9d', + externalId: undefined, + required: false, + type: 'asset' + }, + /** * Category (multiple_choice) */ category: { + name: 'Category', codename: 'category', id: '9821c252-6414-f549-c17f-cc171dd87713', externalId: undefined, - name: 'Category', required: false, type: 'multiple_choice', options: { + /** + * Sci-fi + */ sci_fi: { - name: 'Sci fi', + name: 'Sci-fi', id: 'b087f774-1f57-9aa8-dab5-2ca88a646824', codename: 'sci_fi', externalId: undefined }, + + /** + * Documentary + */ documentary: { name: 'Documentary', id: '19c5e959-c24a-4863-0b4d-453cdef8fe9d', codename: 'documentary', externalId: undefined }, + + /** + * Action + */ action: { name: 'Action', id: '7d453309-8d74-9607-80c4-36dcc1bd005f', codename: 'action', externalId: undefined }, + + /** + * Romance + */ romance: { name: 'Romance', id: '60550cc7-c986-a59f-b069-7565862fe1c1', codename: 'romance', externalId: undefined }, + + /** + * Animation + */ animation: { name: 'Animation', id: '54c0590d-6a94-a69a-902d-fceea4fa62f8', codename: 'animation', externalId: undefined }, + + /** + * Comedy + */ comedy: { name: 'Comedy', id: 'd2fe357f-894e-9bc3-550c-c2c400d99c6b', codename: 'comedy', externalId: undefined }, + + /** + * Adventure + */ adventure: { name: 'Adventure', id: 'cd8389b0-7628-7739-7b14-3225a50212c1', codename: 'adventure', externalId: undefined }, + + /** + * Drama + */ drama: { name: 'Drama', id: '051e74de-f2e0-f405-9ad5-5263221e46f2', @@ -139,99 +222,39 @@ export const contentTypes = { }, /** - * Length (number) - */ - length: { - codename: 'length', - id: '7e8ecfab-a419-27ee-d8ec-8adb76fd007c', - externalId: undefined, - name: 'Length', - required: false, - type: 'number' - }, - - /** - * Plot (rich_text) - */ - plot: { - codename: 'plot', - id: 'f7ee4f27-27fd-a19b-3c5c-102aae1c50ce', - externalId: undefined, - name: 'Plot', - required: false, - type: 'rich_text' - }, - - /** - * Poster (asset) - */ - poster: { - codename: 'poster', - id: 'a39a7237-9503-a1ae-8431-5b6cdb85ae9d', - externalId: undefined, - name: 'Poster', - required: false, - type: 'asset' - }, - - /** - * ReleaseCategory (taxonomy) - */ - releasecategory: { - codename: 'releasecategory', - id: '65f2fd44-1856-bc2b-17c2-decb0635e3d2', - externalId: undefined, - name: 'ReleaseCategory', - required: false, - type: 'taxonomy' - }, - - /** - * Released (date_time) + * Stars (modular_content) */ - released: { - codename: 'released', - id: '5ccf4644-0d65-5d96-9a32-f4ea21974d51', + stars: { + name: 'Stars', + codename: 'stars', + id: 'aa26a55d-19f8-7501-fea3-b0d9b1eeac71', externalId: undefined, - name: 'Released', required: false, - type: 'date_time' + type: 'modular_content' }, /** * SeoName (url_slug) */ seoname: { + name: 'SeoName', codename: 'seoname', id: '756cc91a-a090-60f9-a7f0-f505bfbe046c', externalId: undefined, - name: 'SeoName', required: false, type: 'url_slug' }, /** - * Stars (modular_content) + * ReleaseCategory (taxonomy) */ - stars: { - codename: 'stars', - id: 'aa26a55d-19f8-7501-fea3-b0d9b1eeac71', + releasecategory: { + name: 'ReleaseCategory', + codename: 'releasecategory', + id: '65f2fd44-1856-bc2b-17c2-decb0635e3d2', externalId: undefined, - name: 'Stars', required: false, - type: 'modular_content' - }, - - /** - * Title (text) - */ - title: { - codename: 'title', - id: '3473187e-dc78-eff2-7099-f690f7042d4a', - externalId: undefined, - name: 'Title', - required: true, - type: 'text' + type: 'taxonomy' } } } diff --git a/tests/integration/snapshots/environment/customApps.ts b/tests/integration/snapshots/environment/customApps.ts new file mode 100644 index 0000000..c4a10fd --- /dev/null +++ b/tests/integration/snapshots/environment/customApps.ts @@ -0,0 +1 @@ +export const customApps = {} as const; diff --git a/sample/project/index.ts b/tests/integration/snapshots/environment/index.ts similarity index 75% rename from sample/project/index.ts rename to tests/integration/snapshots/environment/index.ts index 886cbf6..d17d053 100644 --- a/sample/project/index.ts +++ b/tests/integration/snapshots/environment/index.ts @@ -1,9 +1,12 @@ -export * from './languages.js'; +export * from './assetFolders.js'; export * from './collections.js'; export * from './contentTypes.js'; export * from './contentTypeSnippets.js'; -export * from './taxonomies.js'; -export * from './workflows.js'; +export * from './customApps.js'; +export * from './languages.js'; +export * from './previewUrls.js'; export * from './roles.js'; -export * from './assetFolders.js'; +export * from './spaces.js'; +export * from './taxonomies.js'; export * from './webhooks.js'; +export * from './workflows.js'; diff --git a/sample/project/languages.ts b/tests/integration/snapshots/environment/languages.ts similarity index 69% rename from sample/project/languages.ts rename to tests/integration/snapshots/environment/languages.ts index dc2bfb5..59bf649 100644 --- a/sample/project/languages.ts +++ b/tests/integration/snapshots/environment/languages.ts @@ -1,47 +1,40 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ export const languages = { /** - * cz + * English */ - cz: { - codename: 'cz', - id: '41ccb26f-ceab-04d0-6ffa-9c7c5358aa8f', + en: { + name: 'English', + codename: 'en', + id: '00000000-0000-0000-0000-000000000000', isActive: true, - isDefault: false, + isDefault: true, fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'cz' + externalId: undefined }, /** - * English + * cz */ - en: { - codename: 'en', - id: '00000000-0000-0000-0000-000000000000', + cz: { + name: 'cz', + codename: 'cz', + id: '41ccb26f-ceab-04d0-6ffa-9c7c5358aa8f', isActive: true, - isDefault: true, + isDefault: false, fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'English' + externalId: undefined }, /** * German */ german: { + name: 'German', codename: 'German', id: '14f7bcc0-4fd6-4b77-8c22-70e5ccfdae1d', isActive: false, isDefault: false, fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'German' + externalId: undefined } } as const; diff --git a/tests/integration/snapshots/environment/previewUrls.ts b/tests/integration/snapshots/environment/previewUrls.ts new file mode 100644 index 0000000..112490f --- /dev/null +++ b/tests/integration/snapshots/environment/previewUrls.ts @@ -0,0 +1,49 @@ +export const previewUrls = { + /** + * Preview configuration + */ + spaceDomains: { + movies: { + spaceName: 'Movies', + spaceCodename: 'movies', + domain: 'https://siteA.com' + }, + + global: { + spaceName: 'Global', + spaceCodename: 'global', + domain: 'https://siteB.com' + } + }, + previewUrlPatterns: { + actor: { + contentTypeName: 'Actor', + contentTypeCodename: 'actor', + urlPatterns: { + default: { + spaceName: undefined, + spaceCodename: undefined, + url: 'https://sample.com/{codename}' + } + } + }, + + movie: { + contentTypeName: 'Movie', + contentTypeCodename: 'movie', + urlPatterns: { + movies: { + spaceName: 'Movies', + spaceCodename: 'movies', + url: 'https://sample.com/movieA/{itemId}' + }, + + global: { + spaceName: 'Global', + spaceCodename: 'global', + url: 'https://sample.com/movieB/{itemId}' + } + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/roles.ts b/tests/integration/snapshots/environment/roles.ts new file mode 100644 index 0000000..4c98c22 --- /dev/null +++ b/tests/integration/snapshots/environment/roles.ts @@ -0,0 +1,37 @@ +export const roles = { + /** + * Content contributor + */ + contentContributor: { + name: 'Content contributor', + codename: undefined, + id: 'dca0ac85-274f-429e-b00e-6f74bf917051' + }, + + /** + * Reviewer + */ + reviewer: { + name: 'Reviewer', + codename: undefined, + id: '94478afa-d898-45dd-8300-ba61b6e0eb4b' + }, + + /** + * Project manager + */ + projectManager: { + name: 'Project manager', + codename: 'project-manager', + id: 'af95ac37-4efa-4b92-aa26-db773cd172c6' + }, + + /** + * Developer + */ + developer: { + name: 'Developer', + codename: undefined, + id: 'b3994090-0818-4969-816b-f4c5d3e526f3' + } +} as const; diff --git a/tests/integration/snapshots/environment/spaces.ts b/tests/integration/snapshots/environment/spaces.ts new file mode 100644 index 0000000..5457a8e --- /dev/null +++ b/tests/integration/snapshots/environment/spaces.ts @@ -0,0 +1,19 @@ +export const spaces = { + /** + * Movies + */ + movies: { + name: 'Movies', + codename: 'movies', + id: 'ae7187c1-b38b-4356-8ebc-4f9f4d84496a' + }, + + /** + * Global + */ + global: { + name: 'Global', + codename: 'global', + id: '2de65a86-d41c-4fea-ba0b-9cf61584a6d5' + } +} as const; diff --git a/sample/project/taxonomies.ts b/tests/integration/snapshots/environment/taxonomies.ts similarity index 81% rename from sample/project/taxonomies.ts rename to tests/integration/snapshots/environment/taxonomies.ts index 2e99e3d..0092997 100644 --- a/sample/project/taxonomies.ts +++ b/tests/integration/snapshots/environment/taxonomies.ts @@ -1,87 +1,109 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ export const taxonomies = { /** - * MovieType + * movietype */ movietype: { + name: 'MovieType', codename: 'movietype', - id: '365a17e6-1929-27ab-9f67-a9273c846717', externalId: undefined, - name: 'MovieType', + id: '365a17e6-1929-27ab-9f67-a9273c846717', terms: { + /** + * Student + */ + student: { + name: 'Student', + codename: 'student', + id: 'b107e12c-124d-705f-1029-c0dfdd0b2438', + externalId: undefined, + terms: {} + }, + + /** + * Film + */ film: { + name: 'Film', codename: 'film', id: '5a2a1927-41a4-294f-5d89-cf0cc045e943', externalId: undefined, - name: 'Film', terms: { + /** + * TV + */ + tv: { + name: 'TV', + codename: 'tv', + id: '47511b09-6c39-fa04-ff59-7c47551e827f', + externalId: undefined, + terms: {} + }, + + /** + * Blockbuster + */ blockbuster: { + name: 'Blockbuster', codename: 'blockbuster', id: '875a4657-1dcd-0415-cb3a-892078f5991a', externalId: undefined, - name: 'Blockbuster', terms: {} }, + + /** + * Cinema only + */ cinema_only: { + name: 'Cinema only', codename: 'cinema_only', id: 'e15c4e32-ab7c-57a2-1b66-d8e3566a1dd2', externalId: undefined, - name: 'Cinema only', - terms: {} - }, - tv: { - codename: 'tv', - id: '47511b09-6c39-fa04-ff59-7c47551e827f', - externalId: undefined, - name: 'TV', terms: {} } } - }, - student: { - codename: 'student', - id: 'b107e12c-124d-705f-1029-c0dfdd0b2438', - externalId: undefined, - name: 'Student', - terms: {} } } }, /** - * ReleaseCategory + * releasecategory */ releasecategory: { + name: 'ReleaseCategory', codename: 'releasecategory', - id: '09b6a348-0f86-7a68-4af3-7cab9a5c60b7', externalId: undefined, - name: 'ReleaseCategory', + id: '09b6a348-0f86-7a68-4af3-7cab9a5c60b7', terms: { + /** + * Global release + */ global_release: { + name: 'Global release', codename: 'global_release', id: '4acaf439-9f3a-f34a-6211-d3fc6ec7152e', externalId: undefined, - name: 'Global release', - terms: {} - }, - local_release: { - codename: 'local_release', - id: '37e55484-f0dc-14eb-bf2a-b0293a0d1b1f', - externalId: undefined, - name: 'Local release', terms: {} }, + + /** + * US only + */ us_only: { + name: 'US only', codename: 'us_only', id: 'b03d990a-55a9-601e-dd5c-aa2edc8698ca', externalId: undefined, - name: 'US only', + terms: {} + }, + + /** + * Local release + */ + local_release: { + name: 'Local release', + codename: 'local_release', + id: '37e55484-f0dc-14eb-bf2a-b0293a0d1b1f', + externalId: undefined, terms: {} } } diff --git a/tests/integration/snapshots/environment/webhooks.ts b/tests/integration/snapshots/environment/webhooks.ts new file mode 100644 index 0000000..dc0ee75 --- /dev/null +++ b/tests/integration/snapshots/environment/webhooks.ts @@ -0,0 +1 @@ +export const webhooks = {} as const; diff --git a/sample/project/workflows.ts b/tests/integration/snapshots/environment/workflows.ts similarity index 80% rename from sample/project/workflows.ts rename to tests/integration/snapshots/environment/workflows.ts index 86f0483..2569219 100644 --- a/sample/project/workflows.ts +++ b/tests/integration/snapshots/environment/workflows.ts @@ -1,36 +1,12 @@ -/** - * Generated by '@kontent-ai/model-generator@7.2.0' - * - * Project name: Movie Database - * Environment: Production - * Environment Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 - */ export const workflows = { /** * Default - * Archived step Id: 7a535a69-ad34-47f8-806a-def1fdf4d391 - * Published step Id: f05b8a85-c6cc-429a-ac6d-21d5edd268fe */ default: { + name: 'Default', codename: 'default', id: '00000000-0000-0000-0000-000000000000', - name: 'Default', steps: { - archived: { - name: 'Archived', - codename: 'archived', - id: '7a535a69-ad34-47f8-806a-def1fdf4d391' - }, - published: { - name: 'Published', - codename: 'published', - id: 'f05b8a85-c6cc-429a-ac6d-21d5edd268fe' - }, - scheduled: { - name: 'Scheduled', - codename: 'scheduled', - id: '9d2b0228-4d0d-4c23-8b49-01a698857709' - }, draft: { name: 'Draft', codename: 'draft', @@ -45,6 +21,21 @@ export const workflows = { name: 'Ready to publish', codename: 'ready_to_publish', id: 'aaee1d73-f0cc-4185-9e49-844d161c3634' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'f05b8a85-c6cc-429a-ac6d-21d5edd268fe' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' } } } diff --git a/tests/integration/snapshots/items/_filesList.json b/tests/integration/snapshots/items/_filesList.json new file mode 100644 index 0000000..26e9a79 --- /dev/null +++ b/tests/integration/snapshots/items/_filesList.json @@ -0,0 +1,9 @@ +[ + { "filename": "items/movie.items.ts" }, + { "filename": "items/actor.items.ts" }, + { "filename": "items/index.ts" }, + { "filename": "codenames/movie.codenames.ts" }, + { "filename": "codenames/actor.codenames.ts" }, + { "filename": "codenames/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/codenames/actor.codenames.ts b/tests/integration/snapshots/items/codenames/actor.codenames.ts new file mode 100644 index 0000000..df07fa9 --- /dev/null +++ b/tests/integration/snapshots/items/codenames/actor.codenames.ts @@ -0,0 +1,23 @@ +/** + * Type representing available item codenames + * + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export type ActorCodenames = + | 'anne_hathaway' + | 'bill_nighy' + | 'billy_crystal' + | 'christian_bale' + | 'domhnall_gleeson' + | 'jessica_chastain' + | 'joel_edgerton' + | 'kristen_wiig' + | 'matt_damon' + | 'nathalie_boltt' + | 'rachel_mcadams' + | 'sharlto_copley' + | 'tom_hardy'; diff --git a/tests/integration/snapshots/items/codenames/index.ts b/tests/integration/snapshots/items/codenames/index.ts new file mode 100644 index 0000000..d981cd4 --- /dev/null +++ b/tests/integration/snapshots/items/codenames/index.ts @@ -0,0 +1,2 @@ +export * from './actor.codenames.js'; +export * from './movie.codenames.js'; diff --git a/tests/integration/snapshots/items/codenames/movie.codenames.ts b/tests/integration/snapshots/items/codenames/movie.codenames.ts new file mode 100644 index 0000000..bf4e71a --- /dev/null +++ b/tests/integration/snapshots/items/codenames/movie.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export type MovieCodenames = '_the_dark_knight_rises' | 'about_time' | 'district_9' | 'monsters__inc_' | 'the_martian' | 'warrior'; diff --git a/tests/integration/snapshots/items/index.ts b/tests/integration/snapshots/items/index.ts new file mode 100644 index 0000000..2d2e1f9 --- /dev/null +++ b/tests/integration/snapshots/items/index.ts @@ -0,0 +1,2 @@ +export * from './codenames/index.js'; +export * from './items/index.js'; diff --git a/tests/integration/snapshots/items/items/actor.items.ts b/tests/integration/snapshots/items/items/actor.items.ts new file mode 100644 index 0000000..b4d8c24 --- /dev/null +++ b/tests/integration/snapshots/items/items/actor.items.ts @@ -0,0 +1,114 @@ +/** + * Object representing identifiers of available items + * + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + * Codename: actor + */ +export const actorItems = { + /** + * Anne Hathaway + */ + anne_hathaway: { + codename: 'anne_hathaway', + id: '04f3fe64-2d62-4db3-84d5-06776c47f543' + }, + + /** + * Bill Nighy + */ + bill_nighy: { + codename: 'bill_nighy', + id: 'cddc7576-38b3-4de2-9fb9-2d1ce16daa8b' + }, + + /** + * Billy Crystal + */ + billy_crystal: { + codename: 'billy_crystal', + id: '3e99ea61-7d47-49f0-b271-5757061658ab' + }, + + /** + * Christian Bale + */ + christian_bale: { + codename: 'christian_bale', + id: 'f0e9e9fa-91e8-40d5-9527-b7e0ae51fc54' + }, + + /** + * Domhnall Gleeson + */ + domhnall_gleeson: { + codename: 'domhnall_gleeson', + id: 'c37b94d2-56e1-4e0a-9f14-547fe194e0d9' + }, + + /** + * Jessica Chastain + */ + jessica_chastain: { + codename: 'jessica_chastain', + id: 'a67aacfa-b400-444d-b53e-df1766065034' + }, + + /** + * Joel Edgerton + */ + joel_edgerton: { + codename: 'joel_edgerton', + id: '3294e4b0-e58b-49d7-85fa-5bc9a86556ec' + }, + + /** + * Kristen Wiig + */ + kristen_wiig: { + codename: 'kristen_wiig', + id: '2df17777-b347-4590-be05-cb256bf718e9' + }, + + /** + * Matt Damon + */ + matt_damon: { + codename: 'matt_damon', + id: '69a1cbb3-fcc9-4f50-8631-8298fe106cd5' + }, + + /** + * Nathalie Boltt + */ + nathalie_boltt: { + codename: 'nathalie_boltt', + id: '11b2170c-6df8-48d6-af66-4ddafa2a425a' + }, + + /** + * Rachel McAdams + */ + rachel_mcadams: { + codename: 'rachel_mcadams', + id: '10145fa6-b074-4d2e-9a18-07cf23dff33d' + }, + + /** + * Sharlto Copley + */ + sharlto_copley: { + codename: 'sharlto_copley', + id: 'c10783cb-c8b8-4fec-8f44-7323ffc3227b' + }, + + /** + * Tom Hardy + */ + tom_hardy: { + codename: 'tom_hardy', + id: 'd1557cb1-d7ec-4d04-9742-f86b52bc34fc' + } +} as const; diff --git a/tests/integration/snapshots/items/items/index.ts b/tests/integration/snapshots/items/items/index.ts new file mode 100644 index 0000000..6eb8e64 --- /dev/null +++ b/tests/integration/snapshots/items/items/index.ts @@ -0,0 +1,2 @@ +export * from './actor.items.js'; +export * from './movie.items.js'; diff --git a/tests/integration/snapshots/items/items/movie.items.ts b/tests/integration/snapshots/items/items/movie.items.ts new file mode 100644 index 0000000..6320e41 --- /dev/null +++ b/tests/integration/snapshots/items/items/movie.items.ts @@ -0,0 +1,58 @@ +/** + * Object representing identifiers of available items + * + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + * Codename: movie + */ +export const movieItems = { + /** + * The Dark Knight Rises + */ + _the_dark_knight_rises: { + codename: '_the_dark_knight_rises', + id: 'e9ff5385-0f10-469a-8525-98189e295c0d' + }, + + /** + * About Time + */ + about_time: { + codename: 'about_time', + id: 'f5d741ec-e500-4285-97f0-a30196a655bd' + }, + + /** + * District 9 + */ + district_9: { + codename: 'district_9', + id: 'e0b67f90-790c-4509-8679-5ca2df42f3b8' + }, + + /** + * Monsters, Inc. + */ + monsters__inc_: { + codename: 'monsters__inc_', + id: '00e96c5c-22a2-4ecf-811d-28881d1d2eda' + }, + + /** + * The Martian + */ + the_martian: { + codename: 'the_martian', + id: 'e9ac3dd7-8129-4f9a-9112-eb24d84d3ecd' + }, + + /** + * Warrior + */ + warrior: { + codename: 'warrior', + id: '325e2acb-1c14-47f6-af9a-27bc8b6c16fe' + } +} as const; diff --git a/tests/integration/snapshots/migration-toolkit/_filesList.json b/tests/integration/snapshots/migration-toolkit/_filesList.json new file mode 100644 index 0000000..0da8308 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/_filesList.json @@ -0,0 +1,9 @@ +[ + { "filename": "content-types/actor.ts" }, + { "filename": "content-types/movie.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "migration.ts" }, + { "filename": "environment/environment.ts" }, + { "filename": "environment/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/migration-toolkit/content-types/actor.ts b/tests/integration/snapshots/migration-toolkit/content-types/actor.ts new file mode 100644 index 0000000..06805e1 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/content-types/actor.ts @@ -0,0 +1,54 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { Item } from '../migration.js'; + +/** + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + */ +export type ActorItem = Item< + 'actor', + { + /** + * Url + * + * Type: url_slug + * Required: false + * Codename: url + * Id: c8658782-f209-a573-9c85-430fb4e3e9f0 + */ + readonly url: MigrationElementModels.UrlSlugElement; + + /** + * First name + * + * Type: text + * Required: true + * Codename: first_name + * Id: 14dd70e5-c42d-f111-9640-c82b443edf1d + * Guidelines: This is the first name of the actor + */ + readonly first_name: MigrationElementModels.TextElement; + + /** + * Last name + * + * Type: text + * Required: true + * Codename: last_name + * Id: 9f7a0dd4-af3a-95ca-0358-400c14ce7075 + */ + readonly last_name: MigrationElementModels.TextElement; + + /** + * Photo + * + * Type: asset + * Required: false + * Codename: photo + * Id: eaec9ba3-9624-6875-04ec-80d0b2e00781 + */ + readonly photo: MigrationElementModels.AssetElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/content-types/index.ts b/tests/integration/snapshots/migration-toolkit/content-types/index.ts new file mode 100644 index 0000000..79e8008 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/content-types/index.ts @@ -0,0 +1,2 @@ +export * from './actor.js'; +export * from './movie.js'; diff --git a/tests/integration/snapshots/migration-toolkit/content-types/movie.ts b/tests/integration/snapshots/migration-toolkit/content-types/movie.ts new file mode 100644 index 0000000..7011f8f --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/content-types/movie.ts @@ -0,0 +1,103 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { Item } from '../migration.js'; + +/** + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + */ +export type MovieItem = Item< + 'movie', + { + /** + * Title + * + * Type: text + * Required: true + * Codename: title + * Id: 3473187e-dc78-eff2-7099-f690f7042d4a + */ + readonly title: MigrationElementModels.TextElement; + + /** + * Plot + * + * Type: rich_text + * Required: false + * Codename: plot + * Id: f7ee4f27-27fd-a19b-3c5c-102aae1c50ce + */ + readonly plot: MigrationElementModels.RichTextElement; + + /** + * Released + * + * Type: date_time + * Required: false + * Codename: released + * Id: 5ccf4644-0d65-5d96-9a32-f4ea21974d51 + */ + readonly released: MigrationElementModels.DateTimeElement; + + /** + * Length + * + * Type: number + * Required: false + * Codename: length + * Id: 7e8ecfab-a419-27ee-d8ec-8adb76fd007c + */ + readonly length: MigrationElementModels.NumberElement; + + /** + * Poster + * + * Type: asset + * Required: false + * Codename: poster + * Id: a39a7237-9503-a1ae-8431-5b6cdb85ae9d + */ + readonly poster: MigrationElementModels.AssetElement; + + /** + * Category + * + * Type: multiple_choice + * Required: false + * Codename: category + * Id: 9821c252-6414-f549-c17f-cc171dd87713 + */ + readonly category: MigrationElementModels.MultipleChoiceElement; + + /** + * Stars + * + * Type: modular_content + * Required: false + * Codename: stars + * Id: aa26a55d-19f8-7501-fea3-b0d9b1eeac71 + */ + readonly stars: MigrationElementModels.LinkedItemsElement; + + /** + * SeoName + * + * Type: url_slug + * Required: false + * Codename: seoname + * Id: 756cc91a-a090-60f9-a7f0-f505bfbe046c + */ + readonly seoname: MigrationElementModels.UrlSlugElement; + + /** + * ReleaseCategory + * + * Type: taxonomy + * Required: false + * Codename: releasecategory + * Id: 65f2fd44-1856-bc2b-17c2-decb0635e3d2 + */ + readonly releasecategory: MigrationElementModels.TaxonomyElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/environment/environment.ts b/tests/integration/snapshots/migration-toolkit/environment/environment.ts new file mode 100644 index 0000000..2ce09b8 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/environment/environment.ts @@ -0,0 +1,24 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = 'cz' | 'en' | 'German'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = 'actor' | 'movie'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'default'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft' | 'published' | 'ready_to_publish' | 'review' | 'scheduled'; diff --git a/tests/integration/snapshots/migration-toolkit/environment/index.ts b/tests/integration/snapshots/migration-toolkit/environment/index.ts new file mode 100644 index 0000000..b63b473 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/environment/index.ts @@ -0,0 +1 @@ +export * from './environment.js'; diff --git a/tests/integration/snapshots/migration-toolkit/index.ts b/tests/integration/snapshots/migration-toolkit/index.ts new file mode 100644 index 0000000..eb4a624 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/index.ts @@ -0,0 +1,3 @@ +export * from './content-types/index.js'; +export * from './environment/index.js'; +export * from './migration.js'; diff --git a/tests/integration/snapshots/migration-toolkit/migration.ts b/tests/integration/snapshots/migration-toolkit/migration.ts new file mode 100644 index 0000000..41af267 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/migration.ts @@ -0,0 +1,27 @@ +import type { MigrationItem, MigrationItemSystem, MigrationElements } from '@kontent-ai/migration-toolkit'; +import type { + CollectionCodenames, + ContentTypeCodenames, + LanguageCodenames, + WorkflowCodenames, + WorkflowStepCodenames +} from './environment/environment.js'; + +/** + * System object shared by all individual content type models + */ +export type ItemSystem = MigrationItemSystem< + TCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames +>; + +/** + * Item object shared by all individual content type models + */ +export type Item = MigrationItem< + TElements, + ItemSystem, + WorkflowStepCodenames +>; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..4b14821 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist" + }, + "include": ["lib/**/*"] +} diff --git a/tsconfig.es2022.json b/tsconfig.es2022.json deleted file mode 100644 index f96ee40..0000000 --- a/tsconfig.es2022.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "importHelpers": true, - "target": "es2022", - "outDir": "dist/es2022", - "moduleResolution": "NodeNext", - "module": "NodeNext" - }, - "include": [ - "lib/**/*" - ] -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 53a7378..c9b5fe4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,32 @@ { + "compileOnSave": true, "compilerOptions": { - "module": "commonjs", - "target": "ESNext", - "outDir": "dist", - "rootDir": ".", + "noEmit": true, + "target": "es2022", + "moduleResolution": "nodenext", + "module": "NodeNext", + "importHelpers": true, "sourceMap": true, "declaration": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, "strict": true, - "skipLibCheck": true, - "esModuleInterop": true, + "strictNullChecks": true, + "strictPropertyInitialization": true, "resolveJsonModule": true, + "noImplicitReturns": true, + "allowUnreachableCode": false, + "skipLibCheck": true, "alwaysStrict": true, + "forceConsistentCasingInFileNames": true, "noUnusedParameters": false, "noUnusedLocals": true, "strictFunctionTypes": true, "noImplicitAny": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true + "typeRoots": ["./node_modules/@types"], + "lib": ["esnext"] }, - "include": ["**/*.ts"] + "include": ["lib/**/*", "tests/**/*", "eslint.config.mjs", "vitest.config.ts", "sample/**/*", "scripts/**/*"], + "exclude": ["node_modules"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..f84527d --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,16 @@ +import { loadEnv } from 'vite'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + root: '.', + test: { + dir: 'tests', + globals: true, + environment: 'node', + setupFiles: ['dotenv/config'], + env: loadEnv('', process.cwd(), '') // loads .env variables + }, + build: { + target: 'esnext' + } +});