diff --git a/.env.template b/.env.template index 00209f30..36964ad8 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,10 @@ -API_KEY=x -ENVIRONMENT_ID=y -ADD_TIMESTAMP=true -MODULE_RESOLUTION=node +SAMPLE_MANAGEMENT_API_KEY=x +SAMPLE_ENVIRONMENT_ID=y +SAMPLE_DELIVERY_API_KEY=z + +INTEGRATION_MANAGEMENT_API_KEY=y +INTEGRATION_ENVIRONMENT_ID=z + +ADD_TIMESTAMP=false +MODULE_EXTENSION=js +DELIVERY_API_KEY=y diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index fe7f8acd..00000000 --- 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 00000000..3b92be70 --- /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 b61b17d3..00000000 --- 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 00000000..eae590b5 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,22 @@ +name: Test + +on: + push: + branches: [main] + pull_request: + +env: + INTEGRATION_MANAGEMENT_API_KEY: ${{ secrets.INTEGRATION_MANAGEMENT_API_KEY }} + INTEGRATION_ENVIRONMENT_ID: ${{ secrets.INTEGRATION_ENVIRONMENT_ID }} + +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 00000000..1a2f5bd2 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 71f32090..87f2c472 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 3fa5069d..810d203f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,10 @@ { "typescript.tsdk": "node_modules\\typescript\\lib", -} \ No newline at end of file + "typescript.updateImportsOnFileMove.enabled": "always", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "[markdown]": { + "editor.formatOnSave": false + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 92e67ab3..faffb527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,246 +1,283 @@ # Changelog -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. +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. -## [7.4.0](https://github.com/kontent-ai/model-generator-js/compare/v7.3.0...v7.4.0) (2024-08-15) +## [8.0.0-0](https://github.com/kontent-ai/model-generator-js/compare/v7.4.0...v8.0.0-0) (2024-09-16) + +### Features + +- Adds support for `items` models - Produces TypeScript types for all item codenames, along with objects containing the id and codename of + each item. This is particularly useful when referencing a set of items in your code, enabling type-safe access instead of relying on + hardcoded strings. +- Add support for `migration-toolkit models` +- Revamped the structure of `delivery-sdk` models - the models offer better type safety with the introduction of types representing various + environment entities such as languages, content types, workflows, workflow step and more. The required version of + `@kontent-ai/delivery-sdk` is `>=16`. +- Separates `snippet` from the main item in `delivery-sdk` models +- Extends `environment` models to cover all entities available in `MAPI` +- Covers the model generator with `unit` and `integration` tests +- Simplifies public API by only exporting meaningful code +- Updates all dependencies to their latest versions +### ⚠ BREAKING CHANGES + +- Separates `delivery-sdk` & `environment` models which can now be generated independently on each other +- Both CLI & API is updated, please refer to examples in the `Readme.md` or in `sample` directory for more details +- The `delivery-sdk` models now require you to use `@kontent-ai/delivery-sdk` on version `>=16`. There have been some changes to SDK which + are incorporated in the model generator. ### Features -* updates deps (& fixes Axios vulnerability) ([a6999aa](https://github.com/kontent-ai/model-generator-js/commit/a6999aab660a06ff13451cc8d7f3e27dc793a58f)) -* updates deps & node.js req to >= 20 ([160fd56](https://github.com/kontent-ai/model-generator-js/commit/160fd560ed738b6210e814a13b344bfbe8633685)) +- Separates Delivery & Project models + ([a28ec19](https://github.com/kontent-ai/model-generator-js/commit/a28ec195fe0c361a2e75316fd2ea732d1aea1c05)) -## [7.3.0](https://github.com/kontent-ai/model-generator-js/compare/v7.2.0...v7.3.0) (2024-06-28) +## [7.4.0](https://github.com/kontent-ai/model-generator-js/compare/v7.3.0...v7.4.0) (2024-08-15) +### Features + +- updates deps (& fixes Axios vulnerability) + ([a6999aa](https://github.com/kontent-ai/model-generator-js/commit/a6999aab660a06ff13451cc8d7f3e27dc793a58f)) +- updates deps & node.js req to >= 20 + ([160fd56](https://github.com/kontent-ai/model-generator-js/commit/160fd560ed738b6210e814a13b344bfbe8633685)) + +## [7.3.0](https://github.com/kontent-ai/model-generator-js/compare/v7.2.0...v7.3.0) (2024-06-28) ### Features -* updates deps ([df4413c](https://github.com/kontent-ai/model-generator-js/commit/df4413cfb3af81b41c95ac76a47d784e5337235b)) +- updates deps ([df4413c](https://github.com/kontent-ai/model-generator-js/commit/df4413cfb3af81b41c95ac76a47d784e5337235b)) ## [7.2.0](https://github.com/kontent-ai/model-generator-js/compare/v7.1.0...v7.2.0) (2024-06-18) - ### Features -* adds support for 'nodeNext' module resolution imports ([bd222e4](https://github.com/kontent-ai/model-generator-js/commit/bd222e426688c4ccbc0267d0fac19a747553d64a)) -* updates deps ([300131f](https://github.com/kontent-ai/model-generator-js/commit/300131facbb1725ff099aa895604638229208389)) +- adds support for 'nodeNext' module resolution imports + ([bd222e4](https://github.com/kontent-ai/model-generator-js/commit/bd222e426688c4ccbc0267d0fac19a747553d64a)) +- updates deps ([300131f](https://github.com/kontent-ai/model-generator-js/commit/300131facbb1725ff099aa895604638229208389)) ## [7.1.0](https://github.com/kontent-ai/model-generator-js/compare/v7.0.3...v7.1.0) (2024-04-29) - ### Features -* updates deps ([f178319](https://github.com/kontent-ai/model-generator-js/commit/f1783199b31ca792c7e87b928914638cf357023d)) - +- updates deps ([f178319](https://github.com/kontent-ai/model-generator-js/commit/f1783199b31ca792c7e87b928914638cf357023d)) ### Bug Fixes -* replaces all apostrophes in name values ([636d772](https://github.com/kontent-ai/model-generator-js/commit/636d772f178da4f0ab2fd9931e1cf7d0e955fd78)) +- replaces all apostrophes in name values + ([636d772](https://github.com/kontent-ai/model-generator-js/commit/636d772f178da4f0ab2fd9931e1cf7d0e955fd78)) ### [7.0.3](https://github.com/kontent-ai/model-generator-js/compare/v7.0.2...v7.0.3) (2024-04-15) - ### Bug Fixes -* Adds missing declaration files ([26e61ab](https://github.com/kontent-ai/model-generator-js/commit/26e61ab607ceb95c8e88a30c359097103921a38e)) +- Adds missing declaration files + ([26e61ab](https://github.com/kontent-ai/model-generator-js/commit/26e61ab607ceb95c8e88a30c359097103921a38e)) ### [7.0.2](https://github.com/kontent-ai/model-generator-js/compare/v7.0.1...v7.0.2) (2024-04-13) - ### Bug Fixes -* Fixes runtime by avoiding direct package.json imports, instead use version script with metadata file ([f212f71](https://github.com/kontent-ai/model-generator-js/commit/f212f718eedfe59e623f38ea1c8ac6972ad266b0)) +- Fixes runtime by avoiding direct package.json imports, instead use version script with metadata file + ([f212f71](https://github.com/kontent-ai/model-generator-js/commit/f212f718eedfe59e623f38ea1c8ac6972ad266b0)) ### [7.0.1](https://github.com/kontent-ai/model-generator-js/compare/v7.0.0...v7.0.1) (2024-04-13) - ### Bug Fixes -* Fixes export / types path ([558fec7](https://github.com/kontent-ai/model-generator-js/commit/558fec7e13f44ac6740c1d67c7ccd07678502434)) +- Fixes export / types path ([558fec7](https://github.com/kontent-ai/model-generator-js/commit/558fec7e13f44ac6740c1d67c7ccd07678502434)) ## [7.0.0](https://github.com/kontent-ai/model-generator-js/compare/v6.5.1...v7.0.0) (2024-04-13) - ### ⚠ BREAKING CHANGES -* Removes CommonJs export in favor of ES2022. Also reworks scripts / package.json and tsconfig +- Removes CommonJs export in favor of ES2022. Also reworks scripts / package.json and tsconfig ### Features -* Handle errors in file formatting with prettier, display better info message and store unformatted file ([c2e1265](https://github.com/kontent-ai/model-generator-js/commit/c2e12658c2fbdfca0d82a98bb0156f1121fc4095)) -* Removes CommonJs export in favor of ES2022. Also reworks scripts / package.json and tsconfig ([29dfa39](https://github.com/kontent-ai/model-generator-js/commit/29dfa391b901c230b0de2797873b79339ef1fd1e)) - +- Handle errors in file formatting with prettier, display better info message and store unformatted file + ([c2e1265](https://github.com/kontent-ai/model-generator-js/commit/c2e12658c2fbdfca0d82a98bb0156f1121fc4095)) +- Removes CommonJs export in favor of ES2022. Also reworks scripts / package.json and tsconfig + ([29dfa39](https://github.com/kontent-ai/model-generator-js/commit/29dfa391b901c230b0de2797873b79339ef1fd1e)) ### Bug Fixes -* Removes unsupported characters in object names ([e606f39](https://github.com/kontent-ai/model-generator-js/commit/e606f395e790073765ffe1c1d1a9cf7eb29f90ec)) +- Removes unsupported characters in object names + ([e606f39](https://github.com/kontent-ai/model-generator-js/commit/e606f395e790073765ffe1c1d1a9cf7eb29f90ec)) ### [6.5.1](https://github.com/kontent-ai/model-generator-js/compare/v6.5.0...v6.5.1) (2024-02-27) ## [6.5.0](https://github.com/kontent-ai/model-generator-js/compare/v6.4.0...v6.5.0) (2023-09-12) - ### Features -* Add managementApiUrl option ([#45](https://github.com/kontent-ai/model-generator-js/issues/45)) ([9c38937](https://github.com/kontent-ai/model-generator-js/commit/9c38937cfd452015ff3d9b2e9c0d717dd20e6e73)) +- Add managementApiUrl option ([#45](https://github.com/kontent-ai/model-generator-js/issues/45)) + ([9c38937](https://github.com/kontent-ai/model-generator-js/commit/9c38937cfd452015ff3d9b2e9c0d717dd20e6e73)) ## [6.4.0](https://github.com/kontent-ai/model-generator-js/compare/v6.3.1...v6.4.0) (2023-08-14) - ### Features -* Adds ability to skip environment info generation (fixes https://github.com/kontent-ai/model-generator-js/issues/43) ([d89badd](https://github.com/kontent-ai/model-generator-js/commit/d89baddb1165c55d1bcad45b06e07b54039de9ec)) -* Adds strongly typed workflow steps to project export ([1cdeb93](https://github.com/kontent-ai/model-generator-js/commit/1cdeb93161ada7d9d44fba1d7b4635c155aa093f)) -* updates deps ([7895e32](https://github.com/kontent-ai/model-generator-js/commit/7895e32988134755671ed6d0c9351384c16b5c15)) +- Adds ability to skip environment info generation (fixes https://github.com/kontent-ai/model-generator-js/issues/43) + ([d89badd](https://github.com/kontent-ai/model-generator-js/commit/d89baddb1165c55d1bcad45b06e07b54039de9ec)) +- Adds strongly typed workflow steps to project export + ([1cdeb93](https://github.com/kontent-ai/model-generator-js/commit/1cdeb93161ada7d9d44fba1d7b4635c155aa093f)) +- updates deps ([7895e32](https://github.com/kontent-ai/model-generator-js/commit/7895e32988134755671ed6d0c9351384c16b5c15)) ### [6.3.1](https://github.com/kontent-ai/model-generator-js/compare/v6.3.0...v6.3.1) (2023-08-04) - ### Bug Fixes -* make sortConfig optional (fixes https://github.com/kontent-ai/model-generator-js/issues/42) ([1ee3b04](https://github.com/kontent-ai/model-generator-js/commit/1ee3b04648b7b0aaf65e250304513fa566467dcb)) +- make sortConfig optional (fixes https://github.com/kontent-ai/model-generator-js/issues/42) + ([1ee3b04](https://github.com/kontent-ai/model-generator-js/commit/1ee3b04648b7b0aaf65e250304513fa566467dcb)) ## [6.3.0](https://github.com/kontent-ai/model-generator-js/compare/v6.2.0...v6.3.0) (2023-08-02) - ### Features -* adds option to disable sorting on taxonomy terms ([6707d4b](https://github.com/kontent-ai/model-generator-js/commit/6707d4b15ce1155b17054f4fc17167a16d35d933)) +- adds option to disable sorting on taxonomy terms + ([6707d4b](https://github.com/kontent-ai/model-generator-js/commit/6707d4b15ce1155b17054f4fc17167a16d35d933)) ## [6.2.0](https://github.com/kontent-ai/model-generator-js/compare/v6.1.0...v6.2.0) (2023-07-31) - ### Features -* updates deps, improves test generator script, migrates to eslint, refactors file creation (internal) ([fe15ddc](https://github.com/kontent-ai/model-generator-js/commit/fe15ddc3fd08e3539c4c59ec0c17f2c64cf10421)) +- updates deps, improves test generator script, migrates to eslint, refactors file creation (internal) + ([fe15ddc](https://github.com/kontent-ai/model-generator-js/commit/fe15ddc3fd08e3539c4c59ec0c17f2c64cf10421)) ## [6.1.0](https://github.com/kontent-ai/model-generator-js/compare/v6.0.0...v6.1.0) (2023-06-26) - ### Features -* generates strongly typed multiple choice options, convert object names to safe variants in comments, updates dependencies, updates default code formatting ([7119a94](https://github.com/kontent-ai/model-generator-js/commit/7119a94db7b0c87c2c24b011d656cd8f67d944f7)) +- generates strongly typed multiple choice options, convert object names to safe variants in comments, updates dependencies, updates default + code formatting ([7119a94](https://github.com/kontent-ai/model-generator-js/commit/7119a94db7b0c87c2c24b011d656cd8f67d944f7)) ## [6.0.0](https://github.com/kontent-ai/model-generator-js/compare/v5.10.0...v6.0.0) (2023-05-31) - ### ⚠ BREAKING CHANGES -* Uses 'environment' naming as used with latest version of SDKs, updates all dependencies +- Uses 'environment' naming as used with latest version of SDKs, updates all dependencies ### Features -* Uses 'environment' naming as used with latest version of SDKs, updates all dependencies ([131b798](https://github.com/kontent-ai/model-generator-js/commit/131b7985622f922962db63b66c5e1113a22b7684)) +- Uses 'environment' naming as used with latest version of SDKs, updates all dependencies + ([131b798](https://github.com/kontent-ai/model-generator-js/commit/131b7985622f922962db63b66c5e1113a22b7684)) ## [5.10.0](https://github.com/kontent-ai/model-generator-js/compare/v5.9.0...v5.10.0) (2023-02-20) - ### Features -* improves error logging for failed content types & snippets ([786e076](https://github.com/kontent-ai/model-generator-js/commit/786e076aabe12770bd6ce967525a94abbbc66dac)) -* updates dependencies ([3926a5b](https://github.com/kontent-ai/model-generator-js/commit/3926a5bb4888f8a20de0a53590f0609fc6eb9457)) -* updates deps ([da5d171](https://github.com/kontent-ai/model-generator-js/commit/da5d171c3bed89725c9920347d981d606be1c61e)) - +- improves error logging for failed content types & snippets + ([786e076](https://github.com/kontent-ai/model-generator-js/commit/786e076aabe12770bd6ce967525a94abbbc66dac)) +- updates dependencies ([3926a5b](https://github.com/kontent-ai/model-generator-js/commit/3926a5bb4888f8a20de0a53590f0609fc6eb9457)) +- updates deps ([da5d171](https://github.com/kontent-ai/model-generator-js/commit/da5d171c3bed89725c9920347d981d606be1c61e)) ### Bug Fixes -* escapes asset folder name value ([2b0708e](https://github.com/kontent-ai/model-generator-js/commit/2b0708e5c71a36bd5c28e04989e9383ec75a6907)) +- escapes asset folder name value + ([2b0708e](https://github.com/kontent-ai/model-generator-js/commit/2b0708e5c71a36bd5c28e04989e9383ec75a6907)) ## [5.9.0](https://github.com/kontent-ai/model-generator-js/compare/v5.8.0...v5.9.0) (2022-12-20) - ### Features -* removes 'last modified' info from generated models (fixes https://github.com/kontent-ai/model-generator-js/issues/35#issuecomment-1359017033) ([05c9ee9](https://github.com/kontent-ai/model-generator-js/commit/05c9ee98b16034f585b7a1d9aeaa0ef829b813d1)), closes [/github.com/kontent-ai/model-generator-js/issues/35#issuecomment-1359017033](https://github.com/kontent-ai//github.com/kontent-ai/model-generator-js/issues/35/issues/issuecomment-1359017033) -* updates dependencies ([6a3768d](https://github.com/kontent-ai/model-generator-js/commit/6a3768db58adc8580474dc97784f66e822f2bc4a)) +- removes 'last modified' info from generated models (fixes + https://github.com/kontent-ai/model-generator-js/issues/35#issuecomment-1359017033) + ([05c9ee9](https://github.com/kontent-ai/model-generator-js/commit/05c9ee98b16034f585b7a1d9aeaa0ef829b813d1)), closes + [/github.com/kontent-ai/model-generator-js/issues/35#issuecomment-1359017033](https://github.com/kontent-ai//github.com/kontent-ai/model-generator-js/issues/35/issues/issuecomment-1359017033) +- updates dependencies ([6a3768d](https://github.com/kontent-ai/model-generator-js/commit/6a3768db58adc8580474dc97784f66e822f2bc4a)) ## [5.8.0](https://github.com/kontent-ai/model-generator-js/compare/v5.7.0...v5.8.0) (2022-10-07) - ### Features -* Adds 'type' keyword to type imports (TS Import Elision) ([f2d3afc](https://github.com/kontent-ai/model-generator-js/commit/f2d3afc0b20902d12fcba1d44967378910fe168b)) -* Adds const assertion to project generated files (fixes https://github.com/kontent-ai/model-generator-js/issues/31) ([823628c](https://github.com/kontent-ai/model-generator-js/commit/823628c32b7f86f09af4453dd041d3cc0ad3ce6c)) -* Adds new config option 'outputDir' for specifying target directory where files will be created (fixes https://github.com/kontent-ai/model-generator-js/issues/26) ([dff641e](https://github.com/kontent-ai/model-generator-js/commit/dff641e162ce8064c5c84488d149a13a0b41585a)) -* sorts various objects alphabetically ([a080f36](https://github.com/kontent-ai/model-generator-js/commit/a080f36a29ee6abacba0c6789e80bf387457d256)) -* updates dependencies ([4526cf4](https://github.com/kontent-ai/model-generator-js/commit/4526cf445d36276119efc4347b381c54d89dc998)) +- Adds 'type' keyword to type imports (TS Import Elision) + ([f2d3afc](https://github.com/kontent-ai/model-generator-js/commit/f2d3afc0b20902d12fcba1d44967378910fe168b)) +- Adds const assertion to project generated files (fixes https://github.com/kontent-ai/model-generator-js/issues/31) + ([823628c](https://github.com/kontent-ai/model-generator-js/commit/823628c32b7f86f09af4453dd041d3cc0ad3ce6c)) +- Adds new config option 'outputDir' for specifying target directory where files will be created (fixes + https://github.com/kontent-ai/model-generator-js/issues/26) + ([dff641e](https://github.com/kontent-ai/model-generator-js/commit/dff641e162ce8064c5c84488d149a13a0b41585a)) +- sorts various objects alphabetically + ([a080f36](https://github.com/kontent-ai/model-generator-js/commit/a080f36a29ee6abacba0c6789e80bf387457d256)) +- updates dependencies ([4526cf4](https://github.com/kontent-ai/model-generator-js/commit/4526cf445d36276119efc4347b381c54d89dc998)) ## [5.7.0](https://github.com/kontent-ai/model-generator-js/compare/v5.6.0...v5.7.0) (2022-09-15) - ### Features -* adds support for generating content type snippet project model (generates contentTypeSnippets.ts) ([259d969](https://github.com/kontent-ai/model-generator-js/commit/259d9696f7f7c9db4567b03548c0e5caca419298)) +- adds support for generating content type snippet project model (generates contentTypeSnippets.ts) + ([259d969](https://github.com/kontent-ai/model-generator-js/commit/259d9696f7f7c9db4567b03548c0e5caca419298)) ## [5.6.0](https://github.com/kontent-ai/model-generator-js/compare/v5.5.1...v5.6.0) (2022-09-13) - ### Features -* Removes 'Elements' from import if content type has 0 elements (fixes https://github.com/kontent-ai/model-generator-js/issues/30) ([0ec69ff](https://github.com/kontent-ai/model-generator-js/commit/0ec69ffc2106b2bf0c586d96d61f7f934eb29d04)) +- Removes 'Elements' from import if content type has 0 elements (fixes https://github.com/kontent-ai/model-generator-js/issues/30) + ([0ec69ff](https://github.com/kontent-ai/model-generator-js/commit/0ec69ffc2106b2bf0c586d96d61f7f934eb29d04)) ### [5.5.1](https://github.com/kontent-ai/model-generator-js/compare/v5.5.0...v5.5.1) (2022-09-02) - ### Bug Fixes -* Fixes import path from content type snippet to content type model ([4707a05](https://github.com/kontent-ai/model-generator-js/commit/4707a0594a66b42f64408f0a4e99da0cfc5c7ebf)) +- Fixes import path from content type snippet to content type model + ([4707a05](https://github.com/kontent-ai/model-generator-js/commit/4707a0594a66b42f64408f0a4e99da0cfc5c7ebf)) ## [5.5.0](https://github.com/kontent-ai/model-generator-js/compare/v5.4.1...v5.5.0) (2022-09-01) - ### Features -* updates deps ([67d8f81](https://github.com/kontent-ai/model-generator-js/commit/67d8f811989c366f6dc5e60aa488c4db51ac1b95)) +- updates deps ([67d8f81](https://github.com/kontent-ai/model-generator-js/commit/67d8f811989c366f6dc5e60aa488c4db51ac1b95)) ### [5.4.1](https://github.com/kontent-ai/model-generator-js/compare/v5.4.0...v5.4.1) (2022-08-02) - ### Bug Fixes -* Fixes missing imports for subpages element (fixes https://github.com/kontent-ai/model-generator-js/issues/27) ([12f693a](https://github.com/kontent-ai/model-generator-js/commit/12f693ae30551e27545f8edc1b4d17146eb1cef4)) +- Fixes missing imports for subpages element (fixes https://github.com/kontent-ai/model-generator-js/issues/27) + ([12f693a](https://github.com/kontent-ai/model-generator-js/commit/12f693ae30551e27545f8edc1b4d17146eb1cef4)) ## [5.4.0](https://github.com/kontent-ai/model-generator-js/compare/v5.3.0...v5.4.0) (2022-08-01) - ### Features -* Adds support for Delivery 'subpages' elements (fixes https://github.com/kontent-ai/model-generator-js/issues/27) ([9750120](https://github.com/kontent-ai/model-generator-js/commit/97501208eb0e4e63bdfaff2af89ed6a953131aea)) +- Adds support for Delivery 'subpages' elements (fixes https://github.com/kontent-ai/model-generator-js/issues/27) + ([9750120](https://github.com/kontent-ai/model-generator-js/commit/97501208eb0e4e63bdfaff2af89ed6a953131aea)) ## [5.3.0](https://github.com/kontent-ai/model-generator-js/compare/v5.2.0...v5.3.0) (2022-07-28) - ### Features -* Splits Content type snippets from the types they are used in favor of using intersection (fixes https://github.com/kontent-ai/model-generator-js/issues/25) ([6ea944a](https://github.com/kontent-ai/model-generator-js/commit/6ea944a88048b4acbdabaf8a3ab65ae8d0ce75bf)) -* updates dependencies ([e4b3b90](https://github.com/kontent-ai/model-generator-js/commit/e4b3b90cec95a7c0ade58dd003d2d99c30ee9fdf)) - +- Splits Content type snippets from the types they are used in favor of using intersection (fixes + https://github.com/kontent-ai/model-generator-js/issues/25) + ([6ea944a](https://github.com/kontent-ai/model-generator-js/commit/6ea944a88048b4acbdabaf8a3ab65ae8d0ce75bf)) +- updates dependencies ([e4b3b90](https://github.com/kontent-ai/model-generator-js/commit/e4b3b90cec95a7c0ade58dd003d2d99c30ee9fdf)) ### Bug Fixes -* Adds default import to barrel files in case there are no files to import ([2020022](https://github.com/kontent-ai/model-generator-js/commit/2020022e509dad7afcf67b2b8bb87314aeef9b18)) +- Adds default import to barrel files in case there are no files to import + ([2020022](https://github.com/kontent-ai/model-generator-js/commit/2020022e509dad7afcf67b2b8bb87314aeef9b18)) ## [5.2.0](https://github.com/kontent-ai/model-generator-js/compare/v5.1.1...v5.2.0) (2022-07-26) - ### Features -* Adds new 'isEnterpriseSubscription' option which disables endpoint that required Enterprise subscription plans ([76e9784](https://github.com/kontent-ai/model-generator-js/commit/76e97849e2ca99a3986c163d447bb08b6773f84f)) +- Adds new 'isEnterpriseSubscription' option which disables endpoint that required Enterprise subscription plans + ([76e9784](https://github.com/kontent-ai/model-generator-js/commit/76e97849e2ca99a3986c163d447bb08b6773f84f)) ### [5.1.1](https://github.com/kontent-ai/model-generator-js/compare/v5.1.0...v5.1.1) (2022-07-21) - ### Bug Fixes -* Adds missing 'taxonomy' element to project's content type structure ([8a165a3](https://github.com/kontent-ai/model-generator-js/commit/8a165a35d062cc438ffa47ccff22b8191dc958e5)) -* fixes missing usage of 'addExtension' ([b99dcd7](https://github.com/kontent-ai/model-generator-js/commit/b99dcd74c9b4232ebe1d43c793ac2b1c67579cdd)) +- Adds missing 'taxonomy' element to project's content type structure + ([8a165a3](https://github.com/kontent-ai/model-generator-js/commit/8a165a35d062cc438ffa47ccff22b8191dc958e5)) +- fixes missing usage of 'addExtension' + ([b99dcd7](https://github.com/kontent-ai/model-generator-js/commit/b99dcd74c9b4232ebe1d43c793ac2b1c67579cdd)) ## [5.1.0](https://github.com/kontent-ai/model-generator-js/compare/v5.0.0...v5.1.0) (2022-07-21) - ### Features -* updates dependencies & readme, makes 'exportProjectSettings' property optional and exports all objects by default ([e1c50fa](https://github.com/kontent-ai/model-generator-js/commit/e1c50faf9df0b526edbec5312967fb2728ffc4b2)) +- updates dependencies & readme, makes 'exportProjectSettings' property optional and exports all objects by default + ([e1c50fa](https://github.com/kontent-ai/model-generator-js/commit/e1c50faf9df0b526edbec5312967fb2728ffc4b2)) ## [5.0.0](https://github.com/kontent-ai/model-generator-js/compare/v5.0.0-4...v5.0.0) (2022-07-14) @@ -248,170 +285,216 @@ All notable changes to this project will be documented in this file. See [standa ## [5.0.0-3](https://github.com/kontent-ai/model-generator-js/compare/v5.0.0-2...v5.0.0-3) (2022-05-30) - ### Features -* updates deps ([694d009](https://github.com/kontent-ai/model-generator-js/commit/694d009a1709f8ab28a7c47e75d16d9b7136a983)) +- updates deps ([694d009](https://github.com/kontent-ai/model-generator-js/commit/694d009a1709f8ab28a7c47e75d16d9b7136a983)) ## [5.0.0-2](https://github.com/kontent-ai/model-generator-js/compare/v5.0.0-1...v5.0.0-2) (2022-05-24) - ### Features -* Adds support for elements placed in content type snippets (fixes https://github.com/kontent-ai/model-generator-js/issues/24) ([320c607](https://github.com/kontent-ai/model-generator-js/commit/320c607f9e72961fddc936ad907355ac28639869)) +- Adds support for elements placed in content type snippets (fixes https://github.com/kontent-ai/model-generator-js/issues/24) + ([320c607](https://github.com/kontent-ai/model-generator-js/commit/320c607f9e72961fddc936ad907355ac28639869)) ## [5.0.0-1](https://github.com/kontent-ai/model-generator-js/compare/v4.1.0...v5.0.0-1) (2022-05-19) - ### ⚠ BREAKING CHANGES -* Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the generator. -* changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types - -### Features - -* Adds 'help' cli command with options list and descriptions ([f67916b](https://github.com/kontent-ai/model-generator-js/commit/f67916b33285cb581d4d5ad314d95a97558473d2)) -* adds 'id' to all objects within project structure ([7123509](https://github.com/kontent-ai/model-generator-js/commit/712350942c6d0f3aee79d8825db2f609ed3122ab)) -* adds additional language properties (fallback language, default & active states) ([5659c65](https://github.com/kontent-ai/model-generator-js/commit/5659c654d0f706da69856aa5ed44bd117ed1f4b8)) -* Adds comments to all generated _project items ([fba932b](https://github.com/kontent-ai/model-generator-js/commit/fba932bc0b9e65245d87a56418b7f6712d0fc539)) -* Adds comments to each element / content type / taxonomy with extra metadata information ([1b6a6f1](https://github.com/kontent-ai/model-generator-js/commit/1b6a6f1905723a8b15cd7869b5434fcbe25c81ba)) -* Adds metadata to generated project model, logs project information including environment to console ([ae9d4de](https://github.com/kontent-ai/model-generator-js/commit/ae9d4de07d238a7727b020ccee50c7ae43e80340)) -* Adds more properties to selected project objects and adjust comments to prevent data duplication ([23ffc62](https://github.com/kontent-ai/model-generator-js/commit/23ffc62b270cc75fc658ee1dc12688b5984bc0e2)) -* adds name property to asset folders ([c559f17](https://github.com/kontent-ai/model-generator-js/commit/c559f17008a06c5ec86df32112d2e0004e0c0f9d)) -* Adds support for asset folders in project structure ([e73fd46](https://github.com/kontent-ai/model-generator-js/commit/e73fd46f02b580121a5e2eb091eda9bf86166695)) -* adds support for collections in project model ([8404230](https://github.com/kontent-ai/model-generator-js/commit/840423006508494acff786d02e1c59f439fd2fbd)) -* adds support for disabled export of certain project objects, updates readme and samples ([b376564](https://github.com/kontent-ai/model-generator-js/commit/b37656433e9123a3479979dd91604820d16fb8b6)) -* adds support for project roles, use camelCase for language property identifier ([022f7c7](https://github.com/kontent-ai/model-generator-js/commit/022f7c7e835ab10657b64a60c62608d28818ca93)) -* adds support for project webhooks ([4c2a99f](https://github.com/kontent-ai/model-generator-js/commit/4c2a99fa57228e2902813db4c38a49c41bd7dca6)) -* Adds support for strongly typed taxonomy elements ([cab91bf](https://github.com/kontent-ai/model-generator-js/commit/cab91bfaddfe645c7c55aff7dbcbb1f2b5cbbd32)) -* changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types ([011ffa8](https://github.com/kontent-ai/model-generator-js/commit/011ffa8d78efad60c94fa5175565d157a468a127)) -* Generates barrel export from all created files ([915d149](https://github.com/kontent-ai/model-generator-js/commit/915d149f31ad7714aed450f5b57a8538e1c2e19c)) -* Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the generator. ([47270b1](https://github.com/kontent-ai/model-generator-js/commit/47270b17d4ab88a99f6679f0ed991539c9a10906)) -* Refactors internal generator and adds support for content type restrictions in linked items element ([d6afc18](https://github.com/kontent-ai/model-generator-js/commit/d6afc1850faba2e8127ca7d94cdd052f33b3346f)) -* Separates content type / taxonomy barrel export ([d346533](https://github.com/kontent-ai/model-generator-js/commit/d346533e126174b541f8ef37c6f9681f29358e3f)) -* separates project model into distinct files & properties, uses barrel export for project files ([06067c0](https://github.com/kontent-ai/model-generator-js/commit/06067c0aa3fe44662999f05d3220d50746e3495b)) -* updates deps ([abaa4f6](https://github.com/kontent-ai/model-generator-js/commit/abaa4f655c4b1a152a89c778c2ade9a3b26a464e)) -* updates deps & entry modules ([a9582b8](https://github.com/kontent-ai/model-generator-js/commit/a9582b8b1c1a304e272cd37dc6d85e13c9fe833c)) +- Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the + generator. +- changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types + +### Features + +- Adds 'help' cli command with options list and descriptions + ([f67916b](https://github.com/kontent-ai/model-generator-js/commit/f67916b33285cb581d4d5ad314d95a97558473d2)) +- adds 'id' to all objects within project structure + ([7123509](https://github.com/kontent-ai/model-generator-js/commit/712350942c6d0f3aee79d8825db2f609ed3122ab)) +- adds additional language properties (fallback language, default & active states) + ([5659c65](https://github.com/kontent-ai/model-generator-js/commit/5659c654d0f706da69856aa5ed44bd117ed1f4b8)) +- Adds comments to all generated \_project items + ([fba932b](https://github.com/kontent-ai/model-generator-js/commit/fba932bc0b9e65245d87a56418b7f6712d0fc539)) +- Adds comments to each element / content type / taxonomy with extra metadata information + ([1b6a6f1](https://github.com/kontent-ai/model-generator-js/commit/1b6a6f1905723a8b15cd7869b5434fcbe25c81ba)) +- Adds metadata to generated project model, logs project information including environment to console + ([ae9d4de](https://github.com/kontent-ai/model-generator-js/commit/ae9d4de07d238a7727b020ccee50c7ae43e80340)) +- Adds more properties to selected project objects and adjust comments to prevent data duplication + ([23ffc62](https://github.com/kontent-ai/model-generator-js/commit/23ffc62b270cc75fc658ee1dc12688b5984bc0e2)) +- adds name property to asset folders + ([c559f17](https://github.com/kontent-ai/model-generator-js/commit/c559f17008a06c5ec86df32112d2e0004e0c0f9d)) +- Adds support for asset folders in project structure + ([e73fd46](https://github.com/kontent-ai/model-generator-js/commit/e73fd46f02b580121a5e2eb091eda9bf86166695)) +- adds support for collections in project model + ([8404230](https://github.com/kontent-ai/model-generator-js/commit/840423006508494acff786d02e1c59f439fd2fbd)) +- adds support for disabled export of certain project objects, updates readme and samples + ([b376564](https://github.com/kontent-ai/model-generator-js/commit/b37656433e9123a3479979dd91604820d16fb8b6)) +- adds support for project roles, use camelCase for language property identifier + ([022f7c7](https://github.com/kontent-ai/model-generator-js/commit/022f7c7e835ab10657b64a60c62608d28818ca93)) +- adds support for project webhooks + ([4c2a99f](https://github.com/kontent-ai/model-generator-js/commit/4c2a99fa57228e2902813db4c38a49c41bd7dca6)) +- Adds support for strongly typed taxonomy elements + ([cab91bf](https://github.com/kontent-ai/model-generator-js/commit/cab91bfaddfe645c7c55aff7dbcbb1f2b5cbbd32)) +- changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types + ([011ffa8](https://github.com/kontent-ai/model-generator-js/commit/011ffa8d78efad60c94fa5175565d157a468a127)) +- Generates barrel export from all created files + ([915d149](https://github.com/kontent-ai/model-generator-js/commit/915d149f31ad7714aed450f5b57a8538e1c2e19c)) +- Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the + generator. ([47270b1](https://github.com/kontent-ai/model-generator-js/commit/47270b17d4ab88a99f6679f0ed991539c9a10906)) +- Refactors internal generator and adds support for content type restrictions in linked items element + ([d6afc18](https://github.com/kontent-ai/model-generator-js/commit/d6afc1850faba2e8127ca7d94cdd052f33b3346f)) +- Separates content type / taxonomy barrel export + ([d346533](https://github.com/kontent-ai/model-generator-js/commit/d346533e126174b541f8ef37c6f9681f29358e3f)) +- separates project model into distinct files & properties, uses barrel export for project files + ([06067c0](https://github.com/kontent-ai/model-generator-js/commit/06067c0aa3fe44662999f05d3220d50746e3495b)) +- updates deps ([abaa4f6](https://github.com/kontent-ai/model-generator-js/commit/abaa4f655c4b1a152a89c778c2ade9a3b26a464e)) +- updates deps & entry modules ([a9582b8](https://github.com/kontent-ai/model-generator-js/commit/a9582b8b1c1a304e272cd37dc6d85e13c9fe833c)) ## [5.0.0-0](https://github.com/kontent-ai/model-generator-js/compare/v4.1.0...v5.0.0-0) (2022-05-09) - ### ⚠ BREAKING CHANGES -* Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the generator. -* changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types - -### Features - -* Adds 'help' cli command with options list and descriptions ([f67916b](https://github.com/kontent-ai/model-generator-js/commit/f67916b33285cb581d4d5ad314d95a97558473d2)) -* adds 'id' to all objects within project structure ([7123509](https://github.com/kontent-ai/model-generator-js/commit/712350942c6d0f3aee79d8825db2f609ed3122ab)) -* Adds comments to all generated _project items ([fba932b](https://github.com/kontent-ai/model-generator-js/commit/fba932bc0b9e65245d87a56418b7f6712d0fc539)) -* Adds comments to each element / content type / taxonomy with extra metadata information ([1b6a6f1](https://github.com/kontent-ai/model-generator-js/commit/1b6a6f1905723a8b15cd7869b5434fcbe25c81ba)) -* Adds metadata to generated project model, logs project information including environment to console ([ae9d4de](https://github.com/kontent-ai/model-generator-js/commit/ae9d4de07d238a7727b020ccee50c7ae43e80340)) -* Adds more properties to selected project objects and adjust comments to prevent data duplication ([23ffc62](https://github.com/kontent-ai/model-generator-js/commit/23ffc62b270cc75fc658ee1dc12688b5984bc0e2)) -* Adds support for asset folders in project structure ([e73fd46](https://github.com/kontent-ai/model-generator-js/commit/e73fd46f02b580121a5e2eb091eda9bf86166695)) -* adds support for collections in project model ([8404230](https://github.com/kontent-ai/model-generator-js/commit/840423006508494acff786d02e1c59f439fd2fbd)) -* adds support for disabled export of certain project objects, updates readme and samples ([b376564](https://github.com/kontent-ai/model-generator-js/commit/b37656433e9123a3479979dd91604820d16fb8b6)) -* adds support for project roles, use camelCase for language property identifier ([022f7c7](https://github.com/kontent-ai/model-generator-js/commit/022f7c7e835ab10657b64a60c62608d28818ca93)) -* adds support for project webhooks ([4c2a99f](https://github.com/kontent-ai/model-generator-js/commit/4c2a99fa57228e2902813db4c38a49c41bd7dca6)) -* Adds support for strongly typed taxonomy elements ([cab91bf](https://github.com/kontent-ai/model-generator-js/commit/cab91bfaddfe645c7c55aff7dbcbb1f2b5cbbd32)) -* Generates barrel export from all created files ([915d149](https://github.com/kontent-ai/model-generator-js/commit/915d149f31ad7714aed450f5b57a8538e1c2e19c)) -* changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types ([011ffa8](https://github.com/kontent-ai/model-generator-js/commit/011ffa8d78efad60c94fa5175565d157a468a127)) -* Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the generator. ([47270b1](https://github.com/kontent-ai/model-generator-js/commit/47270b17d4ab88a99f6679f0ed991539c9a10906)) -* Refactors internal generator and adds support for content type restrictions in linked items element ([d6afc18](https://github.com/kontent-ai/model-generator-js/commit/d6afc1850faba2e8127ca7d94cdd052f33b3346f)) -* Separates content type / taxonomy barrel export ([d346533](https://github.com/kontent-ai/model-generator-js/commit/d346533e126174b541f8ef37c6f9681f29358e3f)) -* separates project model into distinct files & properties, uses barrel export for project files ([06067c0](https://github.com/kontent-ai/model-generator-js/commit/06067c0aa3fe44662999f05d3220d50746e3495b)) -* updates deps ([abaa4f6](https://github.com/kontent-ai/model-generator-js/commit/abaa4f655c4b1a152a89c778c2ade9a3b26a464e)) -* updates deps & entry modules ([a9582b8](https://github.com/kontent-ai/model-generator-js/commit/a9582b8b1c1a304e272cd37dc6d85e13c9fe833c)) +- Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the + generator. +- changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types + +### Features + +- Adds 'help' cli command with options list and descriptions + ([f67916b](https://github.com/kontent-ai/model-generator-js/commit/f67916b33285cb581d4d5ad314d95a97558473d2)) +- adds 'id' to all objects within project structure + ([7123509](https://github.com/kontent-ai/model-generator-js/commit/712350942c6d0f3aee79d8825db2f609ed3122ab)) +- Adds comments to all generated \_project items + ([fba932b](https://github.com/kontent-ai/model-generator-js/commit/fba932bc0b9e65245d87a56418b7f6712d0fc539)) +- Adds comments to each element / content type / taxonomy with extra metadata information + ([1b6a6f1](https://github.com/kontent-ai/model-generator-js/commit/1b6a6f1905723a8b15cd7869b5434fcbe25c81ba)) +- Adds metadata to generated project model, logs project information including environment to console + ([ae9d4de](https://github.com/kontent-ai/model-generator-js/commit/ae9d4de07d238a7727b020ccee50c7ae43e80340)) +- Adds more properties to selected project objects and adjust comments to prevent data duplication + ([23ffc62](https://github.com/kontent-ai/model-generator-js/commit/23ffc62b270cc75fc658ee1dc12688b5984bc0e2)) +- Adds support for asset folders in project structure + ([e73fd46](https://github.com/kontent-ai/model-generator-js/commit/e73fd46f02b580121a5e2eb091eda9bf86166695)) +- adds support for collections in project model + ([8404230](https://github.com/kontent-ai/model-generator-js/commit/840423006508494acff786d02e1c59f439fd2fbd)) +- adds support for disabled export of certain project objects, updates readme and samples + ([b376564](https://github.com/kontent-ai/model-generator-js/commit/b37656433e9123a3479979dd91604820d16fb8b6)) +- adds support for project roles, use camelCase for language property identifier + ([022f7c7](https://github.com/kontent-ai/model-generator-js/commit/022f7c7e835ab10657b64a60c62608d28818ca93)) +- adds support for project webhooks + ([4c2a99f](https://github.com/kontent-ai/model-generator-js/commit/4c2a99fa57228e2902813db4c38a49c41bd7dca6)) +- Adds support for strongly typed taxonomy elements + ([cab91bf](https://github.com/kontent-ai/model-generator-js/commit/cab91bfaddfe645c7c55aff7dbcbb1f2b5cbbd32)) +- Generates barrel export from all created files + ([915d149](https://github.com/kontent-ai/model-generator-js/commit/915d149f31ad7714aed450f5b57a8538e1c2e19c)) +- changes the default generator file names, renames fileResolver to contentTypeFileResolver, adds support for generating taxonomy types + ([011ffa8](https://github.com/kontent-ai/model-generator-js/commit/011ffa8d78efad60c94fa5175565d157a468a127)) +- Refactors generator to use Management API for fetching source data. This change now requires you to use 'apiKey' option when calling the + generator. ([47270b1](https://github.com/kontent-ai/model-generator-js/commit/47270b17d4ab88a99f6679f0ed991539c9a10906)) +- Refactors internal generator and adds support for content type restrictions in linked items element + ([d6afc18](https://github.com/kontent-ai/model-generator-js/commit/d6afc1850faba2e8127ca7d94cdd052f33b3346f)) +- Separates content type / taxonomy barrel export + ([d346533](https://github.com/kontent-ai/model-generator-js/commit/d346533e126174b541f8ef37c6f9681f29358e3f)) +- separates project model into distinct files & properties, uses barrel export for project files + ([06067c0](https://github.com/kontent-ai/model-generator-js/commit/06067c0aa3fe44662999f05d3220d50746e3495b)) +- updates deps ([abaa4f6](https://github.com/kontent-ai/model-generator-js/commit/abaa4f655c4b1a152a89c778c2ade9a3b26a464e)) +- updates deps & entry modules ([a9582b8](https://github.com/kontent-ai/model-generator-js/commit/a9582b8b1c1a304e272cd37dc6d85e13c9fe833c)) ## [4.1.0](https://github.com/kontent-ai/model-generator-js/compare/v4.1.0-0...v4.1.0) (2021-11-24) ## [4.1.0-0](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0...v4.1.0-0) (2021-11-24) - ### Features -* adds support for customizing content type names ([d63e007](https://github.com/kontent-ai/model-generator-js/commit/d63e00786eee94bde7fbdeede5c9e19250ee19b4)) -* adds support for generating custom filenames ([d4e638b](https://github.com/kontent-ai/model-generator-js/commit/d4e638bad4d7cc28eb23f62c59bc00ea545aae51)) -* renames 'nameResolver' to 'elementResolver' and unifies it with customElementResolver option ([a18fd00](https://github.com/kontent-ai/model-generator-js/commit/a18fd003e9507b487135d27ef6dcb5a748907b26)) +- adds support for customizing content type names + ([d63e007](https://github.com/kontent-ai/model-generator-js/commit/d63e00786eee94bde7fbdeede5c9e19250ee19b4)) +- adds support for generating custom filenames + ([d4e638b](https://github.com/kontent-ai/model-generator-js/commit/d4e638bad4d7cc28eb23f62c59bc00ea545aae51)) +- renames 'nameResolver' to 'elementResolver' and unifies it with customElementResolver option + ([a18fd00](https://github.com/kontent-ai/model-generator-js/commit/a18fd003e9507b487135d27ef6dcb5a748907b26)) ## [4.0.0](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-7...v4.0.0) (2021-11-16) ## [4.0.0-7](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-6...v4.0.0-7) (2021-11-16) - ### Bug Fixes -* converts language property name to alphanumeric string ([68272a2](https://github.com/kontent-ai/model-generator-js/commit/68272a2d7002204e1e43c1c50960e4c4f0b5ce73)) +- converts language property name to alphanumeric string + ([68272a2](https://github.com/kontent-ai/model-generator-js/commit/68272a2d7002204e1e43c1c50960e4c4f0b5ce73)) ## [4.0.0-6](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-5...v4.0.0-6) (2021-11-16) - ### Bug Fixes -* use camel case codename for language property name (in case there are unsupported object property chars in codename) ([fc9d8e0](https://github.com/kontent-ai/model-generator-js/commit/fc9d8e0b5a68c5845e9d26b3d11d63f657c6d647)) +- use camel case codename for language property name (in case there are unsupported object property chars in codename) + ([fc9d8e0](https://github.com/kontent-ai/model-generator-js/commit/fc9d8e0b5a68c5845e9d26b3d11d63f657c6d647)) ## [4.0.0-5](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-4...v4.0.0-5) (2021-11-10) - ### Bug Fixes -* escapes name values ([102c864](https://github.com/kontent-ai/model-generator-js/commit/102c864efc031f1ea21ac2bebbd8bdf9e640759d)) +- escapes name values ([102c864](https://github.com/kontent-ai/model-generator-js/commit/102c864efc031f1ea21ac2bebbd8bdf9e640759d)) ## [4.0.0-4](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-3...v4.0.0-4) (2021-11-10) - ### Bug Fixes -* move kontent-delivery dependency ([9747799](https://github.com/kontent-ai/model-generator-js/commit/9747799f83062781bc57130399cd5ecc0e5bbdc4)) +- move kontent-delivery dependency + ([9747799](https://github.com/kontent-ai/model-generator-js/commit/9747799f83062781bc57130399cd5ecc0e5bbdc4)) ## [4.0.0-3](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-2...v4.0.0-3) (2021-11-08) - ### Features -* refactors generator code to prepare for separate delivery / management models ([3127473](https://github.com/kontent-ai/model-generator-js/commit/31274730278e67e65a94ca7f510e52401e8ee3da)) +- refactors generator code to prepare for separate delivery / management models + ([3127473](https://github.com/kontent-ai/model-generator-js/commit/31274730278e67e65a94ca7f510e52401e8ee3da)) ## [4.0.0-2](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-1...v4.0.0-2) (2021-11-04) ## [4.0.0-1](https://github.com/kontent-ai/model-generator-js/compare/v4.0.0-0...v4.0.0-1) (2021-11-04) - ### Features -* adds support for generating project structure for content types, languages & taxonomies ([7dfdab9](https://github.com/kontent-ai/model-generator-js/commit/7dfdab9fecd171e6f57a4b1f22b6fc9075a60908)) -* use pascal case for type class names ([322888e](https://github.com/kontent-ai/model-generator-js/commit/322888e6290fcfcc5f710d9e6000ffe69dac6a93)) +- adds support for generating project structure for content types, languages & taxonomies + ([7dfdab9](https://github.com/kontent-ai/model-generator-js/commit/7dfdab9fecd171e6f57a4b1f22b6fc9075a60908)) +- use pascal case for type class names + ([322888e](https://github.com/kontent-ai/model-generator-js/commit/322888e6290fcfcc5f710d9e6000ffe69dac6a93)) ## [4.0.0-0](https://github.com/kontent-ai/model-generator-js/compare/v3.3.0-0...v4.0.0-0) (2021-10-20) - ### Features -* use peer deps for kontent delivery, updates all deps ([9b02551](https://github.com/kontent-ai/model-generator-js/commit/9b0255126ebd69594c74cfb9dc5a0c047f4871ef)) +- use peer deps for kontent delivery, updates all deps + ([9b02551](https://github.com/kontent-ai/model-generator-js/commit/9b0255126ebd69594c74cfb9dc5a0c047f4871ef)) ## [3.3.0-0](https://github.com/kontent-ai/model-generator-js/compare/v3.2.0...v3.3.0-0) (2021-10-11) - ### Features -* adds support for custom name resolver, fixes script paths, exports public API ([af50d20](https://github.com/kontent-ai/model-generator-js/commit/af50d20726303986742171f1f24d446f1d9e94cc)) -* adds support for specifying built-in name resolvers ([22881db](https://github.com/kontent-ai/model-generator-js/commit/22881db74bb3e5094baf27892fd2b6052952b3d4)) -* capitalize type name in model ([76106c7](https://github.com/kontent-ai/model-generator-js/commit/76106c7a7eb3bbf937e7a2ec9b05ac13ae28d3ba)) -* implements timestamp disable option, adds colors for better console output, adds prettier and beautifies output with the ability to pass custom configuration ([df13368](https://github.com/kontent-ai/model-generator-js/commit/df133689a6ae1875647e15342587aec56e0c28fa)) -* updates build & distribution process, updates dev deps ([e6dfb8d](https://github.com/kontent-ai/model-generator-js/commit/e6dfb8de437e6ea11625e1a573b86775782bc1ec)) -* updates code generator for new version of Delivery SDK ([f6aca8f](https://github.com/kontent-ai/model-generator-js/commit/f6aca8f0305dcc23367d24b1b224492c47f3fd5c)) +- adds support for custom name resolver, fixes script paths, exports public API + ([af50d20](https://github.com/kontent-ai/model-generator-js/commit/af50d20726303986742171f1f24d446f1d9e94cc)) +- adds support for specifying built-in name resolvers + ([22881db](https://github.com/kontent-ai/model-generator-js/commit/22881db74bb3e5094baf27892fd2b6052952b3d4)) +- capitalize type name in model + ([76106c7](https://github.com/kontent-ai/model-generator-js/commit/76106c7a7eb3bbf937e7a2ec9b05ac13ae28d3ba)) +- implements timestamp disable option, adds colors for better console output, adds prettier and beautifies output with the ability to pass + custom configuration ([df13368](https://github.com/kontent-ai/model-generator-js/commit/df133689a6ae1875647e15342587aec56e0c28fa)) +- updates build & distribution process, updates dev deps + ([e6dfb8d](https://github.com/kontent-ai/model-generator-js/commit/e6dfb8de437e6ea11625e1a573b86775782bc1ec)) +- updates code generator for new version of Delivery SDK + ([f6aca8f](https://github.com/kontent-ai/model-generator-js/commit/f6aca8f0305dcc23367d24b1b224492c47f3fd5c)) ## [3.2.0](https://github.com/kontent-ai/model-generator-js/compare/v3.1.0...v3.2.0) (2020-02-12) - ### Features -* adds ability to skip timestamp generation in models (helps with tracking changes under source control) fixes https://github.com/kontent-ai/model-generator-js/issues/1 ([1098ebb](https://github.com/kontent-ai/model-generator-js/commit/1098ebb1ebf63240b46d0cca35b107b58c562667)) +- adds ability to skip timestamp generation in models (helps with tracking changes under source control) fixes + https://github.com/kontent-ai/model-generator-js/issues/1 + ([1098ebb](https://github.com/kontent-ai/model-generator-js/commit/1098ebb1ebf63240b46d0cca35b107b58c562667)) ## 3.1.0 (2020-01-06) - ### Features -* updates dependencies and uses @kentico/kontent-delivery:8.2.0 ([befe7f0](https://github.com/kontent-ai/model-generator-js/commit/befe7f06c10f41eabbeb8eaeb01c7245c630dfbd)) -* uses standard-version & fixes github link in package.json ([dc15768](https://github.com/kontent-ai/model-generator-js/commit/dc15768ee9fbbfbcb1733e7bad9ff41affd95f3b)) +- updates dependencies and uses @kentico/kontent-delivery:8.2.0 + ([befe7f0](https://github.com/kontent-ai/model-generator-js/commit/befe7f06c10f41eabbeb8eaeb01c7245c630dfbd)) +- uses standard-version & fixes github link in package.json + ([dc15768](https://github.com/kontent-ai/model-generator-js/commit/dc15768ee9fbbfbcb1733e7bad9ff41affd95f3b)) diff --git a/LICENSE.md b/LICENSE.md index 4b1c689c..a2d4b365 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 5a1a5337..ce9cee3e 100644 --- a/README.md +++ b/README.md @@ -4,234 +4,316 @@ # 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 Kontent.ai Model Generator is a library designed to enhance your development experience by enabling the use of strongly typed objects +and TypeScript models. It supports the generation of four distinct types of models: + +| Model type | Description | Compatibility | +| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | +| [delivery-sdk](#delivery-sdk-models) | Generates TypeScript models for the [JS Delivery SDK](https://www.npmjs.com/package/@kontent-ai/delivery-sdk). These models include content types, taxonomies, and codename-based types representing elements such as workflow steps, languages, and more. | `@kontent-ai/delivery-sdk` on version `>=16.0.0` | +| [migration-toolkit](#migration-toolkit-models) | Creates TypeScript models for the [Migration Toolkit](https://www.npmjs.com/package/@kontent-ai/migration-toolkit). These models help simplify and standardize the process of writing migration scripts. | `@kontent-ai/migration-toolkit` on version `>=2.6.0` | +| [environment](#environment-models) | Generates JavaScript objects (not TypeScript types) representing the entire structure of your environment — including content types, workflows, languages, and taxonomies. These objects provide comprehensive access to environment metadata. | Can be used in any project. No external dependencies are required. | +| [items](#item-models) | Produces TypeScript types for all item codenames, along with objects containing the id and codename of each item. This is particularly useful when referencing a set of items in your code, enabling type-safe access instead of relying on hardcoded strings. | Can be used in any project. No external dependencies are required. | ## Installation -Install package globally so you can use it anywhere: +Install `globally`, as a `devDependency` or just use `npx` for simplicity -`npm i @kontent-ai/model-generator -g` +```bash +# Install globally +npm i -g @kontent-ai/model-generator@latest -## Generate models with CLI +# Install as dev dependency and use in your code +npm i --save-dev @kontent-ai/model-generator@latest -Go to folder where you want to create models and run: +# Run with npx +npx @kontent-ai/model-generator@latest --help +``` -`kontent-generate --environmentId=xxx --apiKey=yyy` +### CLI Help -You may specify other options like: +```bash +# General help +npx @kontent-ai/model-generator@latest --help -`kontent-generate --environmentId=xxx --apiKey=yyy --addTimestamp=false --elementResolver=camelCase` +# Or get help for specific command +npx @kontent-ai/model-generator@latest delivery-sdk --help +``` -## Generate models in code +## Delivery SDK Models -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). +> [!TIP] +> Recommended: Using these models is highly encouraged when working with the JavaScript Delivery SDK, as they provide robust type +> safety and streamline development. -```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 - } -}); +Basic usage + +```bash +npx @kontent-ai/model-generator@latest delivery-sdk + --environmentId= + --managementApiKey= ``` -### Customizing generated file names +Usage with options -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 delivery-sdk + --environmentId= + --managementApiKey= + --outputDir= + --moduleFileExtension= + --addTimestamp= + --managementBaseUrl= +``` ```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}` +import { generateDeliveryModelsAsync } from '@kontent-ai/model-generator'; + +await generateDeliveryModelsAsync({ + // required + environmentId: 'x', + managementApiKey: 'y', + moduleFileExtension: 'js', + addTimestamp: false, + createFiles: true, + outputDir: '/', // only required when createFiles is true + + // optional + fileResolvers: { contentType: 'camelCase', snippet: 'camelCase', taxonomy: 'camelCase' }, + nameResolvers: { contentType: (item) => `Company_${item.codename}`, snippet: 'pascalCase', taxonomy: 'pascalCase' }, + formatOptions: { indentSize: 4, quote: 'single' }, + baseUrl: undefined }); ``` -### Customizing generated content type names +Configuration + +| Option | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `environmentId` | Id of Kontent.ai environment | +| `managementApiKey` | Management API key | +| `moduleFileExtension` | Extension used for imports in generated models. | +| `addTimestamp` | Indicates if models contain timestamp | +| `createFiles` | If enabled, files will be created on FileSystem. When disabled you may iterate over the result and process the files yourself. | +| `outputDir` | Output directory path for files. Only available when `createFiles` is set to `true` | +| `fileResolvers` | Can be used to customize the generated filenames | +| `nameResolvers` | Can be used to customize names of generated types | +| `formatOptions` | Prettier configuration for formatting generated code | +| `baseUrl` | Can be used to override default Kontent.ai URLs | + +## Migration toolkit models + +Basic usage + +```bash +npx @kontent-ai/model-generator@latest migration-toolkit + --environmentId= + --managementApiKey= +``` + +Usage with options -You may customize name of content types using the `contentTypeResolver` configuration option and taxonomy types with the -`taxonomyTypeResolver` option: +```bash +npx @kontent-ai/model-generator@latest migration-toolkit + --environmentId= + --managementApiKey= + --outputDir= + --moduleFileExtension= + --addTimestamp= + --managementBaseUrl= +``` ```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 { generateMigrationModelsAsync } from '@kontent-ai/model-generator'; + +await generateMigrationModelsAsync({ + // required + environmentId: 'x', + managementApiKey: 'y', + moduleFileExtension: 'js', + addTimestamp: false, + createFiles: true, + outputDir: '/', // only required when createFiles is true + + // optional + baseUrl: undefined, + formatOptions: { indentSize: 4, quote: 'single' } }); ``` -## 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` +Configuration + +| Option | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `environmentId` | Id of Kontent.ai environment | +| `managementApiKey` | Management API key | +| `moduleFileExtension` | Extension used for imports in generated models. | +| `addTimestamp` | Indicates if models contain timestamp | +| `createFiles` | If enabled, files will be created on FileSystem. When disabled you may iterate over the result and process the files yourself. | +| `outputDir` | Output directory path for files. Only available when `createFiles` is set to `true` | +| `formatOptions` | Prettier configuration for formatting generated code | +| `baseUrl` | Can be used to override default Kontent.ai URLs | + +## Environment models + +> [!TIP] +> Due to their potentially large size, these objects are intended for use in backend/server-side code only. Avoid including them in +> client-side applications to prevent unnecessary bundle size and exposure of sensitive data. + +Basic usage + +```bash +npx @kontent-ai/model-generator@latest environment + --environmentId= + --managementApiKey= +``` + +Usage with options + +```bash +npx @kontent-ai/model-generator@latest environment + --environmentId= + --managementApiKey= + --entities= + --outputDir= + --moduleFileExtension= + --addTimestamp= + --managementBaseUrl= +``` + +Available entities ```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; -}>; +[ + 'languages', + 'taxonomies', + 'contentTypes', + 'snippets', + 'webhooks', + 'collections', + 'workflows', + 'assetFolders', + 'roles', + 'customApps', + 'previewUrls', + 'spaces' +]; ``` -`movietype.ts` +```typescript +import { generateEnvironmentModelsAsync } from '@kontent-ai/model-generator'; + +await generateEnvironmentModelsAsync({ + // required + environmentId: 'x', + managementApiKey: 'y', + entities: [], // all entity types are exported by default + addTimestamp: false, + moduleFileExtension: 'js', + createFiles: true, + outputDir: '/', // only required when createFiles is true + // optional + baseUrl: undefined, + formatOptions: { indentSize: 4, quote: 'single' } +}); +``` + +Configuration + +| Option | Description | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `environmentId` | Id of Kontent.ai environment | +| `managementApiKey` | Management API key | +| `entities` | Array of entity types that will be exported | +| `moduleFileExtension` | Extension used for imports in generated models. | +| `addTimestamp` | Indicates if models contain timestamp | +| `createFiles` | If enabled, files will be created on FileSystem. When disabled you may iterate over the result and process the files yourself. | +| `outputDir` | Output directory path for files. Only available when `createFiles` is set to `true` | +| `formatOptions` | Prettier configuration for formatting generated code | +| `baseUrl` | Can be used to override default Kontent.ai URLs | + +## Item models + +> [!TIP] +> This option is not recommended for environments with a large volume of content items, as it may lead to performance or scalability +> issues during code generation. + +Basic usage + +```bash +# '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= + --managementApiKey= +``` + +Usage with options + +```bash +npx @kontent-ai/model-generator@latest items + --environmentId= + --managementApiKey= + -deliveryApiKey= + --apiMode= + --generateTypes= + --generateObjects= + --outputDir= + --moduleFileExtension= + --addTimestamp= + --filterByTypeCodenames= + --managementBaseUrl= + --deliveryBaseUrl= +``` ```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'; +import { generateItemsAsync } from '@kontent-ai/model-generator'; + +await generateItemsAsync({ + // required + environmentId: 'x', + managementApiKey: 'y', + deliveryApiKey: 'z', // only required when secure / api mode is used + addTimestamp: false, + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true, + createFiles: true, + outputDir: '/', // only required when createFiles is true + // optional + baseUrl: undefined, + formatOptions: { indentSize: 4, quote: 'single' }, + deliveryBaseUrl: undefined +}); ``` -To learn the complete generator output, see the following folder: -https://github.com/kontent-ai/model-generator-js/tree/master/sample +Configuration + +| Option | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `environmentId` | Id of Kontent.ai environment | +| `managementApiKey` | Management API key | +| `deliveryApiKey` | Delivery API key required when the `apiMode` is using preview or secure mode | +| `moduleFileExtension` | Extension used for imports in generated models. | +| `addTimestamp` | Indicates if models contain timestamp | +| `generateObjects` | If enabled, javascript objects with codename / id will be generated | +| `generateTypes` | If enabled, typescript type representing codename will be generated | +| `filterByTypeCodenames` | Array of content type codenames of which content items will be generated. Useful for narrowing down generated items | +| `apiMode` | Delivery API mode for fetching content items. By default delivery (public) mode is used | +| `createFiles` | If enabled, files will be created on FileSystem. When disabled you may iterate over the result and process the files yourself. | +| `outputDir` | Output directory path for files. Only available when `createFiles` is set to `true` | +| `formatOptions` | Prettier configuration for formatting generated code | +| `baseUrl` | Can be used to override default Kontent.ai URLs | + +## Sample models + +To see how models are generated have a look at following sample generated models: + +1. `delivery-sdk` -> +2. `migration-toolkit` -> +3. `environment` -> +4. `items` -> ## Contribution & Feedback diff --git a/clean.ts b/clean.ts deleted file mode 100644 index fa8e185a..00000000 --- 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 00000000..435e149a --- /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 00000000..e3eaf547 --- /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), + managementApiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + managementBaseUrl: 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 00000000..1eec6785 --- /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), + managementApiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + entities: cliFetcher.getOptionalArgumentArrayValue(commandOptions.entities.name).filter(isEnvironmentEntity), + managementBaseUrl: 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 00000000..a6a24d69 --- /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), + managementApiKey: 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), + managementBaseUrl: 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 00000000..0cb0e1bf --- /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), + managementApiKey: cliFetcher.getRequiredArgumentValue(commandOptions.managementApiKey.name), + // optional + managementBaseUrl: 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 00000000..6567f3a7 --- /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 00000000..75d40c51 --- /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 00000000..046adf6f --- /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 00000000..40dd29d2 --- /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 00000000..8fae6add --- /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 bdb330d1..00000000 --- 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 00000000..d1058403 --- /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 00000000..951a3a23 --- /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 560baeeb..00000000 --- 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 00000000..e7603202 --- /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: 'CoreMigrationItemSystem', + item: 'CoreMigrationItem', + 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 00000000..daa5a8c0 --- /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 00000000..799c340f --- /dev/null +++ b/lib/core/core.models.ts @@ -0,0 +1,104 @@ +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 const moduleFileExtensions = ['js', 'ts', 'mjs', 'mts', 'none'] as const; + +export type ModuleFileExtension = (typeof moduleFileExtensions)[number]; + +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[]; + readonly isElementWithProperty: boolean; +} + +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 00000000..5f1b89c4 --- /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 00000000..c42ca3d9 --- /dev/null +++ b/lib/core/element.utils.ts @@ -0,0 +1,154 @@ +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), + isElementWithProperty: match(wrapper.element.type) + .returnType() + .with('guidelines', () => false) + .otherwise(() => true) + }; +} + +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 00000000..49efa7a9 --- /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 00000000..dbb79d01 --- /dev/null +++ b/lib/core/importer.ts @@ -0,0 +1,31 @@ +import { parse } from 'path'; +import type { LibraryType, LiteralUnion, ModuleFileExtension } from './core.models.js'; +import { getFileNameWithoutExtension, sortAlphabetically } from './core.utils.js'; + +export function getImporter(moduleFileExtension: ModuleFileExtension) { + const importExtension = moduleFileExtension === 'none' ? '' : `.${moduleFileExtension}`; + + return { + importType: (data: { readonly filePathOrPackage: LiteralUnion; readonly importValue: string }): string => { + if (!data.importValue.length) { + return ''; + } + + 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 00000000..01e9008f --- /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 00000000..0476238b --- /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 00000000..f4250d45 --- /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 getDeliveryKontentFetcher(config: { + readonly environmentId: string; + readonly deliveryApiKey: 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.deliveryApiKey : undefined, + previewApiKey: config.apiMode === 'preview' ? config.deliveryApiKey : 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 00000000..13f08bd9 --- /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 getManagementKontentFetcher(config: { + readonly environmentId: string; + readonly managementApiKey: string; + readonly baseUrl?: string; +}): ManagementKontentFetcher { + const client: GeneratorManagementClient = createManagementClient({ + environmentId: config.environmentId, + apiKey: config.managementApiKey, + 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 67332df9..00000000 --- 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 00000000..babde6d4 --- /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 { getImporter } from '../core/importer.js'; +import { formatCodeAsync } from '../format/formatter.js'; + +export function getFileManager(config: { + readonly moduleFileExtension: ModuleFileExtension; + readonly outputDir?: string; + readonly formatOptions?: Readonly; + readonly environmentInfo: Readonly; + readonly addTimestamp: boolean; +}) { + const fixedOutputDir = toOutputDirPath(config.outputDir); + const importer = getImporter(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 5617c8e7..00000000 --- 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 00000000..90bb16e0 --- /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 2cf71fc6..00000000 --- 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 02390b89..ae5b19a2 100644 --- a/lib/generators/delivery/delivery-content-type.generator.ts +++ b/lib/generators/delivery/delivery-content-type.generator.ts @@ -1,847 +1,574 @@ -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 { getImporter } 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 = getImporter(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] : []), + // only import elements type if there is at least one element that is represented by property and is not from a snippet + ...(flattenedElements.filter((m) => m.isElementWithProperty && !m.fromSnippet).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.snippet(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 00000000..04ceedaf --- /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 { getManagementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { getFileManager } 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 managementApiKey: string; + readonly moduleFileExtension: ModuleFileExtension; + + readonly managementBaseUrl?: 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 = getFileManager({ + ...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 = getManagementKontentFetcher({ + environmentId: config.environmentId, + managementApiKey: config.managementApiKey, + baseUrl: config.managementBaseUrl + }); + + 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 4b66dc16..00000000 --- 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 017d6a9b..8b8e7852 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 00000000..66a933d4 --- /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 { getManagementKontentFetcher, type ManagementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { getFileManager } from '../../files/file-manager.js'; +import { getEnvironmentGenerator, type EnvironmentEntities } from './environment.generator.js'; + +export type GenerateEnvironmentModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly managementApiKey: string; + + readonly entities?: readonly EnvironmentEntity[]; + readonly moduleFileExtension: ModuleFileExtension; + readonly managementBaseUrl?: 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 = getFileManager({ + ...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 = getManagementKontentFetcher({ + environmentId: config.environmentId, + managementApiKey: config.managementApiKey, + baseUrl: config.managementBaseUrl + }); + + 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: getEnvironmentGenerator({ + 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 00000000..3da3e1fb --- /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 getEnvironmentGenerator(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 21a4a691..00000000 --- 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 00000000..c106b6de --- /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 { getDeliveryKontentFetcher } from '../../fetch/delivery-kontent-fetcher.js'; +import { getManagementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { getFileManager } from '../../files/file-manager.js'; +import { getItemsGenerator } from './items.generator.js'; + +export type GenerateItemsModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly managementApiKey: string; + readonly moduleFileExtension: ModuleFileExtension; + readonly apiMode: DeliveryApiMode; + readonly filterByTypeCodenames: readonly string[]; + readonly generateTypes: boolean; + readonly generateObjects: boolean; + + readonly deliveryApiKey?: string; + readonly managementBaseUrl?: 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 = getFileManager({ + ...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 = getDeliveryKontentFetcher({ + environmentId: config.environmentId, + apiMode: config.apiMode, + deliveryApiKey: config.deliveryApiKey, + baseUrl: config.deliveryBaseUrl + }); + + const managementKontentFetcher = getManagementKontentFetcher({ + environmentId: config.environmentId, + managementApiKey: config.managementApiKey, + baseUrl: config.managementBaseUrl + }); + + const environmentInfo = await managementKontentFetcher.getEnvironmentInfoAsync(); + + const [items, types] = await Promise.all([ + deliveryKontentFetcher.getItemsAsync(config.filterByTypeCodenames), + managementKontentFetcher.getTypesAsync() + ]); + + const itemsGenerator = getItemsGenerator({ + 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 00000000..4af344b3 --- /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 getItemsGenerator(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 00000000..db436e81 --- /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 { getManagementKontentFetcher } from '../../fetch/management-kontent-fetcher.js'; +import { getFileManager } from '../../files/file-manager.js'; +import { getMigrationGenerator } from './migration.generator.js'; + +export type GenerateMigrationModelsConfig = { + readonly environmentId: string; + readonly addTimestamp: boolean; + readonly managementApiKey: string; + readonly moduleFileExtension: ModuleFileExtension; + + readonly managementBaseUrl?: 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 = getFileManager({ + ...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 = getManagementKontentFetcher({ + environmentId: config.environmentId, + managementApiKey: config.managementApiKey, + baseUrl: config.managementBaseUrl + }); + + 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 = getMigrationGenerator({ + 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 00000000..c1e505ac --- /dev/null +++ b/lib/generators/migration/migration.generator.ts @@ -0,0 +1,203 @@ +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 { getImporter } 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 getMigrationGenerator(config: MigrationGeneratorConfig) { + const importer = getImporter(config.moduleFileExtension); + + const getMigrationItemType = (type: Readonly): GeneratedFile => { + const flattenedElements = getFlattenedElements({ + elements: type.elements, + snippets: config.environmentData.snippets, + taxonomies: config.environmentData.taxonomies, + types: config.environmentData.types + }); + + const importElementsType = flattenedElements.filter((m) => m.isElementWithProperty).length ? true : false; + + return { + filename: `${type.codename}.ts`, + text: ` + ${ + importElementsType + ? 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}', + ${getMigrationItemElementsCode(flattenedElements)} + >;` + }; + }; + + const getMigrationItemElementsCode = (flattenedElements: readonly FlattenedElement[]): string => { + if (!flattenedElements.length) { + return 'Record'; + } + + const elementsCode = flattenedElements + .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 `{${elementsCode}}`; + }; + + 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 991b35ee..00000000 --- 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 00000000..201a6ed6 --- /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 1369907e..00000000 --- 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 09e64640..00000000 --- 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 02819768..ae510b55 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: 'Tue, 01 Apr 2025 08:23:12 GMT', + version: '8.0.0' }; diff --git a/lib/models.ts b/lib/models.ts deleted file mode 100644 index e31855fc..00000000 --- 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 7b095a48..00000000 --- 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 00000000..c49ec161 --- /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 b095045c..00000000 --- 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 157645ce..e546c7cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,51 @@ { "name": "@kontent-ai/model-generator", - "version": "7.4.0", + "version": "8.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@kontent-ai/model-generator", - "version": "7.4.0", + "version": "8.0.0", "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", + "@kontent-ai/management-sdk": "7.7.0", + "chalk": "5.4.1", + "prettier": "3.5.3", + "ts-pattern": "5.7.0", "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.23.0", + "@kontent-ai/migration-toolkit": "2.6.1", + "@types/node": "22.13.15", + "@types/yargs": "17.0.33", + "dotenv-cli": "8.0.0", + "eslint": "9.23.0", "standard-version": "9.5.0", - "tsx": "4.16.2", - "typescript": "5.5.3" + "tsx": "4.19.3", + "typescript": "5.8.2", + "typescript-eslint": "8.29.0", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.1.1" }, "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 +53,531 @@ } }, "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", "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.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "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.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "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/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "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.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "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 +585,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.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "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.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.12.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 +668,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,65 +677,149 @@ "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.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "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/@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.8", + "resolved": "https://registry.npmjs.org/@kontent-ai-consulting/tools-analytics/-/tools-analytics-0.0.8.tgz", + "integrity": "sha512-YVGLfNbT/lw8H+Gqx+ykDAF6HAgSPmvE0h6A7W+neT2r+R4EaU+IIln6A/zBr5CHjwAPTJT4h5EZjQsZLWpvFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kontent-ai/core-sdk": "10.10.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "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==", + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.10.0.tgz", + "integrity": "sha512-XuTx05ctBwit1OkAeyb/xLV3zh3KWh0sW6wMAo+wjoNT2o1VPYKj1NREp2oE9U4ierXwSdMQn1OLILQQ4oaV5g==", + "license": "MIT", "dependencies": { - "axios": "1.7.4" + "axios": "1.8.2" }, "engines": { "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==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/delivery-sdk/-/delivery-sdk-16.0.0.tgz", + "integrity": "sha512-GdIQI5t7ydf9w2pMSDYG4gXdpC6W4+5Gdav89WObGkBVd0IPsKCNRla84KzmAEXkLVrHSekJJs2VmyXA+kG3Pw==", + "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "10.7.0", - "url-parse": "1.5.10", - "uuid": "10.0.0" + "@kontent-ai/core-sdk": "10.10.0" }, "engines": { - "node": ">= 18" + "node": ">= 20" } }, "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==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/management-sdk/-/management-sdk-7.7.0.tgz", + "integrity": "sha512-WHXgKCNjsmzSdYQvIi1+BTEaMeP2BbQ7ehT88ulv/JSA/VHX1iBNUXVevBT1MKEWgOMgNJ39Nwdmr0u8Y0AZjw==", + "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "10.7.0", + "@kontent-ai/core-sdk": "10.10.0", "mime": "3.0.0" }, "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==", + "node_modules/@kontent-ai/migration-toolkit": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@kontent-ai/migration-toolkit/-/migration-toolkit-2.6.1.tgz", + "integrity": "sha512-zDupSXfDpDcBKsCxZ55Kmvie4F3qMf1VYOsgx8nGdkCd8CIBdOXgYxYnmxnDMGUnfpoIG1nMgMNYIPWVPXi8QQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", + "@kontent-ai-consulting/tools-analytics": "0.0.8", + "@kontent-ai/management-sdk": "7.7.0", + "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.2.0", + "p-limit": "6.2.0", + "prompts": "2.4.2", + "ts-pattern": "5.6.2", + "yargs": "17.7.2", + "zod": "3.24.2" + }, + "bin": { + "kontent-ai-migration-toolkit": "dist/node/cli/app.js" + }, + "engines": { + "node": ">=20" + } + }, + "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, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@kontent-ai/migration-toolkit/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==", + "dev": true, + "license": "MIT" + }, + "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": { + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -708,6 +831,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -717,6 +841,7 @@ "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": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -725,42 +850,330 @@ "node": ">= 8" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "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 + "dev": true, + "license": "MIT" }, "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==", + "version": "22.13.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.15.tgz", + "integrity": "sha512-imAbQEEbVni6i6h6Bd5xkCRwLqFc8hihCsi2GbtDoAtUcAFQ6Zs4pFXTZUUbroTkXdImczWM9AI8eZUuybXE3w==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "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 - }, - "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.", "dev": true, - "dependencies": { - "prettier": "*" - } + "license": "MIT" }, "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==", + "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": "*" } @@ -769,80 +1182,76 @@ "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 + "dev": true, + "license": "MIT" }, "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==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", + "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", "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", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/type-utils": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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 - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", + "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", "dev": true, + "license": "MIT", "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", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.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==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", + "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -850,123 +1259,257 @@ } }, "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==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", + "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "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.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", + "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/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.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", + "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", + "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/expect": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "@vitest/spy": "3.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "eslint": "^8.56.0" + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { - "typescript": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "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/@vitest/pretty-format": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/runner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", "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" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "@vitest/utils": "3.1.1", + "pathe": "^2.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/snapshot": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", "dev": true, + "license": "MIT", "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" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "@vitest/pretty-format": "3.1.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/spy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" + "tinyspy": "^3.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" } }, - "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/@vitest/utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.1", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, "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==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -979,6 +1522,7 @@ "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" } @@ -987,13 +1531,15 @@ "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 + "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", @@ -1006,17 +1552,23 @@ } }, "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==", + "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": ">=8" + "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" }, @@ -1031,41 +1583,80 @@ "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 + "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 - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "engines": { - "node": ">=8" - } + "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==" + "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.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1076,15 +1667,39 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "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": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "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" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -1092,6 +1707,7 @@ "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" }, @@ -1099,67 +1715,225 @@ "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 + "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.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "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": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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": ">=6" + "node": ">= 16" } }, - "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==", + "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": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "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", @@ -1169,10 +1943,52 @@ "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" }, @@ -1183,20 +1999,14 @@ "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/colors": { - "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" - } + "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" }, @@ -1209,6 +2019,7 @@ "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" @@ -1218,7 +2029,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -1228,6 +2040,7 @@ "engines": [ "node >= 6.0" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -1235,11 +2048,27 @@ "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", @@ -1262,6 +2091,7 @@ "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" @@ -1275,6 +2105,7 @@ "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" }, @@ -1287,6 +2118,7 @@ "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" }, @@ -1298,13 +2130,15 @@ "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 + "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", @@ -1319,6 +2153,7 @@ "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", @@ -1344,6 +2179,7 @@ "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" }, @@ -1356,6 +2192,7 @@ "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" }, @@ -1368,6 +2205,7 @@ "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" }, @@ -1380,6 +2218,7 @@ "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" }, @@ -1392,6 +2231,7 @@ "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" @@ -1405,6 +2245,7 @@ "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" } @@ -1414,6 +2255,7 @@ "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", @@ -1437,6 +2279,7 @@ "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" } @@ -1446,6 +2289,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" @@ -1459,6 +2303,7 @@ "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", @@ -1479,6 +2324,7 @@ "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", @@ -1500,13 +2346,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "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", @@ -1521,6 +2369,7 @@ "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" } @@ -1530,17 +2379,19 @@ "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.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "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.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1556,6 +2407,7 @@ "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" } @@ -1565,6 +2417,7 @@ "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" @@ -1581,20 +2434,102 @@ "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 + "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" } @@ -1604,6 +2539,7 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1613,39 +2549,17 @@ "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/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/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" }, @@ -1654,10 +2568,11 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "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" }, @@ -1666,12 +2581,13 @@ } }, "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==", + "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.3", + "cross-spawn": "^7.0.6", "dotenv": "^16.3.0", "dotenv-expand": "^10.0.0", "minimist": "^1.2.6" @@ -1685,6 +2601,7 @@ "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" } @@ -1694,6 +2611,7 @@ "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" @@ -1702,21 +2620,12 @@ "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_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" }, @@ -1729,6 +2638,7 @@ "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" @@ -1737,23 +2647,12 @@ "node": ">=6" } }, - "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==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "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" }, @@ -1769,6 +2668,7 @@ "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" }, @@ -1781,66 +2681,161 @@ "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": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "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.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "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" + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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" } @@ -1850,6 +2845,7 @@ "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" }, @@ -1858,132 +2854,137 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "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", + "eslint-scope": "^8.3.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": "^6.0.1", + "file-entry-cache": "^8.0.0", "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" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "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" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "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==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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": "^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/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/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/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": { - "brace-expansion": "^1.1.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "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==", + "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.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "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/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "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" }, @@ -1996,6 +2997,7 @@ "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" }, @@ -2008,36 +3010,60 @@ "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.2.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", + "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", + "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 + "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==", + "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.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -2048,6 +3074,7 @@ "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" }, @@ -2059,19 +3086,22 @@ "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 + "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 + "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==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2081,6 +3111,7 @@ "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" }, @@ -2096,20 +3127,22 @@ "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": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "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": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -2117,6 +3150,7 @@ "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" }, @@ -2129,6 +3163,7 @@ "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" @@ -2141,35 +3176,37 @@ } }, "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==", + "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.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "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 + "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.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "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" }, @@ -2179,31 +3216,44 @@ } } }, + "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.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "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/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, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2216,7 +3266,17 @@ "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" } @@ -2225,15 +3285,54 @@ "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.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-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", @@ -2247,45 +3346,61 @@ "node": ">=6.9.0" } }, + "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": ">=8" + } + }, "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": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "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/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/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": { - "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" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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/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": { - "safe-buffer": "~5.1.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/get-pkg-repo/node_modules/through2": { @@ -2293,6 +3408,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -2303,6 +3419,7 @@ "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", @@ -2316,11 +3433,25 @@ "node": ">=10" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/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==", + "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" }, @@ -2333,6 +3464,7 @@ "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": { "dargs": "^7.0.0", "lodash": "^4.17.15", @@ -2352,6 +3484,7 @@ "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" @@ -2365,6 +3498,7 @@ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, + "license": "MIT", "dependencies": { "meow": "^8.0.0", "semver": "^6.0.0" @@ -2381,6 +3515,7 @@ "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" } @@ -2390,36 +3525,17 @@ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, + "license": "BSD", "dependencies": { "ini": "^1.3.2" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2427,80 +3543,58 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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, - "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" - }, + "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": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "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==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -2522,24 +3616,79 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { - "node": ">=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==", - "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": { + "has-symbols": "^1.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2552,6 +3701,7 @@ "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": { "lru-cache": "^6.0.0" }, @@ -2559,20 +3709,50 @@ "node": ">=10" } }, + "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/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, + "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.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2589,6 +3769,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2598,44 +3779,134 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "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 + "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": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "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": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "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==", + "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": { "hasown": "^2.0.2" }, @@ -2646,11 +3917,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2659,6 +3948,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -2668,6 +3958,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2675,77 +3966,245 @@ "node": ">=0.10.0" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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.12.0" } }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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/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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "text-extensions": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "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, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "text-extensions": "^1.0.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "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 + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "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 + "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==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2757,37 +4216,43 @@ "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 + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "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 + "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 + "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 + "dev": true, + "license": "ISC" }, "node_modules/jsonparse": { "version": "1.3.1", @@ -2796,13 +4261,15 @@ "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" @@ -2814,11 +4281,25 @@ "node": "*" } }, + "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": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "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, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -2828,15 +4309,27 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2845,17 +4338,29 @@ "node": ">= 0.8.0" } }, + "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": { + "immediate": "~3.0.5" + } + }, "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 + "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": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -2871,6 +4376,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2880,6 +4386,7 @@ "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" }, @@ -2894,25 +4401,66 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "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 + "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": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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": { "yallist": "^4.0.0" }, @@ -2920,11 +4468,22 @@ "node": ">=10" } }, + "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": { + "@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" }, @@ -2932,11 +4491,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/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", @@ -2962,6 +4531,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2974,13 +4544,15 @@ "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==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2993,6 +4565,7 @@ "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" }, @@ -3008,6 +4581,7 @@ "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": { "p-limit": "^2.2.0" }, @@ -3020,6 +4594,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3038,6 +4613,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -3053,6 +4629,7 @@ "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": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -3070,6 +4647,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -3079,6 +4657,7 @@ "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": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -3091,6 +4670,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -3100,36 +4680,27 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "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": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3142,6 +4713,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -3153,6 +4725,7 @@ "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" } @@ -3161,6 +4734,7 @@ "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": { "mime-db": "1.52.0" }, @@ -3168,28 +4742,40 @@ "node": ">= 0.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -3197,6 +4783,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3206,6 +4793,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -3220,33 +4808,57 @@ "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/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 + "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.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "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": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -3257,13 +4869,81 @@ "node": ">=10" } }, - "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/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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.4" + } + }, + "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": { + "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/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": { - "wrappy": "1" + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { @@ -3271,6 +4951,7 @@ "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", @@ -3280,14 +4961,71 @@ "word-wrap": "^1.2.5" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-limit": { + "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": { "yocto-queue": "^0.1.0" }, @@ -3298,14 +5036,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "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, - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3318,15 +5054,24 @@ "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": ">=6" } }, + "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": { "callsites": "^3.0.0" }, @@ -3339,6 +5084,7 @@ "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" @@ -3352,24 +5098,17 @@ "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/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3378,28 +5117,62 @@ "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 + "dev": true, + "license": "MIT" }, "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==", + "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": { + "pify": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "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/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/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" } }, "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 + "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/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3412,23 +5185,65 @@ "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/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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.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.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -3443,18 +5258,35 @@ "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 + "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": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } }, "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==" + "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": ">=6" } @@ -3465,16 +5297,12 @@ "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, + "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, - "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", @@ -3493,13 +5321,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "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" } @@ -3509,6 +5339,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, + "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -3523,6 +5354,7 @@ "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" @@ -3536,6 +5368,7 @@ "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": { "locate-path": "^2.0.0" }, @@ -3548,6 +5381,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -3561,6 +5395,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^1.0.0" }, @@ -3573,6 +5408,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -3585,6 +5421,7 @@ "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" } @@ -3594,6 +5431,7 @@ "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" } @@ -3602,13 +5440,15 @@ "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/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": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -3616,55 +5456,45 @@ "validate-npm-package-license": "^3.0.1" } }, - "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==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "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, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "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==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "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/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, + "license": "MIT" + }, "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": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -3673,32 +5503,53 @@ "node": ">=8" } }, + "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": { + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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": { - "is-core-module": "^2.13.0", + "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" } @@ -3708,6 +5559,7 @@ "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": ">=4" } @@ -3717,35 +5569,85 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/rollup": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.6" }, "bin": { - "rimraf": "bin.js" + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/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/run-parallel": { "version": "1.2.0", @@ -3766,35 +5668,42 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "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" }, @@ -3802,11 +5711,53 @@ "node": ">=10" } }, + "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": ">= 0.4" + } + }, + "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": { + "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": ">= 0.4" + } + }, + "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, + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3819,24 +5770,130 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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": { + "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": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "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": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "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": ">=0.10.0" + } + }, + "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, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3846,6 +5903,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3855,29 +5913,33 @@ "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 + "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.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true + "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" }, @@ -3890,15 +5952,39 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, + "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": ">= 6" + } + }, + "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", @@ -3922,11 +6008,22 @@ "node": ">=10" } }, + "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/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, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -3939,6 +6036,7 @@ "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", @@ -3953,6 +6051,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -3964,6 +6063,7 @@ "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" } @@ -3972,13 +6072,22 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "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/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": ">=0.8.0" } @@ -3988,15 +6097,45 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, + "node_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/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": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "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": { "has-flag": "^3.0.0" }, @@ -4009,6 +6148,7 @@ "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", @@ -4022,26 +6162,66 @@ "node": ">=10" } }, + "node_modules/std-env": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "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": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "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==", + "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": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stringify-package": { @@ -4049,17 +6229,23 @@ "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 + "dev": true, + "license": "ISC" }, "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==", + "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": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom": { @@ -4067,6 +6253,7 @@ "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" } @@ -4076,6 +6263,7 @@ "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" }, @@ -4088,6 +6276,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4100,6 +6289,7 @@ "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": { "has-flag": "^4.0.0" }, @@ -4112,6 +6302,7 @@ "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": ">= 0.4" }, @@ -4124,36 +6315,93 @@ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, - "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 + "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", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "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": "^18.0.0 || >=20.0.0" + } + }, + "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": ">=14.0.0" + } + }, + "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/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-number": "^7.0.0" }, @@ -4166,29 +6414,59 @@ "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": ">=8" } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-pattern": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.7.0.tgz", + "integrity": "sha512-0/FvIG4g3kNkYgbNwBBW5pZBkfpeYQnH+2AA3xmjkCAit/DSDPKmgwC3fKof4oYUq6gupClVOJlFl+939VRBMg==", + "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": { - "node": ">=16" + "node": "^18 || >=20" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "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": { - "esbuild": "~0.21.5", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -4206,6 +6484,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4214,10 +6493,11 @@ } }, "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==", + "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" }, @@ -4229,13 +6509,15 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4244,11 +6526,35 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.0.tgz", + "integrity": "sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.29.0", + "@typescript-eslint/parser": "8.29.0", + "@typescript-eslint/utils": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "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==", + "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" @@ -4258,62 +6564,231 @@ } }, "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 + "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, + "license": "MIT" }, "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": { "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" - } + "dev": true, + "license": "MIT" }, "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-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vite": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/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": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.1", + "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.1.1", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "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.1.1", + "@vitest/ui": "3.1.1", + "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/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" }, @@ -4324,11 +6799,90 @@ "node": ">= 8" } }, + "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, + "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.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "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/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4337,12 +6891,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 +6911,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 +6966,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 +6975,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 +7001,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.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 5a1b2af1..00dfafc9 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", + "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,54 @@ "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": "tsx scripts/clean-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", + "@kontent-ai/management-sdk": "7.7.0", + "chalk": "5.4.1", + "prettier": "3.5.3", + "ts-pattern": "5.7.0", + "yargs": "17.7.2" }, "devDependencies": { - "@types/yargs": "17.0.32", + "@eslint/js": "9.23.0", + "@kontent-ai/migration-toolkit": "2.6.1", + "@types/node": "22.13.15", + "@types/yargs": "17.0.33", + "dotenv-cli": "8.0.0", + "eslint": "9.23.0", "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.8.2", + "typescript-eslint": "8.29.0", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.1.1" } } diff --git a/sample/content-type-snippets/index.ts b/sample/content-type-snippets/index.ts deleted file mode 100644 index cb0ff5c3..00000000 --- a/sample/content-type-snippets/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/sample/content-types/actor.ts b/sample/content-types/actor.ts deleted file mode 100644 index cc9a3b7c..00000000 --- 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/index.ts b/sample/content-types/index.ts deleted file mode 100644 index 79e80086..00000000 --- a/sample/content-types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './actor.js'; -export * from './movie.js'; diff --git a/sample/content-types/movie.ts b/sample/content-types/movie.ts deleted file mode 100644 index 965996e8..00000000 --- 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 00000000..00866e71 --- /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-21'. +* +* (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 00000000..7a82a69f --- /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-21'. +* +* (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 00000000..1d3d6d66 --- /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-21'. +* +* (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 00000000..143a0962 --- /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-21'. +* +* (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 00000000..cab29be5 --- /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-21'. +* +* (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 00000000..2a5a671c --- /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-21'. +* +* (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 00000000..69626b40 --- /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-21'. +* +* (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 00000000..6eabfe76 --- /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-21'. +* +* (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 00000000..25cadae4 --- /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-21'. +* +* (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 00000000..1267850f --- /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-21'. +* +* (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 00000000..4505fc2f --- /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-21'. +* +* (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/index.ts b/sample/environment/index.ts new file mode 100644 index 00000000..00866e71 --- /dev/null +++ b/sample/environment/index.ts @@ -0,0 +1,16 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-21'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +export {}; diff --git a/sample/items/codenames/actor.codenames.ts b/sample/items/codenames/actor.codenames.ts new file mode 100644 index 00000000..3fc0f698 --- /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-21'. +* +* (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 00000000..47f734d6 --- /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-21'. +* +* (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 00000000..454fb2e1 --- /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-21'. +* +* (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 00000000..d760f3ef --- /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-21'. +* +* (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 00000000..e3965e80 --- /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-21'. +* +* (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 00000000..03b30764 --- /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-21'. +* +* (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 00000000..a1d712ee --- /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-21'. +* +* (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 00000000..f6788554 --- /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-21'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Actor + * + * Codename: actor + * Id: 58099989-319f-495f-aa36-cb3710854e36 + */ +export type ActorItem = CoreMigrationItem< + '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 00000000..1d3d6d66 --- /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-21'. +* +* (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 00000000..aae70526 --- /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-21'. +* +* (c) Kontent.ai +* +* ------------------------------------------------------------------------------- +* +* Project: Movie Database +* Environment: Production +* Id: da5abe9f-fdad-4168-97cd-b3464be2ccb9 +* +* ------------------------------------------------------------------------------- +**/ + +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Movie + * + * Codename: movie + * Id: b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c + */ +export type MovieItem = CoreMigrationItem< + '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 00000000..6fadf7a1 --- /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-21'. +* +* (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 00000000..e523db62 --- /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-21'. +* +* (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 00000000..891fe0c5 --- /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-21'. +* +* (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 00000000..031085bf --- /dev/null +++ b/sample/migration/migration.ts @@ -0,0 +1,41 @@ + +/** +* This file has been auto-generated by '@kontent-ai/model-generator@8.0.0-21'. +* +* (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 CoreMigrationItemSystem = MigrationItemSystem< + TCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames +>; + +/** + * Item object shared by all individual content type models + */ +export type CoreMigrationItem< + TCodename extends ContentTypeCodenames, + TElements extends MigrationElements = MigrationElements +> = MigrationItem, WorkflowStepCodenames>; diff --git a/sample/project/assetFolders.ts b/sample/project/assetFolders.ts deleted file mode 100644 index 39e128f6..00000000 --- a/sample/project/assetFolders.ts +++ /dev/null @@ -1,58 +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 assetFolders = { - /** - * my folder A - */ - myFolderA: { - id: '6bb4814a-6a5c-4b8c-836e-7f83b008d5d1', - name: 'my folder A', - externalId: undefined, - folders: { - /** - * my folder nested A - */ - myFolderNestedA: { - id: '555784e5-e92e-4a86-b40b-d642afbf7b4e', - name: 'my folder nested A', - externalId: undefined, - folders: { - /** - * even more nested A - */ - evenMoreNestedA: { - id: 'd26940cc-6c8d-41e6-93a0-0748c854b100', - name: 'even more nested A', - externalId: undefined, - folders: {} - }, - - /** - * even more nested B - */ - evenMoreNestedB: { - id: '97fc4b03-98d2-44b4-8e03-b223a013b0b6', - name: 'even more nested B', - externalId: undefined, - folders: {} - } - } - } - } - }, - - /** - * my folder B - */ - myFolderB: { - id: '58d1c135-42cb-43c2-a2cd-c615e0a36e83', - name: 'my folder B', - externalId: undefined, - folders: {} - } -} as const; diff --git a/sample/project/collections.ts b/sample/project/collections.ts deleted file mode 100644 index f65ac106..00000000 --- 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 ecac6d14..00000000 --- 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/contentTypes.ts b/sample/project/contentTypes.ts deleted file mode 100644 index f0a96f6f..00000000 --- a/sample/project/contentTypes.ts +++ /dev/null @@ -1,238 +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 contentTypes = { - /** - * Actor - */ - actor: { - codename: 'actor', - id: '58099989-319f-495f-aa36-cb3710854e36', - externalId: undefined, - name: 'Actor', - elements: { - /** - * First name (text) - * - * This is the first name of the actor - */ - first_name: { - codename: 'first_name', - id: '14dd70e5-c42d-f111-9640-c82b443edf1d', - externalId: undefined, - name: 'First name', - required: true, - type: 'text' - }, - - /** - * Last name (text) - */ - last_name: { - codename: 'last_name', - id: '9f7a0dd4-af3a-95ca-0358-400c14ce7075', - externalId: undefined, - name: 'Last name', - required: true, - type: 'text' - }, - - /** - * Photo (asset) - */ - 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' - } - } - }, - - /** - * Movie - */ - movie: { - codename: 'movie', - id: 'b0c0f9c2-ffb6-4e62-bac9-34e14172dd8c', - externalId: undefined, - name: 'Movie', - elements: { - /** - * Category (multiple_choice) - */ - category: { - codename: 'category', - id: '9821c252-6414-f549-c17f-cc171dd87713', - externalId: undefined, - name: 'Category', - required: false, - type: 'multiple_choice', - options: { - sci_fi: { - name: 'Sci fi', - id: 'b087f774-1f57-9aa8-dab5-2ca88a646824', - codename: 'sci_fi', - externalId: undefined - }, - documentary: { - name: 'Documentary', - id: '19c5e959-c24a-4863-0b4d-453cdef8fe9d', - codename: 'documentary', - externalId: undefined - }, - action: { - name: 'Action', - id: '7d453309-8d74-9607-80c4-36dcc1bd005f', - codename: 'action', - externalId: undefined - }, - romance: { - name: 'Romance', - id: '60550cc7-c986-a59f-b069-7565862fe1c1', - codename: 'romance', - externalId: undefined - }, - animation: { - name: 'Animation', - id: '54c0590d-6a94-a69a-902d-fceea4fa62f8', - codename: 'animation', - externalId: undefined - }, - comedy: { - name: 'Comedy', - id: 'd2fe357f-894e-9bc3-550c-c2c400d99c6b', - codename: 'comedy', - externalId: undefined - }, - adventure: { - name: 'Adventure', - id: 'cd8389b0-7628-7739-7b14-3225a50212c1', - codename: 'adventure', - externalId: undefined - }, - drama: { - name: 'Drama', - id: '051e74de-f2e0-f405-9ad5-5263221e46f2', - codename: 'drama', - externalId: undefined - } - } - }, - - /** - * 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) - */ - released: { - codename: 'released', - id: '5ccf4644-0d65-5d96-9a32-f4ea21974d51', - externalId: undefined, - name: 'Released', - required: false, - type: 'date_time' - }, - - /** - * SeoName (url_slug) - */ - seoname: { - codename: 'seoname', - id: '756cc91a-a090-60f9-a7f0-f505bfbe046c', - externalId: undefined, - name: 'SeoName', - required: false, - type: 'url_slug' - }, - - /** - * Stars (modular_content) - */ - stars: { - codename: 'stars', - id: 'aa26a55d-19f8-7501-fea3-b0d9b1eeac71', - 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' - } - } - } -} as const; diff --git a/sample/project/languages.ts b/sample/project/languages.ts deleted file mode 100644 index dc2bfb56..00000000 --- a/sample/project/languages.ts +++ /dev/null @@ -1,47 +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 languages = { - /** - * cz - */ - cz: { - codename: 'cz', - id: '41ccb26f-ceab-04d0-6ffa-9c7c5358aa8f', - isActive: true, - isDefault: false, - fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'cz' - }, - - /** - * English - */ - en: { - codename: 'en', - id: '00000000-0000-0000-0000-000000000000', - isActive: true, - isDefault: true, - fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'English' - }, - - /** - * German - */ - german: { - codename: 'German', - id: '14f7bcc0-4fd6-4b77-8c22-70e5ccfdae1d', - isActive: false, - isDefault: false, - fallbackLanguageId: '00000000-0000-0000-0000-000000000000', - externalId: undefined, - name: 'German' - } -} as const; diff --git a/sample/project/roles.ts b/sample/project/roles.ts deleted file mode 100644 index 2c99a6ef..00000000 --- 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/taxonomies.ts b/sample/project/taxonomies.ts deleted file mode 100644 index 2e99e3d4..00000000 --- a/sample/project/taxonomies.ts +++ /dev/null @@ -1,89 +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 taxonomies = { - /** - * MovieType - */ - movietype: { - codename: 'movietype', - id: '365a17e6-1929-27ab-9f67-a9273c846717', - externalId: undefined, - name: 'MovieType', - terms: { - film: { - codename: 'film', - id: '5a2a1927-41a4-294f-5d89-cf0cc045e943', - externalId: undefined, - name: 'Film', - terms: { - blockbuster: { - codename: 'blockbuster', - id: '875a4657-1dcd-0415-cb3a-892078f5991a', - externalId: undefined, - name: 'Blockbuster', - terms: {} - }, - 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: { - codename: 'releasecategory', - id: '09b6a348-0f86-7a68-4af3-7cab9a5c60b7', - externalId: undefined, - name: 'ReleaseCategory', - terms: { - 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: { - codename: 'us_only', - id: 'b03d990a-55a9-601e-dd5c-aa2edc8698ca', - externalId: undefined, - name: 'US only', - terms: {} - } - } - } -} as const; diff --git a/sample/project/webhooks.ts b/sample/project/webhooks.ts deleted file mode 100644 index 01b54893..00000000 --- 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/project/workflows.ts b/sample/project/workflows.ts deleted file mode 100644 index 86f04839..00000000 --- a/sample/project/workflows.ts +++ /dev/null @@ -1,51 +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 workflows = { - /** - * Default - * Archived step Id: 7a535a69-ad34-47f8-806a-def1fdf4d391 - * Published step Id: f05b8a85-c6cc-429a-ac6d-21d5edd268fe - */ - 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', - 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' - } - } - } -} as const; diff --git a/sample/taxonomies/index.ts b/sample/taxonomies/index.ts deleted file mode 100644 index 40c15f12..00000000 --- a/sample/taxonomies/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './movietype.js'; -export * from './releasecategory.js'; diff --git a/sample/taxonomies/movietype.ts b/sample/taxonomies/movietype.ts deleted file mode 100644 index 0ca5bebb..00000000 --- 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 bf1e256f..00000000 --- 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-snapshots.ts b/scripts/clean-snapshots.ts new file mode 100644 index 00000000..aca9ad6c --- /dev/null +++ b/scripts/clean-snapshots.ts @@ -0,0 +1,5 @@ +import { deleteFolderRecursive } from './utils/script.utils.js'; + +for (const path of ['tests/integration/snapshots']) { + deleteFolderRecursive(path); +} diff --git a/scripts/clean.ts b/scripts/clean.ts new file mode 100644 index 00000000..fbfde8c7 --- /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 6fa9253f..00000000 --- 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 824781f2..00000000 --- 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 00000000..9fe4b79f --- /dev/null +++ b/scripts/samples/delivery-sample.ts @@ -0,0 +1,24 @@ +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({ + // required + environmentId: config.sampleEnv.environmentId, + managementApiKey: config.sampleEnv.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + createFiles: true, + addTimestamp: false, + outputDir: outputDir, // only required when createFiles is true + + // optional + fileResolvers: { contentType: 'camelCase', snippet: 'camelCase', taxonomy: 'camelCase' }, + nameResolvers: { contentType: 'pascalCase', snippet: 'pascalCase', taxonomy: 'pascalCase' }, + formatOptions: undefined, + managementBaseUrl: undefined + }); +}); diff --git a/scripts/samples/environment-sample.ts b/scripts/samples/environment-sample.ts new file mode 100644 index 00000000..c079e1ed --- /dev/null +++ b/scripts/samples/environment-sample.ts @@ -0,0 +1,22 @@ +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({ + // required + environmentId: config.sampleEnv.environmentId, + managementApiKey: config.sampleEnv.managementApiKey, + entities: [], // all entity types are exported by default + addTimestamp: false, + moduleFileExtension: config.moduleFileExtension, + createFiles: true, + outputDir: outputDir, // only required when createFiles is true + // optional + managementBaseUrl: undefined, + formatOptions: undefined + }); +}); diff --git a/scripts/samples/item-sample.ts b/scripts/samples/item-sample.ts new file mode 100644 index 00000000..f3d7f6f6 --- /dev/null +++ b/scripts/samples/item-sample.ts @@ -0,0 +1,27 @@ +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({ + // required + environmentId: config.sampleEnv.environmentId, + addTimestamp: false, + managementApiKey: config.sampleEnv.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + apiMode: 'default', + deliveryApiKey: config.sampleEnv.deliveryApiKey, + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true, + createFiles: true, + outputDir: outputDir, + // optional + managementBaseUrl: undefined, + formatOptions: undefined, + deliveryBaseUrl: undefined + }); +}); diff --git a/scripts/samples/migration-sample.ts b/scripts/samples/migration-sample.ts new file mode 100644 index 00000000..1aaeef15 --- /dev/null +++ b/scripts/samples/migration-sample.ts @@ -0,0 +1,22 @@ +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({ + // required + createFiles: true, + addTimestamp: false, + environmentId: config.sampleEnv.environmentId, + managementApiKey: config.sampleEnv.managementApiKey, + moduleFileExtension: config.moduleFileExtension, + outputDir: outputDir, // only required when createFiles is true + + // optional + managementBaseUrl: undefined, + formatOptions: undefined + }); +}); diff --git a/scripts/update-version.ts b/scripts/update-version.ts index e1ecbffc..88dc0782 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 00000000..595f8401 --- /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 00000000..755399ba --- /dev/null +++ b/scripts/utils/script.utils.ts @@ -0,0 +1,78 @@ +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 sampleEnv: { + readonly managementApiKey: string; + readonly deliveryApiKey: string; + readonly environmentId: string; + }; + readonly integrationEnv: { + readonly managementApiKey: string; + readonly environmentId: string; + }; + + readonly moduleFileExtension: ModuleFileExtension; + }) => Promise +): Promise { + try { + await func({ + sampleEnv: { + deliveryApiKey: getEnvironmentRequiredValue('SAMPLE_DELIVERY_API_KEY'), + environmentId: getEnvironmentRequiredValue('SAMPLE_ENVIRONMENT_ID'), + managementApiKey: getEnvironmentRequiredValue('SAMPLE_MANAGEMENT_API_KEY') + }, + integrationEnv: { + environmentId: getEnvironmentRequiredValue('INTEGRATION_ENVIRONMENT_ID'), + managementApiKey: getEnvironmentRequiredValue('INTEGRATION_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 00000000..d90ed8ed --- /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 00000000..2f38ceb7 --- /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 00000000..9139fe1c --- /dev/null +++ b/tests/core/importer.spec.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from 'vitest'; +import { getImporter } 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 = getImporter(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 00000000..e7c71cbb --- /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 00000000..81d70d8d --- /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 00000000..c38c9aaf --- /dev/null +++ b/tests/integration/generated-models.spec.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from 'vitest'; +import type { GeneratedFile } from '../../lib/core/core.models.js'; +import { formatCodeAsync } from '../../lib/format/formatter.js'; +import { deliverySdkSnapshots } from './test-cases/delivery-sdk-snapshots.js'; +import { environmentSnapshots } from './test-cases/environment-snapshots.js'; +import { itemsSnapshots } from './test-cases/items-snapshots.js'; +import { migrationToolkitSnapshots } from './test-cases/migration-toolkit-snapshots.js'; + +for (const snapshot of [...deliverySdkSnapshots, ...environmentSnapshots, ...migrationToolkitSnapshots, ...itemsSnapshots]) { + describe(`Integration - ${snapshot.cliAction}`, async () => { + const files = await snapshot.getFilesAsync(); + const getSnapshotRelativePath = (file: GeneratedFile) => `./snapshots/${snapshot.cliAction}/${snapshot.folder}/${file.filename}`; + + it(`Number of generated files & names should match`, async () => { + const filename = `./snapshots/${snapshot.cliAction}/${snapshot.folder}/_filesList.json`; + + await expect( + await formatCodeAsync(JSON.stringify(files.map<{ filename: string }>((file) => ({ filename: file.filename }))), { + parser: 'json' + }) + ).toMatchFileSnapshot(filename, `Invalid file '${filename}'`); + }); + + for (const file of files) { + it(`File '${file.filename}' should match snapshot`, async () => { + const filename = getSnapshotRelativePath(file); + await expect(file.text).toMatchFileSnapshot(filename); + }); + + it(`File '${file.filename}' code should format TS code without throwing exception`, async () => { + await expect(formatCodeAsync(file.text, { parser: 'typescript' })).resolves.toBeTruthy(); + }); + } + }); +} diff --git a/tests/integration/integration-tests.config.ts b/tests/integration/integration-tests.config.ts new file mode 100644 index 00000000..bd2f92e9 --- /dev/null +++ b/tests/integration/integration-tests.config.ts @@ -0,0 +1,13 @@ +import type { CliAction, GeneratedFile } from '../../lib/core/core.models.js'; +import { getEnvironmentRequiredValue } from '../../scripts/utils/environment.utils.js'; + +export type SnapshotModelsTest = { + readonly cliAction: CliAction; + readonly folder: string; + readonly getFilesAsync: () => Promise; +}; + +export const integrationEnv = { + id: getEnvironmentRequiredValue('INTEGRATION_ENVIRONMENT_ID'), + apiKey: getEnvironmentRequiredValue('INTEGRATION_MANAGEMENT_API_KEY') +} as const; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/_filesList.json b/tests/integration/snapshots/delivery-sdk/basic-js/_filesList.json new file mode 100644 index 00000000..7d7ce517 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/_filesList.json @@ -0,0 +1,23 @@ +[ + { "filename": "content-types/content_type_with_snippet_only.ts" }, + { "filename": "content-types/_content_type_with_special_chars____.ts" }, + { "filename": "content-types/circular_reference_type_a_b.ts" }, + { "filename": "content-types/page.ts" }, + { "filename": "content-types/content_type_with_all_elements.ts" }, + { "filename": "content-types/content_type_with_guidelines_only.ts" }, + { "filename": "content-types/circular_reference_type_b____a.ts" }, + { "filename": "content-types/empty_content_type.ts" }, + { "filename": "content-types/type_with_empty_snippet.ts" }, + { "filename": "content-types/web_spotlight_root.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "content-type-snippets/snippet_a.ts" }, + { "filename": "content-type-snippets/empty_snippet.ts" }, + { "filename": "content-type-snippets/index.ts" }, + { "filename": "taxonomies/taxonomy_a.ts" }, + { "filename": "taxonomies/taxonomy_without_terms.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/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/empty_snippet.ts new file mode 100644 index 00000000..9356162f --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/empty_snippet.ts @@ -0,0 +1,14 @@ +import type { Snippet } from '@kontent-ai/delivery-sdk'; + +/** + * Empty snippet + * + * Id: 1d7e3745-3320-4107-996b-2c6b240df7ae + * Codename: empty_snippet + */ +export type EmptySnippet = Snippet>; + +/** + * Type representing all available element codenames for Empty snippet + */ +export type EmptySnippetElementCodenames = never; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/index.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/index.ts new file mode 100644 index 00000000..c899ce25 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/index.ts @@ -0,0 +1,2 @@ +export * from './empty_snippet.js'; +export * from './snippet_a.js'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/snippet_a.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/snippet_a.ts new file mode 100644 index 00000000..8aa64006 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-type-snippets/snippet_a.ts @@ -0,0 +1,37 @@ +import type { Elements, Snippet } from '@kontent-ai/delivery-sdk'; +import type { ContentTypeWithAllElements } from '../content-types/index.js'; + +/** + * Snippet A + * + * Id: b74eb5f6-c851-42f2-9fea-e367d0a3fa61 + * Codename: snippet_a + */ +export type SnippetA = Snippet< + SnippetAElementCodenames, + { + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: Elements.LinkedItemsElement; + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: Elements.TextElement; + } +>; + +/** + * Type representing all available element codenames for Snippet A + */ +export type SnippetAElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/_content_type_with_special_chars____.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/_content_type_with_special_chars____.ts new file mode 100644 index 00000000..6658dc54 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/_content_type_with_special_chars____.ts @@ -0,0 +1,48 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentTypeWithSpecialChars = CoreContentType< + ContentTypeWithSpecialCharsElementCodenames, + { + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: Elements.TextElement; + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: Elements.NumberElement; + }, + '_content_type_with_special_chars____' +>; + +/** + * Type representing all available element codenames for 🐧 Content type with special chars #!_' + */ +export type ContentTypeWithSpecialCharsElementCodenames = 'parrot__' | '_____numberelem_____________________'; + +/** + * Type guard for 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export function isContentTypeWithSpecialChars(item: CoreContentType | undefined | null): item is ContentTypeWithSpecialChars { + return item?.system?.type === '_content_type_with_special_chars____'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_a_b.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_a_b.ts new file mode 100644 index 00000000..6f356258 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_a_b.ts @@ -0,0 +1,40 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeBA } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export type CircularReferenceTypeAB = CoreContentType< + CircularReferenceTypeABElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_a_b' +>; + +/** + * Type representing all available element codenames for Circular reference type A > B + */ +export type CircularReferenceTypeABElementCodenames = 'items'; + +/** + * Type guard for Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export function isCircularReferenceTypeAB(item: CoreContentType | undefined | null): item is CircularReferenceTypeAB { + return item?.system?.type === 'circular_reference_type_a_b'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_b____a.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_b____a.ts new file mode 100644 index 00000000..ac7f453a --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/circular_reference_type_b____a.ts @@ -0,0 +1,40 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeAB } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export type CircularReferenceTypeBA = CoreContentType< + CircularReferenceTypeBAElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_b____a' +>; + +/** + * Type representing all available element codenames for Circular reference type B -> A + */ +export type CircularReferenceTypeBAElementCodenames = 'items'; + +/** + * Type guard for Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export function isCircularReferenceTypeBA(item: CoreContentType | undefined | null): item is CircularReferenceTypeBA { + return item?.system?.type === 'circular_reference_type_b____a'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_all_elements.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_all_elements.ts new file mode 100644 index 00000000..f7eb27fb --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_all_elements.ts @@ -0,0 +1,135 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; +import type { SnippetA } from '../content-type-snippets/index.js'; +import type { TaxonomyA } from '../taxonomies/index.js'; + +/** + * Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElements = CoreContentType< + ContentTypeWithAllElementsElementCodenames, + { + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 + * Guidelines: Simple text element guidelines + */ + readonly text_element: Elements.TextElement; + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: Elements.UrlSlugElement; + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: Elements.RichTextElement; + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: Elements.DateTimeElement; + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: Elements.CustomElement; + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: Elements.LinkedItemsElement; + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: Elements.AssetsElement; + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: Elements.MultipleChoiceElement<'option_a' | 'option_b'>; + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: Elements.NumberElement; + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: Elements.TaxonomyElement; + } & SnippetA, + 'content_type_with_all_elements' +>; + +/** + * Type representing all available element codenames for Content type with all elements + */ +export type ContentTypeWithAllElementsElementCodenames = + | 'text_element' + | 'url_slug_element' + | 'rich_text_element' + | 'date___time_element' + | 'custom_element' + | 'linked_items_element' + | 'asset_element' + | 'multiple_choice_element' + | 'number_element' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'taxonomy_element'; + +/** + * Type guard for Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export function isContentTypeWithAllElements(item: CoreContentType | undefined | null): item is ContentTypeWithAllElements { + return item?.system?.type === 'content_type_with_all_elements'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_guidelines_only.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_guidelines_only.ts new file mode 100644 index 00000000..1b7fab6a --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_guidelines_only.ts @@ -0,0 +1,28 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export type ContentTypeWithGuidelinesOnly = CoreContentType< + ContentTypeWithGuidelinesOnlyElementCodenames, + Record, + 'content_type_with_guidelines_only' +>; + +/** + * Type representing all available element codenames for Content type with guidelines only + */ +export type ContentTypeWithGuidelinesOnlyElementCodenames = never; + +/** + * Type guard for Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export function isContentTypeWithGuidelinesOnly(item: CoreContentType | undefined | null): item is ContentTypeWithGuidelinesOnly { + return item?.system?.type === 'content_type_with_guidelines_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_snippet_only.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_snippet_only.ts new file mode 100644 index 00000000..f40ddad8 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/content_type_with_snippet_only.ts @@ -0,0 +1,29 @@ +import type { CoreContentType } from '../system/index.js'; +import type { SnippetA } from '../content-type-snippets/index.js'; + +/** + * Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export type ContentTypeWithSnippetOnly = CoreContentType< + ContentTypeWithSnippetOnlyElementCodenames, + Record & SnippetA, + 'content_type_with_snippet_only' +>; + +/** + * Type representing all available element codenames for Content type with snippet only + */ +export type ContentTypeWithSnippetOnlyElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; + +/** + * Type guard for Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export function isContentTypeWithSnippetOnly(item: CoreContentType | undefined | null): item is ContentTypeWithSnippetOnly { + return item?.system?.type === 'content_type_with_snippet_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/empty_content_type.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/empty_content_type.ts new file mode 100644 index 00000000..fa6d309e --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/empty_content_type.ts @@ -0,0 +1,24 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export type EmptyContentType = CoreContentType, 'empty_content_type'>; + +/** + * Type representing all available element codenames for Empty content type + */ +export type EmptyContentTypeElementCodenames = never; + +/** + * Type guard for Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export function isEmptyContentType(item: CoreContentType | undefined | null): item is EmptyContentType { + return item?.system?.type === 'empty_content_type'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/index.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/index.ts new file mode 100644 index 00000000..208916f2 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/index.ts @@ -0,0 +1,10 @@ +export * from './_content_type_with_special_chars____.js'; +export * from './circular_reference_type_a_b.js'; +export * from './circular_reference_type_b____a.js'; +export * from './content_type_with_all_elements.js'; +export * from './content_type_with_guidelines_only.js'; +export * from './content_type_with_snippet_only.js'; +export * from './empty_content_type.js'; +export * from './page.js'; +export * from './type_with_empty_snippet.js'; +export * from './web_spotlight_root.js'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/page.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/page.ts new file mode 100644 index 00000000..8ed87b6b --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/page.ts @@ -0,0 +1,75 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export type Page = CoreContentType< + PageElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: Elements.TextElement; + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: Elements.UrlSlugElement; + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: Elements.MultipleChoiceElement<'yes' | 'no'>; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'page' +>; + +/** + * Type representing all available element codenames for Page + */ +export type PageElementCodenames = 'title' | 'url' | 'show_in_navigation' | 'subpages' | 'content'; + +/** + * Type guard for Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export function isPage(item: CoreContentType | undefined | null): item is Page { + return item?.system?.type === 'page'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/type_with_empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/type_with_empty_snippet.ts new file mode 100644 index 00000000..ad355918 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/type_with_empty_snippet.ts @@ -0,0 +1,24 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export type TypeWithEmptySnippet = CoreContentType, 'type_with_empty_snippet'>; + +/** + * Type representing all available element codenames for Type with empty snippet + */ +export type TypeWithEmptySnippetElementCodenames = never; + +/** + * Type guard for Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export function isTypeWithEmptySnippet(item: CoreContentType | undefined | null): item is TypeWithEmptySnippet { + return item?.system?.type === 'type_with_empty_snippet'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/content-types/web_spotlight_root.ts b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/web_spotlight_root.ts new file mode 100644 index 00000000..7fbc3214 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/content-types/web_spotlight_root.ts @@ -0,0 +1,58 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; +import type { Page } from './index.js'; + +/** + * Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type WebSpotlightRoot = CoreContentType< + WebSpotlightRootElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: Elements.TextElement; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'web_spotlight_root' +>; + +/** + * Type representing all available element codenames for Web spotlight root + */ +export type WebSpotlightRootElementCodenames = 'title' | 'subpages' | 'content'; + +/** + * Type guard for Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export function isWebSpotlightRoot(item: CoreContentType | undefined | null): item is WebSpotlightRoot { + return item?.system?.type === 'web_spotlight_root'; +} diff --git a/sample/index.ts b/tests/integration/snapshots/delivery-sdk/basic-js/index.ts similarity index 78% rename from sample/index.ts rename to tests/integration/snapshots/delivery-sdk/basic-js/index.ts index 855039bd..9c462b03 100644 --- a/sample/index.ts +++ b/tests/integration/snapshots/delivery-sdk/basic-js/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/basic-js/system/core.type.ts b/tests/integration/snapshots/delivery-sdk/basic-js/system/core.type.ts new file mode 100644 index 00000000..d6daeac9 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/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/basic-js/system/delivery.codenames.ts b/tests/integration/snapshots/delivery-sdk/basic-js/system/delivery.codenames.ts new file mode 100644 index 00000000..d3da6dd1 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/system/delivery.codenames.ts @@ -0,0 +1,67 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = + | '_content_type_with_special_chars____' + | 'circular_reference_type_a_b' + | 'circular_reference_type_b____a' + | 'content_type_with_all_elements' + | 'content_type_with_guidelines_only' + | 'content_type_with_snippet_only' + | 'empty_content_type' + | 'page' + | 'type_with_empty_snippet' + | 'web_spotlight_root'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default' | 'legacy_collection'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'advanced_workflow' | 'default'; + +/** + * Type representing all taxonomies + */ +export type TaxonomyCodenames = 'taxonomy_a' | 'taxonomy_without_terms'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; + +/** + * Type representing all element codenames across all content types + */ +export type ElementCodenames = + | '_____numberelem_____________________' + | 'asset_element' + | 'content' + | 'custom_element' + | 'date___time_element' + | 'empty_snippet' + | 'guidelines' + | 'items' + | 'linked_items_element' + | 'multiple_choice_element' + | 'number_element' + | 'parrot__' + | 'rich_text_element' + | 'show_in_navigation' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'snippet_a' + | 'subpages' + | 'taxonomy_element' + | 'text_element' + | 'title' + | 'url_slug_element' + | 'url'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/system/index.ts b/tests/integration/snapshots/delivery-sdk/basic-js/system/index.ts new file mode 100644 index 00000000..decb2dcf --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/system/index.ts @@ -0,0 +1,2 @@ +export * from './core.type.js'; +export * from './delivery.codenames.js'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/index.ts b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/index.ts new file mode 100644 index 00000000..cc185ed7 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/index.ts @@ -0,0 +1,2 @@ +export * from './taxonomy_a.js'; +export * from './taxonomy_without_terms.js'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_a.ts b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_a.ts new file mode 100644 index 00000000..c5a15699 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_a.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export const taxonomyAValues = ['nested_term_2', 'nested_term_1', 'term_1', 'term_2', 'term_3'] as const; + +/** + * Type representing Taxonomy A taxonomy + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export type TaxonomyA = (typeof taxonomyAValues)[number]; + +/** + * Type guard for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export function isTaxonomyA(value: string | undefined | null): value is TaxonomyA { + return typeof value === 'string' && (taxonomyAValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_without_terms.ts b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_without_terms.ts new file mode 100644 index 00000000..1efc0c04 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-js/taxonomies/taxonomy_without_terms.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export const taxonomyWithoutTermsValues = [] as const; + +/** + * Type representing Taxonomy without terms taxonomy + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export type TaxonomyWithoutTerms = (typeof taxonomyWithoutTermsValues)[number]; + +/** + * Type guard for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export function isTaxonomyWithoutTerms(value: string | undefined | null): value is TaxonomyWithoutTerms { + return typeof value === 'string' && (taxonomyWithoutTermsValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/_filesList.json b/tests/integration/snapshots/delivery-sdk/basic-ts/_filesList.json new file mode 100644 index 00000000..7d7ce517 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/_filesList.json @@ -0,0 +1,23 @@ +[ + { "filename": "content-types/content_type_with_snippet_only.ts" }, + { "filename": "content-types/_content_type_with_special_chars____.ts" }, + { "filename": "content-types/circular_reference_type_a_b.ts" }, + { "filename": "content-types/page.ts" }, + { "filename": "content-types/content_type_with_all_elements.ts" }, + { "filename": "content-types/content_type_with_guidelines_only.ts" }, + { "filename": "content-types/circular_reference_type_b____a.ts" }, + { "filename": "content-types/empty_content_type.ts" }, + { "filename": "content-types/type_with_empty_snippet.ts" }, + { "filename": "content-types/web_spotlight_root.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "content-type-snippets/snippet_a.ts" }, + { "filename": "content-type-snippets/empty_snippet.ts" }, + { "filename": "content-type-snippets/index.ts" }, + { "filename": "taxonomies/taxonomy_a.ts" }, + { "filename": "taxonomies/taxonomy_without_terms.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/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/empty_snippet.ts new file mode 100644 index 00000000..9356162f --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/empty_snippet.ts @@ -0,0 +1,14 @@ +import type { Snippet } from '@kontent-ai/delivery-sdk'; + +/** + * Empty snippet + * + * Id: 1d7e3745-3320-4107-996b-2c6b240df7ae + * Codename: empty_snippet + */ +export type EmptySnippet = Snippet>; + +/** + * Type representing all available element codenames for Empty snippet + */ +export type EmptySnippetElementCodenames = never; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/index.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/index.ts new file mode 100644 index 00000000..1e622e08 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/index.ts @@ -0,0 +1,2 @@ +export * from './empty_snippet.ts'; +export * from './snippet_a.ts'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/snippet_a.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/snippet_a.ts new file mode 100644 index 00000000..e9aa5fa8 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-type-snippets/snippet_a.ts @@ -0,0 +1,37 @@ +import type { Elements, Snippet } from '@kontent-ai/delivery-sdk'; +import type { ContentTypeWithAllElements } from '../content-types/index.ts'; + +/** + * Snippet A + * + * Id: b74eb5f6-c851-42f2-9fea-e367d0a3fa61 + * Codename: snippet_a + */ +export type SnippetA = Snippet< + SnippetAElementCodenames, + { + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: Elements.LinkedItemsElement; + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: Elements.TextElement; + } +>; + +/** + * Type representing all available element codenames for Snippet A + */ +export type SnippetAElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/_content_type_with_special_chars____.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/_content_type_with_special_chars____.ts new file mode 100644 index 00000000..699b2ccd --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/_content_type_with_special_chars____.ts @@ -0,0 +1,48 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.ts'; + +/** + * 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentTypeWithSpecialChars = CoreContentType< + ContentTypeWithSpecialCharsElementCodenames, + { + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: Elements.TextElement; + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: Elements.NumberElement; + }, + '_content_type_with_special_chars____' +>; + +/** + * Type representing all available element codenames for 🐧 Content type with special chars #!_' + */ +export type ContentTypeWithSpecialCharsElementCodenames = 'parrot__' | '_____numberelem_____________________'; + +/** + * Type guard for 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export function isContentTypeWithSpecialChars(item: CoreContentType | undefined | null): item is ContentTypeWithSpecialChars { + return item?.system?.type === '_content_type_with_special_chars____'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_a_b.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_a_b.ts new file mode 100644 index 00000000..d96e5c5d --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_a_b.ts @@ -0,0 +1,40 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeBA } from './index.ts'; +import type { CoreContentType } from '../system/index.ts'; + +/** + * Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export type CircularReferenceTypeAB = CoreContentType< + CircularReferenceTypeABElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_a_b' +>; + +/** + * Type representing all available element codenames for Circular reference type A > B + */ +export type CircularReferenceTypeABElementCodenames = 'items'; + +/** + * Type guard for Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export function isCircularReferenceTypeAB(item: CoreContentType | undefined | null): item is CircularReferenceTypeAB { + return item?.system?.type === 'circular_reference_type_a_b'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_b____a.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_b____a.ts new file mode 100644 index 00000000..a2e120f7 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/circular_reference_type_b____a.ts @@ -0,0 +1,40 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeAB } from './index.ts'; +import type { CoreContentType } from '../system/index.ts'; + +/** + * Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export type CircularReferenceTypeBA = CoreContentType< + CircularReferenceTypeBAElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_b____a' +>; + +/** + * Type representing all available element codenames for Circular reference type B -> A + */ +export type CircularReferenceTypeBAElementCodenames = 'items'; + +/** + * Type guard for Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export function isCircularReferenceTypeBA(item: CoreContentType | undefined | null): item is CircularReferenceTypeBA { + return item?.system?.type === 'circular_reference_type_b____a'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_all_elements.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_all_elements.ts new file mode 100644 index 00000000..143ddeef --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_all_elements.ts @@ -0,0 +1,135 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.ts'; +import type { SnippetA } from '../content-type-snippets/index.ts'; +import type { TaxonomyA } from '../taxonomies/index.ts'; + +/** + * Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElements = CoreContentType< + ContentTypeWithAllElementsElementCodenames, + { + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 + * Guidelines: Simple text element guidelines + */ + readonly text_element: Elements.TextElement; + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: Elements.UrlSlugElement; + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: Elements.RichTextElement; + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: Elements.DateTimeElement; + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: Elements.CustomElement; + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: Elements.LinkedItemsElement; + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: Elements.AssetsElement; + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: Elements.MultipleChoiceElement<'option_a' | 'option_b'>; + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: Elements.NumberElement; + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: Elements.TaxonomyElement; + } & SnippetA, + 'content_type_with_all_elements' +>; + +/** + * Type representing all available element codenames for Content type with all elements + */ +export type ContentTypeWithAllElementsElementCodenames = + | 'text_element' + | 'url_slug_element' + | 'rich_text_element' + | 'date___time_element' + | 'custom_element' + | 'linked_items_element' + | 'asset_element' + | 'multiple_choice_element' + | 'number_element' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'taxonomy_element'; + +/** + * Type guard for Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export function isContentTypeWithAllElements(item: CoreContentType | undefined | null): item is ContentTypeWithAllElements { + return item?.system?.type === 'content_type_with_all_elements'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_guidelines_only.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_guidelines_only.ts new file mode 100644 index 00000000..84ec3288 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_guidelines_only.ts @@ -0,0 +1,28 @@ +import type { CoreContentType } from '../system/index.ts'; + +/** + * Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export type ContentTypeWithGuidelinesOnly = CoreContentType< + ContentTypeWithGuidelinesOnlyElementCodenames, + Record, + 'content_type_with_guidelines_only' +>; + +/** + * Type representing all available element codenames for Content type with guidelines only + */ +export type ContentTypeWithGuidelinesOnlyElementCodenames = never; + +/** + * Type guard for Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export function isContentTypeWithGuidelinesOnly(item: CoreContentType | undefined | null): item is ContentTypeWithGuidelinesOnly { + return item?.system?.type === 'content_type_with_guidelines_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_snippet_only.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_snippet_only.ts new file mode 100644 index 00000000..e2b4c517 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/content_type_with_snippet_only.ts @@ -0,0 +1,29 @@ +import type { CoreContentType } from '../system/index.ts'; +import type { SnippetA } from '../content-type-snippets/index.ts'; + +/** + * Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export type ContentTypeWithSnippetOnly = CoreContentType< + ContentTypeWithSnippetOnlyElementCodenames, + Record & SnippetA, + 'content_type_with_snippet_only' +>; + +/** + * Type representing all available element codenames for Content type with snippet only + */ +export type ContentTypeWithSnippetOnlyElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; + +/** + * Type guard for Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export function isContentTypeWithSnippetOnly(item: CoreContentType | undefined | null): item is ContentTypeWithSnippetOnly { + return item?.system?.type === 'content_type_with_snippet_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/empty_content_type.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/empty_content_type.ts new file mode 100644 index 00000000..b2bf6713 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/empty_content_type.ts @@ -0,0 +1,24 @@ +import type { CoreContentType } from '../system/index.ts'; + +/** + * Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export type EmptyContentType = CoreContentType, 'empty_content_type'>; + +/** + * Type representing all available element codenames for Empty content type + */ +export type EmptyContentTypeElementCodenames = never; + +/** + * Type guard for Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export function isEmptyContentType(item: CoreContentType | undefined | null): item is EmptyContentType { + return item?.system?.type === 'empty_content_type'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/index.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/index.ts new file mode 100644 index 00000000..e1c2761a --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/index.ts @@ -0,0 +1,10 @@ +export * from './_content_type_with_special_chars____.ts'; +export * from './circular_reference_type_a_b.ts'; +export * from './circular_reference_type_b____a.ts'; +export * from './content_type_with_all_elements.ts'; +export * from './content_type_with_guidelines_only.ts'; +export * from './content_type_with_snippet_only.ts'; +export * from './empty_content_type.ts'; +export * from './page.ts'; +export * from './type_with_empty_snippet.ts'; +export * from './web_spotlight_root.ts'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/page.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/page.ts new file mode 100644 index 00000000..fd0b1248 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/page.ts @@ -0,0 +1,75 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.ts'; + +/** + * Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export type Page = CoreContentType< + PageElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: Elements.TextElement; + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: Elements.UrlSlugElement; + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: Elements.MultipleChoiceElement<'yes' | 'no'>; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'page' +>; + +/** + * Type representing all available element codenames for Page + */ +export type PageElementCodenames = 'title' | 'url' | 'show_in_navigation' | 'subpages' | 'content'; + +/** + * Type guard for Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export function isPage(item: CoreContentType | undefined | null): item is Page { + return item?.system?.type === 'page'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/type_with_empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/type_with_empty_snippet.ts new file mode 100644 index 00000000..e8c81853 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/type_with_empty_snippet.ts @@ -0,0 +1,24 @@ +import type { CoreContentType } from '../system/index.ts'; + +/** + * Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export type TypeWithEmptySnippet = CoreContentType, 'type_with_empty_snippet'>; + +/** + * Type representing all available element codenames for Type with empty snippet + */ +export type TypeWithEmptySnippetElementCodenames = never; + +/** + * Type guard for Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export function isTypeWithEmptySnippet(item: CoreContentType | undefined | null): item is TypeWithEmptySnippet { + return item?.system?.type === 'type_with_empty_snippet'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/web_spotlight_root.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/web_spotlight_root.ts new file mode 100644 index 00000000..3609c047 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/content-types/web_spotlight_root.ts @@ -0,0 +1,58 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.ts'; +import type { Page } from './index.ts'; + +/** + * Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type WebSpotlightRoot = CoreContentType< + WebSpotlightRootElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: Elements.TextElement; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'web_spotlight_root' +>; + +/** + * Type representing all available element codenames for Web spotlight root + */ +export type WebSpotlightRootElementCodenames = 'title' | 'subpages' | 'content'; + +/** + * Type guard for Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export function isWebSpotlightRoot(item: CoreContentType | undefined | null): item is WebSpotlightRoot { + return item?.system?.type === 'web_spotlight_root'; +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/index.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/index.ts new file mode 100644 index 00000000..0c445e98 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/index.ts @@ -0,0 +1,4 @@ +export * from './content-type-snippets/index.ts'; +export * from './content-types/index.ts'; +export * from './system/index.ts'; +export * from './taxonomies/index.ts'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/system/core.type.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/system/core.type.ts new file mode 100644 index 00000000..607ef2da --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/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.ts'; + +/** + * 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/basic-ts/system/delivery.codenames.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/system/delivery.codenames.ts new file mode 100644 index 00000000..d3da6dd1 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/system/delivery.codenames.ts @@ -0,0 +1,67 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = + | '_content_type_with_special_chars____' + | 'circular_reference_type_a_b' + | 'circular_reference_type_b____a' + | 'content_type_with_all_elements' + | 'content_type_with_guidelines_only' + | 'content_type_with_snippet_only' + | 'empty_content_type' + | 'page' + | 'type_with_empty_snippet' + | 'web_spotlight_root'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default' | 'legacy_collection'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'advanced_workflow' | 'default'; + +/** + * Type representing all taxonomies + */ +export type TaxonomyCodenames = 'taxonomy_a' | 'taxonomy_without_terms'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; + +/** + * Type representing all element codenames across all content types + */ +export type ElementCodenames = + | '_____numberelem_____________________' + | 'asset_element' + | 'content' + | 'custom_element' + | 'date___time_element' + | 'empty_snippet' + | 'guidelines' + | 'items' + | 'linked_items_element' + | 'multiple_choice_element' + | 'number_element' + | 'parrot__' + | 'rich_text_element' + | 'show_in_navigation' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'snippet_a' + | 'subpages' + | 'taxonomy_element' + | 'text_element' + | 'title' + | 'url_slug_element' + | 'url'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/system/index.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/system/index.ts new file mode 100644 index 00000000..d9f3c520 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/system/index.ts @@ -0,0 +1,2 @@ +export * from './core.type.ts'; +export * from './delivery.codenames.ts'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/index.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/index.ts new file mode 100644 index 00000000..b5470881 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/index.ts @@ -0,0 +1,2 @@ +export * from './taxonomy_a.ts'; +export * from './taxonomy_without_terms.ts'; diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_a.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_a.ts new file mode 100644 index 00000000..c5a15699 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_a.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export const taxonomyAValues = ['nested_term_2', 'nested_term_1', 'term_1', 'term_2', 'term_3'] as const; + +/** + * Type representing Taxonomy A taxonomy + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export type TaxonomyA = (typeof taxonomyAValues)[number]; + +/** + * Type guard for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export function isTaxonomyA(value: string | undefined | null): value is TaxonomyA { + return typeof value === 'string' && (taxonomyAValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_without_terms.ts b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_without_terms.ts new file mode 100644 index 00000000..1efc0c04 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/basic-ts/taxonomies/taxonomy_without_terms.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export const taxonomyWithoutTermsValues = [] as const; + +/** + * Type representing Taxonomy without terms taxonomy + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export type TaxonomyWithoutTerms = (typeof taxonomyWithoutTermsValues)[number]; + +/** + * Type guard for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export function isTaxonomyWithoutTerms(value: string | undefined | null): value is TaxonomyWithoutTerms { + return typeof value === 'string' && (taxonomyWithoutTermsValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/_filesList.json b/tests/integration/snapshots/delivery-sdk/custom-format-options/_filesList.json new file mode 100644 index 00000000..7d7ce517 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/_filesList.json @@ -0,0 +1,23 @@ +[ + { "filename": "content-types/content_type_with_snippet_only.ts" }, + { "filename": "content-types/_content_type_with_special_chars____.ts" }, + { "filename": "content-types/circular_reference_type_a_b.ts" }, + { "filename": "content-types/page.ts" }, + { "filename": "content-types/content_type_with_all_elements.ts" }, + { "filename": "content-types/content_type_with_guidelines_only.ts" }, + { "filename": "content-types/circular_reference_type_b____a.ts" }, + { "filename": "content-types/empty_content_type.ts" }, + { "filename": "content-types/type_with_empty_snippet.ts" }, + { "filename": "content-types/web_spotlight_root.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "content-type-snippets/snippet_a.ts" }, + { "filename": "content-type-snippets/empty_snippet.ts" }, + { "filename": "content-type-snippets/index.ts" }, + { "filename": "taxonomies/taxonomy_a.ts" }, + { "filename": "taxonomies/taxonomy_without_terms.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/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/empty_snippet.ts new file mode 100644 index 00000000..d3c144ad --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/empty_snippet.ts @@ -0,0 +1,17 @@ + +import type { Snippet } from '@kontent-ai/delivery-sdk'; + + +/** +* Empty snippet +* +* Id: 1d7e3745-3320-4107-996b-2c6b240df7ae +* Codename: empty_snippet +*/ +export type EmptySnippet = Snippet>; + +/** +* Type representing all available element codenames for Empty snippet +*/ +export type EmptySnippetElementCodenames = never diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/index.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/index.ts new file mode 100644 index 00000000..2d0376eb --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/index.ts @@ -0,0 +1 @@ + export * from './empty_snippet.js'; export * from './snippet_a.js'; \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/snippet_a.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/snippet_a.ts new file mode 100644 index 00000000..12f3eb2b --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-type-snippets/snippet_a.ts @@ -0,0 +1,35 @@ + +import type { Elements, Snippet } from '@kontent-ai/delivery-sdk'; +import type { ContentTypeWithAllElements } from '../content-types/index.js'; + +/** +* Snippet A +* +* Id: b74eb5f6-c851-42f2-9fea-e367d0a3fa61 +* Codename: snippet_a +*/ +export type SnippetA = Snippet; + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: Elements.TextElement;}>; + +/** +* Type representing all available element codenames for Snippet A +*/ +export type SnippetAElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/_content_type_with_special_chars____.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/_content_type_with_special_chars____.ts new file mode 100644 index 00000000..a1fe6aeb --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/_content_type_with_special_chars____.ts @@ -0,0 +1,47 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** +* 🐧 Content type with special chars #!_' +* +* Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 +* Codename: _content_type_with_special_chars____ +*/ +export type ContentTypeWithSpecialChars = CoreContentType< +ContentTypeWithSpecialCharsElementCodenames, +{ + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: Elements.TextElement; + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: Elements.NumberElement;}, +'_content_type_with_special_chars____'> + +/** +* Type representing all available element codenames for 🐧 Content type with special chars #!_' +*/ +export type ContentTypeWithSpecialCharsElementCodenames = 'parrot__' | '_____numberelem_____________________';; + +/** +* Type guard for 🐧 Content type with special chars #!_' +* +* Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 +* Codename: _content_type_with_special_chars____ +*/ +export function isContentTypeWithSpecialChars(item: CoreContentType | undefined | null): item is ContentTypeWithSpecialChars { + return item?.system?.type === '_content_type_with_special_chars____'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_a_b.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_a_b.ts new file mode 100644 index 00000000..353fad27 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_a_b.ts @@ -0,0 +1,39 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeBA } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** +* Circular reference type A > B +* +* Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 +* Codename: circular_reference_type_a_b +*/ +export type CircularReferenceTypeAB = CoreContentType< +CircularReferenceTypeABElementCodenames, +{ + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: Elements.LinkedItemsElement;}, +'circular_reference_type_a_b'> + +/** +* Type representing all available element codenames for Circular reference type A > B +*/ +export type CircularReferenceTypeABElementCodenames = 'items';; + +/** +* Type guard for Circular reference type A > B +* +* Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 +* Codename: circular_reference_type_a_b +*/ +export function isCircularReferenceTypeAB(item: CoreContentType | undefined | null): item is CircularReferenceTypeAB { + return item?.system?.type === 'circular_reference_type_a_b'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_b____a.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_b____a.ts new file mode 100644 index 00000000..9a7a56b8 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/circular_reference_type_b____a.ts @@ -0,0 +1,39 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CircularReferenceTypeAB } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** +* Circular reference type B -> A +* +* Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 +* Codename: circular_reference_type_b____a +*/ +export type CircularReferenceTypeBA = CoreContentType< +CircularReferenceTypeBAElementCodenames, +{ + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: Elements.LinkedItemsElement;}, +'circular_reference_type_b____a'> + +/** +* Type representing all available element codenames for Circular reference type B -> A +*/ +export type CircularReferenceTypeBAElementCodenames = 'items';; + +/** +* Type guard for Circular reference type B -> A +* +* Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 +* Codename: circular_reference_type_b____a +*/ +export function isCircularReferenceTypeBA(item: CoreContentType | undefined | null): item is CircularReferenceTypeBA { + return item?.system?.type === 'circular_reference_type_b____a'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_all_elements.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_all_elements.ts new file mode 100644 index 00000000..f4d5f5cc --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_all_elements.ts @@ -0,0 +1,122 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; +import type { SnippetA } from '../content-type-snippets/index.js'; +import type { TaxonomyA } from '../taxonomies/index.js'; + +/** +* Content type with all elements +* +* Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 +* Codename: content_type_with_all_elements +*/ +export type ContentTypeWithAllElements = CoreContentType< +ContentTypeWithAllElementsElementCodenames, +{ + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 +* Guidelines: Simple text element guidelines + */ + readonly text_element: Elements.TextElement; + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: Elements.UrlSlugElement; + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: Elements.RichTextElement; + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: Elements.DateTimeElement; + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: Elements.CustomElement; + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: Elements.LinkedItemsElement; + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: Elements.AssetsElement; + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: Elements.MultipleChoiceElement<'option_a' | 'option_b'>; + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: Elements.NumberElement; + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: Elements.TaxonomyElement;} & SnippetA, +'content_type_with_all_elements'> + +/** +* Type representing all available element codenames for Content type with all elements +*/ +export type ContentTypeWithAllElementsElementCodenames = 'text_element' | 'url_slug_element' | 'rich_text_element' | 'date___time_element' | 'custom_element' | 'linked_items_element' | 'asset_element' | 'multiple_choice_element' | 'number_element' | 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text' | 'taxonomy_element';; + +/** +* Type guard for Content type with all elements +* +* Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 +* Codename: content_type_with_all_elements +*/ +export function isContentTypeWithAllElements(item: CoreContentType | undefined | null): item is ContentTypeWithAllElements { + return item?.system?.type === 'content_type_with_all_elements'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_guidelines_only.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_guidelines_only.ts new file mode 100644 index 00000000..e1ea44dc --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_guidelines_only.ts @@ -0,0 +1,29 @@ + + +import type { CoreContentType } from '../system/index.js'; + +/** +* Content type with guidelines only +* +* Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef +* Codename: content_type_with_guidelines_only +*/ +export type ContentTypeWithGuidelinesOnly = CoreContentType< +ContentTypeWithGuidelinesOnlyElementCodenames, +Record, +'content_type_with_guidelines_only'> + +/** +* Type representing all available element codenames for Content type with guidelines only +*/ +export type ContentTypeWithGuidelinesOnlyElementCodenames = never; + +/** +* Type guard for Content type with guidelines only +* +* Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef +* Codename: content_type_with_guidelines_only +*/ +export function isContentTypeWithGuidelinesOnly(item: CoreContentType | undefined | null): item is ContentTypeWithGuidelinesOnly { + return item?.system?.type === 'content_type_with_guidelines_only'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_snippet_only.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_snippet_only.ts new file mode 100644 index 00000000..316d689c --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/content_type_with_snippet_only.ts @@ -0,0 +1,30 @@ + + +import type { CoreContentType } from '../system/index.js'; +import type { SnippetA } from '../content-type-snippets/index.js'; + +/** +* Content type with snippet only +* +* Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 +* Codename: content_type_with_snippet_only +*/ +export type ContentTypeWithSnippetOnly = CoreContentType< +ContentTypeWithSnippetOnlyElementCodenames, +Record & SnippetA, +'content_type_with_snippet_only'> + +/** +* Type representing all available element codenames for Content type with snippet only +*/ +export type ContentTypeWithSnippetOnlyElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text';; + +/** +* Type guard for Content type with snippet only +* +* Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 +* Codename: content_type_with_snippet_only +*/ +export function isContentTypeWithSnippetOnly(item: CoreContentType | undefined | null): item is ContentTypeWithSnippetOnly { + return item?.system?.type === 'content_type_with_snippet_only'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/empty_content_type.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/empty_content_type.ts new file mode 100644 index 00000000..c8b15b98 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/empty_content_type.ts @@ -0,0 +1,29 @@ + + +import type { CoreContentType } from '../system/index.js'; + +/** +* Empty content type +* +* Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e +* Codename: empty_content_type +*/ +export type EmptyContentType = CoreContentType< +EmptyContentTypeElementCodenames, +Record, +'empty_content_type'> + +/** +* Type representing all available element codenames for Empty content type +*/ +export type EmptyContentTypeElementCodenames = never; + +/** +* Type guard for Empty content type +* +* Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e +* Codename: empty_content_type +*/ +export function isEmptyContentType(item: CoreContentType | undefined | null): item is EmptyContentType { + return item?.system?.type === 'empty_content_type'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/index.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/index.ts new file mode 100644 index 00000000..b27f6683 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/index.ts @@ -0,0 +1 @@ + export * from './_content_type_with_special_chars____.js'; export * from './circular_reference_type_a_b.js'; export * from './circular_reference_type_b____a.js'; export * from './content_type_with_all_elements.js'; export * from './content_type_with_guidelines_only.js'; export * from './content_type_with_snippet_only.js'; export * from './empty_content_type.js'; export * from './page.js'; export * from './type_with_empty_snippet.js'; export * from './web_spotlight_root.js'; \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/page.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/page.ts new file mode 100644 index 00000000..49cc96c8 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/page.ts @@ -0,0 +1,74 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** +* Page +* +* Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 +* Codename: page +*/ +export type Page = CoreContentType< +PageElementCodenames, +{ + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: Elements.TextElement; + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: Elements.UrlSlugElement; + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: Elements.MultipleChoiceElement<'yes' | 'no'>; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: Elements.LinkedItemsElement;}, +'page'> + +/** +* Type representing all available element codenames for Page +*/ +export type PageElementCodenames = 'title' | 'url' | 'show_in_navigation' | 'subpages' | 'content';; + +/** +* Type guard for Page +* +* Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 +* Codename: page +*/ +export function isPage(item: CoreContentType | undefined | null): item is Page { + return item?.system?.type === 'page'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/type_with_empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/type_with_empty_snippet.ts new file mode 100644 index 00000000..7dcc4954 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/type_with_empty_snippet.ts @@ -0,0 +1,29 @@ + + +import type { CoreContentType } from '../system/index.js'; + +/** +* Type with empty snippet +* +* Id: 11039462-1d7d-4673-9aa8-af07fb53985c +* Codename: type_with_empty_snippet +*/ +export type TypeWithEmptySnippet = CoreContentType< +TypeWithEmptySnippetElementCodenames, +Record, +'type_with_empty_snippet'> + +/** +* Type representing all available element codenames for Type with empty snippet +*/ +export type TypeWithEmptySnippetElementCodenames = never; + +/** +* Type guard for Type with empty snippet +* +* Id: 11039462-1d7d-4673-9aa8-af07fb53985c +* Codename: type_with_empty_snippet +*/ +export function isTypeWithEmptySnippet(item: CoreContentType | undefined | null): item is TypeWithEmptySnippet { + return item?.system?.type === 'type_with_empty_snippet'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/web_spotlight_root.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/web_spotlight_root.ts new file mode 100644 index 00000000..7e9c863e --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/content-types/web_spotlight_root.ts @@ -0,0 +1,57 @@ + +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; +import type { Page } from './index.js'; + +/** +* Web spotlight root +* +* Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 +* Codename: web_spotlight_root +*/ +export type WebSpotlightRoot = CoreContentType< +WebSpotlightRootElementCodenames, +{ + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: Elements.TextElement; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: Elements.LinkedItemsElement;}, +'web_spotlight_root'> + +/** +* Type representing all available element codenames for Web spotlight root +*/ +export type WebSpotlightRootElementCodenames = 'title' | 'subpages' | 'content';; + +/** +* Type guard for Web spotlight root +* +* Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 +* Codename: web_spotlight_root +*/ +export function isWebSpotlightRoot(item: CoreContentType | undefined | null): item is WebSpotlightRoot { + return item?.system?.type === 'web_spotlight_root'; + }; diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/index.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/index.ts new file mode 100644 index 00000000..3b59f62f --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/index.ts @@ -0,0 +1 @@ + export * from './content-type-snippets/index.js'; export * from './content-types/index.js'; export * from './system/index.js'; export * from './taxonomies/index.js'; \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/system/core.type.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/core.type.ts new file mode 100644 index 00000000..409f8947 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/core.type.ts @@ -0,0 +1,39 @@ + + 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< + TElements, + TContentTypeCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames, + WorkflowStepCodenames + >; + + /** + * 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; + \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/system/delivery.codenames.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/delivery.codenames.ts new file mode 100644 index 00000000..b2bfd124 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/delivery.codenames.ts @@ -0,0 +1,36 @@ + + /** + * Type representing all languages +*/ + export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + + /** + * Type representing all content types +*/ + export type ContentTypeCodenames = '_content_type_with_special_chars____' | 'circular_reference_type_a_b' | 'circular_reference_type_b____a' | 'content_type_with_all_elements' | 'content_type_with_guidelines_only' | 'content_type_with_snippet_only' | 'empty_content_type' | 'page' | 'type_with_empty_snippet' | 'web_spotlight_root'; + + /** + * Type representing all collections +*/ + export type CollectionCodenames = 'default' | 'legacy_collection'; + + /** + * Type representing all workflows +*/ + export type WorkflowCodenames = 'advanced_workflow' | 'default'; + + /** + * Type representing all taxonomies +*/ + export type TaxonomyCodenames = 'taxonomy_a' | 'taxonomy_without_terms'; + + /** + * Type representing all worksflow steps across all workflows +*/ + export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; + + /** + * Type representing all element codenames across all content types +*/ + export type ElementCodenames = '_____numberelem_____________________' | 'asset_element' | 'content' | 'custom_element' | 'date___time_element' | 'empty_snippet' | 'guidelines' | 'items' | 'linked_items_element' | 'multiple_choice_element' | 'number_element' | 'parrot__' | 'rich_text_element' | 'show_in_navigation' | 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text' | 'snippet_a' | 'subpages' | 'taxonomy_element' | 'text_element' | 'title' | 'url_slug_element' | 'url'; + \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/system/index.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/index.ts new file mode 100644 index 00000000..f76bc08b --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/system/index.ts @@ -0,0 +1 @@ + export * from './core.type.js'; export * from './delivery.codenames.js'; \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/index.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/index.ts new file mode 100644 index 00000000..00fe3a95 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/index.ts @@ -0,0 +1 @@ + export * from './taxonomy_a.js'; export * from './taxonomy_without_terms.js'; \ No newline at end of file diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_a.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_a.ts new file mode 100644 index 00000000..084519a4 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_a.ts @@ -0,0 +1,27 @@ + + +/** + * All taxonomy codename values for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e +*/ + export const taxonomyAValues = ['nested_term_2', 'nested_term_1', 'term_1', 'term_2', 'term_3'] as const; + +/** + * Type representing Taxonomy A taxonomy + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e +*/ +export type TaxonomyA = typeof taxonomyAValues[number]; + +/** + * Type guard for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e +*/ +export function isTaxonomyA(value: string | undefined | null): value is TaxonomyA { + return typeof value === 'string' && (taxonomyAValues as readonly string[]).includes(value); + } diff --git a/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_without_terms.ts b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_without_terms.ts new file mode 100644 index 00000000..3489afb2 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/custom-format-options/taxonomies/taxonomy_without_terms.ts @@ -0,0 +1,27 @@ + + +/** + * All taxonomy codename values for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 +*/ + export const taxonomyWithoutTermsValues = [] as const; + +/** + * Type representing Taxonomy without terms taxonomy + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 +*/ +export type TaxonomyWithoutTerms = typeof taxonomyWithoutTermsValues[number]; + +/** + * Type guard for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 +*/ +export function isTaxonomyWithoutTerms(value: string | undefined | null): value is TaxonomyWithoutTerms { + return typeof value === 'string' && (taxonomyWithoutTermsValues as readonly string[]).includes(value); + } diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/_filesList.json b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/_filesList.json new file mode 100644 index 00000000..425165dc --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/_filesList.json @@ -0,0 +1,33 @@ +[ + { + "filename": "content-types/content_type_content_type_with_snippet_only.ts" + }, + { + "filename": "content-types/content_type__content_type_with_special_chars____.ts" + }, + { "filename": "content-types/content_type_circular_reference_type_a_b.ts" }, + { "filename": "content-types/content_type_page.ts" }, + { + "filename": "content-types/content_type_content_type_with_all_elements.ts" + }, + { + "filename": "content-types/content_type_content_type_with_guidelines_only.ts" + }, + { + "filename": "content-types/content_type_circular_reference_type_b____a.ts" + }, + { "filename": "content-types/content_type_empty_content_type.ts" }, + { "filename": "content-types/content_type_type_with_empty_snippet.ts" }, + { "filename": "content-types/content_type_web_spotlight_root.ts" }, + { "filename": "content-types/index.ts" }, + { "filename": "content-type-snippets/snippet_snippet_a.ts" }, + { "filename": "content-type-snippets/snippet_empty_snippet.ts" }, + { "filename": "content-type-snippets/index.ts" }, + { "filename": "taxonomies/taxonomy_taxonomy_a.ts" }, + { "filename": "taxonomies/taxonomy_taxonomy_without_terms.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/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/index.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/index.ts new file mode 100644 index 00000000..0d6ab068 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/index.ts @@ -0,0 +1,2 @@ +export * from './snippet_empty_snippet.js'; +export * from './snippet_snippet_a.js'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_empty_snippet.ts new file mode 100644 index 00000000..55227275 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_empty_snippet.ts @@ -0,0 +1,14 @@ +import type { Snippet } from '@kontent-ai/delivery-sdk'; + +/** + * Empty snippet + * + * Id: 1d7e3745-3320-4107-996b-2c6b240df7ae + * Codename: empty_snippet + */ +export type Snippet_empty_snippet = Snippet>; + +/** + * Type representing all available element codenames for Empty snippet + */ +export type Snippet_empty_snippetElementCodenames = never; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_snippet_a.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_snippet_a.ts new file mode 100644 index 00000000..f75fc212 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-type-snippets/snippet_snippet_a.ts @@ -0,0 +1,37 @@ +import type { Elements, Snippet } from '@kontent-ai/delivery-sdk'; +import type { ContentType_content_type_with_all_elements } from '../content-types/index.js'; + +/** + * Snippet A + * + * Id: b74eb5f6-c851-42f2-9fea-e367d0a3fa61 + * Codename: snippet_a + */ +export type Snippet_snippet_a = Snippet< + Snippet_snippet_aElementCodenames, + { + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: Elements.LinkedItemsElement; + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: Elements.TextElement; + } +>; + +/** + * Type representing all available element codenames for Snippet A + */ +export type Snippet_snippet_aElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type__content_type_with_special_chars____.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type__content_type_with_special_chars____.ts new file mode 100644 index 00000000..3750c19f --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type__content_type_with_special_chars____.ts @@ -0,0 +1,50 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentType__content_type_with_special_chars____ = CoreContentType< + ContentType__content_type_with_special_chars____ElementCodenames, + { + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: Elements.TextElement; + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: Elements.NumberElement; + }, + '_content_type_with_special_chars____' +>; + +/** + * Type representing all available element codenames for 🐧 Content type with special chars #!_' + */ +export type ContentType__content_type_with_special_chars____ElementCodenames = 'parrot__' | '_____numberelem_____________________'; + +/** + * Type guard for 🐧 Content type with special chars #!_' + * + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export function isContentType__content_type_with_special_chars____( + item: CoreContentType | undefined | null +): item is ContentType__content_type_with_special_chars____ { + return item?.system?.type === '_content_type_with_special_chars____'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_a_b.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_a_b.ts new file mode 100644 index 00000000..8ce4684f --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_a_b.ts @@ -0,0 +1,42 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { ContentType_circular_reference_type_b____a } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export type ContentType_circular_reference_type_a_b = CoreContentType< + ContentType_circular_reference_type_a_bElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_a_b' +>; + +/** + * Type representing all available element codenames for Circular reference type A > B + */ +export type ContentType_circular_reference_type_a_bElementCodenames = 'items'; + +/** + * Type guard for Circular reference type A > B + * + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + * Codename: circular_reference_type_a_b + */ +export function isContentType_circular_reference_type_a_b( + item: CoreContentType | undefined | null +): item is ContentType_circular_reference_type_a_b { + return item?.system?.type === 'circular_reference_type_a_b'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_b____a.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_b____a.ts new file mode 100644 index 00000000..4cd3b749 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_circular_reference_type_b____a.ts @@ -0,0 +1,42 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { ContentType_circular_reference_type_a_b } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export type ContentType_circular_reference_type_b____a = CoreContentType< + ContentType_circular_reference_type_b____aElementCodenames, + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: Elements.LinkedItemsElement; + }, + 'circular_reference_type_b____a' +>; + +/** + * Type representing all available element codenames for Circular reference type B -> A + */ +export type ContentType_circular_reference_type_b____aElementCodenames = 'items'; + +/** + * Type guard for Circular reference type B -> A + * + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + * Codename: circular_reference_type_b____a + */ +export function isContentType_circular_reference_type_b____a( + item: CoreContentType | undefined | null +): item is ContentType_circular_reference_type_b____a { + return item?.system?.type === 'circular_reference_type_b____a'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_all_elements.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_all_elements.ts new file mode 100644 index 00000000..0859cd9e --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_all_elements.ts @@ -0,0 +1,137 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; +import type { Snippet_snippet_a } from '../content-type-snippets/index.js'; +import type { Taxonomy_taxonomy_a } from '../taxonomies/index.js'; + +/** + * Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentType_content_type_with_all_elements = CoreContentType< + ContentType_content_type_with_all_elementsElementCodenames, + { + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 + * Guidelines: Simple text element guidelines + */ + readonly text_element: Elements.TextElement; + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: Elements.UrlSlugElement; + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: Elements.RichTextElement; + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: Elements.DateTimeElement; + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: Elements.CustomElement; + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: Elements.LinkedItemsElement; + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: Elements.AssetsElement; + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: Elements.MultipleChoiceElement<'option_a' | 'option_b'>; + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: Elements.NumberElement; + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: Elements.TaxonomyElement; + } & Snippet_snippet_a, + 'content_type_with_all_elements' +>; + +/** + * Type representing all available element codenames for Content type with all elements + */ +export type ContentType_content_type_with_all_elementsElementCodenames = + | 'text_element' + | 'url_slug_element' + | 'rich_text_element' + | 'date___time_element' + | 'custom_element' + | 'linked_items_element' + | 'asset_element' + | 'multiple_choice_element' + | 'number_element' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'taxonomy_element'; + +/** + * Type guard for Content type with all elements + * + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export function isContentType_content_type_with_all_elements( + item: CoreContentType | undefined | null +): item is ContentType_content_type_with_all_elements { + return item?.system?.type === 'content_type_with_all_elements'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_guidelines_only.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_guidelines_only.ts new file mode 100644 index 00000000..f5e81dfb --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_guidelines_only.ts @@ -0,0 +1,30 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export type ContentType_content_type_with_guidelines_only = CoreContentType< + ContentType_content_type_with_guidelines_onlyElementCodenames, + Record, + 'content_type_with_guidelines_only' +>; + +/** + * Type representing all available element codenames for Content type with guidelines only + */ +export type ContentType_content_type_with_guidelines_onlyElementCodenames = never; + +/** + * Type guard for Content type with guidelines only + * + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + * Codename: content_type_with_guidelines_only + */ +export function isContentType_content_type_with_guidelines_only( + item: CoreContentType | undefined | null +): item is ContentType_content_type_with_guidelines_only { + return item?.system?.type === 'content_type_with_guidelines_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_snippet_only.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_snippet_only.ts new file mode 100644 index 00000000..da06bc73 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_content_type_with_snippet_only.ts @@ -0,0 +1,31 @@ +import type { CoreContentType } from '../system/index.js'; +import type { Snippet_snippet_a } from '../content-type-snippets/index.js'; + +/** + * Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export type ContentType_content_type_with_snippet_only = CoreContentType< + ContentType_content_type_with_snippet_onlyElementCodenames, + Record & Snippet_snippet_a, + 'content_type_with_snippet_only' +>; + +/** + * Type representing all available element codenames for Content type with snippet only + */ +export type ContentType_content_type_with_snippet_onlyElementCodenames = 'snippet_a__linked_items_with_specific_types' | 'snippet_a__text'; + +/** + * Type guard for Content type with snippet only + * + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + * Codename: content_type_with_snippet_only + */ +export function isContentType_content_type_with_snippet_only( + item: CoreContentType | undefined | null +): item is ContentType_content_type_with_snippet_only { + return item?.system?.type === 'content_type_with_snippet_only'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_empty_content_type.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_empty_content_type.ts new file mode 100644 index 00000000..47ef37c3 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_empty_content_type.ts @@ -0,0 +1,28 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export type ContentType_empty_content_type = CoreContentType< + ContentType_empty_content_typeElementCodenames, + Record, + 'empty_content_type' +>; + +/** + * Type representing all available element codenames for Empty content type + */ +export type ContentType_empty_content_typeElementCodenames = never; + +/** + * Type guard for Empty content type + * + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + * Codename: empty_content_type + */ +export function isContentType_empty_content_type(item: CoreContentType | undefined | null): item is ContentType_empty_content_type { + return item?.system?.type === 'empty_content_type'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_page.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_page.ts new file mode 100644 index 00000000..a8c416f2 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_page.ts @@ -0,0 +1,75 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export type ContentType_page = CoreContentType< + ContentType_pageElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: Elements.TextElement; + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: Elements.UrlSlugElement; + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: Elements.MultipleChoiceElement<'yes' | 'no'>; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'page' +>; + +/** + * Type representing all available element codenames for Page + */ +export type ContentType_pageElementCodenames = 'title' | 'url' | 'show_in_navigation' | 'subpages' | 'content'; + +/** + * Type guard for Page + * + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + * Codename: page + */ +export function isContentType_page(item: CoreContentType | undefined | null): item is ContentType_page { + return item?.system?.type === 'page'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_type_with_empty_snippet.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_type_with_empty_snippet.ts new file mode 100644 index 00000000..2991e715 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_type_with_empty_snippet.ts @@ -0,0 +1,30 @@ +import type { CoreContentType } from '../system/index.js'; + +/** + * Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export type ContentType_type_with_empty_snippet = CoreContentType< + ContentType_type_with_empty_snippetElementCodenames, + Record, + 'type_with_empty_snippet' +>; + +/** + * Type representing all available element codenames for Type with empty snippet + */ +export type ContentType_type_with_empty_snippetElementCodenames = never; + +/** + * Type guard for Type with empty snippet + * + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + * Codename: type_with_empty_snippet + */ +export function isContentType_type_with_empty_snippet( + item: CoreContentType | undefined | null +): item is ContentType_type_with_empty_snippet { + return item?.system?.type === 'type_with_empty_snippet'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_web_spotlight_root.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_web_spotlight_root.ts new file mode 100644 index 00000000..aa0781c2 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/content_type_web_spotlight_root.ts @@ -0,0 +1,58 @@ +import type { Elements } from '@kontent-ai/delivery-sdk'; +import type { ContentType_page } from './index.js'; +import type { CoreContentType } from '../system/index.js'; + +/** + * Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type ContentType_web_spotlight_root = CoreContentType< + ContentType_web_spotlight_rootElementCodenames, + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: Elements.TextElement; + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: Elements.LinkedItemsElement; + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: Elements.LinkedItemsElement; + }, + 'web_spotlight_root' +>; + +/** + * Type representing all available element codenames for Web spotlight root + */ +export type ContentType_web_spotlight_rootElementCodenames = 'title' | 'subpages' | 'content'; + +/** + * Type guard for Web spotlight root + * + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export function isContentType_web_spotlight_root(item: CoreContentType | undefined | null): item is ContentType_web_spotlight_root { + return item?.system?.type === 'web_spotlight_root'; +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/index.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/index.ts new file mode 100644 index 00000000..049b09a5 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/content-types/index.ts @@ -0,0 +1,10 @@ +export * from './content_type__content_type_with_special_chars____.js'; +export * from './content_type_circular_reference_type_a_b.js'; +export * from './content_type_circular_reference_type_b____a.js'; +export * from './content_type_content_type_with_all_elements.js'; +export * from './content_type_content_type_with_guidelines_only.js'; +export * from './content_type_content_type_with_snippet_only.js'; +export * from './content_type_empty_content_type.js'; +export * from './content_type_page.js'; +export * from './content_type_type_with_empty_snippet.js'; +export * from './content_type_web_spotlight_root.js'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/index.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/index.ts new file mode 100644 index 00000000..9c462b03 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/index.ts @@ -0,0 +1,4 @@ +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/name-and-file-resolvers/system/core.type.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/core.type.ts new file mode 100644 index 00000000..d6daeac9 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/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/name-and-file-resolvers/system/delivery.codenames.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/delivery.codenames.ts new file mode 100644 index 00000000..d3da6dd1 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/delivery.codenames.ts @@ -0,0 +1,67 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = + | '_content_type_with_special_chars____' + | 'circular_reference_type_a_b' + | 'circular_reference_type_b____a' + | 'content_type_with_all_elements' + | 'content_type_with_guidelines_only' + | 'content_type_with_snippet_only' + | 'empty_content_type' + | 'page' + | 'type_with_empty_snippet' + | 'web_spotlight_root'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default' | 'legacy_collection'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'advanced_workflow' | 'default'; + +/** + * Type representing all taxonomies + */ +export type TaxonomyCodenames = 'taxonomy_a' | 'taxonomy_without_terms'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; + +/** + * Type representing all element codenames across all content types + */ +export type ElementCodenames = + | '_____numberelem_____________________' + | 'asset_element' + | 'content' + | 'custom_element' + | 'date___time_element' + | 'empty_snippet' + | 'guidelines' + | 'items' + | 'linked_items_element' + | 'multiple_choice_element' + | 'number_element' + | 'parrot__' + | 'rich_text_element' + | 'show_in_navigation' + | 'snippet_a__linked_items_with_specific_types' + | 'snippet_a__text' + | 'snippet_a' + | 'subpages' + | 'taxonomy_element' + | 'text_element' + | 'title' + | 'url_slug_element' + | 'url'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/index.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/index.ts new file mode 100644 index 00000000..decb2dcf --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/system/index.ts @@ -0,0 +1,2 @@ +export * from './core.type.js'; +export * from './delivery.codenames.js'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/index.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/index.ts new file mode 100644 index 00000000..dade689e --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/index.ts @@ -0,0 +1,2 @@ +export * from './taxonomy_taxonomy_a.js'; +export * from './taxonomy_taxonomy_without_terms.js'; diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_a.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_a.ts new file mode 100644 index 00000000..2300b9eb --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_a.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export const Taxonomy_taxonomy_aValues = ['nested_term_2', 'nested_term_1', 'term_1', 'term_2', 'term_3'] as const; + +/** + * Type representing Taxonomy A taxonomy + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export type Taxonomy_taxonomy_a = (typeof Taxonomy_taxonomy_aValues)[number]; + +/** + * Type guard for Taxonomy A + * + * Codename: taxonomy_a + * Id: bb37a632-3f78-48f8-ba25-7fa806d41a3e + */ +export function isTaxonomy_taxonomy_a(value: string | undefined | null): value is Taxonomy_taxonomy_a { + return typeof value === 'string' && (Taxonomy_taxonomy_aValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_without_terms.ts b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_without_terms.ts new file mode 100644 index 00000000..759f4d42 --- /dev/null +++ b/tests/integration/snapshots/delivery-sdk/name-and-file-resolvers/taxonomies/taxonomy_taxonomy_without_terms.ts @@ -0,0 +1,25 @@ +/** + * All taxonomy codename values for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export const Taxonomy_taxonomy_without_termsValues = [] as const; + +/** + * Type representing Taxonomy without terms taxonomy + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export type Taxonomy_taxonomy_without_terms = (typeof Taxonomy_taxonomy_without_termsValues)[number]; + +/** + * Type guard for Taxonomy without terms + * + * Codename: taxonomy_without_terms + * Id: 01878d46-fcbc-4211-a801-676ad4e72cb2 + */ +export function isTaxonomy_taxonomy_without_terms(value: string | undefined | null): value is Taxonomy_taxonomy_without_terms { + return typeof value === 'string' && (Taxonomy_taxonomy_without_termsValues as readonly string[]).includes(value); +} diff --git a/tests/integration/snapshots/environment/all-entities-js/_filesList.json b/tests/integration/snapshots/environment/all-entities-js/_filesList.json new file mode 100644 index 00000000..d9f31d04 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/_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/tests/integration/snapshots/environment/all-entities-js/assetFolders.ts b/tests/integration/snapshots/environment/all-entities-js/assetFolders.ts new file mode 100644 index 00000000..3ff32605 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/assetFolders.ts @@ -0,0 +1,45 @@ +export const assetFolders = { + /** + * Folder A + */ + folder_a: { + name: 'Folder A', + codename: 'folder_a', + id: '5cf5c539-6574-4971-b4da-4cd503052f61', + externalId: undefined, + folders: { + /** + * Folder C + */ + folder_c: { + name: 'Folder C', + codename: 'folder_c', + id: 'a829c87a-e627-4d80-af16-2f6c92509452', + externalId: undefined, + folders: { + /** + * Folder D + */ + folder_d: { + name: 'Folder D', + codename: 'folder_d', + id: '8e1edcd2-5b53-4228-aadb-2211ee3ea91e', + externalId: undefined, + folders: {} + } + } + } + } + }, + + /** + * Folder B + */ + folder_b: { + name: 'Folder B', + codename: 'folder_b', + id: '916b6be8-55c3-4a45-80ad-8d860fd7d1f6', + externalId: undefined, + folders: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/collections.ts b/tests/integration/snapshots/environment/all-entities-js/collections.ts new file mode 100644 index 00000000..8549077d --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/collections.ts @@ -0,0 +1,19 @@ +export const collections = { + /** + * Legacy collection + */ + legacy_collection: { + name: 'Legacy collection', + codename: 'legacy_collection', + id: 'cae5e2ff-6f38-4381-aa55-89fdf8427bcf' + }, + + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/contentTypeSnippets.ts b/tests/integration/snapshots/environment/all-entities-js/contentTypeSnippets.ts new file mode 100644 index 00000000..055982ae --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/contentTypeSnippets.ts @@ -0,0 +1,47 @@ +export const contentTypeSnippets = { + /** + * Snippet A + */ + snippet_a: { + name: 'Snippet A', + codename: 'snippet_a', + id: 'b74eb5f6-c851-42f2-9fea-e367d0a3fa61', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * Empty snippet + */ + empty_snippet: { + name: 'Empty snippet', + codename: 'empty_snippet', + id: '1d7e3745-3320-4107-996b-2c6b240df7ae', + externalId: undefined, + elements: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/contentTypes.ts b/tests/integration/snapshots/environment/all-entities-js/contentTypes.ts new file mode 100644 index 00000000..06dc9c2a --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/contentTypes.ts @@ -0,0 +1,466 @@ +export const contentTypes = { + /** + * Content type with snippet only + */ + content_type_with_snippet_only: { + name: 'Content type with snippet only', + codename: 'content_type_with_snippet_only', + id: '7fd86bef-8f30-4a02-a1c3-fb130f65e9b4', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * 🐧 Content type with special chars #!_' + */ + _content_type_with_special_chars____: { + name: '🐧 Content type with special chars #!_', + codename: '_content_type_with_special_chars____', + id: '66bfcb40-edd7-4edf-8176-33517d0d6f80', + externalId: undefined, + elements: { + /** + * 🦜Parrot_emoji (text) + */ + parrot__: { + name: '🦜Parrot_emoji', + codename: 'parrot__', + id: 'cafaa776-893d-4e8c-b460-9534ac2fe769', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ (number) + */ + _____numberelem_____________________: { + name: '!!!_$NumberElem<>-%@&{}()/§`?´=^*#~', + codename: '_____numberelem_____________________', + id: '3bb33958-71f3-4039-8594-5f0df9378dbb', + externalId: undefined, + required: false, + type: 'number' + } + } + }, + + /** + * Circular reference type A > B + */ + circular_reference_type_a_b: { + name: 'Circular reference type A > B', + codename: 'circular_reference_type_a_b', + id: 'a58680f7-0667-4a0e-8dc2-889233bdbf71', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '33ab92dd-e47d-45e2-a060-3b5df0754c24', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Page + */ + page: { + name: 'Page', + codename: 'page', + id: '4db6e2c7-c25b-4896-a05d-d20206234c04', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * URL (url_slug) + */ + url: { + name: 'URL', + codename: 'url', + id: 'e573bfc9-3193-4224-9d2a-9efb83da8849', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Show in navigation (multiple_choice) + */ + show_in_navigation: { + name: 'Show in navigation', + codename: 'show_in_navigation', + id: '07889917-fdc5-4285-bc30-4fed2a218c89', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Yes + */ + yes: { + name: 'Yes', + id: '0878b011-be8d-4a1e-9fc8-d79c9d9176a2', + codename: 'yes', + externalId: undefined + }, + + /** + * No + */ + no: { + name: 'No', + id: 'ae8520bf-72b3-4677-99de-fc99d743019b', + codename: 'no', + externalId: undefined + } + } + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'b909dc5d-0efe-478a-9257-83e5c90e884d', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'dfb0d07c-531e-4eaa-8f7d-e62671d4ca36', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Content type with all elements + */ + content_type_with_all_elements: { + name: 'Content type with all elements', + codename: 'content_type_with_all_elements', + id: '071c7591-e7f0-41ac-984f-7a3db35f97e8', + externalId: undefined, + elements: { + /** + * Text element (text) + * Guidelines: Simple text element guidelines + */ + text_element: { + name: 'Text element', + codename: 'text_element', + id: 'cf24e550-3bbe-4e9d-aee6-e81b9b490228', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Url slug element (url_slug) + */ + url_slug_element: { + name: 'Url slug element', + codename: 'url_slug_element', + id: 'e117d1ae-d985-4df2-b6c7-b3aa03521a00', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Rich text element (rich_text) + */ + rich_text_element: { + name: 'Rich text element', + codename: 'rich_text_element', + id: '81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c', + externalId: undefined, + required: false, + type: 'rich_text' + }, + + /** + * Date & time element (date_time) + */ + date___time_element: { + name: 'Date & time element', + codename: 'date___time_element', + id: '38d5d709-4152-445c-b1ef-333147bd656e', + externalId: undefined, + required: false, + type: 'date_time' + }, + + /** + * Custom element (custom) + */ + custom_element: { + name: 'Custom element', + codename: 'custom_element', + id: '768581f2-7b56-4be3-a8a2-a1850dbe493e', + externalId: undefined, + required: false, + type: 'custom' + }, + + /** + * Linked items element (modular_content) + */ + linked_items_element: { + name: 'Linked items element', + codename: 'linked_items_element', + id: '4631c94d-034c-428a-88bb-cae6d7985ff5', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Asset element (asset) + */ + asset_element: { + name: 'Asset element', + codename: 'asset_element', + id: 'fc99d625-106b-4f95-b37e-7f7be358d3d1', + externalId: undefined, + required: false, + type: 'asset' + }, + + /** + * Multiple choice element (multiple_choice) + */ + multiple_choice_element: { + name: 'Multiple choice element', + codename: 'multiple_choice_element', + id: '709148dd-8c3f-4660-95b8-a72f386dd367', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Option A + */ + option_a: { + name: 'Option A', + id: 'c3f7bfdf-62d8-433b-a3e7-0909bbb28ce1', + codename: 'option_a', + externalId: undefined + }, + + /** + * Option B + */ + option_b: { + name: 'Option B', + id: '66e1a3a8-25ae-4eb6-bbd8-0af6c77b432f', + codename: 'option_b', + externalId: undefined + } + } + }, + + /** + * Number element (number) + */ + number_element: { + name: 'Number element', + codename: 'number_element', + id: '7416ea32-3d33-45bb-bf2a-2226f658e953', + externalId: undefined, + required: false, + type: 'number' + }, + + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Taxonomy A (taxonomy) + */ + taxonomy_element: { + name: 'Taxonomy A', + codename: 'taxonomy_element', + id: '6073dec8-2489-479f-9916-abc055126e59', + externalId: undefined, + required: false, + type: 'taxonomy' + } + } + }, + + /** + * Content type with guidelines only + */ + content_type_with_guidelines_only: { + name: 'Content type with guidelines only', + codename: 'content_type_with_guidelines_only', + id: '7e38a995-b4d7-46c9-92a4-4359241fa5ef', + externalId: undefined, + elements: {} + }, + + /** + * Circular reference type B -> A + */ + circular_reference_type_b____a: { + name: 'Circular reference type B -> A', + codename: 'circular_reference_type_b____a', + id: '919bdcad-fe8e-4f56-9a63-346154b6f6e2', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '019714f7-8c50-492b-8e5c-f7c3d7e2529b', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Empty content type + */ + empty_content_type: { + name: 'Empty content type', + codename: 'empty_content_type', + id: '4e41e105-6ec5-4a08-9680-b85e9cd8b14e', + externalId: undefined, + elements: {} + }, + + /** + * Type with empty snippet + */ + type_with_empty_snippet: { + name: 'Type with empty snippet', + codename: 'type_with_empty_snippet', + id: '11039462-1d7d-4673-9aa8-af07fb53985c', + externalId: undefined, + elements: {} + }, + + /** + * Web spotlight root + */ + web_spotlight_root: { + name: 'Web spotlight root', + codename: 'web_spotlight_root', + id: '7e8ca9f3-7f06-44d6-b9db-ae4905531365', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9d19fa4-4ad3-4b3f-998a-ca392651f7d0', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'e6702a6b-35b8-4a12-acca-1b1361fc926b', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/customApps.ts b/tests/integration/snapshots/environment/all-entities-js/customApps.ts new file mode 100644 index 00000000..becd0e55 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/customApps.ts @@ -0,0 +1,19 @@ +export const customApps = { + /** + * Custom app 1 + */ + customApp1: { + name: 'Custom app 1', + codename: 'custom_app_1', + sourceUrl: 'https://kontent.ai' + }, + + /** + * Custom app 2 + */ + customApp2: { + name: 'Custom app 2', + codename: 'custom_app_2', + sourceUrl: 'https://sample.com/A' + } +} as const; diff --git a/sample/project/index.ts b/tests/integration/snapshots/environment/all-entities-js/index.ts similarity index 75% rename from sample/project/index.ts rename to tests/integration/snapshots/environment/all-entities-js/index.ts index 886cbf6a..d17d053a 100644 --- a/sample/project/index.ts +++ b/tests/integration/snapshots/environment/all-entities-js/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/tests/integration/snapshots/environment/all-entities-js/languages.ts b/tests/integration/snapshots/environment/all-entities-js/languages.ts new file mode 100644 index 00000000..0b55dbab --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/languages.ts @@ -0,0 +1,66 @@ +export const languages = { + /** + * Default project language + */ + default: { + name: 'Default project language', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + isActive: true, + isDefault: true, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * English + */ + enUS: { + name: 'English', + codename: 'en-US', + id: '92b3da35-4f76-4169-be83-dd6ea3e19df4', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * Spanish + */ + esES: { + name: 'Spanish', + codename: 'es-ES', + id: '479cc04e-3cb9-4e4d-962e-8335edb0d42d', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * __jp + */ + jp: { + name: '__jp', + codename: '__jp', + id: '012f5a8a-cd02-4dc0-8967-5fc015cb3ea8', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * 🦉Lang + */ + lang: { + name: '🦉Lang', + codename: '🦉Lang', + id: 'ca74c0e9-be0b-44e9-9d3c-dc2be224df34', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/previewUrls.ts b/tests/integration/snapshots/environment/all-entities-js/previewUrls.ts new file mode 100644 index 00000000..4fc2aecd --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/previewUrls.ts @@ -0,0 +1,37 @@ +export const previewUrls = { + /** + * Preview configuration + */ + spaceDomains: { + default_space: { + spaceName: 'Default space', + spaceCodename: 'default_space', + domain: 'https://sample.com/A' + }, + + uk_space: { + spaceName: 'UK Space', + spaceCodename: 'uk_space', + domain: 'https://sample.com/B' + } + }, + previewUrlPatterns: { + content_type_with_all_elements: { + contentTypeName: 'Content type with all elements', + contentTypeCodename: 'content_type_with_all_elements', + urlPatterns: { + uk_space: { + spaceName: 'UK Space', + spaceCodename: 'uk_space', + url: 'https://sample.com/{codename}' + }, + + default_space: { + spaceName: 'Default space', + spaceCodename: 'default_space', + url: 'https://sample.com/default/{codename}' + } + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/roles.ts b/tests/integration/snapshots/environment/all-entities-js/roles.ts new file mode 100644 index 00000000..1812aedb --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/roles.ts @@ -0,0 +1,19 @@ +export const roles = { + /** + * Project manager + */ + projectManager: { + name: 'Project manager', + codename: 'project-manager', + id: '11e8e88f-30a6-4b53-92d6-46f834753fe0' + }, + + /** + * Editor + */ + editor: { + name: 'Editor', + codename: undefined, + id: '1f84cb35-c8d1-4b08-b5ab-de222c0ee971' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/spaces.ts b/tests/integration/snapshots/environment/all-entities-js/spaces.ts new file mode 100644 index 00000000..58742577 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/spaces.ts @@ -0,0 +1,19 @@ +export const spaces = { + /** + * Default space + */ + defaultSpace: { + name: 'Default space', + codename: 'default_space', + id: '425019d1-b896-4046-b181-7d7676cf5612' + }, + + /** + * UK Space + */ + ukSpace: { + name: 'UK Space', + codename: 'uk_space', + id: '90ddee41-ed12-4ca6-95b7-4aa759b50bcc' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/taxonomies.ts b/tests/integration/snapshots/environment/all-entities-js/taxonomies.ts new file mode 100644 index 00000000..337a30f3 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/taxonomies.ts @@ -0,0 +1,78 @@ +export const taxonomies = { + /** + * taxonomy_a + */ + taxonomy_a: { + name: 'Taxonomy A', + codename: 'taxonomy_a', + externalId: undefined, + id: 'bb37a632-3f78-48f8-ba25-7fa806d41a3e', + terms: { + /** + * Term 1 + */ + term_1: { + name: 'Term 1', + codename: 'term_1', + id: '548654a0-da85-4831-b3e5-8d555566868d', + externalId: undefined, + terms: { + /** + * Nested term 1 + */ + nested_term_1: { + name: 'Nested term 1', + codename: 'nested_term_1', + id: 'a7b82db1-9c20-4d27-963e-66510a397ae0', + externalId: undefined, + terms: { + /** + * Nested term 2 + */ + nested_term_2: { + name: 'Nested term 2', + codename: 'nested_term_2', + id: '1f511bde-5b82-4d3c-afda-8570c6d19d9d', + externalId: undefined, + terms: {} + } + } + } + } + }, + + /** + * Term 2 + */ + term_2: { + name: 'Term 2', + codename: 'term_2', + id: '21be3ed9-10b8-435a-9820-09c1df84e6b3', + externalId: undefined, + terms: {} + }, + + /** + * Term 3 + */ + term_3: { + name: 'Term 3', + codename: 'term_3', + id: 'fa1e16a7-e0b1-4ac9-bdcb-9e8f6ef23593', + externalId: undefined, + terms: {} + } + } + }, + + /** + * taxonomy_without_terms + */ + taxonomy_without_terms: { + name: 'Taxonomy without terms', + codename: 'taxonomy_without_terms', + externalId: undefined, + id: '01878d46-fcbc-4211-a801-676ad4e72cb2', + terms: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/webhooks.ts b/tests/integration/snapshots/environment/all-entities-js/webhooks.ts new file mode 100644 index 00000000..ac3e4a56 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/webhooks.ts @@ -0,0 +1,19 @@ +export const webhooks = { + /** + * Webhook A + */ + webhookA: { + name: 'Webhook A', + url: 'https://sample.ai', + id: 'fb8c5f7f-a46e-432a-8c38-212a05d8c337' + }, + + /** + * Webhook B + */ + webhookB: { + name: 'Webhook B', + url: 'https://kontent.ai', + id: '32bff270-82b2-4848-bfb6-249288f1d7dc' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-js/workflows.ts b/tests/integration/snapshots/environment/all-entities-js/workflows.ts new file mode 100644 index 00000000..d25cbe47 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-js/workflows.ts @@ -0,0 +1,73 @@ +export const workflows = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + steps: { + draft: { + name: 'Draft', + codename: 'draft', + id: 'eee6db3b-545a-4785-8e86-e3772c8756f9' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + }, + + /** + * Advanced workflow + */ + advanced_workflow: { + name: 'Advanced workflow', + codename: 'advanced_workflow', + id: '7f29f522-6acc-4413-961f-822371e77757', + steps: { + draft_b42a7f1: { + name: 'Draft', + codename: 'draft_b42a7f1', + id: 'b42a7f11-430c-4361-94f4-0292edad87f9' + }, + step_1: { + name: 'Step 1', + codename: 'step_1', + id: 'a75b9306-e81d-4aa7-b7cc-a3fdbcabdd5d' + }, + step_2: { + name: 'Step 2', + codename: 'step_2', + id: '08fa314a-420b-4045-bb80-c10ce0bae24d' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/_filesList.json b/tests/integration/snapshots/environment/all-entities-ts/_filesList.json new file mode 100644 index 00000000..d9f31d04 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/_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/tests/integration/snapshots/environment/all-entities-ts/assetFolders.ts b/tests/integration/snapshots/environment/all-entities-ts/assetFolders.ts new file mode 100644 index 00000000..3ff32605 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/assetFolders.ts @@ -0,0 +1,45 @@ +export const assetFolders = { + /** + * Folder A + */ + folder_a: { + name: 'Folder A', + codename: 'folder_a', + id: '5cf5c539-6574-4971-b4da-4cd503052f61', + externalId: undefined, + folders: { + /** + * Folder C + */ + folder_c: { + name: 'Folder C', + codename: 'folder_c', + id: 'a829c87a-e627-4d80-af16-2f6c92509452', + externalId: undefined, + folders: { + /** + * Folder D + */ + folder_d: { + name: 'Folder D', + codename: 'folder_d', + id: '8e1edcd2-5b53-4228-aadb-2211ee3ea91e', + externalId: undefined, + folders: {} + } + } + } + } + }, + + /** + * Folder B + */ + folder_b: { + name: 'Folder B', + codename: 'folder_b', + id: '916b6be8-55c3-4a45-80ad-8d860fd7d1f6', + externalId: undefined, + folders: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/collections.ts b/tests/integration/snapshots/environment/all-entities-ts/collections.ts new file mode 100644 index 00000000..8549077d --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/collections.ts @@ -0,0 +1,19 @@ +export const collections = { + /** + * Legacy collection + */ + legacy_collection: { + name: 'Legacy collection', + codename: 'legacy_collection', + id: 'cae5e2ff-6f38-4381-aa55-89fdf8427bcf' + }, + + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/contentTypeSnippets.ts b/tests/integration/snapshots/environment/all-entities-ts/contentTypeSnippets.ts new file mode 100644 index 00000000..055982ae --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/contentTypeSnippets.ts @@ -0,0 +1,47 @@ +export const contentTypeSnippets = { + /** + * Snippet A + */ + snippet_a: { + name: 'Snippet A', + codename: 'snippet_a', + id: 'b74eb5f6-c851-42f2-9fea-e367d0a3fa61', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * Empty snippet + */ + empty_snippet: { + name: 'Empty snippet', + codename: 'empty_snippet', + id: '1d7e3745-3320-4107-996b-2c6b240df7ae', + externalId: undefined, + elements: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/contentTypes.ts b/tests/integration/snapshots/environment/all-entities-ts/contentTypes.ts new file mode 100644 index 00000000..06dc9c2a --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/contentTypes.ts @@ -0,0 +1,466 @@ +export const contentTypes = { + /** + * Content type with snippet only + */ + content_type_with_snippet_only: { + name: 'Content type with snippet only', + codename: 'content_type_with_snippet_only', + id: '7fd86bef-8f30-4a02-a1c3-fb130f65e9b4', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * 🐧 Content type with special chars #!_' + */ + _content_type_with_special_chars____: { + name: '🐧 Content type with special chars #!_', + codename: '_content_type_with_special_chars____', + id: '66bfcb40-edd7-4edf-8176-33517d0d6f80', + externalId: undefined, + elements: { + /** + * 🦜Parrot_emoji (text) + */ + parrot__: { + name: '🦜Parrot_emoji', + codename: 'parrot__', + id: 'cafaa776-893d-4e8c-b460-9534ac2fe769', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ (number) + */ + _____numberelem_____________________: { + name: '!!!_$NumberElem<>-%@&{}()/§`?´=^*#~', + codename: '_____numberelem_____________________', + id: '3bb33958-71f3-4039-8594-5f0df9378dbb', + externalId: undefined, + required: false, + type: 'number' + } + } + }, + + /** + * Circular reference type A > B + */ + circular_reference_type_a_b: { + name: 'Circular reference type A > B', + codename: 'circular_reference_type_a_b', + id: 'a58680f7-0667-4a0e-8dc2-889233bdbf71', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '33ab92dd-e47d-45e2-a060-3b5df0754c24', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Page + */ + page: { + name: 'Page', + codename: 'page', + id: '4db6e2c7-c25b-4896-a05d-d20206234c04', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * URL (url_slug) + */ + url: { + name: 'URL', + codename: 'url', + id: 'e573bfc9-3193-4224-9d2a-9efb83da8849', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Show in navigation (multiple_choice) + */ + show_in_navigation: { + name: 'Show in navigation', + codename: 'show_in_navigation', + id: '07889917-fdc5-4285-bc30-4fed2a218c89', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Yes + */ + yes: { + name: 'Yes', + id: '0878b011-be8d-4a1e-9fc8-d79c9d9176a2', + codename: 'yes', + externalId: undefined + }, + + /** + * No + */ + no: { + name: 'No', + id: 'ae8520bf-72b3-4677-99de-fc99d743019b', + codename: 'no', + externalId: undefined + } + } + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'b909dc5d-0efe-478a-9257-83e5c90e884d', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'dfb0d07c-531e-4eaa-8f7d-e62671d4ca36', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Content type with all elements + */ + content_type_with_all_elements: { + name: 'Content type with all elements', + codename: 'content_type_with_all_elements', + id: '071c7591-e7f0-41ac-984f-7a3db35f97e8', + externalId: undefined, + elements: { + /** + * Text element (text) + * Guidelines: Simple text element guidelines + */ + text_element: { + name: 'Text element', + codename: 'text_element', + id: 'cf24e550-3bbe-4e9d-aee6-e81b9b490228', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Url slug element (url_slug) + */ + url_slug_element: { + name: 'Url slug element', + codename: 'url_slug_element', + id: 'e117d1ae-d985-4df2-b6c7-b3aa03521a00', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Rich text element (rich_text) + */ + rich_text_element: { + name: 'Rich text element', + codename: 'rich_text_element', + id: '81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c', + externalId: undefined, + required: false, + type: 'rich_text' + }, + + /** + * Date & time element (date_time) + */ + date___time_element: { + name: 'Date & time element', + codename: 'date___time_element', + id: '38d5d709-4152-445c-b1ef-333147bd656e', + externalId: undefined, + required: false, + type: 'date_time' + }, + + /** + * Custom element (custom) + */ + custom_element: { + name: 'Custom element', + codename: 'custom_element', + id: '768581f2-7b56-4be3-a8a2-a1850dbe493e', + externalId: undefined, + required: false, + type: 'custom' + }, + + /** + * Linked items element (modular_content) + */ + linked_items_element: { + name: 'Linked items element', + codename: 'linked_items_element', + id: '4631c94d-034c-428a-88bb-cae6d7985ff5', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Asset element (asset) + */ + asset_element: { + name: 'Asset element', + codename: 'asset_element', + id: 'fc99d625-106b-4f95-b37e-7f7be358d3d1', + externalId: undefined, + required: false, + type: 'asset' + }, + + /** + * Multiple choice element (multiple_choice) + */ + multiple_choice_element: { + name: 'Multiple choice element', + codename: 'multiple_choice_element', + id: '709148dd-8c3f-4660-95b8-a72f386dd367', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Option A + */ + option_a: { + name: 'Option A', + id: 'c3f7bfdf-62d8-433b-a3e7-0909bbb28ce1', + codename: 'option_a', + externalId: undefined + }, + + /** + * Option B + */ + option_b: { + name: 'Option B', + id: '66e1a3a8-25ae-4eb6-bbd8-0af6c77b432f', + codename: 'option_b', + externalId: undefined + } + } + }, + + /** + * Number element (number) + */ + number_element: { + name: 'Number element', + codename: 'number_element', + id: '7416ea32-3d33-45bb-bf2a-2226f658e953', + externalId: undefined, + required: false, + type: 'number' + }, + + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Taxonomy A (taxonomy) + */ + taxonomy_element: { + name: 'Taxonomy A', + codename: 'taxonomy_element', + id: '6073dec8-2489-479f-9916-abc055126e59', + externalId: undefined, + required: false, + type: 'taxonomy' + } + } + }, + + /** + * Content type with guidelines only + */ + content_type_with_guidelines_only: { + name: 'Content type with guidelines only', + codename: 'content_type_with_guidelines_only', + id: '7e38a995-b4d7-46c9-92a4-4359241fa5ef', + externalId: undefined, + elements: {} + }, + + /** + * Circular reference type B -> A + */ + circular_reference_type_b____a: { + name: 'Circular reference type B -> A', + codename: 'circular_reference_type_b____a', + id: '919bdcad-fe8e-4f56-9a63-346154b6f6e2', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '019714f7-8c50-492b-8e5c-f7c3d7e2529b', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Empty content type + */ + empty_content_type: { + name: 'Empty content type', + codename: 'empty_content_type', + id: '4e41e105-6ec5-4a08-9680-b85e9cd8b14e', + externalId: undefined, + elements: {} + }, + + /** + * Type with empty snippet + */ + type_with_empty_snippet: { + name: 'Type with empty snippet', + codename: 'type_with_empty_snippet', + id: '11039462-1d7d-4673-9aa8-af07fb53985c', + externalId: undefined, + elements: {} + }, + + /** + * Web spotlight root + */ + web_spotlight_root: { + name: 'Web spotlight root', + codename: 'web_spotlight_root', + id: '7e8ca9f3-7f06-44d6-b9db-ae4905531365', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9d19fa4-4ad3-4b3f-998a-ca392651f7d0', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'e6702a6b-35b8-4a12-acca-1b1361fc926b', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/customApps.ts b/tests/integration/snapshots/environment/all-entities-ts/customApps.ts new file mode 100644 index 00000000..becd0e55 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/customApps.ts @@ -0,0 +1,19 @@ +export const customApps = { + /** + * Custom app 1 + */ + customApp1: { + name: 'Custom app 1', + codename: 'custom_app_1', + sourceUrl: 'https://kontent.ai' + }, + + /** + * Custom app 2 + */ + customApp2: { + name: 'Custom app 2', + codename: 'custom_app_2', + sourceUrl: 'https://sample.com/A' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/index.ts b/tests/integration/snapshots/environment/all-entities-ts/index.ts new file mode 100644 index 00000000..b413a32e --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/index.ts @@ -0,0 +1,12 @@ +export * from './assetFolders.ts'; +export * from './collections.ts'; +export * from './contentTypes.ts'; +export * from './contentTypeSnippets.ts'; +export * from './customApps.ts'; +export * from './languages.ts'; +export * from './previewUrls.ts'; +export * from './roles.ts'; +export * from './spaces.ts'; +export * from './taxonomies.ts'; +export * from './webhooks.ts'; +export * from './workflows.ts'; diff --git a/tests/integration/snapshots/environment/all-entities-ts/languages.ts b/tests/integration/snapshots/environment/all-entities-ts/languages.ts new file mode 100644 index 00000000..0b55dbab --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/languages.ts @@ -0,0 +1,66 @@ +export const languages = { + /** + * Default project language + */ + default: { + name: 'Default project language', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + isActive: true, + isDefault: true, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * English + */ + enUS: { + name: 'English', + codename: 'en-US', + id: '92b3da35-4f76-4169-be83-dd6ea3e19df4', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * Spanish + */ + esES: { + name: 'Spanish', + codename: 'es-ES', + id: '479cc04e-3cb9-4e4d-962e-8335edb0d42d', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * __jp + */ + jp: { + name: '__jp', + codename: '__jp', + id: '012f5a8a-cd02-4dc0-8967-5fc015cb3ea8', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * 🦉Lang + */ + lang: { + name: '🦉Lang', + codename: '🦉Lang', + id: 'ca74c0e9-be0b-44e9-9d3c-dc2be224df34', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/previewUrls.ts b/tests/integration/snapshots/environment/all-entities-ts/previewUrls.ts new file mode 100644 index 00000000..4fc2aecd --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/previewUrls.ts @@ -0,0 +1,37 @@ +export const previewUrls = { + /** + * Preview configuration + */ + spaceDomains: { + default_space: { + spaceName: 'Default space', + spaceCodename: 'default_space', + domain: 'https://sample.com/A' + }, + + uk_space: { + spaceName: 'UK Space', + spaceCodename: 'uk_space', + domain: 'https://sample.com/B' + } + }, + previewUrlPatterns: { + content_type_with_all_elements: { + contentTypeName: 'Content type with all elements', + contentTypeCodename: 'content_type_with_all_elements', + urlPatterns: { + uk_space: { + spaceName: 'UK Space', + spaceCodename: 'uk_space', + url: 'https://sample.com/{codename}' + }, + + default_space: { + spaceName: 'Default space', + spaceCodename: 'default_space', + url: 'https://sample.com/default/{codename}' + } + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/roles.ts b/tests/integration/snapshots/environment/all-entities-ts/roles.ts new file mode 100644 index 00000000..1812aedb --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/roles.ts @@ -0,0 +1,19 @@ +export const roles = { + /** + * Project manager + */ + projectManager: { + name: 'Project manager', + codename: 'project-manager', + id: '11e8e88f-30a6-4b53-92d6-46f834753fe0' + }, + + /** + * Editor + */ + editor: { + name: 'Editor', + codename: undefined, + id: '1f84cb35-c8d1-4b08-b5ab-de222c0ee971' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/spaces.ts b/tests/integration/snapshots/environment/all-entities-ts/spaces.ts new file mode 100644 index 00000000..58742577 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/spaces.ts @@ -0,0 +1,19 @@ +export const spaces = { + /** + * Default space + */ + defaultSpace: { + name: 'Default space', + codename: 'default_space', + id: '425019d1-b896-4046-b181-7d7676cf5612' + }, + + /** + * UK Space + */ + ukSpace: { + name: 'UK Space', + codename: 'uk_space', + id: '90ddee41-ed12-4ca6-95b7-4aa759b50bcc' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/taxonomies.ts b/tests/integration/snapshots/environment/all-entities-ts/taxonomies.ts new file mode 100644 index 00000000..337a30f3 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/taxonomies.ts @@ -0,0 +1,78 @@ +export const taxonomies = { + /** + * taxonomy_a + */ + taxonomy_a: { + name: 'Taxonomy A', + codename: 'taxonomy_a', + externalId: undefined, + id: 'bb37a632-3f78-48f8-ba25-7fa806d41a3e', + terms: { + /** + * Term 1 + */ + term_1: { + name: 'Term 1', + codename: 'term_1', + id: '548654a0-da85-4831-b3e5-8d555566868d', + externalId: undefined, + terms: { + /** + * Nested term 1 + */ + nested_term_1: { + name: 'Nested term 1', + codename: 'nested_term_1', + id: 'a7b82db1-9c20-4d27-963e-66510a397ae0', + externalId: undefined, + terms: { + /** + * Nested term 2 + */ + nested_term_2: { + name: 'Nested term 2', + codename: 'nested_term_2', + id: '1f511bde-5b82-4d3c-afda-8570c6d19d9d', + externalId: undefined, + terms: {} + } + } + } + } + }, + + /** + * Term 2 + */ + term_2: { + name: 'Term 2', + codename: 'term_2', + id: '21be3ed9-10b8-435a-9820-09c1df84e6b3', + externalId: undefined, + terms: {} + }, + + /** + * Term 3 + */ + term_3: { + name: 'Term 3', + codename: 'term_3', + id: 'fa1e16a7-e0b1-4ac9-bdcb-9e8f6ef23593', + externalId: undefined, + terms: {} + } + } + }, + + /** + * taxonomy_without_terms + */ + taxonomy_without_terms: { + name: 'Taxonomy without terms', + codename: 'taxonomy_without_terms', + externalId: undefined, + id: '01878d46-fcbc-4211-a801-676ad4e72cb2', + terms: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/webhooks.ts b/tests/integration/snapshots/environment/all-entities-ts/webhooks.ts new file mode 100644 index 00000000..ac3e4a56 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/webhooks.ts @@ -0,0 +1,19 @@ +export const webhooks = { + /** + * Webhook A + */ + webhookA: { + name: 'Webhook A', + url: 'https://sample.ai', + id: 'fb8c5f7f-a46e-432a-8c38-212a05d8c337' + }, + + /** + * Webhook B + */ + webhookB: { + name: 'Webhook B', + url: 'https://kontent.ai', + id: '32bff270-82b2-4848-bfb6-249288f1d7dc' + } +} as const; diff --git a/tests/integration/snapshots/environment/all-entities-ts/workflows.ts b/tests/integration/snapshots/environment/all-entities-ts/workflows.ts new file mode 100644 index 00000000..d25cbe47 --- /dev/null +++ b/tests/integration/snapshots/environment/all-entities-ts/workflows.ts @@ -0,0 +1,73 @@ +export const workflows = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + steps: { + draft: { + name: 'Draft', + codename: 'draft', + id: 'eee6db3b-545a-4785-8e86-e3772c8756f9' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + }, + + /** + * Advanced workflow + */ + advanced_workflow: { + name: 'Advanced workflow', + codename: 'advanced_workflow', + id: '7f29f522-6acc-4413-961f-822371e77757', + steps: { + draft_b42a7f1: { + name: 'Draft', + codename: 'draft_b42a7f1', + id: 'b42a7f11-430c-4361-94f4-0292edad87f9' + }, + step_1: { + name: 'Step 1', + codename: 'step_1', + id: 'a75b9306-e81d-4aa7-b7cc-a3fdbcabdd5d' + }, + step_2: { + name: 'Step 2', + codename: 'step_2', + id: '08fa314a-420b-4045-bb80-c10ce0bae24d' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/entities-filter-1/_filesList.json b/tests/integration/snapshots/environment/entities-filter-1/_filesList.json new file mode 100644 index 00000000..e2373ed7 --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-1/_filesList.json @@ -0,0 +1 @@ +[{ "filename": "taxonomies.ts" }, { "filename": "index.ts" }] diff --git a/tests/integration/snapshots/environment/entities-filter-1/index.ts b/tests/integration/snapshots/environment/entities-filter-1/index.ts new file mode 100644 index 00000000..65ef7383 --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-1/index.ts @@ -0,0 +1 @@ +export * from './taxonomies.js'; diff --git a/tests/integration/snapshots/environment/entities-filter-1/taxonomies.ts b/tests/integration/snapshots/environment/entities-filter-1/taxonomies.ts new file mode 100644 index 00000000..337a30f3 --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-1/taxonomies.ts @@ -0,0 +1,78 @@ +export const taxonomies = { + /** + * taxonomy_a + */ + taxonomy_a: { + name: 'Taxonomy A', + codename: 'taxonomy_a', + externalId: undefined, + id: 'bb37a632-3f78-48f8-ba25-7fa806d41a3e', + terms: { + /** + * Term 1 + */ + term_1: { + name: 'Term 1', + codename: 'term_1', + id: '548654a0-da85-4831-b3e5-8d555566868d', + externalId: undefined, + terms: { + /** + * Nested term 1 + */ + nested_term_1: { + name: 'Nested term 1', + codename: 'nested_term_1', + id: 'a7b82db1-9c20-4d27-963e-66510a397ae0', + externalId: undefined, + terms: { + /** + * Nested term 2 + */ + nested_term_2: { + name: 'Nested term 2', + codename: 'nested_term_2', + id: '1f511bde-5b82-4d3c-afda-8570c6d19d9d', + externalId: undefined, + terms: {} + } + } + } + } + }, + + /** + * Term 2 + */ + term_2: { + name: 'Term 2', + codename: 'term_2', + id: '21be3ed9-10b8-435a-9820-09c1df84e6b3', + externalId: undefined, + terms: {} + }, + + /** + * Term 3 + */ + term_3: { + name: 'Term 3', + codename: 'term_3', + id: 'fa1e16a7-e0b1-4ac9-bdcb-9e8f6ef23593', + externalId: undefined, + terms: {} + } + } + }, + + /** + * taxonomy_without_terms + */ + taxonomy_without_terms: { + name: 'Taxonomy without terms', + codename: 'taxonomy_without_terms', + externalId: undefined, + id: '01878d46-fcbc-4211-a801-676ad4e72cb2', + terms: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/entities-filter-2/_filesList.json b/tests/integration/snapshots/environment/entities-filter-2/_filesList.json new file mode 100644 index 00000000..9441365f --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-2/_filesList.json @@ -0,0 +1 @@ +[{ "filename": "contentTypes.ts" }, { "filename": "index.ts" }] diff --git a/tests/integration/snapshots/environment/entities-filter-2/contentTypes.ts b/tests/integration/snapshots/environment/entities-filter-2/contentTypes.ts new file mode 100644 index 00000000..06dc9c2a --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-2/contentTypes.ts @@ -0,0 +1,466 @@ +export const contentTypes = { + /** + * Content type with snippet only + */ + content_type_with_snippet_only: { + name: 'Content type with snippet only', + codename: 'content_type_with_snippet_only', + id: '7fd86bef-8f30-4a02-a1c3-fb130f65e9b4', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * 🐧 Content type with special chars #!_' + */ + _content_type_with_special_chars____: { + name: '🐧 Content type with special chars #!_', + codename: '_content_type_with_special_chars____', + id: '66bfcb40-edd7-4edf-8176-33517d0d6f80', + externalId: undefined, + elements: { + /** + * 🦜Parrot_emoji (text) + */ + parrot__: { + name: '🦜Parrot_emoji', + codename: 'parrot__', + id: 'cafaa776-893d-4e8c-b460-9534ac2fe769', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ (number) + */ + _____numberelem_____________________: { + name: '!!!_$NumberElem<>-%@&{}()/§`?´=^*#~', + codename: '_____numberelem_____________________', + id: '3bb33958-71f3-4039-8594-5f0df9378dbb', + externalId: undefined, + required: false, + type: 'number' + } + } + }, + + /** + * Circular reference type A > B + */ + circular_reference_type_a_b: { + name: 'Circular reference type A > B', + codename: 'circular_reference_type_a_b', + id: 'a58680f7-0667-4a0e-8dc2-889233bdbf71', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '33ab92dd-e47d-45e2-a060-3b5df0754c24', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Page + */ + page: { + name: 'Page', + codename: 'page', + id: '4db6e2c7-c25b-4896-a05d-d20206234c04', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * URL (url_slug) + */ + url: { + name: 'URL', + codename: 'url', + id: 'e573bfc9-3193-4224-9d2a-9efb83da8849', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Show in navigation (multiple_choice) + */ + show_in_navigation: { + name: 'Show in navigation', + codename: 'show_in_navigation', + id: '07889917-fdc5-4285-bc30-4fed2a218c89', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Yes + */ + yes: { + name: 'Yes', + id: '0878b011-be8d-4a1e-9fc8-d79c9d9176a2', + codename: 'yes', + externalId: undefined + }, + + /** + * No + */ + no: { + name: 'No', + id: 'ae8520bf-72b3-4677-99de-fc99d743019b', + codename: 'no', + externalId: undefined + } + } + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'b909dc5d-0efe-478a-9257-83e5c90e884d', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'dfb0d07c-531e-4eaa-8f7d-e62671d4ca36', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Content type with all elements + */ + content_type_with_all_elements: { + name: 'Content type with all elements', + codename: 'content_type_with_all_elements', + id: '071c7591-e7f0-41ac-984f-7a3db35f97e8', + externalId: undefined, + elements: { + /** + * Text element (text) + * Guidelines: Simple text element guidelines + */ + text_element: { + name: 'Text element', + codename: 'text_element', + id: 'cf24e550-3bbe-4e9d-aee6-e81b9b490228', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Url slug element (url_slug) + */ + url_slug_element: { + name: 'Url slug element', + codename: 'url_slug_element', + id: 'e117d1ae-d985-4df2-b6c7-b3aa03521a00', + externalId: undefined, + required: false, + type: 'url_slug' + }, + + /** + * Rich text element (rich_text) + */ + rich_text_element: { + name: 'Rich text element', + codename: 'rich_text_element', + id: '81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c', + externalId: undefined, + required: false, + type: 'rich_text' + }, + + /** + * Date & time element (date_time) + */ + date___time_element: { + name: 'Date & time element', + codename: 'date___time_element', + id: '38d5d709-4152-445c-b1ef-333147bd656e', + externalId: undefined, + required: false, + type: 'date_time' + }, + + /** + * Custom element (custom) + */ + custom_element: { + name: 'Custom element', + codename: 'custom_element', + id: '768581f2-7b56-4be3-a8a2-a1850dbe493e', + externalId: undefined, + required: false, + type: 'custom' + }, + + /** + * Linked items element (modular_content) + */ + linked_items_element: { + name: 'Linked items element', + codename: 'linked_items_element', + id: '4631c94d-034c-428a-88bb-cae6d7985ff5', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Asset element (asset) + */ + asset_element: { + name: 'Asset element', + codename: 'asset_element', + id: 'fc99d625-106b-4f95-b37e-7f7be358d3d1', + externalId: undefined, + required: false, + type: 'asset' + }, + + /** + * Multiple choice element (multiple_choice) + */ + multiple_choice_element: { + name: 'Multiple choice element', + codename: 'multiple_choice_element', + id: '709148dd-8c3f-4660-95b8-a72f386dd367', + externalId: undefined, + required: false, + type: 'multiple_choice', + options: { + /** + * Option A + */ + option_a: { + name: 'Option A', + id: 'c3f7bfdf-62d8-433b-a3e7-0909bbb28ce1', + codename: 'option_a', + externalId: undefined + }, + + /** + * Option B + */ + option_b: { + name: 'Option B', + id: '66e1a3a8-25ae-4eb6-bbd8-0af6c77b432f', + codename: 'option_b', + externalId: undefined + } + } + }, + + /** + * Number element (number) + */ + number_element: { + name: 'Number element', + codename: 'number_element', + id: '7416ea32-3d33-45bb-bf2a-2226f658e953', + externalId: undefined, + required: false, + type: 'number' + }, + + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + }, + + /** + * Taxonomy A (taxonomy) + */ + taxonomy_element: { + name: 'Taxonomy A', + codename: 'taxonomy_element', + id: '6073dec8-2489-479f-9916-abc055126e59', + externalId: undefined, + required: false, + type: 'taxonomy' + } + } + }, + + /** + * Content type with guidelines only + */ + content_type_with_guidelines_only: { + name: 'Content type with guidelines only', + codename: 'content_type_with_guidelines_only', + id: '7e38a995-b4d7-46c9-92a4-4359241fa5ef', + externalId: undefined, + elements: {} + }, + + /** + * Circular reference type B -> A + */ + circular_reference_type_b____a: { + name: 'Circular reference type B -> A', + codename: 'circular_reference_type_b____a', + id: '919bdcad-fe8e-4f56-9a63-346154b6f6e2', + externalId: undefined, + elements: { + /** + * Items (modular_content) + */ + items: { + name: 'Items', + codename: 'items', + id: '019714f7-8c50-492b-8e5c-f7c3d7e2529b', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + }, + + /** + * Empty content type + */ + empty_content_type: { + name: 'Empty content type', + codename: 'empty_content_type', + id: '4e41e105-6ec5-4a08-9680-b85e9cd8b14e', + externalId: undefined, + elements: {} + }, + + /** + * Type with empty snippet + */ + type_with_empty_snippet: { + name: 'Type with empty snippet', + codename: 'type_with_empty_snippet', + id: '11039462-1d7d-4673-9aa8-af07fb53985c', + externalId: undefined, + elements: {} + }, + + /** + * Web spotlight root + */ + web_spotlight_root: { + name: 'Web spotlight root', + codename: 'web_spotlight_root', + id: '7e8ca9f3-7f06-44d6-b9db-ae4905531365', + externalId: undefined, + elements: { + /** + * Title (text) + */ + title: { + name: 'Title', + codename: 'title', + id: 'e9d19fa4-4ad3-4b3f-998a-ca392651f7d0', + externalId: undefined, + required: false, + type: 'text' + }, + + /** + * Subpages (subpages) + */ + subpages: { + name: 'Subpages', + codename: 'subpages', + id: 'e6702a6b-35b8-4a12-acca-1b1361fc926b', + externalId: undefined, + required: false, + type: 'subpages' + }, + + /** + * Content (modular_content) + */ + content: { + name: 'Content', + codename: 'content', + id: 'ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8', + externalId: undefined, + required: false, + type: 'modular_content' + } + } + } +} as const; diff --git a/tests/integration/snapshots/environment/entities-filter-2/index.ts b/tests/integration/snapshots/environment/entities-filter-2/index.ts new file mode 100644 index 00000000..b2652409 --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-2/index.ts @@ -0,0 +1 @@ +export * from './contentTypes.js'; diff --git a/tests/integration/snapshots/environment/entities-filter-3/_filesList.json b/tests/integration/snapshots/environment/entities-filter-3/_filesList.json new file mode 100644 index 00000000..4b1e9bef --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-3/_filesList.json @@ -0,0 +1,6 @@ +[ + { "filename": "languages.ts" }, + { "filename": "contentTypeSnippets.ts" }, + { "filename": "workflows.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/environment/entities-filter-3/contentTypeSnippets.ts b/tests/integration/snapshots/environment/entities-filter-3/contentTypeSnippets.ts new file mode 100644 index 00000000..055982ae --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-3/contentTypeSnippets.ts @@ -0,0 +1,47 @@ +export const contentTypeSnippets = { + /** + * Snippet A + */ + snippet_a: { + name: 'Snippet A', + codename: 'snippet_a', + id: 'b74eb5f6-c851-42f2-9fea-e367d0a3fa61', + externalId: undefined, + elements: { + /** + * Linked items with specific types (modular_content) + */ + snippet_a__linked_items_with_specific_types: { + name: 'Linked items with specific types', + codename: 'snippet_a__linked_items_with_specific_types', + id: '140130dc-84c1-455f-99ab-d31579cf90d1', + externalId: undefined, + required: false, + type: 'modular_content' + }, + + /** + * Text (text) + */ + snippet_a__text: { + name: 'Text', + codename: 'snippet_a__text', + id: '873e4a7a-e2ea-49a0-b88e-2ff7b6892f60', + externalId: undefined, + required: true, + type: 'text' + } + } + }, + + /** + * Empty snippet + */ + empty_snippet: { + name: 'Empty snippet', + codename: 'empty_snippet', + id: '1d7e3745-3320-4107-996b-2c6b240df7ae', + externalId: undefined, + elements: {} + } +} as const; diff --git a/tests/integration/snapshots/environment/entities-filter-3/index.ts b/tests/integration/snapshots/environment/entities-filter-3/index.ts new file mode 100644 index 00000000..d7b31b5f --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-3/index.ts @@ -0,0 +1,3 @@ +export * from './contentTypeSnippets.ts'; +export * from './languages.ts'; +export * from './workflows.ts'; diff --git a/tests/integration/snapshots/environment/entities-filter-3/languages.ts b/tests/integration/snapshots/environment/entities-filter-3/languages.ts new file mode 100644 index 00000000..0b55dbab --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-3/languages.ts @@ -0,0 +1,66 @@ +export const languages = { + /** + * Default project language + */ + default: { + name: 'Default project language', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + isActive: true, + isDefault: true, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * English + */ + enUS: { + name: 'English', + codename: 'en-US', + id: '92b3da35-4f76-4169-be83-dd6ea3e19df4', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * Spanish + */ + esES: { + name: 'Spanish', + codename: 'es-ES', + id: '479cc04e-3cb9-4e4d-962e-8335edb0d42d', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * __jp + */ + jp: { + name: '__jp', + codename: '__jp', + id: '012f5a8a-cd02-4dc0-8967-5fc015cb3ea8', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + }, + + /** + * 🦉Lang + */ + lang: { + name: '🦉Lang', + codename: '🦉Lang', + id: 'ca74c0e9-be0b-44e9-9d3c-dc2be224df34', + isActive: true, + isDefault: false, + fallbackLanguageId: '00000000-0000-0000-0000-000000000000', + externalId: undefined + } +} as const; diff --git a/tests/integration/snapshots/environment/entities-filter-3/workflows.ts b/tests/integration/snapshots/environment/entities-filter-3/workflows.ts new file mode 100644 index 00000000..d25cbe47 --- /dev/null +++ b/tests/integration/snapshots/environment/entities-filter-3/workflows.ts @@ -0,0 +1,73 @@ +export const workflows = { + /** + * Default + */ + default: { + name: 'Default', + codename: 'default', + id: '00000000-0000-0000-0000-000000000000', + steps: { + draft: { + name: 'Draft', + codename: 'draft', + id: 'eee6db3b-545a-4785-8e86-e3772c8756f9' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + }, + + /** + * Advanced workflow + */ + advanced_workflow: { + name: 'Advanced workflow', + codename: 'advanced_workflow', + id: '7f29f522-6acc-4413-961f-822371e77757', + steps: { + draft_b42a7f1: { + name: 'Draft', + codename: 'draft_b42a7f1', + id: 'b42a7f11-430c-4361-94f4-0292edad87f9' + }, + step_1: { + name: 'Step 1', + codename: 'step_1', + id: 'a75b9306-e81d-4aa7-b7cc-a3fdbcabdd5d' + }, + step_2: { + name: 'Step 2', + codename: 'step_2', + id: '08fa314a-420b-4045-bb80-c10ce0bae24d' + }, + scheduled: { + name: 'Scheduled', + codename: 'scheduled', + id: '9d2b0228-4d0d-4c23-8b49-01a698857709' + }, + published: { + name: 'Published', + codename: 'published', + id: 'c199950d-99f0-4983-b711-6c4c91624b22' + }, + archived: { + name: 'Archived', + codename: 'archived', + id: '7a535a69-ad34-47f8-806a-def1fdf4d391' + } + } + } +} as const; diff --git a/tests/integration/snapshots/items/filterByType/_filesList.json b/tests/integration/snapshots/items/filterByType/_filesList.json new file mode 100644 index 00000000..0a61b940 --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/_filesList.json @@ -0,0 +1,7 @@ +[ + { "filename": "items/content_type_with_all_elements.items.ts" }, + { "filename": "items/index.ts" }, + { "filename": "codenames/content_type_with_all_elements.codenames.ts" }, + { "filename": "codenames/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/filterByType/codenames/content_type_with_all_elements.codenames.ts b/tests/integration/snapshots/items/filterByType/codenames/content_type_with_all_elements.codenames.ts new file mode 100644 index 00000000..66742349 --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/codenames/content_type_with_all_elements.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElementsCodenames = 'item_a'; diff --git a/tests/integration/snapshots/items/filterByType/codenames/index.ts b/tests/integration/snapshots/items/filterByType/codenames/index.ts new file mode 100644 index 00000000..7b9a901c --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/codenames/index.ts @@ -0,0 +1 @@ +export * from './content_type_with_all_elements.codenames.js'; diff --git a/tests/integration/snapshots/items/filterByType/index.ts b/tests/integration/snapshots/items/filterByType/index.ts new file mode 100644 index 00000000..2d2e1f95 --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/index.ts @@ -0,0 +1,2 @@ +export * from './codenames/index.js'; +export * from './items/index.js'; diff --git a/tests/integration/snapshots/items/filterByType/items/content_type_with_all_elements.items.ts b/tests/integration/snapshots/items/filterByType/items/content_type_with_all_elements.items.ts new file mode 100644 index 00000000..e350a5cc --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/items/content_type_with_all_elements.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export const content_type_with_all_elementsItems = { + /** + * Item A + */ + item_a: { + codename: 'item_a', + id: 'c9084218-1d6a-4346-8042-f0dff2a4251a' + } +} as const; diff --git a/tests/integration/snapshots/items/filterByType/items/index.ts b/tests/integration/snapshots/items/filterByType/items/index.ts new file mode 100644 index 00000000..fbf05ed2 --- /dev/null +++ b/tests/integration/snapshots/items/filterByType/items/index.ts @@ -0,0 +1 @@ +export * from './content_type_with_all_elements.items.js'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/_filesList.json b/tests/integration/snapshots/items/generateObjectsAndTypes-js/_filesList.json new file mode 100644 index 00000000..e186b7bb --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/_filesList.json @@ -0,0 +1,11 @@ +[ + { "filename": "items/content_type_with_all_elements.items.ts" }, + { "filename": "items/_content_type_with_special_chars____.items.ts" }, + { "filename": "items/web_spotlight_root.items.ts" }, + { "filename": "items/index.ts" }, + { "filename": "codenames/content_type_with_all_elements.codenames.ts" }, + { "filename": "codenames/_content_type_with_special_chars____.codenames.ts" }, + { "filename": "codenames/web_spotlight_root.codenames.ts" }, + { "filename": "codenames/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/_content_type_with_special_chars____.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/_content_type_with_special_chars____.codenames.ts new file mode 100644 index 00000000..d746acb3 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/_content_type_with_special_chars____.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentTypeWithSpecialCharsCodenames = 'item_b' | 'item_c'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/content_type_with_all_elements.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/content_type_with_all_elements.codenames.ts new file mode 100644 index 00000000..66742349 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/content_type_with_all_elements.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElementsCodenames = 'item_a'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/index.ts new file mode 100644 index 00000000..da9413bb --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.codenames.js'; +export * from './content_type_with_all_elements.codenames.js'; +export * from './web_spotlight_root.codenames.js'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/web_spotlight_root.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/web_spotlight_root.codenames.ts new file mode 100644 index 00000000..b7379812 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/codenames/web_spotlight_root.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type WebSpotlightRootCodenames = 'wsl_root'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/index.ts new file mode 100644 index 00000000..2d2e1f95 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/index.ts @@ -0,0 +1,2 @@ +export * from './codenames/index.js'; +export * from './items/index.js'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/_content_type_with_special_chars____.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/_content_type_with_special_chars____.items.ts new file mode 100644 index 00000000..7895ff1c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/_content_type_with_special_chars____.items.ts @@ -0,0 +1,26 @@ +/** + * Object representing identifiers of available items + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export const _content_type_with_special_chars____Items = { + /** + * Item B + */ + item_b: { + codename: 'item_b', + id: '48ab3d74-1e06-4eb1-a49b-975593fa990e' + }, + + /** + * Item C + */ + item_c: { + codename: 'item_c', + id: 'b2f155fa-e2fe-4102-9d20-b3b8465b6c49' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/content_type_with_all_elements.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/content_type_with_all_elements.items.ts new file mode 100644 index 00000000..e350a5cc --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/content_type_with_all_elements.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export const content_type_with_all_elementsItems = { + /** + * Item A + */ + item_a: { + codename: 'item_a', + id: 'c9084218-1d6a-4346-8042-f0dff2a4251a' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/index.ts new file mode 100644 index 00000000..336604d3 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.items.js'; +export * from './content_type_with_all_elements.items.js'; +export * from './web_spotlight_root.items.js'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/web_spotlight_root.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/web_spotlight_root.items.ts new file mode 100644 index 00000000..f3ef488c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-js/items/web_spotlight_root.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export const web_spotlight_rootItems = { + /** + * WSL root + */ + wsl_root: { + codename: 'wsl_root', + id: 'c2d52eb8-30a3-4838-b20c-6ca5aab7e094' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/_filesList.json b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/_filesList.json new file mode 100644 index 00000000..e186b7bb --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/_filesList.json @@ -0,0 +1,11 @@ +[ + { "filename": "items/content_type_with_all_elements.items.ts" }, + { "filename": "items/_content_type_with_special_chars____.items.ts" }, + { "filename": "items/web_spotlight_root.items.ts" }, + { "filename": "items/index.ts" }, + { "filename": "codenames/content_type_with_all_elements.codenames.ts" }, + { "filename": "codenames/_content_type_with_special_chars____.codenames.ts" }, + { "filename": "codenames/web_spotlight_root.codenames.ts" }, + { "filename": "codenames/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/_content_type_with_special_chars____.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/_content_type_with_special_chars____.codenames.ts new file mode 100644 index 00000000..d746acb3 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/_content_type_with_special_chars____.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentTypeWithSpecialCharsCodenames = 'item_b' | 'item_c'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/content_type_with_all_elements.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/content_type_with_all_elements.codenames.ts new file mode 100644 index 00000000..66742349 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/content_type_with_all_elements.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElementsCodenames = 'item_a'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/index.ts new file mode 100644 index 00000000..6162ace9 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.codenames.ts'; +export * from './content_type_with_all_elements.codenames.ts'; +export * from './web_spotlight_root.codenames.ts'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/web_spotlight_root.codenames.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/web_spotlight_root.codenames.ts new file mode 100644 index 00000000..b7379812 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/codenames/web_spotlight_root.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type WebSpotlightRootCodenames = 'wsl_root'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/index.ts new file mode 100644 index 00000000..4a8efd24 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/index.ts @@ -0,0 +1,2 @@ +export * from './codenames/index.ts'; +export * from './items/index.ts'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/_content_type_with_special_chars____.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/_content_type_with_special_chars____.items.ts new file mode 100644 index 00000000..7895ff1c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/_content_type_with_special_chars____.items.ts @@ -0,0 +1,26 @@ +/** + * Object representing identifiers of available items + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export const _content_type_with_special_chars____Items = { + /** + * Item B + */ + item_b: { + codename: 'item_b', + id: '48ab3d74-1e06-4eb1-a49b-975593fa990e' + }, + + /** + * Item C + */ + item_c: { + codename: 'item_c', + id: 'b2f155fa-e2fe-4102-9d20-b3b8465b6c49' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/content_type_with_all_elements.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/content_type_with_all_elements.items.ts new file mode 100644 index 00000000..e350a5cc --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/content_type_with_all_elements.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export const content_type_with_all_elementsItems = { + /** + * Item A + */ + item_a: { + codename: 'item_a', + id: 'c9084218-1d6a-4346-8042-f0dff2a4251a' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/index.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/index.ts new file mode 100644 index 00000000..2568fe06 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.items.ts'; +export * from './content_type_with_all_elements.items.ts'; +export * from './web_spotlight_root.items.ts'; diff --git a/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/web_spotlight_root.items.ts b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/web_spotlight_root.items.ts new file mode 100644 index 00000000..f3ef488c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsAndTypes-ts/items/web_spotlight_root.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export const web_spotlight_rootItems = { + /** + * WSL root + */ + wsl_root: { + codename: 'wsl_root', + id: 'c2d52eb8-30a3-4838-b20c-6ca5aab7e094' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsOnly/_filesList.json b/tests/integration/snapshots/items/generateObjectsOnly/_filesList.json new file mode 100644 index 00000000..444586b2 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/_filesList.json @@ -0,0 +1,7 @@ +[ + { "filename": "items/content_type_with_all_elements.items.ts" }, + { "filename": "items/_content_type_with_special_chars____.items.ts" }, + { "filename": "items/web_spotlight_root.items.ts" }, + { "filename": "items/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/generateObjectsOnly/index.ts b/tests/integration/snapshots/items/generateObjectsOnly/index.ts new file mode 100644 index 00000000..501f6602 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/index.ts @@ -0,0 +1 @@ +export * from './items/index.js'; diff --git a/tests/integration/snapshots/items/generateObjectsOnly/items/_content_type_with_special_chars____.items.ts b/tests/integration/snapshots/items/generateObjectsOnly/items/_content_type_with_special_chars____.items.ts new file mode 100644 index 00000000..7895ff1c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/items/_content_type_with_special_chars____.items.ts @@ -0,0 +1,26 @@ +/** + * Object representing identifiers of available items + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export const _content_type_with_special_chars____Items = { + /** + * Item B + */ + item_b: { + codename: 'item_b', + id: '48ab3d74-1e06-4eb1-a49b-975593fa990e' + }, + + /** + * Item C + */ + item_c: { + codename: 'item_c', + id: 'b2f155fa-e2fe-4102-9d20-b3b8465b6c49' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsOnly/items/content_type_with_all_elements.items.ts b/tests/integration/snapshots/items/generateObjectsOnly/items/content_type_with_all_elements.items.ts new file mode 100644 index 00000000..e350a5cc --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/items/content_type_with_all_elements.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export const content_type_with_all_elementsItems = { + /** + * Item A + */ + item_a: { + codename: 'item_a', + id: 'c9084218-1d6a-4346-8042-f0dff2a4251a' + } +} as const; diff --git a/tests/integration/snapshots/items/generateObjectsOnly/items/index.ts b/tests/integration/snapshots/items/generateObjectsOnly/items/index.ts new file mode 100644 index 00000000..336604d3 --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/items/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.items.js'; +export * from './content_type_with_all_elements.items.js'; +export * from './web_spotlight_root.items.js'; diff --git a/tests/integration/snapshots/items/generateObjectsOnly/items/web_spotlight_root.items.ts b/tests/integration/snapshots/items/generateObjectsOnly/items/web_spotlight_root.items.ts new file mode 100644 index 00000000..f3ef488c --- /dev/null +++ b/tests/integration/snapshots/items/generateObjectsOnly/items/web_spotlight_root.items.ts @@ -0,0 +1,18 @@ +/** + * Object representing identifiers of available items + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export const web_spotlight_rootItems = { + /** + * WSL root + */ + wsl_root: { + codename: 'wsl_root', + id: 'c2d52eb8-30a3-4838-b20c-6ca5aab7e094' + } +} as const; diff --git a/tests/integration/snapshots/items/generateTypessOnly/_filesList.json b/tests/integration/snapshots/items/generateTypessOnly/_filesList.json new file mode 100644 index 00000000..c446e8ce --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/_filesList.json @@ -0,0 +1,7 @@ +[ + { "filename": "codenames/content_type_with_all_elements.codenames.ts" }, + { "filename": "codenames/_content_type_with_special_chars____.codenames.ts" }, + { "filename": "codenames/web_spotlight_root.codenames.ts" }, + { "filename": "codenames/index.ts" }, + { "filename": "index.ts" } +] diff --git a/tests/integration/snapshots/items/generateTypessOnly/codenames/_content_type_with_special_chars____.codenames.ts b/tests/integration/snapshots/items/generateTypessOnly/codenames/_content_type_with_special_chars____.codenames.ts new file mode 100644 index 00000000..d746acb3 --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/codenames/_content_type_with_special_chars____.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + * Codename: _content_type_with_special_chars____ + */ +export type ContentTypeWithSpecialCharsCodenames = 'item_b' | 'item_c'; diff --git a/tests/integration/snapshots/items/generateTypessOnly/codenames/content_type_with_all_elements.codenames.ts b/tests/integration/snapshots/items/generateTypessOnly/codenames/content_type_with_all_elements.codenames.ts new file mode 100644 index 00000000..66742349 --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/codenames/content_type_with_all_elements.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + * Codename: content_type_with_all_elements + */ +export type ContentTypeWithAllElementsCodenames = 'item_a'; diff --git a/tests/integration/snapshots/items/generateTypessOnly/codenames/index.ts b/tests/integration/snapshots/items/generateTypessOnly/codenames/index.ts new file mode 100644 index 00000000..da9413bb --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/codenames/index.ts @@ -0,0 +1,3 @@ +export * from './_content_type_with_special_chars____.codenames.js'; +export * from './content_type_with_all_elements.codenames.js'; +export * from './web_spotlight_root.codenames.js'; diff --git a/tests/integration/snapshots/items/generateTypessOnly/codenames/web_spotlight_root.codenames.ts b/tests/integration/snapshots/items/generateTypessOnly/codenames/web_spotlight_root.codenames.ts new file mode 100644 index 00000000..b7379812 --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/codenames/web_spotlight_root.codenames.ts @@ -0,0 +1,10 @@ +/** + * Type representing available item codenames + * + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + * Codename: web_spotlight_root + */ +export type WebSpotlightRootCodenames = 'wsl_root'; diff --git a/tests/integration/snapshots/items/generateTypessOnly/index.ts b/tests/integration/snapshots/items/generateTypessOnly/index.ts new file mode 100644 index 00000000..7e8f46a9 --- /dev/null +++ b/tests/integration/snapshots/items/generateTypessOnly/index.ts @@ -0,0 +1 @@ +export * from './codenames/index.js'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/_filesList.json b/tests/integration/snapshots/migration-toolkit/basic-js/_filesList.json new file mode 100644 index 00000000..babf6d7f --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/_filesList.json @@ -0,0 +1,17 @@ +[ + { "filename": "content-types/content_type_with_snippet_only.ts" }, + { "filename": "content-types/_content_type_with_special_chars____.ts" }, + { "filename": "content-types/circular_reference_type_a_b.ts" }, + { "filename": "content-types/page.ts" }, + { "filename": "content-types/content_type_with_all_elements.ts" }, + { "filename": "content-types/content_type_with_guidelines_only.ts" }, + { "filename": "content-types/circular_reference_type_b____a.ts" }, + { "filename": "content-types/empty_content_type.ts" }, + { "filename": "content-types/type_with_empty_snippet.ts" }, + { "filename": "content-types/web_spotlight_root.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/basic-js/content-types/_content_type_with_special_chars____.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/_content_type_with_special_chars____.ts new file mode 100644 index 00000000..9355f1e5 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/_content_type_with_special_chars____.ts @@ -0,0 +1,33 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + */ +export type ContentTypeWithSpecialCharsItem = CoreMigrationItem< + '_content_type_with_special_chars____', + { + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: MigrationElementModels.TextElement; + + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: MigrationElementModels.NumberElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_a_b.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_a_b.ts new file mode 100644 index 00000000..f5efab61 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_a_b.ts @@ -0,0 +1,23 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Circular reference type A > B + * + * Codename: circular_reference_type_a_b + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + */ +export type CircularReferenceTypeABItem = CoreMigrationItem< + 'circular_reference_type_a_b', + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_b____a.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_b____a.ts new file mode 100644 index 00000000..7940549c --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/circular_reference_type_b____a.ts @@ -0,0 +1,23 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Circular reference type B -> A + * + * Codename: circular_reference_type_b____a + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + */ +export type CircularReferenceTypeBAItem = CoreMigrationItem< + 'circular_reference_type_b____a', + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_all_elements.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_all_elements.ts new file mode 100644 index 00000000..9d2d6874 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_all_elements.ts @@ -0,0 +1,134 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + */ +export type ContentTypeWithAllElementsItem = CoreMigrationItem< + 'content_type_with_all_elements', + { + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 + * Guidelines: Simple text element guidelines + */ + readonly text_element: MigrationElementModels.TextElement; + + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: MigrationElementModels.UrlSlugElement; + + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: MigrationElementModels.RichTextElement; + + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: MigrationElementModels.DateTimeElement; + + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: MigrationElementModels.CustomElement; + + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: MigrationElementModels.LinkedItemsElement; + + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: MigrationElementModels.AssetElement; + + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: MigrationElementModels.MultipleChoiceElement; + + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: MigrationElementModels.NumberElement; + + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: MigrationElementModels.LinkedItemsElement; + + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: MigrationElementModels.TextElement; + + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: MigrationElementModels.TaxonomyElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_guidelines_only.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_guidelines_only.ts new file mode 100644 index 00000000..49c75593 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_guidelines_only.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Content type with guidelines only + * + * Codename: content_type_with_guidelines_only + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + */ +export type ContentTypeWithGuidelinesOnlyItem = CoreMigrationItem<'content_type_with_guidelines_only', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_snippet_only.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_snippet_only.ts new file mode 100644 index 00000000..33f76e35 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/content_type_with_snippet_only.ts @@ -0,0 +1,33 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Content type with snippet only + * + * Codename: content_type_with_snippet_only + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + */ +export type ContentTypeWithSnippetOnlyItem = CoreMigrationItem< + 'content_type_with_snippet_only', + { + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: MigrationElementModels.LinkedItemsElement; + + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: MigrationElementModels.TextElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/empty_content_type.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/empty_content_type.ts new file mode 100644 index 00000000..5f0854b2 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/empty_content_type.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Empty content type + * + * Codename: empty_content_type + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + */ +export type EmptyContentTypeItem = CoreMigrationItem<'empty_content_type', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/index.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/index.ts new file mode 100644 index 00000000..208916f2 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/index.ts @@ -0,0 +1,10 @@ +export * from './_content_type_with_special_chars____.js'; +export * from './circular_reference_type_a_b.js'; +export * from './circular_reference_type_b____a.js'; +export * from './content_type_with_all_elements.js'; +export * from './content_type_with_guidelines_only.js'; +export * from './content_type_with_snippet_only.js'; +export * from './empty_content_type.js'; +export * from './page.js'; +export * from './type_with_empty_snippet.js'; +export * from './web_spotlight_root.js'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/page.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/page.ts new file mode 100644 index 00000000..a77aa38d --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/page.ts @@ -0,0 +1,63 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Page + * + * Codename: page + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + */ +export type PageItem = CoreMigrationItem< + 'page', + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: MigrationElementModels.TextElement; + + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: MigrationElementModels.UrlSlugElement; + + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: MigrationElementModels.MultipleChoiceElement; + + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: MigrationElementModels.SubpagesElement; + + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/type_with_empty_snippet.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/type_with_empty_snippet.ts new file mode 100644 index 00000000..01d9620f --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/type_with_empty_snippet.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Type with empty snippet + * + * Codename: type_with_empty_snippet + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + */ +export type TypeWithEmptySnippetItem = CoreMigrationItem<'type_with_empty_snippet', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/content-types/web_spotlight_root.ts b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/web_spotlight_root.ts new file mode 100644 index 00000000..03472df9 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/content-types/web_spotlight_root.ts @@ -0,0 +1,43 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.js'; + +/** + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + */ +export type WebSpotlightRootItem = CoreMigrationItem< + 'web_spotlight_root', + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: MigrationElementModels.TextElement; + + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: MigrationElementModels.SubpagesElement; + + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/environment/environment.ts b/tests/integration/snapshots/migration-toolkit/basic-js/environment/environment.ts new file mode 100644 index 00000000..860b32f0 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/environment/environment.ts @@ -0,0 +1,34 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = + | '_content_type_with_special_chars____' + | 'circular_reference_type_a_b' + | 'circular_reference_type_b____a' + | 'content_type_with_all_elements' + | 'content_type_with_guidelines_only' + | 'content_type_with_snippet_only' + | 'empty_content_type' + | 'page' + | 'type_with_empty_snippet' + | 'web_spotlight_root'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default' | 'legacy_collection'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'advanced_workflow' | 'default'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/environment/index.ts b/tests/integration/snapshots/migration-toolkit/basic-js/environment/index.ts new file mode 100644 index 00000000..b63b4732 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/environment/index.ts @@ -0,0 +1 @@ +export * from './environment.js'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-js/index.ts b/tests/integration/snapshots/migration-toolkit/basic-js/index.ts new file mode 100644 index 00000000..eb4a6241 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/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/basic-js/migration.ts b/tests/integration/snapshots/migration-toolkit/basic-js/migration.ts new file mode 100644 index 00000000..363810be --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-js/migration.ts @@ -0,0 +1,26 @@ +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 CoreMigrationItemSystem = MigrationItemSystem< + TCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames +>; + +/** + * Item object shared by all individual content type models + */ +export type CoreMigrationItem< + TCodename extends ContentTypeCodenames, + TElements extends MigrationElements = MigrationElements +> = MigrationItem, WorkflowStepCodenames>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/_filesList.json b/tests/integration/snapshots/migration-toolkit/basic-ts/_filesList.json new file mode 100644 index 00000000..babf6d7f --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/_filesList.json @@ -0,0 +1,17 @@ +[ + { "filename": "content-types/content_type_with_snippet_only.ts" }, + { "filename": "content-types/_content_type_with_special_chars____.ts" }, + { "filename": "content-types/circular_reference_type_a_b.ts" }, + { "filename": "content-types/page.ts" }, + { "filename": "content-types/content_type_with_all_elements.ts" }, + { "filename": "content-types/content_type_with_guidelines_only.ts" }, + { "filename": "content-types/circular_reference_type_b____a.ts" }, + { "filename": "content-types/empty_content_type.ts" }, + { "filename": "content-types/type_with_empty_snippet.ts" }, + { "filename": "content-types/web_spotlight_root.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/basic-ts/content-types/_content_type_with_special_chars____.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/_content_type_with_special_chars____.ts new file mode 100644 index 00000000..53dc68f1 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/_content_type_with_special_chars____.ts @@ -0,0 +1,33 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * 🐧 Content type with special chars #!_' + * + * Codename: _content_type_with_special_chars____ + * Id: 66bfcb40-edd7-4edf-8176-33517d0d6f80 + */ +export type ContentTypeWithSpecialCharsItem = CoreMigrationItem< + '_content_type_with_special_chars____', + { + /** + * 🦜Parrot_emoji + * + * Type: text + * Required: false + * Codename: parrot__ + * Id: cafaa776-893d-4e8c-b460-9534ac2fe769 + */ + readonly parrot__: MigrationElementModels.TextElement; + + /** + * !!!_$NumberElem<>-%@&{}()/§'`?´=^*#~ + * + * Type: number + * Required: false + * Codename: _____numberelem_____________________ + * Id: 3bb33958-71f3-4039-8594-5f0df9378dbb + */ + readonly _____numberelem_____________________: MigrationElementModels.NumberElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_a_b.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_a_b.ts new file mode 100644 index 00000000..2ce0ef41 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_a_b.ts @@ -0,0 +1,23 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Circular reference type A > B + * + * Codename: circular_reference_type_a_b + * Id: a58680f7-0667-4a0e-8dc2-889233bdbf71 + */ +export type CircularReferenceTypeABItem = CoreMigrationItem< + 'circular_reference_type_a_b', + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 33ab92dd-e47d-45e2-a060-3b5df0754c24 + */ + readonly items: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_b____a.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_b____a.ts new file mode 100644 index 00000000..a774c00c --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/circular_reference_type_b____a.ts @@ -0,0 +1,23 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Circular reference type B -> A + * + * Codename: circular_reference_type_b____a + * Id: 919bdcad-fe8e-4f56-9a63-346154b6f6e2 + */ +export type CircularReferenceTypeBAItem = CoreMigrationItem< + 'circular_reference_type_b____a', + { + /** + * Items + * + * Type: modular_content + * Required: false + * Codename: items + * Id: 019714f7-8c50-492b-8e5c-f7c3d7e2529b + */ + readonly items: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_all_elements.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_all_elements.ts new file mode 100644 index 00000000..053fd60c --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_all_elements.ts @@ -0,0 +1,134 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Content type with all elements + * + * Codename: content_type_with_all_elements + * Id: 071c7591-e7f0-41ac-984f-7a3db35f97e8 + */ +export type ContentTypeWithAllElementsItem = CoreMigrationItem< + 'content_type_with_all_elements', + { + /** + * Text element + * + * Type: text + * Required: true + * Codename: text_element + * Id: cf24e550-3bbe-4e9d-aee6-e81b9b490228 + * Guidelines: Simple text element guidelines + */ + readonly text_element: MigrationElementModels.TextElement; + + /** + * Url slug element + * + * Type: url_slug + * Required: false + * Codename: url_slug_element + * Id: e117d1ae-d985-4df2-b6c7-b3aa03521a00 + */ + readonly url_slug_element: MigrationElementModels.UrlSlugElement; + + /** + * Rich text element + * + * Type: rich_text + * Required: false + * Codename: rich_text_element + * Id: 81ee0883-8c1b-49cc-8d11-2fd1dcf75c5c + */ + readonly rich_text_element: MigrationElementModels.RichTextElement; + + /** + * Date & time element + * + * Type: date_time + * Required: false + * Codename: date___time_element + * Id: 38d5d709-4152-445c-b1ef-333147bd656e + */ + readonly date___time_element: MigrationElementModels.DateTimeElement; + + /** + * Custom element + * + * Type: custom + * Required: false + * Codename: custom_element + * Id: 768581f2-7b56-4be3-a8a2-a1850dbe493e + */ + readonly custom_element: MigrationElementModels.CustomElement; + + /** + * Linked items element + * + * Type: modular_content + * Required: false + * Codename: linked_items_element + * Id: 4631c94d-034c-428a-88bb-cae6d7985ff5 + */ + readonly linked_items_element: MigrationElementModels.LinkedItemsElement; + + /** + * Asset element + * + * Type: asset + * Required: false + * Codename: asset_element + * Id: fc99d625-106b-4f95-b37e-7f7be358d3d1 + */ + readonly asset_element: MigrationElementModels.AssetElement; + + /** + * Multiple choice element + * + * Type: multiple_choice + * Required: false + * Codename: multiple_choice_element + * Id: 709148dd-8c3f-4660-95b8-a72f386dd367 + */ + readonly multiple_choice_element: MigrationElementModels.MultipleChoiceElement; + + /** + * Number element + * + * Type: number + * Required: false + * Codename: number_element + * Id: 7416ea32-3d33-45bb-bf2a-2226f658e953 + */ + readonly number_element: MigrationElementModels.NumberElement; + + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: MigrationElementModels.LinkedItemsElement; + + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: MigrationElementModels.TextElement; + + /** + * Taxonomy A + * + * Type: taxonomy + * Required: false + * Codename: taxonomy_element + * Id: 6073dec8-2489-479f-9916-abc055126e59 + */ + readonly taxonomy_element: MigrationElementModels.TaxonomyElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_guidelines_only.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_guidelines_only.ts new file mode 100644 index 00000000..fc13697e --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_guidelines_only.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Content type with guidelines only + * + * Codename: content_type_with_guidelines_only + * Id: 7e38a995-b4d7-46c9-92a4-4359241fa5ef + */ +export type ContentTypeWithGuidelinesOnlyItem = CoreMigrationItem<'content_type_with_guidelines_only', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_snippet_only.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_snippet_only.ts new file mode 100644 index 00000000..27e0186f --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/content_type_with_snippet_only.ts @@ -0,0 +1,33 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Content type with snippet only + * + * Codename: content_type_with_snippet_only + * Id: 7fd86bef-8f30-4a02-a1c3-fb130f65e9b4 + */ +export type ContentTypeWithSnippetOnlyItem = CoreMigrationItem< + 'content_type_with_snippet_only', + { + /** + * Linked items with specific types + * + * Type: modular_content + * Required: false + * Codename: snippet_a__linked_items_with_specific_types + * Id: 140130dc-84c1-455f-99ab-d31579cf90d1 + */ + readonly snippet_a__linked_items_with_specific_types: MigrationElementModels.LinkedItemsElement; + + /** + * Text + * + * Type: text + * Required: true + * Codename: snippet_a__text + * Id: 873e4a7a-e2ea-49a0-b88e-2ff7b6892f60 + */ + readonly snippet_a__text: MigrationElementModels.TextElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/empty_content_type.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/empty_content_type.ts new file mode 100644 index 00000000..264fcf41 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/empty_content_type.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Empty content type + * + * Codename: empty_content_type + * Id: 4e41e105-6ec5-4a08-9680-b85e9cd8b14e + */ +export type EmptyContentTypeItem = CoreMigrationItem<'empty_content_type', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/index.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/index.ts new file mode 100644 index 00000000..e1c2761a --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/index.ts @@ -0,0 +1,10 @@ +export * from './_content_type_with_special_chars____.ts'; +export * from './circular_reference_type_a_b.ts'; +export * from './circular_reference_type_b____a.ts'; +export * from './content_type_with_all_elements.ts'; +export * from './content_type_with_guidelines_only.ts'; +export * from './content_type_with_snippet_only.ts'; +export * from './empty_content_type.ts'; +export * from './page.ts'; +export * from './type_with_empty_snippet.ts'; +export * from './web_spotlight_root.ts'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/page.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/page.ts new file mode 100644 index 00000000..fbbca63a --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/page.ts @@ -0,0 +1,63 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Page + * + * Codename: page + * Id: 4db6e2c7-c25b-4896-a05d-d20206234c04 + */ +export type PageItem = CoreMigrationItem< + 'page', + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9ad8c8f-6fb0-41d2-8caa-4e4e0ba24719 + */ + readonly title: MigrationElementModels.TextElement; + + /** + * URL + * + * Type: url_slug + * Required: false + * Codename: url + * Id: e573bfc9-3193-4224-9d2a-9efb83da8849 + */ + readonly url: MigrationElementModels.UrlSlugElement; + + /** + * Show in navigation + * + * Type: multiple_choice + * Required: false + * Codename: show_in_navigation + * Id: 07889917-fdc5-4285-bc30-4fed2a218c89 + */ + readonly show_in_navigation: MigrationElementModels.MultipleChoiceElement; + + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: b909dc5d-0efe-478a-9257-83e5c90e884d + */ + readonly subpages: MigrationElementModels.SubpagesElement; + + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: dfb0d07c-531e-4eaa-8f7d-e62671d4ca36 + */ + readonly content: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/type_with_empty_snippet.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/type_with_empty_snippet.ts new file mode 100644 index 00000000..f6251c3a --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/type_with_empty_snippet.ts @@ -0,0 +1,9 @@ +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Type with empty snippet + * + * Codename: type_with_empty_snippet + * Id: 11039462-1d7d-4673-9aa8-af07fb53985c + */ +export type TypeWithEmptySnippetItem = CoreMigrationItem<'type_with_empty_snippet', Record>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/web_spotlight_root.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/web_spotlight_root.ts new file mode 100644 index 00000000..51705d5e --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/content-types/web_spotlight_root.ts @@ -0,0 +1,43 @@ +import type { MigrationElementModels } from '@kontent-ai/migration-toolkit'; +import type { CoreMigrationItem } from '../migration.ts'; + +/** + * Web spotlight root + * + * Codename: web_spotlight_root + * Id: 7e8ca9f3-7f06-44d6-b9db-ae4905531365 + */ +export type WebSpotlightRootItem = CoreMigrationItem< + 'web_spotlight_root', + { + /** + * Title + * + * Type: text + * Required: false + * Codename: title + * Id: e9d19fa4-4ad3-4b3f-998a-ca392651f7d0 + */ + readonly title: MigrationElementModels.TextElement; + + /** + * Subpages + * + * Type: subpages + * Required: false + * Codename: subpages + * Id: e6702a6b-35b8-4a12-acca-1b1361fc926b + */ + readonly subpages: MigrationElementModels.SubpagesElement; + + /** + * Content + * + * Type: modular_content + * Required: false + * Codename: content + * Id: ad185ebb-c7ec-4b89-bf89-4b415b5e0ca8 + */ + readonly content: MigrationElementModels.LinkedItemsElement; + } +>; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/environment/environment.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/environment/environment.ts new file mode 100644 index 00000000..860b32f0 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/environment/environment.ts @@ -0,0 +1,34 @@ +/** + * Type representing all languages + */ +export type LanguageCodenames = '__jp' | '🦉Lang' | 'default' | 'en-US' | 'es-ES'; + +/** + * Type representing all content types + */ +export type ContentTypeCodenames = + | '_content_type_with_special_chars____' + | 'circular_reference_type_a_b' + | 'circular_reference_type_b____a' + | 'content_type_with_all_elements' + | 'content_type_with_guidelines_only' + | 'content_type_with_snippet_only' + | 'empty_content_type' + | 'page' + | 'type_with_empty_snippet' + | 'web_spotlight_root'; + +/** + * Type representing all collections + */ +export type CollectionCodenames = 'default' | 'legacy_collection'; + +/** + * Type representing all workflows + */ +export type WorkflowCodenames = 'advanced_workflow' | 'default'; + +/** + * Type representing all worksflow steps across all workflows + */ +export type WorkflowStepCodenames = 'archived' | 'draft_b42a7f1' | 'draft' | 'published' | 'scheduled' | 'step_1' | 'step_2'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/environment/index.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/environment/index.ts new file mode 100644 index 00000000..85a2b71b --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/environment/index.ts @@ -0,0 +1 @@ +export * from './environment.ts'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/index.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/index.ts new file mode 100644 index 00000000..0a589af7 --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/index.ts @@ -0,0 +1,3 @@ +export * from './content-types/index.ts'; +export * from './environment/index.ts'; +export * from './migration.ts'; diff --git a/tests/integration/snapshots/migration-toolkit/basic-ts/migration.ts b/tests/integration/snapshots/migration-toolkit/basic-ts/migration.ts new file mode 100644 index 00000000..954c656b --- /dev/null +++ b/tests/integration/snapshots/migration-toolkit/basic-ts/migration.ts @@ -0,0 +1,26 @@ +import type { MigrationItem, MigrationItemSystem, MigrationElements } from '@kontent-ai/migration-toolkit'; +import type { + CollectionCodenames, + ContentTypeCodenames, + LanguageCodenames, + WorkflowCodenames, + WorkflowStepCodenames +} from './environment/environment.ts'; + +/** + * System object shared by all individual content type models + */ +export type CoreMigrationItemSystem = MigrationItemSystem< + TCodename, + LanguageCodenames, + CollectionCodenames, + WorkflowCodenames +>; + +/** + * Item object shared by all individual content type models + */ +export type CoreMigrationItem< + TCodename extends ContentTypeCodenames, + TElements extends MigrationElements = MigrationElements +> = MigrationItem, WorkflowStepCodenames>; diff --git a/tests/integration/test-cases/delivery-sdk-snapshots.ts b/tests/integration/test-cases/delivery-sdk-snapshots.ts new file mode 100644 index 00000000..36e58576 --- /dev/null +++ b/tests/integration/test-cases/delivery-sdk-snapshots.ts @@ -0,0 +1,68 @@ +import { generateDeliveryModelsAsync } from '../../../lib/public_api.js'; +import { integrationEnv, type SnapshotModelsTest } from '../integration-tests.config.js'; + +export const deliverySdkSnapshots: readonly SnapshotModelsTest[] = [ + { + cliAction: 'delivery-sdk', + folder: 'basic-js', + getFilesAsync: async () => + await generateDeliveryModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js' + }) + }, + { + cliAction: 'delivery-sdk', + folder: 'basic-ts', + getFilesAsync: async () => + await generateDeliveryModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'ts' + }) + }, + { + cliAction: 'delivery-sdk', + folder: 'name-and-file-resolvers', + getFilesAsync: async () => + await generateDeliveryModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + nameResolvers: { + contentType: (item) => `ContentType_${item.codename}`, + snippet: (item) => `Snippet_${item.codename}`, + taxonomy: (item) => `Taxonomy_${item.codename}` + }, + fileResolvers: { + contentType: (item) => `content_type_${item.codename}`, + snippet: (item) => `snippet_${item.codename}`, + taxonomy: (item) => `taxonomy_${item.codename}` + } + }) + }, + { + cliAction: 'delivery-sdk', + folder: 'custom-format-options', + getFilesAsync: async () => + await generateDeliveryModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + formatOptions: { + printWidth: 300, + bracketSameLine: true, + tabWidth: 8 + } + }) + } +]; diff --git a/tests/integration/test-cases/environment-snapshots.ts b/tests/integration/test-cases/environment-snapshots.ts new file mode 100644 index 00000000..eaa77bf6 --- /dev/null +++ b/tests/integration/test-cases/environment-snapshots.ts @@ -0,0 +1,68 @@ +import { generateEnvironmentModelsAsync } from '../../../lib/public_api.js'; +import { integrationEnv, type SnapshotModelsTest } from '../integration-tests.config.js'; + +export const environmentSnapshots: readonly SnapshotModelsTest[] = [ + { + cliAction: 'environment', + folder: 'all-entities-js', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js' + }) + }, + { + cliAction: 'environment', + folder: 'all-entities-ts', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'ts' + }) + }, + { + cliAction: 'environment', + folder: 'entities-filter-1', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + entities: ['taxonomies'] + }) + }, + { + cliAction: 'environment', + folder: 'entities-filter-2', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + entities: ['contentTypes'] + }) + }, + { + cliAction: 'environment', + folder: 'entities-filter-3', + getFilesAsync: async () => + await generateEnvironmentModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'ts', + entities: ['languages', 'snippets', 'workflows'] + }) + } +]; diff --git a/tests/integration/test-cases/items-snapshots.ts b/tests/integration/test-cases/items-snapshots.ts new file mode 100644 index 00000000..903ba97e --- /dev/null +++ b/tests/integration/test-cases/items-snapshots.ts @@ -0,0 +1,85 @@ +import { generateItemsAsync } from '../../../lib/public_api.js'; +import { integrationEnv, type SnapshotModelsTest } from '../integration-tests.config.js'; + +export const itemsSnapshots: readonly SnapshotModelsTest[] = [ + { + cliAction: 'items', + folder: 'generateObjectsAndTypes-js', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true + }) + }, + { + cliAction: 'items', + folder: 'generateObjectsAndTypes-ts', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'ts', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: true + }) + }, + { + cliAction: 'items', + folder: 'generateObjectsOnly', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: true, + generateTypes: false + }) + }, + { + cliAction: 'items', + folder: 'generateTypessOnly', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: [], + generateObjects: false, + generateTypes: true + }) + }, + { + cliAction: 'items', + folder: 'filterByType', + getFilesAsync: async () => + await generateItemsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js', + apiMode: 'default', + filterByTypeCodenames: ['content_type_with_all_elements'], + generateObjects: true, + generateTypes: true + }) + } +]; diff --git a/tests/integration/test-cases/migration-toolkit-snapshots.ts b/tests/integration/test-cases/migration-toolkit-snapshots.ts new file mode 100644 index 00000000..b71b748e --- /dev/null +++ b/tests/integration/test-cases/migration-toolkit-snapshots.ts @@ -0,0 +1,29 @@ +import { generateMigrationModelsAsync } from '../../../lib/public_api.js'; +import { integrationEnv, type SnapshotModelsTest } from '../integration-tests.config.js'; + +export const migrationToolkitSnapshots: readonly SnapshotModelsTest[] = [ + { + cliAction: 'migration-toolkit', + folder: 'basic-js', + getFilesAsync: async () => + await generateMigrationModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'js' + }) + }, + { + cliAction: 'migration-toolkit', + folder: 'basic-ts', + getFilesAsync: async () => + await generateMigrationModelsAsync({ + addTimestamp: false, + createFiles: false, + environmentId: integrationEnv.id, + managementApiKey: integrationEnv.apiKey, + moduleFileExtension: 'ts' + }) + } +]; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..4b14821a --- /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 f96ee40f..00000000 --- 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 53a73787..c9b5fe4e 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 00000000..f84527d9 --- /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' + } +});