From e753493b25d04ad6c33dd053c7e97c0fd0e56611 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 14 Jan 2026 09:01:26 +0100 Subject: [PATCH 001/221] Moves all code temporarily to "_legacy" folder --- {.github => _legacy/.github}/CODEOWNERS | 0 {.github => _legacy/.github}/workflows/test.yml | 0 .gitignore => _legacy/.gitignore | 0 .npmignore => _legacy/.npmignore | 0 .prettierrc => _legacy/.prettierrc | 0 {.vscode => _legacy/.vscode}/settings.json | 0 CHANGELOG.md => _legacy/CHANGELOG.md | 0 LICENSE.md => _legacy/LICENSE.md | 0 clean.ts => _legacy/clean.ts | 0 eslint.config.mjs => _legacy/eslint.config.mjs | 0 karma-gh-actions.conf.js => _legacy/karma-gh-actions.conf.js | 0 karma.conf.js => _legacy/karma.conf.js | 0 {lib => _legacy/lib}/client/delivery-client.factory.ts | 0 {lib => _legacy/lib}/client/delivery-client.ts | 0 {lib => _legacy/lib}/client/idelivery-client.interface.ts | 0 {lib => _legacy/lib}/client/index.ts | 0 {lib => _legacy/lib}/config/delivery-configs.ts | 0 {lib => _legacy/lib}/config/index.ts | 0 {lib => _legacy/lib}/contracts/contracts.ts | 0 {lib => _legacy/lib}/contracts/index.ts | 0 {lib => _legacy/lib}/elements/element-models.ts | 0 {lib => _legacy/lib}/elements/element-resolver.ts | 0 {lib => _legacy/lib}/elements/element-type.ts | 0 {lib => _legacy/lib}/elements/elements.ts | 0 {lib => _legacy/lib}/elements/index.ts | 0 .../lib}/images/image-url-transformation-builder.factory.ts | 0 {lib => _legacy/lib}/images/image-url-transformation-builder.ts | 0 {lib => _legacy/lib}/images/image.models.ts | 0 {lib => _legacy/lib}/images/index.ts | 0 {lib => _legacy/lib}/index.ts | 0 {lib => _legacy/lib}/mappers/element.mapper.ts | 0 {lib => _legacy/lib}/mappers/generic-element.mapper.ts | 0 {lib => _legacy/lib}/mappers/index.ts | 0 {lib => _legacy/lib}/mappers/item.mapper.ts | 0 {lib => _legacy/lib}/mappers/language.mapper.ts | 0 {lib => _legacy/lib}/mappers/sync.mapper.ts | 0 {lib => _legacy/lib}/mappers/taxonomy.mapper.ts | 0 {lib => _legacy/lib}/mappers/type.mapper.ts | 0 {lib => _legacy/lib}/mappers/used-in.mapper.ts | 0 {lib => _legacy/lib}/models/common/base-responses.ts | 0 {lib => _legacy/lib}/models/common/common-models.ts | 0 {lib => _legacy/lib}/models/common/filters.ts | 0 {lib => _legacy/lib}/models/common/headers.ts | 0 {lib => _legacy/lib}/models/common/index.ts | 0 {lib => _legacy/lib}/models/common/pagination.class.ts | 0 {lib => _legacy/lib}/models/common/parameters.ts | 0 {lib => _legacy/lib}/models/common/sort-order.ts | 0 {lib => _legacy/lib}/models/content-type-models.ts | 0 {lib => _legacy/lib}/models/element-models.ts | 0 {lib => _legacy/lib}/models/index.ts | 0 {lib => _legacy/lib}/models/item-models.ts | 0 {lib => _legacy/lib}/models/language-models.ts | 0 {lib => _legacy/lib}/models/responses.ts | 0 {lib => _legacy/lib}/models/sync-models.ts | 0 {lib => _legacy/lib}/models/taxonomy-models.ts | 0 .../lib}/query/common/base-item-listing-query.class.ts | 0 {lib => _legacy/lib}/query/common/base-listing-query.class.ts | 0 {lib => _legacy/lib}/query/common/base-query.class.ts | 0 {lib => _legacy/lib}/query/element/element-query.class.ts | 0 {lib => _legacy/lib}/query/index.ts | 0 {lib => _legacy/lib}/query/item/multiple-items-query.class.ts | 0 {lib => _legacy/lib}/query/item/single-item-query.class.ts | 0 {lib => _legacy/lib}/query/items-feed/items-feed-query.class.ts | 0 {lib => _legacy/lib}/query/language/languages-query.class.ts | 0 {lib => _legacy/lib}/query/sync/initialize-sync-query.class.ts | 0 {lib => _legacy/lib}/query/sync/sync-changes-query.class.ts | 0 {lib => _legacy/lib}/query/taxonomy/taxonomies-query.class.ts | 0 {lib => _legacy/lib}/query/taxonomy/taxonomy-query.class.ts | 0 {lib => _legacy/lib}/query/type/multiple-type-query.class.ts | 0 {lib => _legacy/lib}/query/type/single-type-query.class.ts | 0 {lib => _legacy/lib}/query/used-in/used-in-query.class.ts | 0 {lib => _legacy/lib}/sdk-info.generated.ts | 0 {lib => _legacy/lib}/services/base-delivery-query.service.ts | 0 {lib => _legacy/lib}/services/delivery-query.service.ts | 0 {lib => _legacy/lib}/services/index.ts | 0 {lib => _legacy/lib}/services/mapping.service.ts | 0 {lib => _legacy/lib}/utilities/codename.helper.ts | 0 {lib => _legacy/lib}/utilities/delivery-url.helper.ts | 0 {lib => _legacy/lib}/utilities/enum.helper.ts | 0 {lib => _legacy/lib}/utilities/index.ts | 0 {misc => _legacy/misc}/set-sdk-version.ts | 0 {misc => _legacy/misc}/verify-sdk-version.ts | 0 {misc => _legacy/misc}/version-helper.ts | 0 package-lock.json => _legacy/package-lock.json | 0 package.json => _legacy/package.json | 0 readme.md => _legacy/readme.md | 0 {test => _legacy/test}/browser/client/delivery-client.spec.ts | 0 .../test}/browser/isolated-tests/core/base-url.spec.ts | 0 .../test}/browser/isolated-tests/core/core-headers.spec.ts | 0 .../test}/browser/isolated-tests/core/global-headers.spec.ts | 0 .../browser/isolated-tests/core/global-query-headers.spec.ts | 0 .../test}/browser/isolated-tests/core/preview-headers.spec.ts | 0 .../test}/browser/isolated-tests/core/preview-url.spec.ts | 0 .../browser/isolated-tests/core/preview-with-secured-mode.spec.ts | 0 .../test}/browser/isolated-tests/core/proxy-url-spec.ts | 0 .../test}/browser/isolated-tests/core/secured-api-headers.spec.ts | 0 .../core/wait-for-loading-new-content-header.spec.ts | 0 .../isolated-tests/elements/assets/asset-rendition.spec.json | 0 .../isolated-tests/elements/assets/asset-rendition.spec.ts | 0 .../isolated-tests/elements/assets/custom-assets-domain.spec.ts | 0 .../custom-element/custom-element-with-custom-model.spec.ts | 0 .../elements/custom-element/custom-element.spec.json | 0 .../isolated-tests/elements/custom-element/custom-element.spec.ts | 0 .../browser/isolated-tests/elements/rich-text/rich-text.spec.json | 0 .../browser/isolated-tests/elements/rich-text/rich-text.spec.ts | 0 .../elements/unknown-element/unknown-element.spec.json | 0 .../elements/unknown-element/unknown-element.spec.ts | 0 .../isolated-tests/endpoints/items-feed/items-feed-all.spec.json | 0 .../isolated-tests/endpoints/items-feed/items-feed-all.spec.ts | 0 .../isolated-tests/endpoints/items-feed/items-feed.spec.json | 0 .../isolated-tests/endpoints/items-feed/items-feed.spec.ts | 0 .../items/circular-referenced-linked-items-mapping.spec.json | 0 .../items/circular-referenced-linked-items-mapping.spec.ts | 0 .../isolated-tests/endpoints/items/items-list-response.spec.json | 0 .../isolated-tests/endpoints/items/items-list-response.spec.ts | 0 ...ms-list-with-reserved-names-in-linked-items-response.spec.json | 0 ...tems-list-with-reserved-names-in-linked-items-response.spec.ts | 0 .../items/items-list-with-reserved-names-response.spec.json | 0 .../items/items-list-with-reserved-names-response.spec.ts | 0 .../endpoints/items/items-with-total-count.spec.json | 0 .../isolated-tests/endpoints/items/items-with-total-count.spec.ts | 0 .../endpoints/items/items-without-total-count.spec.json | 0 .../endpoints/items/items-without-total-count.spec.ts | 0 .../isolated-tests/endpoints/languages/list-languages.spec.json | 0 .../isolated-tests/endpoints/languages/list-languages.spec.ts | 0 .../isolated-tests/endpoints/sync/initialize-sync.spec.json | 0 .../browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts | 0 .../browser/isolated-tests/endpoints/sync/sync-changes.spec.json | 0 .../browser/isolated-tests/endpoints/sync/sync-changes.spec.ts | 0 .../isolated-tests/endpoints/used-in/used-in-all.spec.json | 0 .../browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts | 0 .../browser/isolated-tests/endpoints/used-in/used-in.spec.json | 0 .../browser/isolated-tests/endpoints/used-in/used-in.spec.ts | 0 .../browser/isolated-tests/fake-data/fake-warrior-response.json | 0 .../fake-data/fake-warrior-without-modular-data-response.json | 0 .../test}/browser/isolated-tests/http/custom-http-service.spec.ts | 0 .../test}/browser/isolated-tests/images/image-url-builder.spec.ts | 0 .../test}/browser/isolated-tests/query/custom-headers.spec.ts | 0 .../test}/browser/isolated-tests/query/query-config.spec.ts | 0 .../browser/isolated-tests/query/query-custom-parameter.spec.ts | 0 .../browser/isolated-tests/query/query-initialization.spec.ts | 0 .../test}/browser/isolated-tests/query/query-url-debug.spec.ts | 0 .../isolated-tests/query/wait-for-loading-new-content.spec.ts | 0 .../test}/browser/isolated-tests/response/item.spec.ts | 0 .../linked-items-mapping/linked-items-mapping-disabled.spec.ts | 0 .../linked-items-mapping/linked-items-mapping-enabled.spec.ts | 0 .../response/linked-items-mapping/linked-items-mapping.json | 0 .../isolated-tests/services/generic-element-mapper.spec.ts | 0 .../browser/isolated-tests/services/mapping-service.spec.json | 0 .../test}/browser/isolated-tests/services/mapping-service.spec.ts | 0 .../test}/browser/isolated-tests/services/taxonomy-mapper.spec.ts | 0 .../test}/browser/isolated-tests/services/type-mapper.spec.ts | 0 {test => _legacy/test}/browser/isolated-tests/url/item-filters.ts | 0 .../test}/browser/isolated-tests/url/item-url-parameters.spec.ts | 0 .../test}/browser/isolated-tests/url/item-url.spec.ts | 0 .../test}/browser/isolated-tests/url/taxonomies-url.spec.ts | 0 .../test}/browser/isolated-tests/url/type-url.spec.ts | 0 .../test}/browser/live-tests/custom-url/custom-url.spec.ts | 0 .../test}/browser/live-tests/element/live-element.spec.ts | 0 .../test}/browser/live-tests/errors/kontent-error.spec.ts | 0 .../browser/live-tests/item/live-item-base-linked-items.spec.ts | 0 {test => _legacy/test}/browser/live-tests/item/live-item.spec.ts | 0 .../browser/live-tests/items-feed/live-items-feed-all.spec.ts | 0 .../test}/browser/live-tests/items-feed/live-items-feed.spec.ts | 0 .../test}/browser/live-tests/items/live-items-all.spec.ts | 0 .../test}/browser/live-tests/items/live-items.spec.ts | 0 .../live-tests/localization/localization-default-language.spec.ts | 0 .../test}/browser/live-tests/localization/localized-item.spec.ts | 0 .../test}/browser/live-tests/mapping/live-mapping.service.spec.ts | 0 .../browser/live-tests/network-response/network-response.spec.ts | 0 .../test}/browser/live-tests/pagination/pagination.spec.ts | 0 .../test}/browser/live-tests/promise/response-by-promise.spec.ts | 0 {test => _legacy/test}/browser/live-tests/readme.md | 0 .../test}/browser/live-tests/taxonomy/live-taxonomies.spec.ts | 0 .../test}/browser/live-tests/taxonomy/live-taxonomy.spec.ts | 0 {test => _legacy/test}/browser/live-tests/types/live-type.spec.ts | 0 .../test}/browser/live-tests/types/live-types.spec.ts | 0 {test => _legacy/test}/browser/setup/context.ts | 0 {test => _legacy/test}/browser/setup/delivery-test-client.ts | 0 {test => _legacy/test}/browser/setup/index.ts | 0 {test => _legacy/test}/browser/setup/models.ts | 0 {test => _legacy/test}/browser/setup/setup.ts | 0 {test => _legacy/test}/node/base/base-node-test.js | 0 tsconfig.json => _legacy/tsconfig.json | 0 tsconfig.prod.json => _legacy/tsconfig.prod.json | 0 tsconfig.webpack.json => _legacy/tsconfig.webpack.json | 0 webpack.config.js => _legacy/webpack.config.js | 0 187 files changed, 0 insertions(+), 0 deletions(-) rename {.github => _legacy/.github}/CODEOWNERS (100%) rename {.github => _legacy/.github}/workflows/test.yml (100%) rename .gitignore => _legacy/.gitignore (100%) rename .npmignore => _legacy/.npmignore (100%) rename .prettierrc => _legacy/.prettierrc (100%) rename {.vscode => _legacy/.vscode}/settings.json (100%) rename CHANGELOG.md => _legacy/CHANGELOG.md (100%) rename LICENSE.md => _legacy/LICENSE.md (100%) rename clean.ts => _legacy/clean.ts (100%) rename eslint.config.mjs => _legacy/eslint.config.mjs (100%) rename karma-gh-actions.conf.js => _legacy/karma-gh-actions.conf.js (100%) rename karma.conf.js => _legacy/karma.conf.js (100%) rename {lib => _legacy/lib}/client/delivery-client.factory.ts (100%) rename {lib => _legacy/lib}/client/delivery-client.ts (100%) rename {lib => _legacy/lib}/client/idelivery-client.interface.ts (100%) rename {lib => _legacy/lib}/client/index.ts (100%) rename {lib => _legacy/lib}/config/delivery-configs.ts (100%) rename {lib => _legacy/lib}/config/index.ts (100%) rename {lib => _legacy/lib}/contracts/contracts.ts (100%) rename {lib => _legacy/lib}/contracts/index.ts (100%) rename {lib => _legacy/lib}/elements/element-models.ts (100%) rename {lib => _legacy/lib}/elements/element-resolver.ts (100%) rename {lib => _legacy/lib}/elements/element-type.ts (100%) rename {lib => _legacy/lib}/elements/elements.ts (100%) rename {lib => _legacy/lib}/elements/index.ts (100%) rename {lib => _legacy/lib}/images/image-url-transformation-builder.factory.ts (100%) rename {lib => _legacy/lib}/images/image-url-transformation-builder.ts (100%) rename {lib => _legacy/lib}/images/image.models.ts (100%) rename {lib => _legacy/lib}/images/index.ts (100%) rename {lib => _legacy/lib}/index.ts (100%) rename {lib => _legacy/lib}/mappers/element.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/generic-element.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/index.ts (100%) rename {lib => _legacy/lib}/mappers/item.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/language.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/sync.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/taxonomy.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/type.mapper.ts (100%) rename {lib => _legacy/lib}/mappers/used-in.mapper.ts (100%) rename {lib => _legacy/lib}/models/common/base-responses.ts (100%) rename {lib => _legacy/lib}/models/common/common-models.ts (100%) rename {lib => _legacy/lib}/models/common/filters.ts (100%) rename {lib => _legacy/lib}/models/common/headers.ts (100%) rename {lib => _legacy/lib}/models/common/index.ts (100%) rename {lib => _legacy/lib}/models/common/pagination.class.ts (100%) rename {lib => _legacy/lib}/models/common/parameters.ts (100%) rename {lib => _legacy/lib}/models/common/sort-order.ts (100%) rename {lib => _legacy/lib}/models/content-type-models.ts (100%) rename {lib => _legacy/lib}/models/element-models.ts (100%) rename {lib => _legacy/lib}/models/index.ts (100%) rename {lib => _legacy/lib}/models/item-models.ts (100%) rename {lib => _legacy/lib}/models/language-models.ts (100%) rename {lib => _legacy/lib}/models/responses.ts (100%) rename {lib => _legacy/lib}/models/sync-models.ts (100%) rename {lib => _legacy/lib}/models/taxonomy-models.ts (100%) rename {lib => _legacy/lib}/query/common/base-item-listing-query.class.ts (100%) rename {lib => _legacy/lib}/query/common/base-listing-query.class.ts (100%) rename {lib => _legacy/lib}/query/common/base-query.class.ts (100%) rename {lib => _legacy/lib}/query/element/element-query.class.ts (100%) rename {lib => _legacy/lib}/query/index.ts (100%) rename {lib => _legacy/lib}/query/item/multiple-items-query.class.ts (100%) rename {lib => _legacy/lib}/query/item/single-item-query.class.ts (100%) rename {lib => _legacy/lib}/query/items-feed/items-feed-query.class.ts (100%) rename {lib => _legacy/lib}/query/language/languages-query.class.ts (100%) rename {lib => _legacy/lib}/query/sync/initialize-sync-query.class.ts (100%) rename {lib => _legacy/lib}/query/sync/sync-changes-query.class.ts (100%) rename {lib => _legacy/lib}/query/taxonomy/taxonomies-query.class.ts (100%) rename {lib => _legacy/lib}/query/taxonomy/taxonomy-query.class.ts (100%) rename {lib => _legacy/lib}/query/type/multiple-type-query.class.ts (100%) rename {lib => _legacy/lib}/query/type/single-type-query.class.ts (100%) rename {lib => _legacy/lib}/query/used-in/used-in-query.class.ts (100%) rename {lib => _legacy/lib}/sdk-info.generated.ts (100%) rename {lib => _legacy/lib}/services/base-delivery-query.service.ts (100%) rename {lib => _legacy/lib}/services/delivery-query.service.ts (100%) rename {lib => _legacy/lib}/services/index.ts (100%) rename {lib => _legacy/lib}/services/mapping.service.ts (100%) rename {lib => _legacy/lib}/utilities/codename.helper.ts (100%) rename {lib => _legacy/lib}/utilities/delivery-url.helper.ts (100%) rename {lib => _legacy/lib}/utilities/enum.helper.ts (100%) rename {lib => _legacy/lib}/utilities/index.ts (100%) rename {misc => _legacy/misc}/set-sdk-version.ts (100%) rename {misc => _legacy/misc}/verify-sdk-version.ts (100%) rename {misc => _legacy/misc}/version-helper.ts (100%) rename package-lock.json => _legacy/package-lock.json (100%) rename package.json => _legacy/package.json (100%) rename readme.md => _legacy/readme.md (100%) rename {test => _legacy/test}/browser/client/delivery-client.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/base-url.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/core-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/global-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/global-query-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/preview-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/preview-url.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/preview-with-secured-mode.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/proxy-url-spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/secured-api-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/assets/asset-rendition.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/assets/asset-rendition.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/custom-element/custom-element.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/custom-element/custom-element.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/rich-text/rich-text.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/rich-text/rich-text.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-response.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-response.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/languages/list-languages.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/languages/list-languages.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/sync/sync-changes.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/used-in/used-in.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/endpoints/used-in/used-in.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/fake-data/fake-warrior-response.json (100%) rename {test => _legacy/test}/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json (100%) rename {test => _legacy/test}/browser/isolated-tests/http/custom-http-service.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/images/image-url-builder.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/custom-headers.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/query-config.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/query-custom-parameter.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/query-initialization.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/query-url-debug.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/response/item.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json (100%) rename {test => _legacy/test}/browser/isolated-tests/services/generic-element-mapper.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/services/mapping-service.spec.json (100%) rename {test => _legacy/test}/browser/isolated-tests/services/mapping-service.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/services/taxonomy-mapper.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/services/type-mapper.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/url/item-filters.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/url/item-url-parameters.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/url/item-url.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/url/taxonomies-url.spec.ts (100%) rename {test => _legacy/test}/browser/isolated-tests/url/type-url.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/custom-url/custom-url.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/element/live-element.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/errors/kontent-error.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/item/live-item-base-linked-items.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/item/live-item.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/items-feed/live-items-feed-all.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/items-feed/live-items-feed.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/items/live-items-all.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/items/live-items.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/localization/localization-default-language.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/localization/localized-item.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/mapping/live-mapping.service.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/network-response/network-response.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/pagination/pagination.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/promise/response-by-promise.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/readme.md (100%) rename {test => _legacy/test}/browser/live-tests/taxonomy/live-taxonomies.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/taxonomy/live-taxonomy.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/types/live-type.spec.ts (100%) rename {test => _legacy/test}/browser/live-tests/types/live-types.spec.ts (100%) rename {test => _legacy/test}/browser/setup/context.ts (100%) rename {test => _legacy/test}/browser/setup/delivery-test-client.ts (100%) rename {test => _legacy/test}/browser/setup/index.ts (100%) rename {test => _legacy/test}/browser/setup/models.ts (100%) rename {test => _legacy/test}/browser/setup/setup.ts (100%) rename {test => _legacy/test}/node/base/base-node-test.js (100%) rename tsconfig.json => _legacy/tsconfig.json (100%) rename tsconfig.prod.json => _legacy/tsconfig.prod.json (100%) rename tsconfig.webpack.json => _legacy/tsconfig.webpack.json (100%) rename webpack.config.js => _legacy/webpack.config.js (100%) diff --git a/.github/CODEOWNERS b/_legacy/.github/CODEOWNERS similarity index 100% rename from .github/CODEOWNERS rename to _legacy/.github/CODEOWNERS diff --git a/.github/workflows/test.yml b/_legacy/.github/workflows/test.yml similarity index 100% rename from .github/workflows/test.yml rename to _legacy/.github/workflows/test.yml diff --git a/.gitignore b/_legacy/.gitignore similarity index 100% rename from .gitignore rename to _legacy/.gitignore diff --git a/.npmignore b/_legacy/.npmignore similarity index 100% rename from .npmignore rename to _legacy/.npmignore diff --git a/.prettierrc b/_legacy/.prettierrc similarity index 100% rename from .prettierrc rename to _legacy/.prettierrc diff --git a/.vscode/settings.json b/_legacy/.vscode/settings.json similarity index 100% rename from .vscode/settings.json rename to _legacy/.vscode/settings.json diff --git a/CHANGELOG.md b/_legacy/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to _legacy/CHANGELOG.md diff --git a/LICENSE.md b/_legacy/LICENSE.md similarity index 100% rename from LICENSE.md rename to _legacy/LICENSE.md diff --git a/clean.ts b/_legacy/clean.ts similarity index 100% rename from clean.ts rename to _legacy/clean.ts diff --git a/eslint.config.mjs b/_legacy/eslint.config.mjs similarity index 100% rename from eslint.config.mjs rename to _legacy/eslint.config.mjs diff --git a/karma-gh-actions.conf.js b/_legacy/karma-gh-actions.conf.js similarity index 100% rename from karma-gh-actions.conf.js rename to _legacy/karma-gh-actions.conf.js diff --git a/karma.conf.js b/_legacy/karma.conf.js similarity index 100% rename from karma.conf.js rename to _legacy/karma.conf.js diff --git a/lib/client/delivery-client.factory.ts b/_legacy/lib/client/delivery-client.factory.ts similarity index 100% rename from lib/client/delivery-client.factory.ts rename to _legacy/lib/client/delivery-client.factory.ts diff --git a/lib/client/delivery-client.ts b/_legacy/lib/client/delivery-client.ts similarity index 100% rename from lib/client/delivery-client.ts rename to _legacy/lib/client/delivery-client.ts diff --git a/lib/client/idelivery-client.interface.ts b/_legacy/lib/client/idelivery-client.interface.ts similarity index 100% rename from lib/client/idelivery-client.interface.ts rename to _legacy/lib/client/idelivery-client.interface.ts diff --git a/lib/client/index.ts b/_legacy/lib/client/index.ts similarity index 100% rename from lib/client/index.ts rename to _legacy/lib/client/index.ts diff --git a/lib/config/delivery-configs.ts b/_legacy/lib/config/delivery-configs.ts similarity index 100% rename from lib/config/delivery-configs.ts rename to _legacy/lib/config/delivery-configs.ts diff --git a/lib/config/index.ts b/_legacy/lib/config/index.ts similarity index 100% rename from lib/config/index.ts rename to _legacy/lib/config/index.ts diff --git a/lib/contracts/contracts.ts b/_legacy/lib/contracts/contracts.ts similarity index 100% rename from lib/contracts/contracts.ts rename to _legacy/lib/contracts/contracts.ts diff --git a/lib/contracts/index.ts b/_legacy/lib/contracts/index.ts similarity index 100% rename from lib/contracts/index.ts rename to _legacy/lib/contracts/index.ts diff --git a/lib/elements/element-models.ts b/_legacy/lib/elements/element-models.ts similarity index 100% rename from lib/elements/element-models.ts rename to _legacy/lib/elements/element-models.ts diff --git a/lib/elements/element-resolver.ts b/_legacy/lib/elements/element-resolver.ts similarity index 100% rename from lib/elements/element-resolver.ts rename to _legacy/lib/elements/element-resolver.ts diff --git a/lib/elements/element-type.ts b/_legacy/lib/elements/element-type.ts similarity index 100% rename from lib/elements/element-type.ts rename to _legacy/lib/elements/element-type.ts diff --git a/lib/elements/elements.ts b/_legacy/lib/elements/elements.ts similarity index 100% rename from lib/elements/elements.ts rename to _legacy/lib/elements/elements.ts diff --git a/lib/elements/index.ts b/_legacy/lib/elements/index.ts similarity index 100% rename from lib/elements/index.ts rename to _legacy/lib/elements/index.ts diff --git a/lib/images/image-url-transformation-builder.factory.ts b/_legacy/lib/images/image-url-transformation-builder.factory.ts similarity index 100% rename from lib/images/image-url-transformation-builder.factory.ts rename to _legacy/lib/images/image-url-transformation-builder.factory.ts diff --git a/lib/images/image-url-transformation-builder.ts b/_legacy/lib/images/image-url-transformation-builder.ts similarity index 100% rename from lib/images/image-url-transformation-builder.ts rename to _legacy/lib/images/image-url-transformation-builder.ts diff --git a/lib/images/image.models.ts b/_legacy/lib/images/image.models.ts similarity index 100% rename from lib/images/image.models.ts rename to _legacy/lib/images/image.models.ts diff --git a/lib/images/index.ts b/_legacy/lib/images/index.ts similarity index 100% rename from lib/images/index.ts rename to _legacy/lib/images/index.ts diff --git a/lib/index.ts b/_legacy/lib/index.ts similarity index 100% rename from lib/index.ts rename to _legacy/lib/index.ts diff --git a/lib/mappers/element.mapper.ts b/_legacy/lib/mappers/element.mapper.ts similarity index 100% rename from lib/mappers/element.mapper.ts rename to _legacy/lib/mappers/element.mapper.ts diff --git a/lib/mappers/generic-element.mapper.ts b/_legacy/lib/mappers/generic-element.mapper.ts similarity index 100% rename from lib/mappers/generic-element.mapper.ts rename to _legacy/lib/mappers/generic-element.mapper.ts diff --git a/lib/mappers/index.ts b/_legacy/lib/mappers/index.ts similarity index 100% rename from lib/mappers/index.ts rename to _legacy/lib/mappers/index.ts diff --git a/lib/mappers/item.mapper.ts b/_legacy/lib/mappers/item.mapper.ts similarity index 100% rename from lib/mappers/item.mapper.ts rename to _legacy/lib/mappers/item.mapper.ts diff --git a/lib/mappers/language.mapper.ts b/_legacy/lib/mappers/language.mapper.ts similarity index 100% rename from lib/mappers/language.mapper.ts rename to _legacy/lib/mappers/language.mapper.ts diff --git a/lib/mappers/sync.mapper.ts b/_legacy/lib/mappers/sync.mapper.ts similarity index 100% rename from lib/mappers/sync.mapper.ts rename to _legacy/lib/mappers/sync.mapper.ts diff --git a/lib/mappers/taxonomy.mapper.ts b/_legacy/lib/mappers/taxonomy.mapper.ts similarity index 100% rename from lib/mappers/taxonomy.mapper.ts rename to _legacy/lib/mappers/taxonomy.mapper.ts diff --git a/lib/mappers/type.mapper.ts b/_legacy/lib/mappers/type.mapper.ts similarity index 100% rename from lib/mappers/type.mapper.ts rename to _legacy/lib/mappers/type.mapper.ts diff --git a/lib/mappers/used-in.mapper.ts b/_legacy/lib/mappers/used-in.mapper.ts similarity index 100% rename from lib/mappers/used-in.mapper.ts rename to _legacy/lib/mappers/used-in.mapper.ts diff --git a/lib/models/common/base-responses.ts b/_legacy/lib/models/common/base-responses.ts similarity index 100% rename from lib/models/common/base-responses.ts rename to _legacy/lib/models/common/base-responses.ts diff --git a/lib/models/common/common-models.ts b/_legacy/lib/models/common/common-models.ts similarity index 100% rename from lib/models/common/common-models.ts rename to _legacy/lib/models/common/common-models.ts diff --git a/lib/models/common/filters.ts b/_legacy/lib/models/common/filters.ts similarity index 100% rename from lib/models/common/filters.ts rename to _legacy/lib/models/common/filters.ts diff --git a/lib/models/common/headers.ts b/_legacy/lib/models/common/headers.ts similarity index 100% rename from lib/models/common/headers.ts rename to _legacy/lib/models/common/headers.ts diff --git a/lib/models/common/index.ts b/_legacy/lib/models/common/index.ts similarity index 100% rename from lib/models/common/index.ts rename to _legacy/lib/models/common/index.ts diff --git a/lib/models/common/pagination.class.ts b/_legacy/lib/models/common/pagination.class.ts similarity index 100% rename from lib/models/common/pagination.class.ts rename to _legacy/lib/models/common/pagination.class.ts diff --git a/lib/models/common/parameters.ts b/_legacy/lib/models/common/parameters.ts similarity index 100% rename from lib/models/common/parameters.ts rename to _legacy/lib/models/common/parameters.ts diff --git a/lib/models/common/sort-order.ts b/_legacy/lib/models/common/sort-order.ts similarity index 100% rename from lib/models/common/sort-order.ts rename to _legacy/lib/models/common/sort-order.ts diff --git a/lib/models/content-type-models.ts b/_legacy/lib/models/content-type-models.ts similarity index 100% rename from lib/models/content-type-models.ts rename to _legacy/lib/models/content-type-models.ts diff --git a/lib/models/element-models.ts b/_legacy/lib/models/element-models.ts similarity index 100% rename from lib/models/element-models.ts rename to _legacy/lib/models/element-models.ts diff --git a/lib/models/index.ts b/_legacy/lib/models/index.ts similarity index 100% rename from lib/models/index.ts rename to _legacy/lib/models/index.ts diff --git a/lib/models/item-models.ts b/_legacy/lib/models/item-models.ts similarity index 100% rename from lib/models/item-models.ts rename to _legacy/lib/models/item-models.ts diff --git a/lib/models/language-models.ts b/_legacy/lib/models/language-models.ts similarity index 100% rename from lib/models/language-models.ts rename to _legacy/lib/models/language-models.ts diff --git a/lib/models/responses.ts b/_legacy/lib/models/responses.ts similarity index 100% rename from lib/models/responses.ts rename to _legacy/lib/models/responses.ts diff --git a/lib/models/sync-models.ts b/_legacy/lib/models/sync-models.ts similarity index 100% rename from lib/models/sync-models.ts rename to _legacy/lib/models/sync-models.ts diff --git a/lib/models/taxonomy-models.ts b/_legacy/lib/models/taxonomy-models.ts similarity index 100% rename from lib/models/taxonomy-models.ts rename to _legacy/lib/models/taxonomy-models.ts diff --git a/lib/query/common/base-item-listing-query.class.ts b/_legacy/lib/query/common/base-item-listing-query.class.ts similarity index 100% rename from lib/query/common/base-item-listing-query.class.ts rename to _legacy/lib/query/common/base-item-listing-query.class.ts diff --git a/lib/query/common/base-listing-query.class.ts b/_legacy/lib/query/common/base-listing-query.class.ts similarity index 100% rename from lib/query/common/base-listing-query.class.ts rename to _legacy/lib/query/common/base-listing-query.class.ts diff --git a/lib/query/common/base-query.class.ts b/_legacy/lib/query/common/base-query.class.ts similarity index 100% rename from lib/query/common/base-query.class.ts rename to _legacy/lib/query/common/base-query.class.ts diff --git a/lib/query/element/element-query.class.ts b/_legacy/lib/query/element/element-query.class.ts similarity index 100% rename from lib/query/element/element-query.class.ts rename to _legacy/lib/query/element/element-query.class.ts diff --git a/lib/query/index.ts b/_legacy/lib/query/index.ts similarity index 100% rename from lib/query/index.ts rename to _legacy/lib/query/index.ts diff --git a/lib/query/item/multiple-items-query.class.ts b/_legacy/lib/query/item/multiple-items-query.class.ts similarity index 100% rename from lib/query/item/multiple-items-query.class.ts rename to _legacy/lib/query/item/multiple-items-query.class.ts diff --git a/lib/query/item/single-item-query.class.ts b/_legacy/lib/query/item/single-item-query.class.ts similarity index 100% rename from lib/query/item/single-item-query.class.ts rename to _legacy/lib/query/item/single-item-query.class.ts diff --git a/lib/query/items-feed/items-feed-query.class.ts b/_legacy/lib/query/items-feed/items-feed-query.class.ts similarity index 100% rename from lib/query/items-feed/items-feed-query.class.ts rename to _legacy/lib/query/items-feed/items-feed-query.class.ts diff --git a/lib/query/language/languages-query.class.ts b/_legacy/lib/query/language/languages-query.class.ts similarity index 100% rename from lib/query/language/languages-query.class.ts rename to _legacy/lib/query/language/languages-query.class.ts diff --git a/lib/query/sync/initialize-sync-query.class.ts b/_legacy/lib/query/sync/initialize-sync-query.class.ts similarity index 100% rename from lib/query/sync/initialize-sync-query.class.ts rename to _legacy/lib/query/sync/initialize-sync-query.class.ts diff --git a/lib/query/sync/sync-changes-query.class.ts b/_legacy/lib/query/sync/sync-changes-query.class.ts similarity index 100% rename from lib/query/sync/sync-changes-query.class.ts rename to _legacy/lib/query/sync/sync-changes-query.class.ts diff --git a/lib/query/taxonomy/taxonomies-query.class.ts b/_legacy/lib/query/taxonomy/taxonomies-query.class.ts similarity index 100% rename from lib/query/taxonomy/taxonomies-query.class.ts rename to _legacy/lib/query/taxonomy/taxonomies-query.class.ts diff --git a/lib/query/taxonomy/taxonomy-query.class.ts b/_legacy/lib/query/taxonomy/taxonomy-query.class.ts similarity index 100% rename from lib/query/taxonomy/taxonomy-query.class.ts rename to _legacy/lib/query/taxonomy/taxonomy-query.class.ts diff --git a/lib/query/type/multiple-type-query.class.ts b/_legacy/lib/query/type/multiple-type-query.class.ts similarity index 100% rename from lib/query/type/multiple-type-query.class.ts rename to _legacy/lib/query/type/multiple-type-query.class.ts diff --git a/lib/query/type/single-type-query.class.ts b/_legacy/lib/query/type/single-type-query.class.ts similarity index 100% rename from lib/query/type/single-type-query.class.ts rename to _legacy/lib/query/type/single-type-query.class.ts diff --git a/lib/query/used-in/used-in-query.class.ts b/_legacy/lib/query/used-in/used-in-query.class.ts similarity index 100% rename from lib/query/used-in/used-in-query.class.ts rename to _legacy/lib/query/used-in/used-in-query.class.ts diff --git a/lib/sdk-info.generated.ts b/_legacy/lib/sdk-info.generated.ts similarity index 100% rename from lib/sdk-info.generated.ts rename to _legacy/lib/sdk-info.generated.ts diff --git a/lib/services/base-delivery-query.service.ts b/_legacy/lib/services/base-delivery-query.service.ts similarity index 100% rename from lib/services/base-delivery-query.service.ts rename to _legacy/lib/services/base-delivery-query.service.ts diff --git a/lib/services/delivery-query.service.ts b/_legacy/lib/services/delivery-query.service.ts similarity index 100% rename from lib/services/delivery-query.service.ts rename to _legacy/lib/services/delivery-query.service.ts diff --git a/lib/services/index.ts b/_legacy/lib/services/index.ts similarity index 100% rename from lib/services/index.ts rename to _legacy/lib/services/index.ts diff --git a/lib/services/mapping.service.ts b/_legacy/lib/services/mapping.service.ts similarity index 100% rename from lib/services/mapping.service.ts rename to _legacy/lib/services/mapping.service.ts diff --git a/lib/utilities/codename.helper.ts b/_legacy/lib/utilities/codename.helper.ts similarity index 100% rename from lib/utilities/codename.helper.ts rename to _legacy/lib/utilities/codename.helper.ts diff --git a/lib/utilities/delivery-url.helper.ts b/_legacy/lib/utilities/delivery-url.helper.ts similarity index 100% rename from lib/utilities/delivery-url.helper.ts rename to _legacy/lib/utilities/delivery-url.helper.ts diff --git a/lib/utilities/enum.helper.ts b/_legacy/lib/utilities/enum.helper.ts similarity index 100% rename from lib/utilities/enum.helper.ts rename to _legacy/lib/utilities/enum.helper.ts diff --git a/lib/utilities/index.ts b/_legacy/lib/utilities/index.ts similarity index 100% rename from lib/utilities/index.ts rename to _legacy/lib/utilities/index.ts diff --git a/misc/set-sdk-version.ts b/_legacy/misc/set-sdk-version.ts similarity index 100% rename from misc/set-sdk-version.ts rename to _legacy/misc/set-sdk-version.ts diff --git a/misc/verify-sdk-version.ts b/_legacy/misc/verify-sdk-version.ts similarity index 100% rename from misc/verify-sdk-version.ts rename to _legacy/misc/verify-sdk-version.ts diff --git a/misc/version-helper.ts b/_legacy/misc/version-helper.ts similarity index 100% rename from misc/version-helper.ts rename to _legacy/misc/version-helper.ts diff --git a/package-lock.json b/_legacy/package-lock.json similarity index 100% rename from package-lock.json rename to _legacy/package-lock.json diff --git a/package.json b/_legacy/package.json similarity index 100% rename from package.json rename to _legacy/package.json diff --git a/readme.md b/_legacy/readme.md similarity index 100% rename from readme.md rename to _legacy/readme.md diff --git a/test/browser/client/delivery-client.spec.ts b/_legacy/test/browser/client/delivery-client.spec.ts similarity index 100% rename from test/browser/client/delivery-client.spec.ts rename to _legacy/test/browser/client/delivery-client.spec.ts diff --git a/test/browser/isolated-tests/core/base-url.spec.ts b/_legacy/test/browser/isolated-tests/core/base-url.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/base-url.spec.ts rename to _legacy/test/browser/isolated-tests/core/base-url.spec.ts diff --git a/test/browser/isolated-tests/core/core-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/core-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/core-headers.spec.ts rename to _legacy/test/browser/isolated-tests/core/core-headers.spec.ts diff --git a/test/browser/isolated-tests/core/global-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/global-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/global-headers.spec.ts rename to _legacy/test/browser/isolated-tests/core/global-headers.spec.ts diff --git a/test/browser/isolated-tests/core/global-query-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/global-query-headers.spec.ts rename to _legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts diff --git a/test/browser/isolated-tests/core/preview-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/preview-headers.spec.ts rename to _legacy/test/browser/isolated-tests/core/preview-headers.spec.ts diff --git a/test/browser/isolated-tests/core/preview-url.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-url.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/preview-url.spec.ts rename to _legacy/test/browser/isolated-tests/core/preview-url.spec.ts diff --git a/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts rename to _legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts diff --git a/test/browser/isolated-tests/core/proxy-url-spec.ts b/_legacy/test/browser/isolated-tests/core/proxy-url-spec.ts similarity index 100% rename from test/browser/isolated-tests/core/proxy-url-spec.ts rename to _legacy/test/browser/isolated-tests/core/proxy-url-spec.ts diff --git a/test/browser/isolated-tests/core/secured-api-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/secured-api-headers.spec.ts rename to _legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts diff --git a/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts b/_legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts similarity index 100% rename from test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts rename to _legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts diff --git a/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json b/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json similarity index 100% rename from test/browser/isolated-tests/elements/assets/asset-rendition.spec.json rename to _legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json diff --git a/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts b/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts rename to _legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts diff --git a/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts b/_legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts rename to _legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts diff --git a/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts rename to _legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts diff --git a/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json similarity index 100% rename from test/browser/isolated-tests/elements/custom-element/custom-element.spec.json rename to _legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json diff --git a/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts rename to _legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts diff --git a/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json b/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json similarity index 100% rename from test/browser/isolated-tests/elements/rich-text/rich-text.spec.json rename to _legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json diff --git a/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts b/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts rename to _legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts diff --git a/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json b/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json similarity index 100% rename from test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json rename to _legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json diff --git a/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts b/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts similarity index 100% rename from test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts rename to _legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json diff --git a/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json diff --git a/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-response.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts diff --git a/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json diff --git a/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts diff --git a/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/languages/list-languages.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json diff --git a/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts diff --git a/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json b/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json diff --git a/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts diff --git a/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json b/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json diff --git a/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts diff --git a/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json diff --git a/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts diff --git a/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json similarity index 100% rename from test/browser/isolated-tests/endpoints/used-in/used-in.spec.json rename to _legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json diff --git a/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts similarity index 100% rename from test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts rename to _legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts diff --git a/test/browser/isolated-tests/fake-data/fake-warrior-response.json b/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json similarity index 100% rename from test/browser/isolated-tests/fake-data/fake-warrior-response.json rename to _legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json diff --git a/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json b/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json similarity index 100% rename from test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json rename to _legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json diff --git a/test/browser/isolated-tests/http/custom-http-service.spec.ts b/_legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts similarity index 100% rename from test/browser/isolated-tests/http/custom-http-service.spec.ts rename to _legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts diff --git a/test/browser/isolated-tests/images/image-url-builder.spec.ts b/_legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts similarity index 100% rename from test/browser/isolated-tests/images/image-url-builder.spec.ts rename to _legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts diff --git a/test/browser/isolated-tests/query/custom-headers.spec.ts b/_legacy/test/browser/isolated-tests/query/custom-headers.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/custom-headers.spec.ts rename to _legacy/test/browser/isolated-tests/query/custom-headers.spec.ts diff --git a/test/browser/isolated-tests/query/query-config.spec.ts b/_legacy/test/browser/isolated-tests/query/query-config.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/query-config.spec.ts rename to _legacy/test/browser/isolated-tests/query/query-config.spec.ts diff --git a/test/browser/isolated-tests/query/query-custom-parameter.spec.ts b/_legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/query-custom-parameter.spec.ts rename to _legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts diff --git a/test/browser/isolated-tests/query/query-initialization.spec.ts b/_legacy/test/browser/isolated-tests/query/query-initialization.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/query-initialization.spec.ts rename to _legacy/test/browser/isolated-tests/query/query-initialization.spec.ts diff --git a/test/browser/isolated-tests/query/query-url-debug.spec.ts b/_legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/query-url-debug.spec.ts rename to _legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts diff --git a/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts b/_legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts similarity index 100% rename from test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts rename to _legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts diff --git a/test/browser/isolated-tests/response/item.spec.ts b/_legacy/test/browser/isolated-tests/response/item.spec.ts similarity index 100% rename from test/browser/isolated-tests/response/item.spec.ts rename to _legacy/test/browser/isolated-tests/response/item.spec.ts diff --git a/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts similarity index 100% rename from test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts rename to _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts diff --git a/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts similarity index 100% rename from test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts rename to _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts diff --git a/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json similarity index 100% rename from test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json rename to _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json diff --git a/test/browser/isolated-tests/services/generic-element-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts similarity index 100% rename from test/browser/isolated-tests/services/generic-element-mapper.spec.ts rename to _legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts diff --git a/test/browser/isolated-tests/services/mapping-service.spec.json b/_legacy/test/browser/isolated-tests/services/mapping-service.spec.json similarity index 100% rename from test/browser/isolated-tests/services/mapping-service.spec.json rename to _legacy/test/browser/isolated-tests/services/mapping-service.spec.json diff --git a/test/browser/isolated-tests/services/mapping-service.spec.ts b/_legacy/test/browser/isolated-tests/services/mapping-service.spec.ts similarity index 100% rename from test/browser/isolated-tests/services/mapping-service.spec.ts rename to _legacy/test/browser/isolated-tests/services/mapping-service.spec.ts diff --git a/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts similarity index 100% rename from test/browser/isolated-tests/services/taxonomy-mapper.spec.ts rename to _legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts diff --git a/test/browser/isolated-tests/services/type-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/type-mapper.spec.ts similarity index 100% rename from test/browser/isolated-tests/services/type-mapper.spec.ts rename to _legacy/test/browser/isolated-tests/services/type-mapper.spec.ts diff --git a/test/browser/isolated-tests/url/item-filters.ts b/_legacy/test/browser/isolated-tests/url/item-filters.ts similarity index 100% rename from test/browser/isolated-tests/url/item-filters.ts rename to _legacy/test/browser/isolated-tests/url/item-filters.ts diff --git a/test/browser/isolated-tests/url/item-url-parameters.spec.ts b/_legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts similarity index 100% rename from test/browser/isolated-tests/url/item-url-parameters.spec.ts rename to _legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts diff --git a/test/browser/isolated-tests/url/item-url.spec.ts b/_legacy/test/browser/isolated-tests/url/item-url.spec.ts similarity index 100% rename from test/browser/isolated-tests/url/item-url.spec.ts rename to _legacy/test/browser/isolated-tests/url/item-url.spec.ts diff --git a/test/browser/isolated-tests/url/taxonomies-url.spec.ts b/_legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts similarity index 100% rename from test/browser/isolated-tests/url/taxonomies-url.spec.ts rename to _legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts diff --git a/test/browser/isolated-tests/url/type-url.spec.ts b/_legacy/test/browser/isolated-tests/url/type-url.spec.ts similarity index 100% rename from test/browser/isolated-tests/url/type-url.spec.ts rename to _legacy/test/browser/isolated-tests/url/type-url.spec.ts diff --git a/test/browser/live-tests/custom-url/custom-url.spec.ts b/_legacy/test/browser/live-tests/custom-url/custom-url.spec.ts similarity index 100% rename from test/browser/live-tests/custom-url/custom-url.spec.ts rename to _legacy/test/browser/live-tests/custom-url/custom-url.spec.ts diff --git a/test/browser/live-tests/element/live-element.spec.ts b/_legacy/test/browser/live-tests/element/live-element.spec.ts similarity index 100% rename from test/browser/live-tests/element/live-element.spec.ts rename to _legacy/test/browser/live-tests/element/live-element.spec.ts diff --git a/test/browser/live-tests/errors/kontent-error.spec.ts b/_legacy/test/browser/live-tests/errors/kontent-error.spec.ts similarity index 100% rename from test/browser/live-tests/errors/kontent-error.spec.ts rename to _legacy/test/browser/live-tests/errors/kontent-error.spec.ts diff --git a/test/browser/live-tests/item/live-item-base-linked-items.spec.ts b/_legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts similarity index 100% rename from test/browser/live-tests/item/live-item-base-linked-items.spec.ts rename to _legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts diff --git a/test/browser/live-tests/item/live-item.spec.ts b/_legacy/test/browser/live-tests/item/live-item.spec.ts similarity index 100% rename from test/browser/live-tests/item/live-item.spec.ts rename to _legacy/test/browser/live-tests/item/live-item.spec.ts diff --git a/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts b/_legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts similarity index 100% rename from test/browser/live-tests/items-feed/live-items-feed-all.spec.ts rename to _legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts diff --git a/test/browser/live-tests/items-feed/live-items-feed.spec.ts b/_legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts similarity index 100% rename from test/browser/live-tests/items-feed/live-items-feed.spec.ts rename to _legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts diff --git a/test/browser/live-tests/items/live-items-all.spec.ts b/_legacy/test/browser/live-tests/items/live-items-all.spec.ts similarity index 100% rename from test/browser/live-tests/items/live-items-all.spec.ts rename to _legacy/test/browser/live-tests/items/live-items-all.spec.ts diff --git a/test/browser/live-tests/items/live-items.spec.ts b/_legacy/test/browser/live-tests/items/live-items.spec.ts similarity index 100% rename from test/browser/live-tests/items/live-items.spec.ts rename to _legacy/test/browser/live-tests/items/live-items.spec.ts diff --git a/test/browser/live-tests/localization/localization-default-language.spec.ts b/_legacy/test/browser/live-tests/localization/localization-default-language.spec.ts similarity index 100% rename from test/browser/live-tests/localization/localization-default-language.spec.ts rename to _legacy/test/browser/live-tests/localization/localization-default-language.spec.ts diff --git a/test/browser/live-tests/localization/localized-item.spec.ts b/_legacy/test/browser/live-tests/localization/localized-item.spec.ts similarity index 100% rename from test/browser/live-tests/localization/localized-item.spec.ts rename to _legacy/test/browser/live-tests/localization/localized-item.spec.ts diff --git a/test/browser/live-tests/mapping/live-mapping.service.spec.ts b/_legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts similarity index 100% rename from test/browser/live-tests/mapping/live-mapping.service.spec.ts rename to _legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts diff --git a/test/browser/live-tests/network-response/network-response.spec.ts b/_legacy/test/browser/live-tests/network-response/network-response.spec.ts similarity index 100% rename from test/browser/live-tests/network-response/network-response.spec.ts rename to _legacy/test/browser/live-tests/network-response/network-response.spec.ts diff --git a/test/browser/live-tests/pagination/pagination.spec.ts b/_legacy/test/browser/live-tests/pagination/pagination.spec.ts similarity index 100% rename from test/browser/live-tests/pagination/pagination.spec.ts rename to _legacy/test/browser/live-tests/pagination/pagination.spec.ts diff --git a/test/browser/live-tests/promise/response-by-promise.spec.ts b/_legacy/test/browser/live-tests/promise/response-by-promise.spec.ts similarity index 100% rename from test/browser/live-tests/promise/response-by-promise.spec.ts rename to _legacy/test/browser/live-tests/promise/response-by-promise.spec.ts diff --git a/test/browser/live-tests/readme.md b/_legacy/test/browser/live-tests/readme.md similarity index 100% rename from test/browser/live-tests/readme.md rename to _legacy/test/browser/live-tests/readme.md diff --git a/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts b/_legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts similarity index 100% rename from test/browser/live-tests/taxonomy/live-taxonomies.spec.ts rename to _legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts diff --git a/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts b/_legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts similarity index 100% rename from test/browser/live-tests/taxonomy/live-taxonomy.spec.ts rename to _legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts diff --git a/test/browser/live-tests/types/live-type.spec.ts b/_legacy/test/browser/live-tests/types/live-type.spec.ts similarity index 100% rename from test/browser/live-tests/types/live-type.spec.ts rename to _legacy/test/browser/live-tests/types/live-type.spec.ts diff --git a/test/browser/live-tests/types/live-types.spec.ts b/_legacy/test/browser/live-tests/types/live-types.spec.ts similarity index 100% rename from test/browser/live-tests/types/live-types.spec.ts rename to _legacy/test/browser/live-tests/types/live-types.spec.ts diff --git a/test/browser/setup/context.ts b/_legacy/test/browser/setup/context.ts similarity index 100% rename from test/browser/setup/context.ts rename to _legacy/test/browser/setup/context.ts diff --git a/test/browser/setup/delivery-test-client.ts b/_legacy/test/browser/setup/delivery-test-client.ts similarity index 100% rename from test/browser/setup/delivery-test-client.ts rename to _legacy/test/browser/setup/delivery-test-client.ts diff --git a/test/browser/setup/index.ts b/_legacy/test/browser/setup/index.ts similarity index 100% rename from test/browser/setup/index.ts rename to _legacy/test/browser/setup/index.ts diff --git a/test/browser/setup/models.ts b/_legacy/test/browser/setup/models.ts similarity index 100% rename from test/browser/setup/models.ts rename to _legacy/test/browser/setup/models.ts diff --git a/test/browser/setup/setup.ts b/_legacy/test/browser/setup/setup.ts similarity index 100% rename from test/browser/setup/setup.ts rename to _legacy/test/browser/setup/setup.ts diff --git a/test/node/base/base-node-test.js b/_legacy/test/node/base/base-node-test.js similarity index 100% rename from test/node/base/base-node-test.js rename to _legacy/test/node/base/base-node-test.js diff --git a/tsconfig.json b/_legacy/tsconfig.json similarity index 100% rename from tsconfig.json rename to _legacy/tsconfig.json diff --git a/tsconfig.prod.json b/_legacy/tsconfig.prod.json similarity index 100% rename from tsconfig.prod.json rename to _legacy/tsconfig.prod.json diff --git a/tsconfig.webpack.json b/_legacy/tsconfig.webpack.json similarity index 100% rename from tsconfig.webpack.json rename to _legacy/tsconfig.webpack.json diff --git a/webpack.config.js b/_legacy/webpack.config.js similarity index 100% rename from webpack.config.js rename to _legacy/webpack.config.js From a3a391aefaef72f4bc8b92a40c9b5626025ccd77 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 15 Jan 2026 14:28:48 +0100 Subject: [PATCH 002/221] initial setup + base for list languages query --- .env.template | 8 + .gitattributes | 1 + .github/CODEOWNERS | 4 + .github/workflows/build.yml | 18 + .github/workflows/integration-tests.yml | 22 + .github/workflows/release.yml | 27 + .github/workflows/unit-tests.yml | 18 + .gitignore | 48 + .npmignore | 14 + .nvmrc | 1 + .vscode/settings.json | 33 + LICENSE.md | 9 + README.md | 13 + biome.json | 25 + eslint.config.mjs | 7 + lib/client/delivery-client.ts | 71 + lib/delivery-sdk-info.ts | 8 + lib/models/core.models.ts | 87 + lib/public_api.ts | 16 + lib/queries/languages/language.models.ts | 25 + lib/queries/languages/list-languages-query.ts | 34 + lib/sdk-info.ts | 4 + lib/utils/url.utils.ts | 38 + package-lock.json | 5181 +++++++++++++++++ package.json | 59 + scripts/clean.ts | 5 + scripts/update-version.ts | 5 + tests/integration-tests.config.ts | 90 + .../languages/list-languages-query.spec.ts | 23 + tests/unit/errors/custom-errors.spec.ts | 40 + tests/unit/headers/headers.spec.ts | 46 + tests/unit/headers/preview-api.spec.ts | 41 + tests/unit/headers/secure-api.spec.ts | 41 + .../validation/response-validation.spec.ts | 61 + tests/utils/integration-test.utils.ts | 320 + tests/utils/test.utils.ts | 25 + tsconfig.build.json | 8 + tsconfig.json | 45 + vitest-integration.config.ts | 16 + vitest-unit.config.ts | 16 + 40 files changed, 6553 insertions(+) create mode 100644 .env.template create mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/integration-tests.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/unit-tests.yml create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .nvmrc create mode 100644 .vscode/settings.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 biome.json create mode 100644 eslint.config.mjs create mode 100644 lib/client/delivery-client.ts create mode 100644 lib/delivery-sdk-info.ts create mode 100644 lib/models/core.models.ts create mode 100644 lib/public_api.ts create mode 100644 lib/queries/languages/language.models.ts create mode 100644 lib/queries/languages/list-languages-query.ts create mode 100644 lib/sdk-info.ts create mode 100644 lib/utils/url.utils.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/clean.ts create mode 100644 scripts/update-version.ts create mode 100644 tests/integration-tests.config.ts create mode 100644 tests/integration/languages/list-languages-query.spec.ts create mode 100644 tests/unit/errors/custom-errors.spec.ts create mode 100644 tests/unit/headers/headers.spec.ts create mode 100644 tests/unit/headers/preview-api.spec.ts create mode 100644 tests/unit/headers/secure-api.spec.ts create mode 100644 tests/unit/validation/response-validation.spec.ts create mode 100644 tests/utils/integration-test.utils.ts create mode 100644 tests/utils/test.utils.ts create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json create mode 100644 vitest-integration.config.ts create mode 100644 vitest-unit.config.ts diff --git a/.env.template b/.env.template new file mode 100644 index 00000000..6c3c0ad1 --- /dev/null +++ b/.env.template @@ -0,0 +1,8 @@ +# Name of Kontent.ai project: @kontent-ai/sync-sdk-js + +INTEGRATION_ENVIRONMENT_ID=x +INTEGRATION_MANAGEMENT_API_KEY=x +INTEGRATION_MANAGEMENT_BASE_URL=x #can be used to customize base url for MAPI requests +INTEGRATION_DELIVERY_BASE_URL=x +INTEGRATION_DELIVERY_SYNC_BASE_URL=x + diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fcadb2cf --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text eol=lf diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..c2f5379c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,4 @@ +# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths. +# See https://help.github.com/articles/about-code-owners/ + +* @Enngage @kontent-ai/javascript-maintainers diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..20165e74 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,18 @@ +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 build diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 00000000..72925782 --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,22 @@ +name: Integration Tests + +on: + push: + branches: [main] + pull_request: + +env: + INTEGRATION_ENVIRONMENT_ID: ${{ secrets.INTEGRATION_ENVIRONMENT_ID }} + INTEGRATION_MANAGEMENT_API_KEY: ${{ secrets.INTEGRATION_MANAGEMENT_API_KEY }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js from .nvmrc file + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + - run: npm ci + - run: npm run test:integration diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..d8c4f413 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,27 @@ +on: + release: + types: [published] + +name: publish-to-npm +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + registry-url: 'https://registry.npmjs.org' + + - run: npm ci + + - run: npm publish --access=public + if: ${{!github.event.release.prerelease}} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} + - run: npm publish --tag prerelease + if: ${{github.event.release.prerelease}} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} \ No newline at end of file diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 00000000..b4c4a887 --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,18 @@ +name: Unit Tests + +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 test:unit diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..883c776e --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# Custom +.editorconfig +.env + +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/definitions +/dist +/tmp +/coverage +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..8e61670b --- /dev/null +++ b/.npmignore @@ -0,0 +1,14 @@ +# Ignore everything +* + +# But descend into directories + +# Recursively allow files under subtree +!/lib/** +!/dist/** +!package.json +!.npmignore +!README.md +!LICENSE.md + + 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/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c4bdcf72 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,33 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib", + "files.eol": "\n", + "typescript.updateImportsOnFileMove.enabled": "always", + "editor.defaultFormatter": "biomejs.biome", + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit" + }, + "editor.formatOnSave": true, + "typescript.format.enable": false, + "javascript.format.enable": false, + "[markdown]": { + "editor.formatOnSave": true + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[jsonc]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[scss]": { + "editor.defaultFormatter": "vscode.css-language-features" + } +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..e67552f6 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +# MIT License + +Copyright (c) 2026 Kontent s.r.o. + +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. diff --git a/README.md b/README.md new file mode 100644 index 00000000..e48aa35c --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +[![npm version](https://badge.fury.io/js//%40kontent-ai%2Fdelivery-sdk.svg)](https://www.npmjs.com/package/@kontent-ai/delivery-sdk) +[![Build](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/build.yml/badge.svg)](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/build.yml) +[![Integration Tests](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/integration-tests.yml/badge.svg)](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/integration-tests.yml) +[![Unit Tests](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/unit-tests.yml) +[![npm](https://img.shields.io/npm/dt/@kontent-ai/delivery-sdk.svg)](https://www.npmjs.com/package/@kontent-ai/delivery-sdk) +[![Known Vulnerabilities](https://snyk.io/test/github/Kontent-ai/delivery-sdk-js/badge.svg)](https://snyk.io/test/github/kontent-ai/delivery-sdk-js) +[![GitHub license](https://img.shields.io/github/license/Kontent-ai/delivery-sdk-js.svg)](https://github.com/kontent-ai/delivery-sdk-js) + +# Kontent.ai Delivery SDK for JavaScript + +## License + +MIT diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..8658e76b --- /dev/null +++ b/biome.json @@ -0,0 +1,25 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "extends": ["@kontent-ai/biome-config/base"], + "formatter": { + "indentWidth": 4, + "indentStyle": "tab", + "lineWidth": 140 + }, + "linter": { + "rules": { + "correctness": { + "noUnusedImports": { + "fix": "safe", + "level": "error" + }, + "useImportExtensions": { + "level": "error", + "options": { + "forceJsExtensions": true + } + } + } + } + } +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..8d52ee6b --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,7 @@ +import kontentAiConfig from "@kontent-ai/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig({ + extends: [kontentAiConfig], + files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"], +}); diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts new file mode 100644 index 00000000..77c15bb9 --- /dev/null +++ b/lib/client/delivery-client.ts @@ -0,0 +1,71 @@ +import type { CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, DeliveryClientTypes } from "../models/core.models.js"; +import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; + +type GetDeliveryClient = { + /** + * Use publicly available API for requests. + */ + publicApi: () => { + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + }; + /** + * Use preview API for requests. + * + * Requires a delivery API key with preview access. + */ + previewApi: (deliveryApiKey: string) => { + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + }; + + /** + * Use secure API for requests. + * + * Requires a delivery API key with secure access. + */ + secureApi: (deliveryApiKey: string) => { + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + }; +}; + +/** + * Creates a new sync client instance using fluent API. + * + * You may choose to use public, preview or secure API. + * + * Options can be set within the 'create' function. + * + * @param environmentId - The Id of the Kontent.ai environment. + */ +export function getDeliveryClient( + environmentId: string, +): GetDeliveryClient { + return { + publicApi: () => { + return withClient({ apiMode: "public", environmentId }); + }, + previewApi: (deliveryApiKey: string) => { + return withClient({ apiMode: "preview", environmentId, deliveryApiKey }); + }, + secureApi: (deliveryApiKey: string) => { + return withClient({ apiMode: "secure", environmentId, deliveryApiKey }); + }, + }; +} + +function withClient( + requiredConfig: Pick, +) { + return { + create: (options?: CreateDeliveryClientOptions): DeliveryClient => + createDeliveryClient({ ...requiredConfig, ...options }), + }; +} + +function createDeliveryClient( + config: DeliveryClientConfig, +): DeliveryClient { + return { + config, + listLanguages: () => getListLanguagesQuery(config), + }; +} diff --git a/lib/delivery-sdk-info.ts b/lib/delivery-sdk-info.ts new file mode 100644 index 00000000..737c0e05 --- /dev/null +++ b/lib/delivery-sdk-info.ts @@ -0,0 +1,8 @@ +import type { SDKInfo } from "@kontent-ai/core-sdk"; +import { sdkInfo } from "./sdk-info.js"; + +export const deliverySdkInfo: SDKInfo = { + name: sdkInfo.name, + version: sdkInfo.version, + host: "npmjs.com", +}; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts new file mode 100644 index 00000000..fe19d640 --- /dev/null +++ b/lib/models/core.models.ts @@ -0,0 +1,87 @@ +import type { AdapterResponse, ContinuationHeaderName, SdkConfig } from "@kontent-ai/core-sdk"; +import z from "zod"; +import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; + +export type DeliveryClientTypes = { + readonly languageCodenames: string; + readonly typeCodenames: string; + readonly workflowCodenames: string; + readonly workflowStepCodenames: string; + readonly collectionCodenames: string; + readonly taxonomyCodenames: string; +}; + +export type DeliveryResponseMeta = Pick & { + readonly continuationToken?: string; +} & TExtraMetadata; + +export type DeliveryResponse = { + readonly payload: TPayload; + readonly meta: DeliveryResponseMeta; +}; + +export type ApiMode = "public" | "preview" | "secure"; + +export type DeliveryClientConfig = SdkConfig & { + /** + * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. + */ + readonly environmentId: string; + + /** + * Delivery API key. + * + * Required for secure and preview modes. + */ + readonly deliveryApiKey?: string; + + /** + * Mode for the API. + * + * Secure mode requires a delivery API key with secure access. + * Preview mode requires a delivery API key with preview access. + * Delivery mode is used for public access. + */ + readonly apiMode: ApiMode; +}; + +/** + * Sync client instance. + * + * @param TSyncApiTypes - The types representing your Kontent.ai environment. + * Can be used to narrow down the types of the response payload. + * For example, the codenames of langauges, content types etc. can be narrowed. + */ +export type DeliveryClient = { + readonly config: DeliveryClientConfig; + + /** + * Initializes synchronization of changes in all of the supported entities. + * After the initialization, you’ll get the X-Continuation token which you + * should store for later use in the 'sync' function. + */ + listLanguages(): ListLanguagesQuery; +}; + +export type CreateDeliveryClientOptions = Omit; + +export class MissingContinuationTokenError extends Error { + constructor() { + super(`Missing '${"X-Continuation" satisfies ContinuationHeaderName}' header`); + } +} + +export const paginationSchema = z.object({ + pagination: z + .object({ + skip: z.number(), + limit: z.number(), + count: z.number(), + next_page: z.string(), + }) + .readonly(), +}); + +export type PaginationSchema = Readonly>; + +export type PayloadWithPagination = TPayload & PaginationSchema; diff --git a/lib/public_api.ts b/lib/public_api.ts new file mode 100644 index 00000000..5e5b144e --- /dev/null +++ b/lib/public_api.ts @@ -0,0 +1,16 @@ +// biome-ignore lint/performance/noBarrelFile: One barrel for the public API is fine +export { getDeliveryClient } from "./client/delivery-client.js"; +export type { + ApiMode, + CreateDeliveryClientOptions, + DeliveryClient, + DeliveryClientConfig, + DeliveryClientTypes, + DeliveryResponse, + DeliveryResponseMeta, +} from "./models/core.models.js"; +/* +Languages +*/ +export { Language, ListLanguagesPayload, languageSchema, listLanguagesPayloadSchema } from "./queries/languages/language.models.js"; +export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts new file mode 100644 index 00000000..d1fc3be0 --- /dev/null +++ b/lib/queries/languages/language.models.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; +import { paginationSchema } from "../../models/core.models.js"; + +export const languageSchema = z + .object({ + system: z + .object({ + id: z.string(), + codename: z.string(), + name: z.string(), + }) + .readonly(), + }) + .readonly(); + +export const listLanguagesPayloadSchema = z + .object({ + languages: z.array(languageSchema).readonly(), + ...paginationSchema.shape, + }) + .readonly(); + +export type Language = z.infer; + +export type ListLanguagesPayload = z.infer; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts new file mode 100644 index 00000000..02789b75 --- /dev/null +++ b/lib/queries/languages/list-languages-query.ts @@ -0,0 +1,34 @@ +import { getQuery, type Query } from "@kontent-ai/core-sdk"; +import { deliverySdkInfo } from "../../delivery-sdk-info.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientTypes } from "../../models/core.models.js"; +import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; +import { type ListLanguagesPayload, listLanguagesPayloadSchema } from "./language.models.js"; + +export type ListLanguagesQuery = Query; + +export function getListLanguagesQuery( + config: DeliveryClientConfig, +): ReturnType["listLanguages"]> { + const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); + + const { toPromise } = getQuery({ + config, + sdkInfo: deliverySdkInfo, + authorizationApiKey: config.deliveryApiKey, + zodSchema: listLanguagesPayloadSchema, + continuationToken: undefined, + extraMetadata: () => { + return {}; + }, + request: { + url, + body: null, + method: "GET", + }, + }); + + return { + toUrl: () => url, + toPromise, + }; +} diff --git a/lib/sdk-info.ts b/lib/sdk-info.ts new file mode 100644 index 00000000..e4899988 --- /dev/null +++ b/lib/sdk-info.ts @@ -0,0 +1,4 @@ +export const sdkInfo = { + version: "{{version}}", + name: "@kontent-ai/delivery-sdk", +}; diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts new file mode 100644 index 00000000..fc18f01d --- /dev/null +++ b/lib/utils/url.utils.ts @@ -0,0 +1,38 @@ +import type { ApiMode, DeliveryClientConfig } from "../models/core.models.js"; + +export function getDeliveryEndpointUrl({ + environmentId, + path, + baseUrl, + apiMode, +}: { readonly path: string } & Pick): string { + return getEndpointUrl({ + environmentId, + path, + baseUrl: baseUrl ?? getDefaultBaseUrlForApiMode(apiMode), + }); +} + +export function getEndpointUrl({ + environmentId, + path, + baseUrl, +}: { + readonly environmentId: string; + readonly path: string; + readonly baseUrl: string; +}): string { + return removeDuplicateSlashes(`${baseUrl}/${environmentId}/${path}`); +} + +function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { + if (apiMode === "preview") { + return "https://preview-deliver.kontent.ai"; + } + + return "https://deliver.kontent.ai"; +} + +function removeDuplicateSlashes(path: string): string { + return path.replace(/\/+/g, "/"); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3cd30e45 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5181 @@ +{ + "name": "@kontent-ai/delivery-sdk", + "version": "17.0.0-preview.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@kontent-ai/delivery-sdk", + "version": "17.0.0-preview.0", + "license": "MIT", + "dependencies": { + "@kontent-ai/core-sdk": "12.0.0-preview.7", + "zod": "4.3.5" + }, + "devDependencies": { + "@biomejs/biome": "2.3.11", + "@kontent-ai/biome-config": "0.7.0", + "@kontent-ai/eslint-config": "2.3.0", + "@types/node": "25.0.8", + "chalk": "5.6.2", + "dotenv": "17.2.3", + "eslint": "9.39.2", + "tsx": "4.21.0", + "typescript": "5.9.3", + "vitest": "4.0.17" + }, + "engines": { + "node": ">= 22" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.11.tgz", + "integrity": "sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.3.11", + "@biomejs/cli-darwin-x64": "2.3.11", + "@biomejs/cli-linux-arm64": "2.3.11", + "@biomejs/cli-linux-arm64-musl": "2.3.11", + "@biomejs/cli-linux-x64": "2.3.11", + "@biomejs/cli-linux-x64-musl": "2.3.11", + "@biomejs/cli-win32-arm64": "2.3.11", + "@biomejs/cli-win32-x64": "2.3.11" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.11.tgz", + "integrity": "sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.11.tgz", + "integrity": "sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.11.tgz", + "integrity": "sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.11.tgz", + "integrity": "sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.11.tgz", + "integrity": "sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.11.tgz", + "integrity": "sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.11.tgz", + "integrity": "sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.11.tgz", + "integrity": "sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "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.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kontent-ai/biome-config": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/biome-config/-/biome-config-0.7.0.tgz", + "integrity": "sha512-/dnPAq6QFCuGzdste5dqV0sTa1mBaHP7gLXrNaSzpa3HOGBYYJnKO7kfMD7YUknjoAsOSJyoQ9aAQ7FFB2Yvzg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@biomejs/biome": "^2.3.11" + } + }, + "node_modules/@kontent-ai/core-sdk": { + "version": "12.0.0-preview.7", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.7.tgz", + "integrity": "sha512-imwU2Wihb5sLqf9nrmzgIVTZZALm/f7EagZg4zYOCqQ7ejPc6ZUewerqsYxZvVExPbTIsio8Ns8ZDD9sImuG7w==", + "license": "MIT", + "dependencies": { + "zod": "4.3.5" + }, + "engines": { + "node": ">= 22" + } + }, + "node_modules/@kontent-ai/eslint-config": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.3.0.tgz", + "integrity": "sha512-jitXKJwj56QGzcV9Y2gOVxT6ApIkmS/fcJwbNFhLvuW2DR92gLY7qWnEgscDnCYWKZ9a4gSCVINcRBbZoWSOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^9.39.1", + "eslint-plugin-react": "^7.37.5" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "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/node": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz", + "integrity": "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", + "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/type-utils": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.53.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", + "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", + "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", + "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", + "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", + "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0", + "@typescript-eslint/utils": "8.53.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", + "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", + "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.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", + "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.53.0", + "@typescript-eslint/tsconfig-utils": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/visitor-keys": "8.53.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", + "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.0", + "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/typescript-estree": "8.53.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", + "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", + "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", + "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.17", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", + "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", + "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", + "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", + "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", + "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.17", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "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==", + "dev": true, + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "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/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "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/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "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/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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-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-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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.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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "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, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/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" + } + }, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.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, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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-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/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "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/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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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.11", + "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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "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/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": ">= 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/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" + } + }, + "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/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "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.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "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/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", + "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.17", + "@vitest/mocker": "4.0.17", + "@vitest/pretty-format": "4.0.17", + "@vitest/runner": "4.0.17", + "@vitest/snapshot": "4.0.17", + "@vitest/spy": "4.0.17", + "@vitest/utils": "4.0.17", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.17", + "@vitest/browser-preview": "4.0.17", + "@vitest/browser-webdriverio": "4.0.17", + "@vitest/ui": "4.0.17", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "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-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "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" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..9cadea4f --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "name": "@kontent-ai/delivery-sdk", + "version": "17.0.0-preview.0", + "repository": { + "type": "git", + "url": "https://github.com/kontent-ai/delivery-sdk-js" + }, + "private": false, + "author": "richard sustek", + "license": "MIT", + "description": "Official Kontent.AI Delivery API SDK", + "keywords": [ + "Kontent", + "Kontent.ai", + "Kontent SDK", + "Kontent API", + "Kontent Delivery", + "Kontent Javascript", + "Kontent Node.js", + "Kontent Typescript" + ], + "engines": { + "node": ">= 22" + }, + "exports": "./dist/public_api.js", + "types": "./dist/public_api.d.ts", + "type": "module", + "scripts": { + "prepublishOnly": "npm run build", + "eslint": "eslint", + "lint": "npm run biome:check && npm run eslint", + "build": "npm run biome:check && npm run eslint && npm run build:noemit && npm run clean && tsc --p tsconfig.build.json && npm run update:version", + "build:noemit": "tsc --p tsconfig.json", + "test": "npm run test:unit && npm run test:integration", + "test:unit": "vitest run --config=vitest-unit.config.ts", + "test:integration": "vitest run --config=vitest-integration.config.ts", + "biome:check": "biome check", + "biome:fix": "biome check --write", + "biome:fix:unsafe": "biome check --write --unsafe", + "clean": "tsx scripts/clean.ts", + "update:version": "tsx ./scripts/update-version.ts" + }, + "dependencies": { + "@kontent-ai/core-sdk": "12.0.0-preview.7", + "zod": "4.3.5" + }, + "devDependencies": { + "@kontent-ai/biome-config": "0.7.0", + "@kontent-ai/eslint-config": "2.3.0", + "eslint": "9.39.2", + "@biomejs/biome": "2.3.11", + "@types/node": "25.0.8", + "chalk": "5.6.2", + "typescript": "5.9.3", + "vitest": "4.0.17", + "dotenv": "17.2.3", + "tsx": "4.21.0" + } +} diff --git a/scripts/clean.ts b/scripts/clean.ts new file mode 100644 index 00000000..bd7f34d3 --- /dev/null +++ b/scripts/clean.ts @@ -0,0 +1,5 @@ +import { deleteFolderRecursive } from "@kontent-ai/core-sdk/devkit"; + +for (const path of ["dist"]) { + deleteFolderRecursive(path); +} diff --git a/scripts/update-version.ts b/scripts/update-version.ts new file mode 100644 index 00000000..bfe306fe --- /dev/null +++ b/scripts/update-version.ts @@ -0,0 +1,5 @@ +import { replaceSdkVersionPlaceholder } from "@kontent-ai/core-sdk/devkit"; +// biome-ignore lint/correctness/useImportExtensions: package.json is a JSON file +import packageJson from "../package.json" with { type: "json" }; + +replaceSdkVersionPlaceholder("./dist/sdk-info.js", packageJson.version); diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts new file mode 100644 index 00000000..75f73700 --- /dev/null +++ b/tests/integration-tests.config.ts @@ -0,0 +1,90 @@ +import { getEndpointUrl } from "../lib/utils/url.utils.js"; +import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "./utils/test.utils.js"; + +export function getIntegrationTestConfig() { + const integrationEnv = { + id: getEnvironmentRequiredValue("INTEGRATION_ENVIRONMENT_ID"), + mapiKey: getEnvironmentRequiredValue("INTEGRATION_MANAGEMENT_API_KEY"), + mapiBaseUrl: getEnvironmentOptionalValue("INTEGRATION_MANAGEMENT_BASE_URL"), + deliveryBaseUrl: getEnvironmentOptionalValue("INTEGRATION_DELIVERY_BASE_URL"), + } as const; + + const languageVariantUrl = (itemCodename: string, languageCodename: string) => + getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: `/items/codename/${itemCodename}/variants/codename/${languageCodename}`, + }); + + const getMapiEndpointUrl = ({ environmentId, path }: { readonly environmentId: string; readonly path: string }): string => { + return getEndpointUrl({ + environmentId, + path, + baseUrl: integrationEnv.mapiBaseUrl ?? "https://manage.kontent.ai/v2/projects/", + }); + }; + + const getDeliveryEndpointUrl = ({ environmentId, path }: { readonly environmentId: string; readonly path: string }): string => { + return getEndpointUrl({ + environmentId, + path, + baseUrl: integrationEnv.deliveryBaseUrl ?? "https://deliver.kontent.ai/", + }); + }; + + return { + env: integrationEnv, + mapiUrls: { + contentType: (codename: string) => + getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: `/types/codename/${codename}`, + }), + taxonomy: (codename: string) => + getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: `/taxonomies/codename/${codename}`, + }), + contentItem: (codename: string) => + getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: `/items/codename/${codename}`, + }), + language: (codename: string) => + getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: `/languages/codename/${codename}`, + }), + languageVariant: languageVariantUrl, + publish: (itemCodename: string, languageCodename: string) => `${languageVariantUrl(itemCodename, languageCodename)}/publish`, + contentTypes: getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: "/types", + }), + taxonomies: getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: "/taxonomies", + }), + contentItems: getMapiEndpointUrl({ + environmentId: integrationEnv.id, + path: "/items", + }), + }, + deliveryUrls: { + contentType: (codename: string) => + getDeliveryEndpointUrl({ + environmentId: integrationEnv.id, + path: `/types/${codename}`, + }), + taxonomy: (codename: string) => + getDeliveryEndpointUrl({ + environmentId: integrationEnv.id, + path: `/taxonomies/${codename}`, + }), + contentItem: (codename: string) => + getDeliveryEndpointUrl({ + environmentId: integrationEnv.id, + path: `/items/${codename}`, + }), + }, + }; +} diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts new file mode 100644 index 00000000..a2417aaf --- /dev/null +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from "vitest"; +import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { listLanguagesPayloadSchema } from "../../../lib/queries/languages/language.models.js"; +import { getIntegrationTestConfig } from "../../integration-tests.config.js"; + +describe("List languages query", async () => { + const config = getIntegrationTestConfig(); + const client = getDeliveryClient(config.env.id).publicApi().create({ + baseUrl: config.env.deliveryBaseUrl, + }); + + const { response } = await client.listLanguages().toPromise(); + + it("Response payload should match schema", async () => { + const parseResult = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); + expect(parseResult.error).toBeUndefined(); + expect(parseResult.success).toBeTruthy(); + }); + + it("Response should contain at least one language", () => { + expect(response?.payload.languages.length).toBeGreaterThanOrEqual(1); + }); +}); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts new file mode 100644 index 00000000..79d3583d --- /dev/null +++ b/tests/unit/errors/custom-errors.spec.ts @@ -0,0 +1,40 @@ +import { type ErrorReason, getDefaultHttpService } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import { getDeliveryClient } from "../../../lib/public_api.js"; + +class CustomError extends Error {} + +describe("Handling of custom errors", async () => { + const { success, error } = await getDeliveryClient("x") + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getDefaultHttpService({ + adapter: { + requestAsync: () => { + throw new CustomError(); + }, + }, + }), + }) + .listLanguages() + .toPromise(); + + it("Success should be false", () => { + expect(success).toBe(false); + }); + + it("Error should be returned as unknown", () => { + expect(error?.details.reason).toBe("unknown"); + }); + + it("Original error should be propagated and be of proper type", () => { + if (error?.details.reason === "unknown") { + expect(error.details.originalError).toBeInstanceOf(CustomError); + } else { + throw new Error("Error should be returned as unknown"); + } + }); +}); diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts new file mode 100644 index 00000000..411daf44 --- /dev/null +++ b/tests/unit/headers/headers.spec.ts @@ -0,0 +1,46 @@ +import { getDefaultHttpAdapter, getDefaultHttpService, getSdkIdHeader, type Header } from "@kontent-ai/core-sdk"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { getDeliveryClient } from "../../../lib/public_api.js"; + +describe("Delivery tracking header", async () => { + const expectedHeader = getSdkIdHeader({ + name: "@kontent-ai/delivery-sdk", + version: "{{version}}", // macro is replaced by the version from package.json during build + host: "npmjs.com", + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + + await getDeliveryClient("x") + .publicApi() + .create({ + httpService: getDefaultHttpService({ + adapter: { + requestAsync: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().requestAsync(options); + }, + }, + }), + }) + .listLanguages() + .toPromise(); + + const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); + + it("Request headers should contain sync tracking header with current package info", () => { + expect(syncTrackingHeader?.value).toEqual(expectedHeader.value); + }); +}); diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/headers/preview-api.spec.ts new file mode 100644 index 00000000..15fd5698 --- /dev/null +++ b/tests/unit/headers/preview-api.spec.ts @@ -0,0 +1,41 @@ +import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { getDeliveryClient } from "../../../lib/public_api.js"; + +describe("Preview API", async () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + const previewApiKey = "y"; + + await getDeliveryClient("x") + .previewApi(previewApiKey) + .create({ + httpService: getDefaultHttpService({ + adapter: { + requestAsync: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().requestAsync(options); + }, + }, + }), + }) + .listLanguages() + .toPromise(); + + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + + it("Request headers should contain authorization header with delivery API key", () => { + expect(authorizationHeader?.value).toEqual(`Bearer ${previewApiKey}`); + }); +}); diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/headers/secure-api.spec.ts new file mode 100644 index 00000000..b4cb7805 --- /dev/null +++ b/tests/unit/headers/secure-api.spec.ts @@ -0,0 +1,41 @@ +import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { getDeliveryClient } from "../../../lib/public_api.js"; + +describe("Secure API", async () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + const secureApiKey = "y"; + + await getDeliveryClient("x") + .secureApi(secureApiKey) + .create({ + httpService: getDefaultHttpService({ + adapter: { + requestAsync: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().requestAsync(options); + }, + }, + }), + }) + .listLanguages() + .toPromise(); + + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + + it("Request headers should contain authorization header with secure API key", () => { + expect(authorizationHeader?.value).toEqual(`Bearer ${secureApiKey}`); + }); +}); diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts new file mode 100644 index 00000000..262ec065 --- /dev/null +++ b/tests/unit/validation/response-validation.spec.ts @@ -0,0 +1,61 @@ +import type { ErrorReason } from "@kontent-ai/core-sdk"; +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, test } from "vitest"; +import { ZodError } from "zod"; +import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; + +describe("Response validation", () => { + test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { + const query = getDeliveryClient("x") + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + result: "invalidValue", + }, + statusCode: 200, + }), + }) + .listLanguages(); + + const { success, error } = await query.toPromise(); + + expect(success).toBe(false); + expect(error).toBeDefined(); + expect(error?.details.reason).toStrictEqual("validationFailed"); + + if (error?.details.reason === "validationFailed") { + expect(error.details.url).toStrictEqual(query.toUrl()); + expect(error.details.zodError).toBeInstanceOf(ZodError); + expect(error.details.message).toBeDefined(); + expect(error.details.response).toBeDefined(); + } else { + throw new Error(`Unexpected error reason '${error?.details.reason}'`); + } + }); + + test("Error should not be returned when response does not match schema but validation is disabled", async ({ expect }) => { + const { success, error } = await getDeliveryClient("x") + .publicApi() + .create({ + responseValidation: { + enable: false, + }, + + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + value: "invalidValue", + }, + statusCode: 200, + }), + }) + .listLanguages() + .toPromise(); + + expect(success).toBe(true); + expect(error).toBeUndefined(); + }); +}); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts new file mode 100644 index 00000000..d855b820 --- /dev/null +++ b/tests/utils/integration-test.utils.ts @@ -0,0 +1,320 @@ +import { getDefaultHttpService, type HttpResponse, type JsonValue, type ResultOfSuccessfulQuery } from "@kontent-ai/core-sdk"; +import type { SyncClient, SyncClientTypes, SyncQuery } from "../../lib/public_api.js"; +import { getIntegrationTestConfig } from "../integration-tests.config.js"; + +type ElementChangeEntityData = { readonly value: string } & ElementData; + +type SharedEntityData = { + readonly codename: string; + readonly name: string; +}; + +type ElementData = { readonly type: "text" } & SharedEntityData; + +type LanguageVariantData = { + readonly elements: readonly { + readonly element: { + readonly codename: string; + }; + readonly value: string; + }[]; +}; + +const config = getIntegrationTestConfig(); +const httpService = getDefaultHttpService({ + requestHeaders: [ + { + name: "Authorization", + value: `Bearer ${config.env.mapiKey}`, + }, + ], + retryStrategy: { + maxRetries: 10, + logRetryAttempt: false, + getDelayBetweenRetriesMs: () => 500, + }, +}); + +export async function prepareEnvironmentAsync({ + item, + type, + taxonomy, +}: Parameters[0]): Promise { + await Promise.all([ + deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ + deleteUrl: config.mapiUrls.taxonomy(taxonomy.codename), + deliveryGetUrl: config.deliveryUrls.taxonomy(taxonomy.codename), + }), + deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ + deleteUrl: config.mapiUrls.contentItem(item.codename), + deliveryGetUrl: config.deliveryUrls.contentItem(item.codename), + }), + ]); + + await deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ + deleteUrl: config.mapiUrls.contentType(type.codename), + deliveryGetUrl: config.deliveryUrls.contentType(type.codename), + }); +} + +export async function processChangesForIntegrationTestAsync({ + item, + type, + element, + language, + taxonomy, +}: { + readonly type: SharedEntityData; + readonly element: ElementChangeEntityData; + readonly item: SharedEntityData; + readonly language: SharedEntityData; + readonly taxonomy: SharedEntityData; +}): Promise { + // first prepare the environment by creating the content type, taxonomy and renaming the language + await Promise.all([createContentTypeAsync(type, element), createTaxonomyAsync(taxonomy), renameLanguageAsync(language)]); + + // then create the content item and variant + await createContentItemAndVariantAsync(item, type, language, element); +} + +export async function pollSyncApiAsync({ + token, + client, + getDeltaObject, + retryAttempt, + maxRetries, + pollWaitInMs, +}: { + readonly client: SyncClient; + readonly pollWaitInMs: number; + readonly token: string; + readonly getDeltaObject: (response: ResultOfSuccessfulQuery>) => T | undefined; + readonly retryAttempt: number; + readonly maxRetries: number; +}): Promise< + | { readonly success: true; readonly deltaObject: T; readonly syncResponse: ResultOfSuccessfulQuery> } + | { readonly success: false; readonly deltaObject?: never; readonly syncResponse?: never } +> { + if (retryAttempt >= maxRetries) { + return { + success: false, + }; + } + + const { response: syncResponse, success } = await client.sync(token).toPromise(); + + if (!success) { + throw new Error("Failed to get sync response. The request should always succeed."); + } + + const deltaObject = getDeltaObject(syncResponse); + + if (deltaObject) { + return { + success: true, + deltaObject, + syncResponse, + }; + } + + await waitAsync(pollWaitInMs); + return await pollSyncApiAsync({ + client, + getDeltaObject, + token, + retryAttempt: retryAttempt + 1, + maxRetries, + pollWaitInMs, + }); +} + +export async function waitUntilDeliveryEntityIsDeletedAsync({ + fetchEntityUrl, + retryAttempt, + maxRetries, + pollWaitInMs, +}: { + readonly pollWaitInMs: number; + readonly fetchEntityUrl: string; + readonly retryAttempt: number; + readonly maxRetries: number; +}): Promise { + if (retryAttempt >= maxRetries) { + return; + } + + const { error, success } = await httpService.requestAsync({ + url: fetchEntityUrl, + body: null, + method: "GET", + }); + + if (success) { + // if response is valid, it means the deleted entity is still available in delivery API + await waitAsync(pollWaitInMs); + return await waitUntilDeliveryEntityIsDeletedAsync({ + fetchEntityUrl, + retryAttempt: retryAttempt + 1, + maxRetries, + pollWaitInMs, + }); + } + + if (error.details.reason === "notFound") { + // if entity is not found, it means it has been deleted and the change propagation is complete + return; + } + + throw new Error(`Failed to wait until entity is deleted: ${fetchEntityUrl}`, { cause: error }); +} + +async function renameLanguageAsync(language: SharedEntityData): Promise { + await httpService.requestAsync< + SharedEntityData, + { + op: "replace"; + property_name: "name"; + value: string; + }[] + >({ + url: config.mapiUrls.language(language.codename), + body: [ + { + op: "replace", + property_name: "name", + value: language.name, + }, + ], + method: "PATCH", + }); +} + +async function createTaxonomyAsync(taxonomy: SharedEntityData): Promise { + await httpService.requestAsync({ + url: config.mapiUrls.taxonomies, + body: { + codename: taxonomy.codename, + name: taxonomy.name, + terms: [], + }, + method: "POST", + }); +} + +async function createContentTypeAsync(type: SharedEntityData, element: ElementChangeEntityData): Promise { + await httpService.requestAsync< + SharedEntityData, + SharedEntityData & { + readonly elements: readonly ElementData[]; + } + >({ + url: config.mapiUrls.contentTypes, + body: { + codename: type.codename, + name: type.name, + elements: [ + { + codename: element.codename, + name: element.name, + type: element.type, + }, + ], + }, + method: "POST", + }); +} + +async function waitAsync(ms: number): Promise { + return await new Promise((resolve) => { + setTimeout(resolve, ms); + return; + }); +} + +async function deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ + deleteUrl, + deliveryGetUrl, +}: { + readonly deleteUrl: string; + readonly deliveryGetUrl: string; +}): Promise { + await skip404ErrorsAsync(async () => { + return await httpService.requestAsync({ + url: deleteUrl, + body: null, + method: "DELETE", + }); + }); + + await waitUntilDeliveryEntityIsDeletedAsync({ + fetchEntityUrl: deliveryGetUrl, + maxRetries: 30, + pollWaitInMs: 1000, + retryAttempt: 0, + }); +} + +async function createContentItemAndVariantAsync( + item: SharedEntityData, + type: SharedEntityData, + language: SharedEntityData, + element: ElementChangeEntityData, +): Promise { + await httpService.requestAsync< + SharedEntityData, + SharedEntityData & { + readonly type: { + readonly codename: string; + }; + } + >({ + url: config.mapiUrls.contentItems, + body: { + codename: item.codename, + name: item.name, + type: { + codename: type.codename, + }, + }, + method: "POST", + }); + + await httpService.requestAsync({ + url: config.mapiUrls.languageVariant(item.codename, language.codename), + body: { + elements: [ + { + element: { + codename: element.codename, + }, + value: element.value, + }, + ], + }, + method: "PUT", + }); + + await httpService.requestAsync({ + url: config.mapiUrls.publish(item.codename, language.codename), + body: null, + method: "PUT", + }); +} + +async function skip404ErrorsAsync(fn: () => Promise>): Promise { + const { error, success, response } = await fn(); + + if (success) { + return response.data; + } + + if (error.details.reason === "notFound") { + return undefined; + } + + if (error.details.reason === "invalidResponse" && error.details.status === 401) { + throw new Error(`${error.message} ${error.details.kontentErrorResponse?.message}`, { cause: error }); + } + + throw new Error(`Failed to skip 404 errors. ${error.message}`, { cause: error }); +} diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts new file mode 100644 index 00000000..abe0e14e --- /dev/null +++ b/tests/utils/test.utils.ts @@ -0,0 +1,25 @@ +import type { ContinuationHeaderName, Header } from "@kontent-ai/core-sdk"; +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]; +} + +export const fakeXContinuationTokenHeader: Header = { + name: "X-Continuation" satisfies ContinuationHeaderName, + value: "x", +}; diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..80f9848e --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist" + }, + "include": ["lib/**/*"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..7c048739 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,45 @@ +{ + "compileOnSave": true, + "compilerOptions": { + // Language + runtime environment + "target": "es2022", + "lib": ["esnext"], + + // Modules + resolution + "module": "NodeNext", + "moduleResolution": "nodenext", + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + + // Emit behavior (even if `noEmit` is true, these are useful for tooling expectations) + "noEmit": true, + "declaration": true, + "sourceMap": true, + "importHelpers": true, + + // Decorators + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + + // Strictness + type safety + "strict": true, + "alwaysStrict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + + // Lint-like correctness checks + "noImplicitReturns": true, + "allowUnreachableCode": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "forceConsistentCasingInFileNames": true, + + // Perf / compatibility + "skipLibCheck": true, + "typeRoots": ["./node_modules/@types"] + }, + "include": ["lib/**/*", "tests/**/*", "eslint.config.js", "vitest.config.ts", "sample/**/*", "scripts/**/*"], + "exclude": ["node_modules"] +} diff --git a/vitest-integration.config.ts b/vitest-integration.config.ts new file mode 100644 index 00000000..53b896ad --- /dev/null +++ b/vitest-integration.config.ts @@ -0,0 +1,16 @@ +import { loadEnv } from "vite"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + root: ".", + test: { + dir: "tests/integration", + globals: true, + environment: "node", + setupFiles: ["dotenv/config"], + env: loadEnv("", process.cwd(), ""), // loads .env variables + }, + build: { + target: "esnext", + }, +}); diff --git a/vitest-unit.config.ts b/vitest-unit.config.ts new file mode 100644 index 00000000..bd4a522e --- /dev/null +++ b/vitest-unit.config.ts @@ -0,0 +1,16 @@ +import { loadEnv } from "vite"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + root: ".", + test: { + dir: "tests/unit", + globals: true, + environment: "node", + setupFiles: ["dotenv/config"], + env: loadEnv("", process.cwd(), ""), // loads .env variables + }, + build: { + target: "esnext", + }, +}); From 30b9d0a73530089bae5214fb44d4efb0d176891d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 21 Jan 2026 14:25:13 +0100 Subject: [PATCH 003/221] Extends basic API url tests, minor improvements to tests --- .../languages/list-languages-query.spec.ts | 13 +++-- tests/unit/headers/headers.spec.ts | 13 +++-- tests/unit/headers/preview-api.spec.ts | 19 +++++-- tests/unit/headers/public-deliver-api.spec.ts | 51 +++++++++++++++++++ tests/unit/headers/secure-api.spec.ts | 19 +++++-- 5 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 tests/unit/headers/public-deliver-api.spec.ts diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index a2417aaf..1fadf045 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -9,12 +9,17 @@ describe("List languages query", async () => { baseUrl: config.env.deliveryBaseUrl, }); - const { response } = await client.listLanguages().toPromise(); + const { response, success, error } = await client.listLanguages().toPromise(); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); it("Response payload should match schema", async () => { - const parseResult = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); - expect(parseResult.error).toBeUndefined(); - expect(parseResult.success).toBeTruthy(); + const { error: parseError, success: parseSuccess } = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); }); it("Response should contain at least one language", () => { diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 411daf44..1856d9f0 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -22,7 +22,7 @@ describe("Delivery tracking header", async () => { let requestHeaders: readonly Header[] = []; - await getDeliveryClient("x") + const query = getDeliveryClient("x") .publicApi() .create({ httpService: getDefaultHttpService({ @@ -35,8 +35,15 @@ describe("Delivery tracking header", async () => { }, }), }) - .listLanguages() - .toPromise(); + .listLanguages(); + + // execute query so that http service is called and request headers are captured + const { success, error } = await query.toPromise(); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/headers/preview-api.spec.ts index 15fd5698..ae59a1ad 100644 --- a/tests/unit/headers/preview-api.spec.ts +++ b/tests/unit/headers/preview-api.spec.ts @@ -17,7 +17,7 @@ describe("Preview API", async () => { let requestHeaders: readonly Header[] = []; const previewApiKey = "y"; - await getDeliveryClient("x") + const query = getDeliveryClient("x") .previewApi(previewApiKey) .create({ httpService: getDefaultHttpService({ @@ -30,12 +30,23 @@ describe("Preview API", async () => { }, }), }) - .listLanguages() - .toPromise(); + .listLanguages(); - const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + // execute query so that http service is called and request headers are captured + const { success, error } = await query.toPromise(); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); it("Request headers should contain authorization header with delivery API key", () => { + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); expect(authorizationHeader?.value).toEqual(`Bearer ${previewApiKey}`); }); + + it("URL should point to preview API", () => { + const { host } = new URL(query.toUrl()); + expect(host).toEqual("preview-deliver.kontent.ai"); + }); }); diff --git a/tests/unit/headers/public-deliver-api.spec.ts b/tests/unit/headers/public-deliver-api.spec.ts new file mode 100644 index 00000000..f77f357a --- /dev/null +++ b/tests/unit/headers/public-deliver-api.spec.ts @@ -0,0 +1,51 @@ +import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { getDeliveryClient } from "../../../lib/public_api.js"; + +describe("Public deliver API", async () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + + const query = getDeliveryClient("x") + .publicApi() + .create({ + httpService: getDefaultHttpService({ + adapter: { + requestAsync: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().requestAsync(options); + }, + }, + }), + }) + .listLanguages(); + + // execute query so that http service is called and request headers are captured + const { success, error } = await query.toPromise(); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + + it("Request headers should NOT contain authorization header with delivery API key", () => { + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + expect(authorizationHeader).toBeUndefined(); + }); + + it("URL should point to public deliver API", () => { + const { host } = new URL(query.toUrl()); + expect(host).toEqual("deliver.kontent.ai"); + }); +}); diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/headers/secure-api.spec.ts index b4cb7805..fda14183 100644 --- a/tests/unit/headers/secure-api.spec.ts +++ b/tests/unit/headers/secure-api.spec.ts @@ -17,7 +17,7 @@ describe("Secure API", async () => { let requestHeaders: readonly Header[] = []; const secureApiKey = "y"; - await getDeliveryClient("x") + const query = getDeliveryClient("x") .secureApi(secureApiKey) .create({ httpService: getDefaultHttpService({ @@ -30,12 +30,23 @@ describe("Secure API", async () => { }, }), }) - .listLanguages() - .toPromise(); + .listLanguages(); - const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + // execute query so that http service is called and request headers are captured + const { success, error } = await query.toPromise(); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); it("Request headers should contain authorization header with secure API key", () => { + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); expect(authorizationHeader?.value).toEqual(`Bearer ${secureApiKey}`); }); + + it("URL should point to secure API", () => { + const { host } = new URL(query.toUrl()); + expect(host).toEqual("deliver.kontent.ai"); + }); }); From 5c5340b068aa46fb8a3427997a6d83f9801ec8d4 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 23 Jan 2026 12:30:48 +0100 Subject: [PATCH 004/221] schema testing --- .../languages/list-languages.spec.ts | 45 ++- biome.json | 3 + eslint.config.mjs | 17 +- lib/client/delivery-client.ts | 31 +- lib/models/core.models.ts | 24 +- lib/public_api.ts | 2 +- lib/queries/languages/language.models.ts | 59 +++- lib/queries/languages/list-languages-query.ts | 13 +- package.json | 3 +- .../languages/list-languages-query.spec.ts | 2 +- tests/types/delivery-client-types.test.ts | 35 ++ tests/types/tsconfig.json | 9 + .../custom-schema-validation.spec.ts | 41 +++ tests/utils/integration-test.utils.ts | 320 ------------------ tsconfig.build.json | 3 +- 15 files changed, 228 insertions(+), 379 deletions(-) create mode 100644 tests/types/delivery-client-types.test.ts create mode 100644 tests/types/tsconfig.json create mode 100644 tests/unit/validation/custom-schema-validation.spec.ts delete mode 100644 tests/utils/integration-test.utils.ts diff --git a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts index c9630057..bdfeff72 100644 --- a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts +++ b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts @@ -1,31 +1,30 @@ -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './list-languages.spec.json'; +import type { Responses } from "../../../../../lib/index.js"; +import { Context, getDeliveryClientWithJson, setup } from "../../../setup/index.js"; +import * as responseJson from "./list-languages.spec.json"; -describe('List languages', () => { - const context = new Context(); - setup(context); +describe("List languages", () => { + const context = new Context(); + setup(context); - let response: Responses.IListLanguagesResponse; + let response: Responses.IListLanguagesResponse; - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).languages().toPromise()).data; - }); + beforeAll(async () => { + response = (await getDeliveryClientWithJson(responseJson).languages().toPromise()).data; + }); - it(`Response should have all properties assigned`, () => { - expect(response.items.length).toEqual(responseJson.languages.length); + it(`Response should have all properties assigned`, () => { + expect(response.items.length).toEqual(responseJson.languages.length); - for (const item of response.items) { - const originalItem = responseJson.languages.find((m) => m.system.id === item.system.id); + for (const item of response.items) { + const originalItem = responseJson.languages.find((m) => m.system.id === item.system.id); - if (!originalItem) { - throw Error(`Invalid language '${item.system.id}'`); - } + if (!originalItem) { + throw Error(`Invalid language '${item.system.id}'`); + } - expect(item.system.id).toEqual(originalItem.system.id); - expect(item.system.name).toEqual(originalItem.system.name); - expect(item.system.codename).toEqual(originalItem.system.codename); - } - }); + expect(item.system.id).toEqual(originalItem.system.id); + expect(item.system.name).toEqual(originalItem.system.name); + expect(item.system.codename).toEqual(originalItem.system.codename); + } + }); }); diff --git a/biome.json b/biome.json index 8658e76b..ae3496fa 100644 --- a/biome.json +++ b/biome.json @@ -21,5 +21,8 @@ } } } + }, + "files": { + "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "!_legacy/**/*"] } } diff --git a/eslint.config.mjs b/eslint.config.mjs index 8d52ee6b..680dc0bf 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,7 +1,16 @@ import kontentAiConfig from "@kontent-ai/eslint-config"; import { defineConfig } from "eslint/config"; -export default defineConfig({ - extends: [kontentAiConfig], - files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"], -}); +export default defineConfig( + { + // Global ignores (applies regardless of which configs/plugins match files) + ignores: ["dist/**/*", "_legacy/**/*"], + }, + { + extends: [kontentAiConfig], + files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"], + rules: { + "no-unused-vars": "off", + }, + }, +); diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 77c15bb9..2410bcc6 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,12 +1,18 @@ -import type { CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, DeliveryClientTypes } from "../models/core.models.js"; +import type { + CreateDeliveryClientOptions, + DeliveryClient, + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryClientTypes, +} from "../models/core.models.js"; import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; -type GetDeliveryClient = { +type GetDeliveryClient = { /** * Use publicly available API for requests. */ publicApi: () => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** * Use preview API for requests. @@ -14,7 +20,7 @@ type GetDeliveryClient { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** @@ -23,12 +29,12 @@ type GetDeliveryClient { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; }; /** - * Creates a new sync client instance using fluent API. + * Creates a new delivery client instance using fluent API. * * You may choose to use public, preview or secure API. * @@ -38,34 +44,37 @@ type GetDeliveryClient( environmentId: string, + schema?: DeliveryClientSchema, ): GetDeliveryClient { return { publicApi: () => { - return withClient({ apiMode: "public", environmentId }); + return withClient({ apiMode: "public", environmentId }, schema); }, previewApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "preview", environmentId, deliveryApiKey }); + return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); }, secureApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "secure", environmentId, deliveryApiKey }); + return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); }, }; } function withClient( requiredConfig: Pick, + schema: DeliveryClientSchema, ) { return { create: (options?: CreateDeliveryClientOptions): DeliveryClient => - createDeliveryClient({ ...requiredConfig, ...options }), + createDeliveryClient({ ...requiredConfig, ...options }, schema), }; } function createDeliveryClient( config: DeliveryClientConfig, + schema: DeliveryClientSchema, ): DeliveryClient { return { config, - listLanguages: () => getListLanguagesQuery(config), + listLanguages: () => getListLanguagesQuery(config, schema), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index fe19d640..d8569a2d 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -3,14 +3,22 @@ import z from "zod"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; export type DeliveryClientTypes = { + // readonly contentItemType: IContentItem; + // readonly contentTypeCodenames: string; + // readonly workflowCodenames: string; + // readonly workflowStepCodenames: string; + // readonly collectionCodenames: string; + // readonly taxonomyCodenames: string; readonly languageCodenames: string; - readonly typeCodenames: string; - readonly workflowCodenames: string; - readonly workflowStepCodenames: string; - readonly collectionCodenames: string; - readonly taxonomyCodenames: string; + // readonly elementCodenames: string; }; +export type DeliveryClientSchema = + | { + readonly languageCodenames: readonly TDeliveryClientTypes["languageCodenames"][]; + } + | undefined; + export type DeliveryResponseMeta = Pick & { readonly continuationToken?: string; } & TExtraMetadata; @@ -56,11 +64,9 @@ export type DeliveryClient; }; export type CreateDeliveryClientOptions = Omit; diff --git a/lib/public_api.ts b/lib/public_api.ts index 5e5b144e..a09d106d 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -12,5 +12,5 @@ export type { /* Languages */ -export { Language, ListLanguagesPayload, languageSchema, listLanguagesPayloadSchema } from "./queries/languages/language.models.js"; +export { Language2, ListLanguagesPayload, languageSchema, listLanguagesPayloadSchema } from "./queries/languages/language.models.js"; export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index d1fc3be0..ec23e011 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; export const languageSchema = z .object({ @@ -20,6 +20,59 @@ export const listLanguagesPayloadSchema = z }) .readonly(); -export type Language = z.infer; +export type Language2 = z.infer; -export type ListLanguagesPayload = z.infer; +// export type LanguageWithTypedCodename = Prettify< +// Omit & { +// readonly system: Omit & { +// readonly codename: TDeliveryApiTypes["languageCodenames"]; +// }; +// } +// >; + +// export type ListLanguagesPayload = Omit< +// z.infer, +// "languages" +// > & { +// readonly languages: ReadonlyArray>; +// }; + +const language2 = ( + codenames: z.ZodTemplateLiteral, +): z.ZodReadonly< + z.ZodObject< + { + system: z.ZodReadonly< + z.ZodObject< + { + id: z.ZodString; + codename: z.ZodTemplateLiteral; + }, + z.core.$strip + > + >; + }, + z.core.$strip + > +> => + z + .object({ + system: z + .object({ + id: z.string(), + codename: codenames, + }) + .readonly(), + }) + .readonly(); + +export const getListLanguagesPayloadSchema = (codenames: z.ZodTemplateLiteral) => { + return z.object({ + languages: z.array(language2(codenames)), + ...paginationSchema.shape, + }); +}; + +export type ListLanguagesPayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 02789b75..94cc143d 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,21 +1,24 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; +import z from "zod"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; -import type { DeliveryClient, DeliveryClientConfig, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; -import { type ListLanguagesPayload, listLanguagesPayloadSchema } from "./language.models.js"; +import { getListLanguagesPayloadSchema, type ListLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = Query; +export type ListLanguagesQuery = Query>; export function getListLanguagesQuery( config: DeliveryClientConfig, + schema: DeliveryClientSchema, ): ReturnType["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); + const codenames = schema ? z.templateLiteral([z.enum(schema.languageCodenames)]) : z.templateLiteral([z.string()]); - const { toPromise } = getQuery({ + const { toPromise } = getQuery, null>({ config, sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, - zodSchema: listLanguagesPayloadSchema, + zodSchema: getListLanguagesPayloadSchema(codenames), continuationToken: undefined, extraMetadata: () => { return {}; diff --git a/package.json b/package.json index 9cadea4f..9e476e6a 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,10 @@ "lint": "npm run biome:check && npm run eslint", "build": "npm run biome:check && npm run eslint && npm run build:noemit && npm run clean && tsc --p tsconfig.build.json && npm run update:version", "build:noemit": "tsc --p tsconfig.json", - "test": "npm run test:unit && npm run test:integration", + "test": "npm run test:unit && npm run test:integration && npm run test:types", "test:unit": "vitest run --config=vitest-unit.config.ts", "test:integration": "vitest run --config=vitest-integration.config.ts", + "test:types": "tsc --p tests/types/tsconfig.json", "biome:check": "biome check", "biome:fix": "biome check --write", "biome:fix:unsafe": "biome check --write --unsafe", diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 1fadf045..860ab597 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -5,7 +5,7 @@ import { getIntegrationTestConfig } from "../../integration-tests.config.js"; describe("List languages query", async () => { const config = getIntegrationTestConfig(); - const client = getDeliveryClient(config.env.id).publicApi().create({ + const client = getDeliveryClient<{ languageCodenames: "hello" | "world" }>(config.env.id).publicApi().create({ baseUrl: config.env.deliveryBaseUrl, }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts new file mode 100644 index 00000000..35c66f03 --- /dev/null +++ b/tests/types/delivery-client-types.test.ts @@ -0,0 +1,35 @@ +/** biome-ignore-all lint/correctness/noUnusedVariables: We don't want to use the variables in this file */ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { getDeliveryClient } from "../../lib/client/delivery-client.js"; + +type OriginTypes = { + readonly languageCodenames: "en-US" | "cs-CZ"; +}; + +const client = getDeliveryClient("x") + .publicApi() + .create({ + responseValidation: { + enable: false, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), + }); + +const { response: languageResponse } = await client.listLanguages().toPromise(); + +if (!languageResponse) { + throw new Error("Language response is undefined"); +} + +const validLanguageCodenames: readonly OriginTypes["languageCodenames"][] = languageResponse.payload.languages.map( + (language) => language.system.codename, +); + +// @ts-expect-error - "de-DE" is not allowed +const invalidLanguageCodename: OriginTypes["languageCodenames"] = "de-DE"; + +void validLanguageCodenames; +void invalidLanguageCodename; diff --git a/tests/types/tsconfig.json b/tests/types/tsconfig.json new file mode 100644 index 00000000..0fbcd0e3 --- /dev/null +++ b/tests/types/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noEmit": true, + "noUnusedLocals": false, + "noUnusedParameters": false + }, + "include": ["**/*"] +} diff --git a/tests/unit/validation/custom-schema-validation.spec.ts b/tests/unit/validation/custom-schema-validation.spec.ts new file mode 100644 index 00000000..583eb627 --- /dev/null +++ b/tests/unit/validation/custom-schema-validation.spec.ts @@ -0,0 +1,41 @@ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, it } from "vitest"; +import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { listLanguagesPayloadSchema } from "../../../lib/queries/languages/language.models.js"; + +describe("Custom schema validation", async () => { + const client = getDeliveryClient<{ languageCodenames: "en-US" | "cs-CZ" }>("x", { + languageCodenames: ["en-US", "cs-CZ"], + }) + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + result: "invalidValue", + }, + statusCode: 200, + }), + }); + + const { response, success, error } = await client.listLanguages().toPromise(); + + console.log(response?.payload.languages[0].system.codename); + + it("Response should be successful", () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + + it("Response payload should match schema", async () => { + const { error: parseError, success: parseSuccess } = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + + it("Response should contain at least one language", () => { + expect(response?.payload.languages.length).toBeGreaterThanOrEqual(1); + }); +}); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts deleted file mode 100644 index d855b820..00000000 --- a/tests/utils/integration-test.utils.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { getDefaultHttpService, type HttpResponse, type JsonValue, type ResultOfSuccessfulQuery } from "@kontent-ai/core-sdk"; -import type { SyncClient, SyncClientTypes, SyncQuery } from "../../lib/public_api.js"; -import { getIntegrationTestConfig } from "../integration-tests.config.js"; - -type ElementChangeEntityData = { readonly value: string } & ElementData; - -type SharedEntityData = { - readonly codename: string; - readonly name: string; -}; - -type ElementData = { readonly type: "text" } & SharedEntityData; - -type LanguageVariantData = { - readonly elements: readonly { - readonly element: { - readonly codename: string; - }; - readonly value: string; - }[]; -}; - -const config = getIntegrationTestConfig(); -const httpService = getDefaultHttpService({ - requestHeaders: [ - { - name: "Authorization", - value: `Bearer ${config.env.mapiKey}`, - }, - ], - retryStrategy: { - maxRetries: 10, - logRetryAttempt: false, - getDelayBetweenRetriesMs: () => 500, - }, -}); - -export async function prepareEnvironmentAsync({ - item, - type, - taxonomy, -}: Parameters[0]): Promise { - await Promise.all([ - deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ - deleteUrl: config.mapiUrls.taxonomy(taxonomy.codename), - deliveryGetUrl: config.deliveryUrls.taxonomy(taxonomy.codename), - }), - deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ - deleteUrl: config.mapiUrls.contentItem(item.codename), - deliveryGetUrl: config.deliveryUrls.contentItem(item.codename), - }), - ]); - - await deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ - deleteUrl: config.mapiUrls.contentType(type.codename), - deliveryGetUrl: config.deliveryUrls.contentType(type.codename), - }); -} - -export async function processChangesForIntegrationTestAsync({ - item, - type, - element, - language, - taxonomy, -}: { - readonly type: SharedEntityData; - readonly element: ElementChangeEntityData; - readonly item: SharedEntityData; - readonly language: SharedEntityData; - readonly taxonomy: SharedEntityData; -}): Promise { - // first prepare the environment by creating the content type, taxonomy and renaming the language - await Promise.all([createContentTypeAsync(type, element), createTaxonomyAsync(taxonomy), renameLanguageAsync(language)]); - - // then create the content item and variant - await createContentItemAndVariantAsync(item, type, language, element); -} - -export async function pollSyncApiAsync({ - token, - client, - getDeltaObject, - retryAttempt, - maxRetries, - pollWaitInMs, -}: { - readonly client: SyncClient; - readonly pollWaitInMs: number; - readonly token: string; - readonly getDeltaObject: (response: ResultOfSuccessfulQuery>) => T | undefined; - readonly retryAttempt: number; - readonly maxRetries: number; -}): Promise< - | { readonly success: true; readonly deltaObject: T; readonly syncResponse: ResultOfSuccessfulQuery> } - | { readonly success: false; readonly deltaObject?: never; readonly syncResponse?: never } -> { - if (retryAttempt >= maxRetries) { - return { - success: false, - }; - } - - const { response: syncResponse, success } = await client.sync(token).toPromise(); - - if (!success) { - throw new Error("Failed to get sync response. The request should always succeed."); - } - - const deltaObject = getDeltaObject(syncResponse); - - if (deltaObject) { - return { - success: true, - deltaObject, - syncResponse, - }; - } - - await waitAsync(pollWaitInMs); - return await pollSyncApiAsync({ - client, - getDeltaObject, - token, - retryAttempt: retryAttempt + 1, - maxRetries, - pollWaitInMs, - }); -} - -export async function waitUntilDeliveryEntityIsDeletedAsync({ - fetchEntityUrl, - retryAttempt, - maxRetries, - pollWaitInMs, -}: { - readonly pollWaitInMs: number; - readonly fetchEntityUrl: string; - readonly retryAttempt: number; - readonly maxRetries: number; -}): Promise { - if (retryAttempt >= maxRetries) { - return; - } - - const { error, success } = await httpService.requestAsync({ - url: fetchEntityUrl, - body: null, - method: "GET", - }); - - if (success) { - // if response is valid, it means the deleted entity is still available in delivery API - await waitAsync(pollWaitInMs); - return await waitUntilDeliveryEntityIsDeletedAsync({ - fetchEntityUrl, - retryAttempt: retryAttempt + 1, - maxRetries, - pollWaitInMs, - }); - } - - if (error.details.reason === "notFound") { - // if entity is not found, it means it has been deleted and the change propagation is complete - return; - } - - throw new Error(`Failed to wait until entity is deleted: ${fetchEntityUrl}`, { cause: error }); -} - -async function renameLanguageAsync(language: SharedEntityData): Promise { - await httpService.requestAsync< - SharedEntityData, - { - op: "replace"; - property_name: "name"; - value: string; - }[] - >({ - url: config.mapiUrls.language(language.codename), - body: [ - { - op: "replace", - property_name: "name", - value: language.name, - }, - ], - method: "PATCH", - }); -} - -async function createTaxonomyAsync(taxonomy: SharedEntityData): Promise { - await httpService.requestAsync({ - url: config.mapiUrls.taxonomies, - body: { - codename: taxonomy.codename, - name: taxonomy.name, - terms: [], - }, - method: "POST", - }); -} - -async function createContentTypeAsync(type: SharedEntityData, element: ElementChangeEntityData): Promise { - await httpService.requestAsync< - SharedEntityData, - SharedEntityData & { - readonly elements: readonly ElementData[]; - } - >({ - url: config.mapiUrls.contentTypes, - body: { - codename: type.codename, - name: type.name, - elements: [ - { - codename: element.codename, - name: element.name, - type: element.type, - }, - ], - }, - method: "POST", - }); -} - -async function waitAsync(ms: number): Promise { - return await new Promise((resolve) => { - setTimeout(resolve, ms); - return; - }); -} - -async function deleteEntityAndWaitUntilPropagatedToDeliveryApiAsync({ - deleteUrl, - deliveryGetUrl, -}: { - readonly deleteUrl: string; - readonly deliveryGetUrl: string; -}): Promise { - await skip404ErrorsAsync(async () => { - return await httpService.requestAsync({ - url: deleteUrl, - body: null, - method: "DELETE", - }); - }); - - await waitUntilDeliveryEntityIsDeletedAsync({ - fetchEntityUrl: deliveryGetUrl, - maxRetries: 30, - pollWaitInMs: 1000, - retryAttempt: 0, - }); -} - -async function createContentItemAndVariantAsync( - item: SharedEntityData, - type: SharedEntityData, - language: SharedEntityData, - element: ElementChangeEntityData, -): Promise { - await httpService.requestAsync< - SharedEntityData, - SharedEntityData & { - readonly type: { - readonly codename: string; - }; - } - >({ - url: config.mapiUrls.contentItems, - body: { - codename: item.codename, - name: item.name, - type: { - codename: type.codename, - }, - }, - method: "POST", - }); - - await httpService.requestAsync({ - url: config.mapiUrls.languageVariant(item.codename, language.codename), - body: { - elements: [ - { - element: { - codename: element.codename, - }, - value: element.value, - }, - ], - }, - method: "PUT", - }); - - await httpService.requestAsync({ - url: config.mapiUrls.publish(item.codename, language.codename), - body: null, - method: "PUT", - }); -} - -async function skip404ErrorsAsync(fn: () => Promise>): Promise { - const { error, success, response } = await fn(); - - if (success) { - return response.data; - } - - if (error.details.reason === "notFound") { - return undefined; - } - - if (error.details.reason === "invalidResponse" && error.details.status === 401) { - throw new Error(`${error.message} ${error.details.kontentErrorResponse?.message}`, { cause: error }); - } - - throw new Error(`Failed to skip 404 errors. ${error.message}`, { cause: error }); -} diff --git a/tsconfig.build.json b/tsconfig.build.json index 80f9848e..0304f06a 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -4,5 +4,6 @@ "noEmit": false, "outDir": "dist" }, - "include": ["lib/**/*"] + "include": ["lib/**/*"], + "exclude": ["tests/**/*", "scripts/**/*"] } From 281a112a6c447dc2385e1f61d442d787773dcca6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 23 Jan 2026 16:04:44 +0100 Subject: [PATCH 005/221] adds schema builder --- lib/client/delivery-client.ts | 26 +++++++++++--- lib/models/core.models.ts | 2 +- lib/public_api.ts | 1 + .../languages/list-languages-query.spec.ts | 2 +- tests/types/delivery-client-types.test.ts | 35 +++++-------------- .../custom-schema-validation.spec.ts | 8 ++--- .../validation/response-validation.spec.ts | 2 ++ 7 files changed, 40 insertions(+), 36 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 2410bcc6..a3c31e82 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -7,7 +7,14 @@ import type { } from "../models/core.models.js"; import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; -type GetDeliveryClient = { +type DeliverySchemaBuilder = { + withSchema: ( + schema: DeliveryClientSchema, + ) => DeliveryApiBuilder; + withUnknownSchema: () => DeliveryApiBuilder; +}; + +type DeliveryApiBuilder = { /** * Use publicly available API for requests. */ @@ -42,10 +49,21 @@ type GetDeliveryClient( +export function getDeliveryClient(environmentId: string): DeliverySchemaBuilder { + return { + withSchema: (schema: DeliveryClientSchema) => { + return getApiBuilder(environmentId, schema); + }, + withUnknownSchema: () => { + return getApiBuilder(environmentId, undefined); + }, + }; +} + +function getApiBuilder( environmentId: string, - schema?: DeliveryClientSchema, -): GetDeliveryClient { + schema: DeliveryClientSchema, +) { return { publicApi: () => { return withClient({ apiMode: "public", environmentId }, schema); diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index d8569a2d..995db3a1 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -13,7 +13,7 @@ export type DeliveryClientTypes = { // readonly elementCodenames: string; }; -export type DeliveryClientSchema = +export type DeliveryClientSchema = | { readonly languageCodenames: readonly TDeliveryClientTypes["languageCodenames"][]; } diff --git a/lib/public_api.ts b/lib/public_api.ts index a09d106d..bd56731c 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -5,6 +5,7 @@ export type { CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, + DeliveryClientSchema, DeliveryClientTypes, DeliveryResponse, DeliveryResponseMeta, diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 860ab597..7f42a61e 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -5,7 +5,7 @@ import { getIntegrationTestConfig } from "../../integration-tests.config.js"; describe("List languages query", async () => { const config = getIntegrationTestConfig(); - const client = getDeliveryClient<{ languageCodenames: "hello" | "world" }>(config.env.id).publicApi().create({ + const client = getDeliveryClient(config.env.id).withUnknownSchema().publicApi().create({ baseUrl: config.env.deliveryBaseUrl, }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 35c66f03..f01ee116 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,35 +1,18 @@ -/** biome-ignore-all lint/correctness/noUnusedVariables: We don't want to use the variables in this file */ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { getDeliveryClient } from "../../lib/client/delivery-client.js"; +/** biome-ignore-all lint/correctness/noUnusedVariables: This file is for compile-time checks */ +import { createDeliveryClientSchema } from "../../lib/public_api.js"; type OriginTypes = { readonly languageCodenames: "en-US" | "cs-CZ"; }; -const client = getDeliveryClient("x") - .publicApi() - .create({ - responseValidation: { - enable: false, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), - }); +const schema = createDeliveryClientSchema()({ + languageCodenames: ["en-US", "cs-CZ"] as const, +}); -const { response: languageResponse } = await client.listLanguages().toPromise(); - -if (!languageResponse) { - throw new Error("Language response is undefined"); -} - -const validLanguageCodenames: readonly OriginTypes["languageCodenames"][] = languageResponse.payload.languages.map( - (language) => language.system.codename, -); +// @ts-expect-error - missing "cs-CZ" +createDeliveryClientSchema()({ languageCodenames: ["en-US"] as const }); // @ts-expect-error - "de-DE" is not allowed -const invalidLanguageCodename: OriginTypes["languageCodenames"] = "de-DE"; +createDeliveryClientSchema()({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] as const }); -void validLanguageCodenames; -void invalidLanguageCodename; +void schema; diff --git a/tests/unit/validation/custom-schema-validation.spec.ts b/tests/unit/validation/custom-schema-validation.spec.ts index 583eb627..9baaa056 100644 --- a/tests/unit/validation/custom-schema-validation.spec.ts +++ b/tests/unit/validation/custom-schema-validation.spec.ts @@ -4,9 +4,8 @@ import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; import { listLanguagesPayloadSchema } from "../../../lib/queries/languages/language.models.js"; describe("Custom schema validation", async () => { - const client = getDeliveryClient<{ languageCodenames: "en-US" | "cs-CZ" }>("x", { - languageCodenames: ["en-US", "cs-CZ"], - }) + const client = getDeliveryClient("x") + .withSchema({ languageCodenames: ["en-US", "cs-CZ"] as const }) .publicApi() .create({ responseValidation: { @@ -22,7 +21,8 @@ describe("Custom schema validation", async () => { const { response, success, error } = await client.listLanguages().toPromise(); - console.log(response?.payload.languages[0].system.codename); + const test: "en-US" | "cs-CZ" | undefined = response?.payload.languages[0].system.codename; + void test; it("Response should be successful", () => { expect(success).toBeTruthy(); diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index 262ec065..f32bc2cb 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -7,6 +7,7 @@ import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; describe("Response validation", () => { test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { const query = getDeliveryClient("x") + .withUnknownSchema() .publicApi() .create({ responseValidation: { @@ -39,6 +40,7 @@ describe("Response validation", () => { test("Error should not be returned when response does not match schema but validation is disabled", async ({ expect }) => { const { success, error } = await getDeliveryClient("x") + .withUnknownSchema() .publicApi() .create({ responseValidation: { From 39dbc811f421e4e4a5c19439316ba7d88d5d55ee Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 23 Jan 2026 17:15:31 +0100 Subject: [PATCH 006/221] implements language codenames schema validation with tests --- lib/client/delivery-client.ts | 55 +++++------- lib/models/core.models.ts | 12 ++- lib/queries/languages/language.models.ts | 40 +++------ lib/queries/languages/list-languages-query.ts | 19 ++-- tests/types/delivery-client-types.test.ts | 36 ++++++-- tests/unit/errors/custom-errors.spec.ts | 1 + tests/unit/headers/headers.spec.ts | 1 + tests/unit/headers/preview-api.spec.ts | 1 + tests/unit/headers/public-deliver-api.spec.ts | 1 + tests/unit/headers/secure-api.spec.ts | 1 + .../custom-schema-validation.spec.ts | 41 --------- .../unit/validation/schema-validation.spec.ts | 86 +++++++++++++++++++ ....spec.ts => validation-properties.spec.ts} | 0 13 files changed, 169 insertions(+), 125 deletions(-) delete mode 100644 tests/unit/validation/custom-schema-validation.spec.ts create mode 100644 tests/unit/validation/schema-validation.spec.ts rename tests/unit/validation/{response-validation.spec.ts => validation-properties.spec.ts} (100%) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index a3c31e82..5c6f53f8 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,25 +1,19 @@ -import type { - CreateDeliveryClientOptions, - DeliveryClient, - DeliveryClientConfig, - DeliveryClientSchema, - DeliveryClientTypes, -} from "../models/core.models.js"; +import type { CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../models/core.models.js"; import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; type DeliverySchemaBuilder = { - withSchema: ( - schema: DeliveryClientSchema, - ) => DeliveryApiBuilder; - withUnknownSchema: () => DeliveryApiBuilder; + withSchema: ( + schema: DeliveryClientSchema, + ) => DeliveryApiBuilder; + withUnknownSchema: () => DeliveryApiBuilder; }; -type DeliveryApiBuilder = { +type DeliveryApiBuilder = { /** * Use publicly available API for requests. */ publicApi: () => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** * Use preview API for requests. @@ -27,7 +21,7 @@ type DeliveryApiBuilder { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** @@ -36,7 +30,7 @@ type DeliveryApiBuilder { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; }; @@ -51,48 +45,45 @@ type DeliveryApiBuilder(schema: DeliveryClientSchema) => { + withSchema: (schema: DeliveryClientSchema) => { return getApiBuilder(environmentId, schema); }, withUnknownSchema: () => { - return getApiBuilder(environmentId, undefined); + return getApiBuilder(environmentId, { languageCodenames: undefined }); }, }; } -function getApiBuilder( - environmentId: string, - schema: DeliveryClientSchema, -) { +function getApiBuilder(environmentId: string, schema: DeliveryClientSchema) { return { publicApi: () => { - return withClient({ apiMode: "public", environmentId }, schema); + return withClient({ apiMode: "public", environmentId }, schema); }, previewApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); + return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); }, secureApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); + return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); }, }; } -function withClient( +function withClient( requiredConfig: Pick, - schema: DeliveryClientSchema, + schema: DeliveryClientSchema, ) { return { - create: (options?: CreateDeliveryClientOptions): DeliveryClient => - createDeliveryClient({ ...requiredConfig, ...options }, schema), + create: (options?: CreateDeliveryClientOptions): DeliveryClient => + createDeliveryClient({ ...requiredConfig, ...options }, schema), }; } -function createDeliveryClient( +function createDeliveryClient( config: DeliveryClientConfig, - schema: DeliveryClientSchema, -): DeliveryClient { + schema: DeliveryClientSchema, +): DeliveryClient { return { config, - listLanguages: () => getListLanguagesQuery(config, schema), + listLanguages: () => getListLanguagesQuery(config, schema), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 995db3a1..b643c69b 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -13,11 +13,9 @@ export type DeliveryClientTypes = { // readonly elementCodenames: string; }; -export type DeliveryClientSchema = - | { - readonly languageCodenames: readonly TDeliveryClientTypes["languageCodenames"][]; - } - | undefined; +export type DeliveryClientSchema = { + readonly languageCodenames: readonly TLanguageCodenames[] | undefined; +}; export type DeliveryResponseMeta = Pick & { readonly continuationToken?: string; @@ -60,13 +58,13 @@ export type DeliveryClientConfig = SdkConfig & { * Can be used to narrow down the types of the response payload. * For example, the codenames of langauges, content types etc. can be narrowed. */ -export type DeliveryClient = { +export type DeliveryClient = { readonly config: DeliveryClientConfig; /** * List languages. */ - listLanguages(): ListLanguagesQuery; + listLanguages(): ListLanguagesQuery; }; export type CreateDeliveryClientOptions = Omit; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index ec23e011..fc25aee1 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/core.models.js"; export const languageSchema = z .object({ @@ -37,42 +37,26 @@ export type Language2 = z.infer; // readonly languages: ReadonlyArray>; // }; -const language2 = ( - codenames: z.ZodTemplateLiteral, -): z.ZodReadonly< - z.ZodObject< - { - system: z.ZodReadonly< - z.ZodObject< - { - id: z.ZodString; - codename: z.ZodTemplateLiteral; - }, - z.core.$strip - > - >; - }, - z.core.$strip - > -> => +const language = (codenameSchema: z.ZodType) => z .object({ system: z .object({ id: z.string(), - codename: codenames, + codename: codenameSchema, }) .readonly(), }) .readonly(); -export const getListLanguagesPayloadSchema = (codenames: z.ZodTemplateLiteral) => { - return z.object({ - languages: z.array(language2(codenames)), - ...paginationSchema.shape, - }); -}; +export const getListLanguagesPayloadSchema = (codenameSchema: z.ZodType) => + z + .object({ + languages: z.array(language(codenameSchema)), + ...paginationSchema.shape, + }) + .readonly(); -export type ListLanguagesPayload = z.infer< - ReturnType> +export type ListLanguagesPayload = z.infer< + ReturnType> >; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 94cc143d..099a4f95 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,24 +1,27 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; import z from "zod"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; -import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { getListLanguagesPayloadSchema, type ListLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = Query>; +export type ListLanguagesQuery = Query>; -export function getListLanguagesQuery( +export function getListLanguagesQuery( config: DeliveryClientConfig, - schema: DeliveryClientSchema, -): ReturnType["listLanguages"]> { + schema: DeliveryClientSchema, +): ReturnType["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const codenames = schema ? z.templateLiteral([z.enum(schema.languageCodenames)]) : z.templateLiteral([z.string()]); - const { toPromise } = getQuery, null>({ + const codenames = schema.languageCodenames + ? z.enum(schema.languageCodenames) + : (z.string() as unknown as z.ZodType); + + const { toPromise } = getQuery, null>({ config, sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, - zodSchema: getListLanguagesPayloadSchema(codenames), + zodSchema: getListLanguagesPayloadSchema(codenames), continuationToken: undefined, extraMetadata: () => { return {}; diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index f01ee116..17c495d3 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,18 +1,36 @@ -/** biome-ignore-all lint/correctness/noUnusedVariables: This file is for compile-time checks */ -import { createDeliveryClientSchema } from "../../lib/public_api.js"; +/** biome-ignore-all lint/correctness/noUnusedVariables: We don't want to use the variables in this file */ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { getDeliveryClient } from "../../lib/client/delivery-client.js"; type OriginTypes = { readonly languageCodenames: "en-US" | "cs-CZ"; }; -const schema = createDeliveryClientSchema()({ - languageCodenames: ["en-US", "cs-CZ"] as const, -}); +const client = getDeliveryClient("x") + .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) + .publicApi() + .create({ + responseValidation: { + enable: false, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), + }); -// @ts-expect-error - missing "cs-CZ" -createDeliveryClientSchema()({ languageCodenames: ["en-US"] as const }); +const { response: languageResponse } = await client.listLanguages().toPromise(); + +if (!languageResponse) { + throw new Error("Language response is undefined"); +} + +const validLanguageCodenames: readonly OriginTypes["languageCodenames"][] = languageResponse.payload.languages.map( + (language) => language.system.codename, +); // @ts-expect-error - "de-DE" is not allowed -createDeliveryClientSchema()({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] as const }); +const invalidLanguageCodename: OriginTypes["languageCodenames"] = "de-DE"; -void schema; +void validLanguageCodenames; +void invalidLanguageCodename; diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 79d3583d..07cbd6b4 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -6,6 +6,7 @@ class CustomError extends Error {} describe("Handling of custom errors", async () => { const { success, error } = await getDeliveryClient("x") + .withUnknownSchema() .publicApi() .create({ responseValidation: { diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 1856d9f0..fe718728 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -23,6 +23,7 @@ describe("Delivery tracking header", async () => { let requestHeaders: readonly Header[] = []; const query = getDeliveryClient("x") + .withUnknownSchema() .publicApi() .create({ httpService: getDefaultHttpService({ diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/headers/preview-api.spec.ts index ae59a1ad..99bf1da3 100644 --- a/tests/unit/headers/preview-api.spec.ts +++ b/tests/unit/headers/preview-api.spec.ts @@ -18,6 +18,7 @@ describe("Preview API", async () => { const previewApiKey = "y"; const query = getDeliveryClient("x") + .withUnknownSchema() .previewApi(previewApiKey) .create({ httpService: getDefaultHttpService({ diff --git a/tests/unit/headers/public-deliver-api.spec.ts b/tests/unit/headers/public-deliver-api.spec.ts index f77f357a..2eff84c0 100644 --- a/tests/unit/headers/public-deliver-api.spec.ts +++ b/tests/unit/headers/public-deliver-api.spec.ts @@ -17,6 +17,7 @@ describe("Public deliver API", async () => { let requestHeaders: readonly Header[] = []; const query = getDeliveryClient("x") + .withUnknownSchema() .publicApi() .create({ httpService: getDefaultHttpService({ diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/headers/secure-api.spec.ts index fda14183..8bca242c 100644 --- a/tests/unit/headers/secure-api.spec.ts +++ b/tests/unit/headers/secure-api.spec.ts @@ -18,6 +18,7 @@ describe("Secure API", async () => { const secureApiKey = "y"; const query = getDeliveryClient("x") + .withUnknownSchema() .secureApi(secureApiKey) .create({ httpService: getDefaultHttpService({ diff --git a/tests/unit/validation/custom-schema-validation.spec.ts b/tests/unit/validation/custom-schema-validation.spec.ts deleted file mode 100644 index 9baaa056..00000000 --- a/tests/unit/validation/custom-schema-validation.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { describe, expect, it } from "vitest"; -import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; -import { listLanguagesPayloadSchema } from "../../../lib/queries/languages/language.models.js"; - -describe("Custom schema validation", async () => { - const client = getDeliveryClient("x") - .withSchema({ languageCodenames: ["en-US", "cs-CZ"] as const }) - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: { - result: "invalidValue", - }, - statusCode: 200, - }), - }); - - const { response, success, error } = await client.listLanguages().toPromise(); - - const test: "en-US" | "cs-CZ" | undefined = response?.payload.languages[0].system.codename; - void test; - - it("Response should be successful", () => { - expect(success).toBeTruthy(); - expect(error).toBeUndefined(); - }); - - it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); - }); - - it("Response should contain at least one language", () => { - expect(response?.payload.languages.length).toBeGreaterThanOrEqual(1); - }); -}); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts new file mode 100644 index 00000000..3fd39f6e --- /dev/null +++ b/tests/unit/validation/schema-validation.spec.ts @@ -0,0 +1,86 @@ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, test } from "vitest"; +import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; + +type AllLanguageCodenames = "en-US" | "cs-CZ" | "de-DE"; + +describe("Schema validation", () => { + const mockPayload: ListLanguagesPayload = { + languages: [ + { + system: { + id: "1", + codename: "de-DE", + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, + }; + + test("Response should NOT be successful when response does not match defined language codenames schema", async () => { + const client = getDeliveryClient("x") + .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) // does not include "de-DE" + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + + expect(success).toBeFalsy(); + expect(error).toBeDefined(); + expect(error?.details.reason).toBe("validationFailed"); + }); + + test("Response should be successful when response matches defines language codenames schema", async () => { + const client = getDeliveryClient("x") + .withSchema({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] }) // includes all allowed codenames + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + + test("Response should be successful when response matches general string codename schema", async () => { + const client = getDeliveryClient("x") + .withUnknownSchema() // should use general string for validation + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); +}); diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/validation-properties.spec.ts similarity index 100% rename from tests/unit/validation/response-validation.spec.ts rename to tests/unit/validation/validation-properties.spec.ts From 4b209d36e398c701af8abe4272eca1b25081683a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 27 Jan 2026 14:32:50 +0100 Subject: [PATCH 007/221] Iteration on schema validation --- lib/public_api.ts | 2 +- lib/queries/languages/language.models.ts | 48 +++---------------- lib/queries/languages/list-languages-query.ts | 12 ++--- lib/utils/type.utils.ts | 7 +++ .../languages/list-languages-query.spec.ts | 7 ++- tests/types/delivery-client-types.test.ts | 2 +- tests/unit/errors/custom-errors.spec.ts | 4 +- tests/utils/test.utils.ts | 4 +- 8 files changed, 30 insertions(+), 56 deletions(-) create mode 100644 lib/utils/type.utils.ts diff --git a/lib/public_api.ts b/lib/public_api.ts index bd56731c..3e227d1d 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -13,5 +13,5 @@ export type { /* Languages */ -export { Language2, ListLanguagesPayload, languageSchema, listLanguagesPayloadSchema } from "./queries/languages/language.models.js"; +export { type LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index fc25aee1..61b47b85 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,43 +1,7 @@ import { z } from "zod"; import { paginationSchema } from "../../models/core.models.js"; -export const languageSchema = z - .object({ - system: z - .object({ - id: z.string(), - codename: z.string(), - name: z.string(), - }) - .readonly(), - }) - .readonly(); - -export const listLanguagesPayloadSchema = z - .object({ - languages: z.array(languageSchema).readonly(), - ...paginationSchema.shape, - }) - .readonly(); - -export type Language2 = z.infer; - -// export type LanguageWithTypedCodename = Prettify< -// Omit & { -// readonly system: Omit & { -// readonly codename: TDeliveryApiTypes["languageCodenames"]; -// }; -// } -// >; - -// export type ListLanguagesPayload = Omit< -// z.infer, -// "languages" -// > & { -// readonly languages: ReadonlyArray>; -// }; - -const language = (codenameSchema: z.ZodType) => +export const languagePayload = (codenameSchema: z.ZodType) => z .object({ system: z @@ -49,14 +13,14 @@ const language = (codenameSchema: z.ZodType }) .readonly(); -export const getListLanguagesPayloadSchema = (codenameSchema: z.ZodType) => +export const listLanguagesPayload = (codenameSchema: z.ZodType) => z .object({ - languages: z.array(language(codenameSchema)), + languages: z.array(languagePayload(codenameSchema)), ...paginationSchema.shape, }) .readonly(); -export type ListLanguagesPayload = z.infer< - ReturnType> ->; +export type ListLanguagesPayload = z.infer>>; + +export type LanguagePayload = z.infer>>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 099a4f95..889036b4 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,9 +1,9 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; -import z from "zod"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import { getCodenameSchema } from "../../utils/type.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; -import { getListLanguagesPayloadSchema, type ListLanguagesPayload } from "./language.models.js"; +import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = Query>; @@ -13,15 +13,15 @@ export function getListLanguagesQuery( ): ReturnType["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const codenames = schema.languageCodenames - ? z.enum(schema.languageCodenames) - : (z.string() as unknown as z.ZodType); + const zodSchema = schema.languageCodenames + ? listLanguagesPayload(getCodenameSchema(schema.languageCodenames)) + : listLanguagesPayload(getCodenameSchema(undefined)); const { toPromise } = getQuery, null>({ config, + zodSchema, sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, - zodSchema: getListLanguagesPayloadSchema(codenames), continuationToken: undefined, extraMetadata: () => { return {}; diff --git a/lib/utils/type.utils.ts b/lib/utils/type.utils.ts new file mode 100644 index 00000000..7e95bdd0 --- /dev/null +++ b/lib/utils/type.utils.ts @@ -0,0 +1,7 @@ +import z from "zod"; + +export function getCodenameSchema(codenames: readonly TCodename[]): z.ZodEnum<{ [K in TCodename]: K }>; +export function getCodenameSchema(codenames: undefined): z.ZodString; +export function getCodenameSchema(codenames?: readonly string[]) { + return codenames ? z.enum(codenames) : z.string(); +} diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 7f42a61e..47a08e97 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; -import { listLanguagesPayloadSchema } from "../../../lib/queries/languages/language.models.js"; +import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { getCodenameSchema } from "../../../lib/utils/type.utils.js"; import { getIntegrationTestConfig } from "../../integration-tests.config.js"; describe("List languages query", async () => { @@ -17,7 +18,9 @@ describe("List languages query", async () => { }); it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayloadSchema.safeParseAsync(response?.payload); + const { error: parseError, success: parseSuccess } = await listLanguagesPayload(getCodenameSchema(undefined)).safeParseAsync( + response?.payload, + ); expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 17c495d3..28b3d330 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -7,7 +7,7 @@ type OriginTypes = { }; const client = getDeliveryClient("x") - .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) + .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) .publicApi() .create({ responseValidation: { diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 07cbd6b4..35a0d370 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -27,7 +27,7 @@ describe("Handling of custom errors", async () => { expect(success).toBe(false); }); - it("Error should be returned as unknown", () => { + it("Error should be unknown", () => { expect(error?.details.reason).toBe("unknown"); }); @@ -35,7 +35,7 @@ describe("Handling of custom errors", async () => { if (error?.details.reason === "unknown") { expect(error.details.originalError).toBeInstanceOf(CustomError); } else { - throw new Error("Error should be returned as unknown"); + throw new Error("Error should be unknown"); } }); }); diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index abe0e14e..1762dda8 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,9 +1,9 @@ import type { ContinuationHeaderName, Header } from "@kontent-ai/core-sdk"; import chalk from "chalk"; -import * as dotenv from "dotenv"; +import { config } from "dotenv"; // needed to load .env environment to current process when run via package.json script -dotenv.config(); +config(); export function getEnvironmentRequiredValue(variableName: string): string { const value = getEnvironmentOptionalValue(variableName); From f22d4d315a9ba88e23d180fc3f0ad3473b0b716a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 29 Jan 2026 15:26:04 +0100 Subject: [PATCH 008/221] Updates delivery client comments, use schema overload with type assertion for simplicity --- lib/models/core.models.ts | 5 +---- lib/queries/languages/list-languages-query.ts | 8 ++------ lib/utils/type.utils.ts | 6 ++---- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index b643c69b..9d22d53c 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -52,11 +52,8 @@ export type DeliveryClientConfig = SdkConfig & { }; /** - * Sync client instance. + * Delivery client instance. This is the main entry point for the delivery API. * - * @param TSyncApiTypes - The types representing your Kontent.ai environment. - * Can be used to narrow down the types of the response payload. - * For example, the codenames of langauges, content types etc. can be narrowed. */ export type DeliveryClient = { readonly config: DeliveryClientConfig; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 889036b4..76232282 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,7 +1,7 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import { getCodenameSchema } from "../../utils/type.utils.js"; +import { getCodenameShema } from "../../utils/type.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -13,13 +13,9 @@ export function getListLanguagesQuery( ): ReturnType["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const zodSchema = schema.languageCodenames - ? listLanguagesPayload(getCodenameSchema(schema.languageCodenames)) - : listLanguagesPayload(getCodenameSchema(undefined)); - const { toPromise } = getQuery, null>({ config, - zodSchema, + zodSchema: listLanguagesPayload(getCodenameShema(schema.languageCodenames)), sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, continuationToken: undefined, diff --git a/lib/utils/type.utils.ts b/lib/utils/type.utils.ts index 7e95bdd0..cf593f34 100644 --- a/lib/utils/type.utils.ts +++ b/lib/utils/type.utils.ts @@ -1,7 +1,5 @@ import z from "zod"; -export function getCodenameSchema(codenames: readonly TCodename[]): z.ZodEnum<{ [K in TCodename]: K }>; -export function getCodenameSchema(codenames: undefined): z.ZodString; -export function getCodenameSchema(codenames?: readonly string[]) { - return codenames ? z.enum(codenames) : z.string(); +export function getCodenameShema(codenames?: readonly TCodenames[]): z.ZodType { + return codenames ? z.enum(codenames) : (z.string() as unknown as z.ZodType); } From 3b182e8653283a9a301f1242dca7c6301e597b93 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 30 Jan 2026 13:08:29 +0100 Subject: [PATCH 009/221] Wraps & separates delivery client types, use array of string for strict type check instead of string & type literal --- lib/client/delivery-client.ts | 55 +++++++++++-------- lib/models/core.models.ts | 23 ++++---- lib/queries/languages/language.models.ts | 22 +++++--- lib/queries/languages/list-languages-query.ts | 16 +++--- lib/utils/type.utils.ts | 4 +- tests/types/delivery-client-types.test.ts | 19 ++++--- .../unit/validation/schema-validation.spec.ts | 7 ++- 7 files changed, 86 insertions(+), 60 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 5c6f53f8..c33776ca 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,19 +1,25 @@ -import type { CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../models/core.models.js"; +import type { + CreateDeliveryClientOptions, + DeliveryClient, + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryClientTypes, +} from "../models/core.models.js"; import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; type DeliverySchemaBuilder = { - withSchema: ( - schema: DeliveryClientSchema, - ) => DeliveryApiBuilder; - withUnknownSchema: () => DeliveryApiBuilder; + withSchema: ( + schema: DeliveryClientSchema, + ) => DeliveryApiBuilder; + withUnknownSchema: () => DeliveryApiBuilder; }; -type DeliveryApiBuilder = { +type DeliveryApiBuilder = { /** * Use publicly available API for requests. */ publicApi: () => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** * Use preview API for requests. @@ -21,7 +27,7 @@ type DeliveryApiBuilder = { * Requires a delivery API key with preview access. */ previewApi: (deliveryApiKey: string) => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; /** @@ -30,7 +36,7 @@ type DeliveryApiBuilder = { * Requires a delivery API key with secure access. */ secureApi: (deliveryApiKey: string) => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; + create: (options?: CreateDeliveryClientOptions) => DeliveryClient; }; }; @@ -45,8 +51,8 @@ type DeliveryApiBuilder = { */ export function getDeliveryClient(environmentId: string): DeliverySchemaBuilder { return { - withSchema: (schema: DeliveryClientSchema) => { - return getApiBuilder(environmentId, schema); + withSchema: (schema: DeliveryClientSchema) => { + return getApiBuilder(environmentId, schema); }, withUnknownSchema: () => { return getApiBuilder(environmentId, { languageCodenames: undefined }); @@ -54,36 +60,39 @@ export function getDeliveryClient(environmentId: string): DeliverySchemaBuilder }; } -function getApiBuilder(environmentId: string, schema: DeliveryClientSchema) { +function getApiBuilder( + environmentId: string, + schema: DeliveryClientSchema, +) { return { publicApi: () => { - return withClient({ apiMode: "public", environmentId }, schema); + return withClient({ apiMode: "public", environmentId }, schema); }, previewApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); + return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); }, secureApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); + return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); }, }; } -function withClient( +function withClient( requiredConfig: Pick, - schema: DeliveryClientSchema, + schema: DeliveryClientSchema, ) { return { - create: (options?: CreateDeliveryClientOptions): DeliveryClient => - createDeliveryClient({ ...requiredConfig, ...options }, schema), + create: (options?: CreateDeliveryClientOptions): DeliveryClient => + createDeliveryClient({ ...requiredConfig, ...options }, schema), }; } -function createDeliveryClient( +function createDeliveryClient( config: DeliveryClientConfig, - schema: DeliveryClientSchema, -): DeliveryClient { + schema: DeliveryClientSchema, +): DeliveryClient { return { config, - listLanguages: () => getListLanguagesQuery(config, schema), + listLanguages: () => getListLanguagesQuery(config, schema), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 9d22d53c..3f028d9b 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -4,17 +4,18 @@ import type { ListLanguagesQuery } from "../queries/languages/list-languages-que export type DeliveryClientTypes = { // readonly contentItemType: IContentItem; - // readonly contentTypeCodenames: string; - // readonly workflowCodenames: string; - // readonly workflowStepCodenames: string; - // readonly collectionCodenames: string; - // readonly taxonomyCodenames: string; - readonly languageCodenames: string; - // readonly elementCodenames: string; + // readonly contentTypeCodenames: readonly [string, ...string[]]; + // readonly workflowCodenames: readonly [string, ...string[]]; + // readonly workflowStepCodenames: readonly [string, ...string[]]; + // readonly collectionCodenames: readonly [string, ...string[]]; + readonly taxonomyCodenames: readonly string[]; + readonly languageCodenames: readonly string[]; + // readonly elementCodenames: readonly [string, ...string[]]; }; -export type DeliveryClientSchema = { - readonly languageCodenames: readonly TLanguageCodenames[] | undefined; +export type DeliveryClientSchema = { + readonly taxonomyCodenames?: TDeliveryClientTypes["taxonomyCodenames"]; + readonly languageCodenames?: TDeliveryClientTypes["languageCodenames"]; }; export type DeliveryResponseMeta = Pick & { @@ -55,13 +56,13 @@ export type DeliveryClientConfig = SdkConfig & { * Delivery client instance. This is the main entry point for the delivery API. * */ -export type DeliveryClient = { +export type DeliveryClient = { readonly config: DeliveryClientConfig; /** * List languages. */ - listLanguages(): ListLanguagesQuery; + listLanguages(): ListLanguagesQuery; }; export type CreateDeliveryClientOptions = Omit; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 61b47b85..0afa26d9 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,26 +1,34 @@ import { z } from "zod"; -import { paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (codenameSchema: z.ZodType) => +export const languagePayload = ( + languageCodenames: z.ZodType, +) => z .object({ system: z .object({ id: z.string(), - codename: codenameSchema, + codename: languageCodenames, }) .readonly(), }) .readonly(); -export const listLanguagesPayload = (codenameSchema: z.ZodType) => +export const listLanguagesPayload = ( + languageCodenames: z.ZodType, +) => z .object({ - languages: z.array(languagePayload(codenameSchema)), + languages: z.array(languagePayload(languageCodenames)), ...paginationSchema.shape, }) .readonly(); -export type ListLanguagesPayload = z.infer>>; +export type ListLanguagesPayload = z.infer< + ReturnType> +>; -export type LanguagePayload = z.infer>>; +export type LanguagePayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 76232282..8c92ce7e 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,21 +1,21 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; -import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import { getCodenameShema } from "../../utils/type.utils.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import { getCodenameSchema } from "../../utils/type.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = Query>; +export type ListLanguagesQuery = Query>; -export function getListLanguagesQuery( +export function getListLanguagesQuery( config: DeliveryClientConfig, - schema: DeliveryClientSchema, -): ReturnType["listLanguages"]> { + schema: DeliveryClientSchema, +): ReturnType["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const { toPromise } = getQuery, null>({ + const { toPromise } = getQuery, null>({ config, - zodSchema: listLanguagesPayload(getCodenameShema(schema.languageCodenames)), + zodSchema: listLanguagesPayload(getCodenameSchema(schema.languageCodenames)), sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, continuationToken: undefined, diff --git a/lib/utils/type.utils.ts b/lib/utils/type.utils.ts index cf593f34..2e709107 100644 --- a/lib/utils/type.utils.ts +++ b/lib/utils/type.utils.ts @@ -1,5 +1,5 @@ -import z from "zod"; +import { z } from "zod"; -export function getCodenameShema(codenames?: readonly TCodenames[]): z.ZodType { +export function getCodenameSchema(codenames?: readonly TCodenames[]): z.ZodType { return codenames ? z.enum(codenames) : (z.string() as unknown as z.ZodType); } diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 28b3d330..00bb0f9f 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,13 +1,17 @@ -/** biome-ignore-all lint/correctness/noUnusedVariables: We don't want to use the variables in this file */ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { getDeliveryClient } from "../../lib/client/delivery-client.js"; +import type { DeliveryClient, DeliveryClientSchema, DeliveryClientTypes } from "../../lib/models/core.models.js"; -type OriginTypes = { - readonly languageCodenames: "en-US" | "cs-CZ"; +type DeliveryTypes = DeliveryClientTypes & { + readonly languageCodenames: readonly ["en-US", "cs-CZ"]; }; -const client = getDeliveryClient("x") - .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) +const schema: DeliveryClientSchema = { + languageCodenames: ["en-US", "cs-CZ"], +}; + +const client: DeliveryClient = getDeliveryClient("x") + .withSchema(schema) .publicApi() .create({ responseValidation: { @@ -25,12 +29,13 @@ if (!languageResponse) { throw new Error("Language response is undefined"); } -const validLanguageCodenames: readonly OriginTypes["languageCodenames"][] = languageResponse.payload.languages.map( +// Verifies that the language codenames are assignable from the response schema +const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.payload.languages.map( (language) => language.system.codename, ); // @ts-expect-error - "de-DE" is not allowed -const invalidLanguageCodename: OriginTypes["languageCodenames"] = "de-DE"; +const invalidLanguageCodename: DeliveryTypes["languageCodenames"][number] = "de-DE"; void validLanguageCodenames; void invalidLanguageCodename; diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 3fd39f6e..c8ee898d 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -1,12 +1,15 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -type AllLanguageCodenames = "en-US" | "cs-CZ" | "de-DE"; +type TestDeliveryClientTypes = DeliveryClientTypes & { + readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; +}; describe("Schema validation", () => { - const mockPayload: ListLanguagesPayload = { + const mockPayload: ListLanguagesPayload = { languages: [ { system: { From 3de8f4e25173207efd2d007270cff7bc612b53f8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 30 Jan 2026 14:57:30 +0100 Subject: [PATCH 010/221] Simplifies language payload models by using schema directly, also removes assertion from codename schema utils --- lib/queries/languages/language.models.ts | 13 +++++----- lib/queries/languages/list-languages-query.ts | 3 +-- lib/utils/type.utils.ts | 4 ++-- .../languages/list-languages-query.spec.ts | 5 +--- .../unit/validation/schema-validation.spec.ts | 24 +++++++++++++++++-- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 0afa26d9..27735a80 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,26 +1,25 @@ import { z } from "zod"; -import { type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { getCodenameSchema } from "../../utils/type.utils.js"; -export const languagePayload = ( - languageCodenames: z.ZodType, -) => +export const languagePayload = (schema: DeliveryClientSchema) => z .object({ system: z .object({ id: z.string(), - codename: languageCodenames, + codename: getCodenameSchema(schema.languageCodenames), }) .readonly(), }) .readonly(); export const listLanguagesPayload = ( - languageCodenames: z.ZodType, + schema: DeliveryClientSchema, ) => z .object({ - languages: z.array(languagePayload(languageCodenames)), + languages: z.array(languagePayload(schema)), ...paginationSchema.shape, }) .readonly(); diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 8c92ce7e..fe95a806 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,7 +1,6 @@ import { getQuery, type Query } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; -import { getCodenameSchema } from "../../utils/type.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -15,7 +14,7 @@ export function getListLanguagesQuery, null>({ config, - zodSchema: listLanguagesPayload(getCodenameSchema(schema.languageCodenames)), + zodSchema: listLanguagesPayload(schema), sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, continuationToken: undefined, diff --git a/lib/utils/type.utils.ts b/lib/utils/type.utils.ts index 2e709107..7f65da64 100644 --- a/lib/utils/type.utils.ts +++ b/lib/utils/type.utils.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -export function getCodenameSchema(codenames?: readonly TCodenames[]): z.ZodType { - return codenames ? z.enum(codenames) : (z.string() as unknown as z.ZodType); +export function getCodenameSchema(codenames?: TCodenames): z.ZodType { + return codenames && codenames.length > 0 ? z.enum(codenames) : z.string(); } diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 47a08e97..2a406f72 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from "vitest"; import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getCodenameSchema } from "../../../lib/utils/type.utils.js"; import { getIntegrationTestConfig } from "../../integration-tests.config.js"; describe("List languages query", async () => { @@ -18,9 +17,7 @@ describe("List languages query", async () => { }); it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayload(getCodenameSchema(undefined)).safeParseAsync( - response?.payload, - ); + const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.payload); expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); }); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index c8ee898d..c04e323c 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -42,8 +42,8 @@ describe("Schema validation", () => { const { success, error } = await client.listLanguages().toPromise(); - expect(success).toBeFalsy(); expect(error).toBeDefined(); + expect(success).toBeFalsy(); expect(error?.details.reason).toBe("validationFailed"); }); @@ -63,8 +63,8 @@ describe("Schema validation", () => { const { success, error } = await client.listLanguages().toPromise(); - expect(success).toBeTruthy(); expect(error).toBeUndefined(); + expect(success).toBeTruthy(); }); test("Response should be successful when response matches general string codename schema", async () => { @@ -83,7 +83,27 @@ describe("Schema validation", () => { const { success, error } = await client.listLanguages().toPromise(); + expect(error).toBeUndefined(); expect(success).toBeTruthy(); + }); + + test("Response should be successful when an empty array is provided as codenames source", async () => { + const client = getDeliveryClient("x") + .withSchema({ languageCodenames: [] }) // empty array + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); }); }); From 8ee97c49d4a07120a30b6c0338fb9a95cc8fee7f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 13 Feb 2026 08:32:54 +0100 Subject: [PATCH 011/221] updates deps --- package-lock.json | 399 +++++++++++++++++++++++----------------------- package.json | 12 +- 2 files changed, 207 insertions(+), 204 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cd30e45..f0ca5b32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,29 +9,29 @@ "version": "17.0.0-preview.0", "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.7", - "zod": "4.3.5" + "@kontent-ai/core-sdk": "12.0.0-preview.8", + "zod": "4.3.6" }, "devDependencies": { - "@biomejs/biome": "2.3.11", + "@biomejs/biome": "2.3.14", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", - "@types/node": "25.0.8", + "@types/node": "25.2.1", "chalk": "5.6.2", - "dotenv": "17.2.3", + "dotenv": "17.2.4", "eslint": "9.39.2", "tsx": "4.21.0", "typescript": "5.9.3", - "vitest": "4.0.17" + "vitest": "4.0.18" }, "engines": { "node": ">= 22" } }, "node_modules/@biomejs/biome": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.11.tgz", - "integrity": "sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.14.tgz", + "integrity": "sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -45,20 +45,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.11", - "@biomejs/cli-darwin-x64": "2.3.11", - "@biomejs/cli-linux-arm64": "2.3.11", - "@biomejs/cli-linux-arm64-musl": "2.3.11", - "@biomejs/cli-linux-x64": "2.3.11", - "@biomejs/cli-linux-x64-musl": "2.3.11", - "@biomejs/cli-win32-arm64": "2.3.11", - "@biomejs/cli-win32-x64": "2.3.11" + "@biomejs/cli-darwin-arm64": "2.3.14", + "@biomejs/cli-darwin-x64": "2.3.14", + "@biomejs/cli-linux-arm64": "2.3.14", + "@biomejs/cli-linux-arm64-musl": "2.3.14", + "@biomejs/cli-linux-x64": "2.3.14", + "@biomejs/cli-linux-x64-musl": "2.3.14", + "@biomejs/cli-win32-arm64": "2.3.14", + "@biomejs/cli-win32-x64": "2.3.14" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.11.tgz", - "integrity": "sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.14.tgz", + "integrity": "sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A==", "cpu": [ "arm64" ], @@ -73,9 +73,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.11.tgz", - "integrity": "sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.14.tgz", + "integrity": "sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA==", "cpu": [ "x64" ], @@ -90,9 +90,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.11.tgz", - "integrity": "sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.14.tgz", + "integrity": "sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ==", "cpu": [ "arm64" ], @@ -107,9 +107,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.11.tgz", - "integrity": "sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.14.tgz", + "integrity": "sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg==", "cpu": [ "arm64" ], @@ -124,9 +124,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.11.tgz", - "integrity": "sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.14.tgz", + "integrity": "sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA==", "cpu": [ "x64" ], @@ -141,9 +141,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.11.tgz", - "integrity": "sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.14.tgz", + "integrity": "sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ==", "cpu": [ "x64" ], @@ -158,9 +158,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.11.tgz", - "integrity": "sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.14.tgz", + "integrity": "sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A==", "cpu": [ "arm64" ], @@ -175,9 +175,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.11.tgz", - "integrity": "sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg==", + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.14.tgz", + "integrity": "sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ==", "cpu": [ "x64" ], @@ -892,15 +892,18 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.7", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.7.tgz", - "integrity": "sha512-imwU2Wihb5sLqf9nrmzgIVTZZALm/f7EagZg4zYOCqQ7ejPc6ZUewerqsYxZvVExPbTIsio8Ns8ZDD9sImuG7w==", + "version": "12.0.0-preview.8", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.8.tgz", + "integrity": "sha512-fJF2FaHSZLrQ5wxhHaxJ/9ui6zADdIt9G3f+rXb3v+LIf/XQQ2Geb8fbac8a4fXFBKDADsOLE5BALNKfPPx6bA==", "license": "MIT", "dependencies": { - "zod": "4.3.5" + "zod": "4.3.6" }, "engines": { "node": ">= 22" + }, + "peerDependencies": { + "zod": "4.3.6" } }, "node_modules/@kontent-ai/eslint-config": { @@ -917,9 +920,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -931,9 +934,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -945,9 +948,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -959,9 +962,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -973,9 +976,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -987,9 +990,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -1001,9 +1004,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -1015,9 +1018,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -1029,9 +1032,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -1043,9 +1046,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -1057,9 +1060,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -1071,9 +1074,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -1085,9 +1088,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -1099,9 +1102,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -1113,9 +1116,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -1127,9 +1130,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -1141,9 +1144,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -1155,9 +1158,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -1169,9 +1172,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -1183,9 +1186,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -1197,9 +1200,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -1211,9 +1214,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -1225,9 +1228,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -1239,9 +1242,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -1253,9 +1256,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -1306,9 +1309,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz", - "integrity": "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1549,16 +1552,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", - "integrity": "sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" }, @@ -1567,13 +1570,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.17.tgz", - "integrity": "sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.17", + "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -1594,9 +1597,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.17.tgz", - "integrity": "sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -1607,13 +1610,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.17.tgz", - "integrity": "sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.17", + "@vitest/utils": "4.0.18", "pathe": "^2.0.3" }, "funding": { @@ -1621,13 +1624,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.17.tgz", - "integrity": "sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -1636,9 +1639,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.17.tgz", - "integrity": "sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -1646,13 +1649,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.17.tgz", - "integrity": "sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.17", + "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" }, "funding": { @@ -2167,9 +2170,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.2.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", + "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4210,9 +4213,9 @@ } }, "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", "dependencies": { @@ -4226,31 +4229,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, @@ -4946,19 +4949,19 @@ } }, "node_modules/vitest": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.17.tgz", - "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.17", - "@vitest/mocker": "4.0.17", - "@vitest/pretty-format": "4.0.17", - "@vitest/runner": "4.0.17", - "@vitest/snapshot": "4.0.17", - "@vitest/spy": "4.0.17", - "@vitest/utils": "4.0.17", + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", @@ -4986,10 +4989,10 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.17", - "@vitest/browser-preview": "4.0.17", - "@vitest/browser-webdriverio": "4.0.17", - "@vitest/ui": "4.0.17", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", "happy-dom": "*", "jsdom": "*" }, @@ -5169,9 +5172,9 @@ } }, "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 9e476e6a..e4be3d9e 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,19 @@ "update:version": "tsx ./scripts/update-version.ts" }, "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.7", - "zod": "4.3.5" + "@kontent-ai/core-sdk": "12.0.0-preview.8", + "zod": "4.3.6" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", "eslint": "9.39.2", - "@biomejs/biome": "2.3.11", - "@types/node": "25.0.8", + "@biomejs/biome": "2.3.14", + "@types/node": "25.2.1", "chalk": "5.6.2", "typescript": "5.9.3", - "vitest": "4.0.17", - "dotenv": "17.2.3", + "vitest": "4.0.18", + "dotenv": "17.2.4", "tsx": "4.21.0" } } From 0218b85d2f5ecc7f43adee328bb2d68b7a0d79a2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 13 Feb 2026 09:15:25 +0100 Subject: [PATCH 012/221] updates deps & env. template --- .env.template | 2 +- package-lock.json | 981 +++++++++++++++++++++++++++++----------------- package.json | 8 +- 3 files changed, 636 insertions(+), 355 deletions(-) diff --git a/.env.template b/.env.template index 6c3c0ad1..11db59d1 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,4 @@ -# Name of Kontent.ai project: @kontent-ai/sync-sdk-js +# Name of Kontent.ai project: SDK Integration tests INTEGRATION_ENVIRONMENT_ID=x INTEGRATION_MANAGEMENT_API_KEY=x diff --git a/package-lock.json b/package-lock.json index f0ca5b32..8b2b2a5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,13 +13,13 @@ "zod": "4.3.6" }, "devDependencies": { - "@biomejs/biome": "2.3.14", + "@biomejs/biome": "2.3.15", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", - "@types/node": "25.2.1", + "@types/node": "25.2.3", "chalk": "5.6.2", - "dotenv": "17.2.4", - "eslint": "9.39.2", + "dotenv": "17.3.1", + "eslint": "10.0.0", "tsx": "4.21.0", "typescript": "5.9.3", "vitest": "4.0.18" @@ -29,9 +29,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.14.tgz", - "integrity": "sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.15.tgz", + "integrity": "sha512-u+jlPBAU2B45LDkjjNNYpc1PvqrM/co4loNommS9/sl9oSxsAQKsNZejYuUztvToB5oXi1tN/e62iNd6ESiY3g==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -45,20 +45,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.14", - "@biomejs/cli-darwin-x64": "2.3.14", - "@biomejs/cli-linux-arm64": "2.3.14", - "@biomejs/cli-linux-arm64-musl": "2.3.14", - "@biomejs/cli-linux-x64": "2.3.14", - "@biomejs/cli-linux-x64-musl": "2.3.14", - "@biomejs/cli-win32-arm64": "2.3.14", - "@biomejs/cli-win32-x64": "2.3.14" + "@biomejs/cli-darwin-arm64": "2.3.15", + "@biomejs/cli-darwin-x64": "2.3.15", + "@biomejs/cli-linux-arm64": "2.3.15", + "@biomejs/cli-linux-arm64-musl": "2.3.15", + "@biomejs/cli-linux-x64": "2.3.15", + "@biomejs/cli-linux-x64-musl": "2.3.15", + "@biomejs/cli-win32-arm64": "2.3.15", + "@biomejs/cli-win32-x64": "2.3.15" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.14.tgz", - "integrity": "sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.15.tgz", + "integrity": "sha512-SDCdrJ4COim1r8SNHg19oqT50JfkI/xGZHSyC6mGzMfKrpNe/217Eq6y98XhNTc0vGWDjznSDNXdUc6Kg24jbw==", "cpu": [ "arm64" ], @@ -73,9 +73,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.14.tgz", - "integrity": "sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.15.tgz", + "integrity": "sha512-RkyeSosBtn3C3Un8zQnl9upX0Qbq4E3QmBa0qjpOh1MebRbHhNlRC16jk8HdTe/9ym5zlfnpbb8cKXzW+vlTxw==", "cpu": [ "x64" ], @@ -90,9 +90,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.14.tgz", - "integrity": "sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.15.tgz", + "integrity": "sha512-FN83KxrdVWANOn5tDmW6UBC0grojchbGmcEz6JkRs2YY6DY63sTZhwkQ56x6YtKhDVV1Unz7FJexy8o7KwuIhg==", "cpu": [ "arm64" ], @@ -107,9 +107,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.14.tgz", - "integrity": "sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.15.tgz", + "integrity": "sha512-SSSIj2yMkFdSkXqASzIBdjySBXOe65RJlhKEDlri7MN19RC4cpez+C0kEwPrhXOTgJbwQR9QH1F4+VnHkC35pg==", "cpu": [ "arm64" ], @@ -124,9 +124,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.14.tgz", - "integrity": "sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.15.tgz", + "integrity": "sha512-T8n9p8aiIKOrAD7SwC7opiBM1LYGrE5G3OQRXWgbeo/merBk8m+uxJ1nOXMPzfYyFLfPlKF92QS06KN1UW+Zbg==", "cpu": [ "x64" ], @@ -141,9 +141,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.14.tgz", - "integrity": "sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.15.tgz", + "integrity": "sha512-dbjPzTh+ijmmNwojFYbQNMFp332019ZDioBYAMMJj5Ux9d8MkM+u+J68SBJGVwVeSHMYj+T9504CoxEzQxrdNw==", "cpu": [ "x64" ], @@ -158,9 +158,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.14.tgz", - "integrity": "sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.15.tgz", + "integrity": "sha512-puMuenu/2brQdgqtQ7geNwQlNVxiABKEZJhMRX6AGWcmrMO8EObMXniFQywy2b81qmC+q+SDvlOpspNwz0WiOA==", "cpu": [ "arm64" ], @@ -175,9 +175,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.14.tgz", - "integrity": "sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ==", + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.15.tgz", + "integrity": "sha512-kDZr/hgg+igo5Emi0LcjlgfkoGZtgIpJKhnvKTRmMBv6FF/3SDyEV4khBwqNebZIyMZTzvpca9sQNSXJ39pI2A==", "cpu": [ "x64" ], @@ -663,68 +663,86 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.1.tgz", + "integrity": "sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.1", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", + "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jackspeak": "^4.2.3" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/@eslint/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==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", + "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", + "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz", + "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==", "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": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/eslintrc": { @@ -762,6 +780,37 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -799,27 +848,27 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.1.tgz", + "integrity": "sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz", + "integrity": "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.1.0", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { @@ -874,6 +923,16 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -897,26 +956,396 @@ "integrity": "sha512-fJF2FaHSZLrQ5wxhHaxJ/9ui6zADdIt9G3f+rXb3v+LIf/XQQ2Geb8fbac8a4fXFBKDADsOLE5BALNKfPPx6bA==", "license": "MIT", "dependencies": { - "zod": "4.3.6" + "zod": "4.3.6" + }, + "engines": { + "node": ">= 22" + }, + "peerDependencies": { + "zod": "4.3.6" + } + }, + "node_modules/@kontent-ai/eslint-config": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.3.0.tgz", + "integrity": "sha512-jitXKJwj56QGzcV9Y2gOVxT6ApIkmS/fcJwbNFhLvuW2DR92gLY7qWnEgscDnCYWKZ9a4gSCVINcRBbZoWSOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^9.39.1", + "eslint-plugin-react": "^7.37.5" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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/@kontent-ai/eslint-config/node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 22" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "zod": "4.3.6" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@kontent-ai/eslint-config": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.3.0.tgz", - "integrity": "sha512-jitXKJwj56QGzcV9Y2gOVxT6ApIkmS/fcJwbNFhLvuW2DR92gLY7qWnEgscDnCYWKZ9a4gSCVINcRBbZoWSOzg==", + "node_modules/@kontent-ai/eslint-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@typescript-eslint/eslint-plugin": "^8.46.3", - "@typescript-eslint/parser": "^8.46.3", - "eslint": "^9.39.1", - "eslint-plugin-react": "^7.37.5" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -1294,6 +1723,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1309,78 +1745,24 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.1.tgz", - "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", - "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/type-utils": "8.53.0", - "@typescript-eslint/utils": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.53.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz", - "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/project-service": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", - "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", "debug": "^4.4.3" }, "engines": { @@ -1395,14 +1777,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", - "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0" + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1413,35 +1795,11 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", - "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", - "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0", - "@typescript-eslint/utils": "8.53.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1450,14 +1808,13 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz", - "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", "dev": true, "license": "MIT", "engines": { @@ -1469,16 +1826,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", - "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.0", - "@typescript-eslint/tsconfig-utils": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/visitor-keys": "8.53.0", + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -1496,38 +1853,14 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz", - "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.0", - "@typescript-eslint/types": "8.53.0", - "@typescript-eslint/typescript-estree": "8.53.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", - "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.0", + "@typescript-eslint/types": "8.55.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -2170,9 +2503,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", - "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2437,33 +2770,30 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.0.tgz", + "integrity": "sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.0", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.0", + "@eslint/plugin-kit": "^0.6.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", - "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.0", + "eslint-visitor-keys": "^5.0.0", + "espree": "^11.1.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -2473,8 +2803,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.1.1", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -2482,7 +2811,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -2496,85 +2825,20 @@ } } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.0.tgz", + "integrity": "sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2593,42 +2857,40 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", + "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "jackspeak": "^4.2.3" + }, + "engines": { + "node": "20 || >=22" } }, - "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==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "20 || >=22" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2645,44 +2907,47 @@ } }, "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==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", + "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz", + "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3612,6 +3877,22 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^9.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5110,9 +5391,9 @@ } }, "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==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e4be3d9e..f9a907f2 100644 --- a/package.json +++ b/package.json @@ -48,13 +48,13 @@ "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", - "eslint": "9.39.2", - "@biomejs/biome": "2.3.14", - "@types/node": "25.2.1", + "eslint": "10.0.0", + "@biomejs/biome": "2.3.15", + "@types/node": "25.2.3", "chalk": "5.6.2", "typescript": "5.9.3", "vitest": "4.0.18", - "dotenv": "17.2.4", + "dotenv": "17.3.1", "tsx": "4.21.0" } } From 1fb9c1e7a5b5fcf0245c8603e5ea0461b0ac7ef0 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 10:19:16 +0100 Subject: [PATCH 013/221] updates deps --- package-lock.json | 670 +++++++++++++++++++++++++--------------------- package.json | 4 +- tsconfig.json | 2 +- 3 files changed, 364 insertions(+), 312 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b2b2a5d..6281b456 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,11 @@ "version": "17.0.0-preview.0", "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.8", + "@kontent-ai/core-sdk": "12.0.0-preview.9", "zod": "4.3.6" }, "devDependencies": { - "@biomejs/biome": "2.3.15", + "@biomejs/biome": "2.4.2", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", "@types/node": "25.2.3", @@ -29,11 +29,12 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.15.tgz", - "integrity": "sha512-u+jlPBAU2B45LDkjjNNYpc1PvqrM/co4loNommS9/sl9oSxsAQKsNZejYuUztvToB5oXi1tN/e62iNd6ESiY3g==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.2.tgz", + "integrity": "sha512-vVE/FqLxNLbvYnFDYg3Xfrh1UdFhmPT5i+yPT9GE2nTUgI4rkqo5krw5wK19YHBd7aE7J6r91RRmb8RWwkjy6w==", "dev": true, "license": "MIT OR Apache-2.0", + "peer": true, "bin": { "biome": "bin/biome" }, @@ -45,20 +46,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.15", - "@biomejs/cli-darwin-x64": "2.3.15", - "@biomejs/cli-linux-arm64": "2.3.15", - "@biomejs/cli-linux-arm64-musl": "2.3.15", - "@biomejs/cli-linux-x64": "2.3.15", - "@biomejs/cli-linux-x64-musl": "2.3.15", - "@biomejs/cli-win32-arm64": "2.3.15", - "@biomejs/cli-win32-x64": "2.3.15" + "@biomejs/cli-darwin-arm64": "2.4.2", + "@biomejs/cli-darwin-x64": "2.4.2", + "@biomejs/cli-linux-arm64": "2.4.2", + "@biomejs/cli-linux-arm64-musl": "2.4.2", + "@biomejs/cli-linux-x64": "2.4.2", + "@biomejs/cli-linux-x64-musl": "2.4.2", + "@biomejs/cli-win32-arm64": "2.4.2", + "@biomejs/cli-win32-x64": "2.4.2" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.15.tgz", - "integrity": "sha512-SDCdrJ4COim1r8SNHg19oqT50JfkI/xGZHSyC6mGzMfKrpNe/217Eq6y98XhNTc0vGWDjznSDNXdUc6Kg24jbw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.2.tgz", + "integrity": "sha512-3pEcKCP/1POKyaZZhXcxFl3+d9njmeAihZ17k8lL/1vk+6e0Cbf0yPzKItFiT+5Yh6TQA4uKvnlqe0oVZwRxCA==", "cpu": [ "arm64" ], @@ -73,9 +74,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.15.tgz", - "integrity": "sha512-RkyeSosBtn3C3Un8zQnl9upX0Qbq4E3QmBa0qjpOh1MebRbHhNlRC16jk8HdTe/9ym5zlfnpbb8cKXzW+vlTxw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.2.tgz", + "integrity": "sha512-P7hK1jLVny+0R9UwyGcECxO6sjETxfPyBm/1dmFjnDOHgdDPjPqozByunrwh4xPKld8sxOr5eAsSqal5uKgeBg==", "cpu": [ "x64" ], @@ -90,9 +91,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.15.tgz", - "integrity": "sha512-FN83KxrdVWANOn5tDmW6UBC0grojchbGmcEz6JkRs2YY6DY63sTZhwkQ56x6YtKhDVV1Unz7FJexy8o7KwuIhg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.2.tgz", + "integrity": "sha512-DI3Mi7GT2zYNgUTDEbSjl3e1KhoP76OjQdm8JpvZYZWtVDRyLd3w8llSr2TWk1z+U3P44kUBWY3X7H9MD1/DGQ==", "cpu": [ "arm64" ], @@ -107,9 +108,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.15.tgz", - "integrity": "sha512-SSSIj2yMkFdSkXqASzIBdjySBXOe65RJlhKEDlri7MN19RC4cpez+C0kEwPrhXOTgJbwQR9QH1F4+VnHkC35pg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.2.tgz", + "integrity": "sha512-/x04YK9+7erw6tYEcJv9WXoBHcULI/wMOvNdAyE9S3JStZZ9yJyV67sWAI+90UHuDo/BDhq0d96LDqGlSVv7WA==", "cpu": [ "arm64" ], @@ -124,9 +125,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.15.tgz", - "integrity": "sha512-T8n9p8aiIKOrAD7SwC7opiBM1LYGrE5G3OQRXWgbeo/merBk8m+uxJ1nOXMPzfYyFLfPlKF92QS06KN1UW+Zbg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.2.tgz", + "integrity": "sha512-GK2ErnrKpWFigYP68cXiCHK4RTL4IUWhK92AFS3U28X/nuAL5+hTuy6hyobc8JZRSt+upXt1nXChK+tuHHx4mA==", "cpu": [ "x64" ], @@ -141,9 +142,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.15.tgz", - "integrity": "sha512-dbjPzTh+ijmmNwojFYbQNMFp332019ZDioBYAMMJj5Ux9d8MkM+u+J68SBJGVwVeSHMYj+T9504CoxEzQxrdNw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.2.tgz", + "integrity": "sha512-wbBmTkeAoAYbOQ33f6sfKG7pcRSydQiF+dTYOBjJsnXO2mWEOQHllKlC2YVnedqZFERp2WZhFUoO7TNRwnwEHQ==", "cpu": [ "x64" ], @@ -158,9 +159,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.15.tgz", - "integrity": "sha512-puMuenu/2brQdgqtQ7geNwQlNVxiABKEZJhMRX6AGWcmrMO8EObMXniFQywy2b81qmC+q+SDvlOpspNwz0WiOA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.2.tgz", + "integrity": "sha512-k2uqwLYrNNxnaoiW3RJxoMGnbKda8FuCmtYG3cOtVljs3CzWxaTR+AoXwKGHscC9thax9R4kOrtWqWN0+KdPTw==", "cpu": [ "arm64" ], @@ -175,9 +176,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.15.tgz", - "integrity": "sha512-kDZr/hgg+igo5Emi0LcjlgfkoGZtgIpJKhnvKTRmMBv6FF/3SDyEV4khBwqNebZIyMZTzvpca9sQNSXJ39pI2A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.2.tgz", + "integrity": "sha512-9ma7C4g8Sq3cBlRJD2yrsHXB1mnnEBdpy7PhvFrylQWQb4PoyCmPucdX7frvsSBQuFtIiKCrolPl/8tCZrKvgQ==", "cpu": [ "x64" ], @@ -192,9 +193,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -209,9 +210,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -226,9 +227,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -243,9 +244,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -260,9 +261,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -277,9 +278,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -294,9 +295,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -311,9 +312,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -328,9 +329,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -345,9 +346,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -362,9 +363,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -379,9 +380,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -396,9 +397,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -413,9 +414,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -430,9 +431,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -447,9 +448,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -464,9 +465,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -481,9 +482,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -498,9 +499,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -515,9 +516,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -532,9 +533,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -549,9 +550,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -566,9 +567,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -583,9 +584,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -600,9 +601,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -617,9 +618,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -704,9 +705,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", - "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", + "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -951,15 +952,16 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.8", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.8.tgz", - "integrity": "sha512-fJF2FaHSZLrQ5wxhHaxJ/9ui6zADdIt9G3f+rXb3v+LIf/XQQ2Geb8fbac8a4fXFBKDADsOLE5BALNKfPPx6bA==", + "version": "12.0.0-preview.9", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.9.tgz", + "integrity": "sha512-0xOQEWza/HjglOoFBvnoWGaRT/gbc8LAtJ0XbGiMUKFmrYIww5YJkOAZzvwtFLa/s5+Y39Khen9u1Z5fAWVKzQ==", "license": "MIT", "dependencies": { + "ts-pattern": "5.9.0", "zod": "4.3.6" }, "engines": { - "node": ">= 22" + "node": ">=22" }, "peerDependencies": { "zod": "4.3.6" @@ -1043,109 +1045,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", - "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/type-utils": "8.55.0", - "@typescript-eslint/utils": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.55.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", - "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/type-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", - "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0", - "@typescript-eslint/utils": "8.55.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", - "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/typescript-estree": "8.55.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@kontent-ai/eslint-config/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1180,6 +1079,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -1297,16 +1197,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@kontent-ai/eslint-config/node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -1325,6 +1215,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@kontent-ai/eslint-config/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1750,19 +1650,75 @@ "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/project-service": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", - "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.55.0", - "@typescript-eslint/types": "^8.55.0", + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", "debug": "^4.4.3" }, "engines": { @@ -1777,14 +1733,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", - "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1795,9 +1751,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", - "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -1811,10 +1767,35 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/types": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", - "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -1826,16 +1807,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", - "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.55.0", - "@typescript-eslint/tsconfig-utils": "8.55.0", - "@typescript-eslint/types": "8.55.0", - "@typescript-eslint/visitor-keys": "8.55.0", + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", @@ -1853,15 +1834,39 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", - "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.55.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1872,13 +1877,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2001,6 +2006,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2715,9 +2721,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2728,32 +2734,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/escape-string-regexp": { @@ -2775,6 +2781,7 @@ "integrity": "sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -2907,9 +2914,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.0.tgz", - "integrity": "sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", + "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3249,9 +3256,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", "dev": true, "license": "MIT", "dependencies": { @@ -4079,6 +4086,35 @@ "dev": true, "license": "MIT" }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4326,6 +4362,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4456,19 +4493,25 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "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" } @@ -4594,9 +4637,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -4993,12 +5036,19 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-pattern": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "license": "MIT" + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -5110,6 +5160,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5160,6 +5211,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", diff --git a/package.json b/package.json index f9a907f2..d4e77616 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,14 @@ "update:version": "tsx ./scripts/update-version.ts" }, "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.8", + "@kontent-ai/core-sdk": "12.0.0-preview.9", "zod": "4.3.6" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.3.0", "eslint": "10.0.0", - "@biomejs/biome": "2.3.15", + "@biomejs/biome": "2.4.2", "@types/node": "25.2.3", "chalk": "5.6.2", "typescript": "5.9.3", diff --git a/tsconfig.json b/tsconfig.json index 7c048739..0b9d8d4b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,5 +41,5 @@ "typeRoots": ["./node_modules/@types"] }, "include": ["lib/**/*", "tests/**/*", "eslint.config.js", "vitest.config.ts", "sample/**/*", "scripts/**/*"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "_legacy"] } From 44c456f179caf95ea790e13d9a9954dc02495696 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 10:30:24 +0100 Subject: [PATCH 014/221] updates eslint config due to v10 changes --- eslint.config.mjs | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 680dc0bf..72c60293 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -4,7 +4,7 @@ import { defineConfig } from "eslint/config"; export default defineConfig( { // Global ignores (applies regardless of which configs/plugins match files) - ignores: ["dist/**/*", "_legacy/**/*"], + ignores: ["dist/**/*", "_legacy/**/*", "coverage/**/*"], }, { extends: [kontentAiConfig], diff --git a/package.json b/package.json index d4e77616..de00e6e1 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,9 @@ "type": "module", "scripts": { "prepublishOnly": "npm run build", - "eslint": "eslint", + "eslint": "eslint -c eslint.config.mjs .", "lint": "npm run biome:check && npm run eslint", - "build": "npm run biome:check && npm run eslint && npm run build:noemit && npm run clean && tsc --p tsconfig.build.json && npm run update:version", + "build": "npm run lint && npm run build:noemit && npm run clean && tsc --p tsconfig.build.json && npm run update:version", "build:noemit": "tsc --p tsconfig.json", "test": "npm run test:unit && npm run test:integration && npm run test:types", "test:unit": "vitest run --config=vitest-unit.config.ts", From 9e3925be82f647715b8cc40e0fd49476391dd3b3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 11:00:50 +0100 Subject: [PATCH 015/221] Updates code to latest core-sdk --- lib/queries/languages/list-languages-query.ts | 7 +++---- tests/integration/languages/list-languages-query.spec.ts | 4 ++-- tests/types/delivery-client-types.test.ts | 4 +--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index fe95a806..73cec8c0 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,4 +1,4 @@ -import { getQuery, type Query } from "@kontent-ai/core-sdk"; +import { createQuery, type Query } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; @@ -12,13 +12,12 @@ export function getListLanguagesQuery["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const { toPromise } = getQuery, null>({ + const { toPromise } = createQuery, null>({ config, zodSchema: listLanguagesPayload(schema), sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, - continuationToken: undefined, - extraMetadata: () => { + mapMetadata: () => { return {}; }, request: { diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 2a406f72..ac90ce82 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -17,12 +17,12 @@ describe("List languages query", async () => { }); it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.payload); + const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.data); expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); }); it("Response should contain at least one language", () => { - expect(response?.payload.languages.length).toBeGreaterThanOrEqual(1); + expect(response?.data?.languages?.length).toBeGreaterThanOrEqual(1); }); }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 00bb0f9f..1e90320e 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -30,9 +30,7 @@ if (!languageResponse) { } // Verifies that the language codenames are assignable from the response schema -const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.payload.languages.map( - (language) => language.system.codename, -); +const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.data.languages.map((language) => language.system.codename); // @ts-expect-error - "de-DE" is not allowed const invalidLanguageCodename: DeliveryTypes["languageCodenames"][number] = "de-DE"; From 9f995218b541992527dde35957754ed636c5a11a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 13:42:02 +0100 Subject: [PATCH 016/221] updates core sdk --- package-lock.json | 8 ++++---- package.json | 2 +- tests/integration/languages/list-languages-query.spec.ts | 4 ++-- tests/types/delivery-client-types.test.ts | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6281b456..b214ede0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "17.0.0-preview.0", "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.9", + "@kontent-ai/core-sdk": "12.0.0-preview.10", "zod": "4.3.6" }, "devDependencies": { @@ -952,9 +952,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.9", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.9.tgz", - "integrity": "sha512-0xOQEWza/HjglOoFBvnoWGaRT/gbc8LAtJ0XbGiMUKFmrYIww5YJkOAZzvwtFLa/s5+Y39Khen9u1Z5fAWVKzQ==", + "version": "12.0.0-preview.10", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.10.tgz", + "integrity": "sha512-EnewFspJztr23cgTatMTIZ6IItc6dCA/ILAFd4yskkQjdZyb+uBMKrOfWKMaC6tRZ5r3sNDuqMhUVeeU8N0aEg==", "license": "MIT", "dependencies": { "ts-pattern": "5.9.0", diff --git a/package.json b/package.json index de00e6e1..c2e3d06a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.9", + "@kontent-ai/core-sdk": "12.0.0-preview.10", "zod": "4.3.6" }, "devDependencies": { diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index ac90ce82..65c7ff14 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -17,12 +17,12 @@ describe("List languages query", async () => { }); it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.data); + const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.payload); expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); }); it("Response should contain at least one language", () => { - expect(response?.data?.languages?.length).toBeGreaterThanOrEqual(1); + expect(response?.payload?.languages?.length).toBeGreaterThanOrEqual(1); }); }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 1e90320e..00bb0f9f 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -30,7 +30,9 @@ if (!languageResponse) { } // Verifies that the language codenames are assignable from the response schema -const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.data.languages.map((language) => language.system.codename); +const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.payload.languages.map( + (language) => language.system.codename, +); // @ts-expect-error - "de-DE" is not allowed const invalidLanguageCodename: DeliveryTypes["languageCodenames"][number] = "de-DE"; From 1a74bfb5d72f33fe5258d800111bd1cd210fba88 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 15:14:29 +0100 Subject: [PATCH 017/221] use paging query for list languages, renames delivery client builder fnc --- lib/client/delivery-client.ts | 6 +++--- lib/models/core.models.ts | 2 +- lib/public_api.ts | 2 +- lib/queries/languages/list-languages-query.ts | 9 ++++++--- lib/utils/paging.utils.ts | 13 +++++++++++++ .../languages/list-languages-query.spec.ts | 9 +++++++-- tests/types/delivery-client-types.test.ts | 4 ++-- tests/unit/errors/custom-errors.spec.ts | 4 ++-- tests/unit/headers/headers.spec.ts | 4 ++-- tests/unit/headers/preview-api.spec.ts | 4 ++-- tests/unit/headers/public-deliver-api.spec.ts | 4 ++-- tests/unit/headers/secure-api.spec.ts | 4 ++-- tests/unit/validation/schema-validation.spec.ts | 10 +++++----- tests/unit/validation/validation-properties.spec.ts | 6 +++--- tests/utils/test.utils.ts | 6 +++++- 15 files changed, 56 insertions(+), 31 deletions(-) create mode 100644 lib/utils/paging.utils.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index c33776ca..857b62fa 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -49,7 +49,7 @@ type DeliveryApiBuilder = { * * @param environmentId - The Id of the Kontent.ai environment. */ -export function getDeliveryClient(environmentId: string): DeliverySchemaBuilder { +export function createDeliveryClient(environmentId: string): DeliverySchemaBuilder { return { withSchema: (schema: DeliveryClientSchema) => { return getApiBuilder(environmentId, schema); @@ -83,11 +83,11 @@ function withClient( ) { return { create: (options?: CreateDeliveryClientOptions): DeliveryClient => - createDeliveryClient({ ...requiredConfig, ...options }, schema), + buildDeliveryClient({ ...requiredConfig, ...options }, schema), }; } -function createDeliveryClient( +function buildDeliveryClient( config: DeliveryClientConfig, schema: DeliveryClientSchema, ): DeliveryClient { diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 3f028d9b..cb5bffe3 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -86,4 +86,4 @@ export const paginationSchema = z.object({ export type PaginationSchema = Readonly>; -export type PayloadWithPagination = TPayload & PaginationSchema; +export type ResponseWithPagination = TPayload & PaginationSchema; diff --git a/lib/public_api.ts b/lib/public_api.ts index 3e227d1d..d97ec30e 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -1,5 +1,5 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the public API is fine -export { getDeliveryClient } from "./client/delivery-client.js"; +export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, CreateDeliveryClientOptions, diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 73cec8c0..bef1ff34 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,10 +1,11 @@ -import { createQuery, type Query } from "@kontent-ai/core-sdk"; +import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import { getPaginationByUrl } from "../../utils/paging.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = Query>; +export type ListLanguagesQuery = PagingQuery>; export function getListLanguagesQuery( config: DeliveryClientConfig, @@ -12,7 +13,7 @@ export function getListLanguagesQuery["listLanguages"]> { const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - const { toPromise } = createQuery, null>({ + const { toPromise, toAllPromise } = createPagingQuery, null>({ config, zodSchema: listLanguagesPayload(schema), sdkInfo: deliverySdkInfo, @@ -20,6 +21,7 @@ export function getListLanguagesQuery { return {}; }, + pagination: getPaginationByUrl(), request: { url, body: null, @@ -30,5 +32,6 @@ export function getListLanguagesQuery url, toPromise, + toAllPromise, }; } diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts new file mode 100644 index 00000000..312917de --- /dev/null +++ b/lib/utils/paging.utils.ts @@ -0,0 +1,13 @@ +import type { Pagination } from "@kontent-ai/core-sdk"; +import type { PaginationSchema } from "../models/core.models.js"; + +export function getPaginationByUrl(): Pagination { + return { + getNextPageData: (response) => { + return { + continuationToken: undefined, + nextPageUrl: response.payload.pagination.next_page, + }; + }, + }; +} diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 65c7ff14..7bb72d8e 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -1,16 +1,21 @@ import { describe, expect, it } from "vitest"; -import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getIntegrationTestConfig } from "../../integration-tests.config.js"; +import { isPagingQuery } from "../../utils/test.utils.js"; describe("List languages query", async () => { const config = getIntegrationTestConfig(); - const client = getDeliveryClient(config.env.id).withUnknownSchema().publicApi().create({ + const client = createDeliveryClient(config.env.id).withUnknownSchema().publicApi().create({ baseUrl: config.env.deliveryBaseUrl, }); const { response, success, error } = await client.listLanguages().toPromise(); + it("Query should be a paging query", () => { + expect(isPagingQuery(client.listLanguages())).toBeTruthy(); + }); + it("Response should be successful", () => { expect(success).toBeTruthy(); expect(error).toBeUndefined(); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 00bb0f9f..b1dfdeb5 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,5 +1,5 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { getDeliveryClient } from "../../lib/client/delivery-client.js"; +import { createDeliveryClient } from "../../lib/client/delivery-client.js"; import type { DeliveryClient, DeliveryClientSchema, DeliveryClientTypes } from "../../lib/models/core.models.js"; type DeliveryTypes = DeliveryClientTypes & { @@ -10,7 +10,7 @@ const schema: DeliveryClientSchema = { languageCodenames: ["en-US", "cs-CZ"], }; -const client: DeliveryClient = getDeliveryClient("x") +const client: DeliveryClient = createDeliveryClient("x") .withSchema(schema) .publicApi() .create({ diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 35a0d370..8b0a9199 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -1,11 +1,11 @@ import { type ErrorReason, getDefaultHttpService } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; -import { getDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; class CustomError extends Error {} describe("Handling of custom errors", async () => { - const { success, error } = await getDeliveryClient("x") + const { success, error } = await createDeliveryClient("x") .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index fe718728..0573df42 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -1,7 +1,7 @@ import { getDefaultHttpAdapter, getDefaultHttpService, getSdkIdHeader, type Header } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { getDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; describe("Delivery tracking header", async () => { const expectedHeader = getSdkIdHeader({ @@ -22,7 +22,7 @@ describe("Delivery tracking header", async () => { let requestHeaders: readonly Header[] = []; - const query = getDeliveryClient("x") + const query = createDeliveryClient("x") .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/headers/preview-api.spec.ts index 99bf1da3..f082900d 100644 --- a/tests/unit/headers/preview-api.spec.ts +++ b/tests/unit/headers/preview-api.spec.ts @@ -1,7 +1,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { getDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; describe("Preview API", async () => { afterEach(() => { @@ -17,7 +17,7 @@ describe("Preview API", async () => { let requestHeaders: readonly Header[] = []; const previewApiKey = "y"; - const query = getDeliveryClient("x") + const query = createDeliveryClient("x") .withUnknownSchema() .previewApi(previewApiKey) .create({ diff --git a/tests/unit/headers/public-deliver-api.spec.ts b/tests/unit/headers/public-deliver-api.spec.ts index 2eff84c0..deec723f 100644 --- a/tests/unit/headers/public-deliver-api.spec.ts +++ b/tests/unit/headers/public-deliver-api.spec.ts @@ -1,7 +1,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { getDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; describe("Public deliver API", async () => { afterEach(() => { @@ -16,7 +16,7 @@ describe("Public deliver API", async () => { let requestHeaders: readonly Header[] = []; - const query = getDeliveryClient("x") + const query = createDeliveryClient("x") .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/headers/secure-api.spec.ts index 8bca242c..b9f8fded 100644 --- a/tests/unit/headers/secure-api.spec.ts +++ b/tests/unit/headers/secure-api.spec.ts @@ -1,7 +1,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { getDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; describe("Secure API", async () => { afterEach(() => { @@ -17,7 +17,7 @@ describe("Secure API", async () => { let requestHeaders: readonly Header[] = []; const secureApiKey = "y"; - const query = getDeliveryClient("x") + const query = createDeliveryClient("x") .withUnknownSchema() .secureApi(secureApiKey) .create({ diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index c04e323c..a1e65b4a 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -1,6 +1,6 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; -import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; @@ -27,7 +27,7 @@ describe("Schema validation", () => { }; test("Response should NOT be successful when response does not match defined language codenames schema", async () => { - const client = getDeliveryClient("x") + const client = createDeliveryClient("x") .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) // does not include "de-DE" .publicApi() .create({ @@ -48,7 +48,7 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches defines language codenames schema", async () => { - const client = getDeliveryClient("x") + const client = createDeliveryClient("x") .withSchema({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] }) // includes all allowed codenames .publicApi() .create({ @@ -68,7 +68,7 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches general string codename schema", async () => { - const client = getDeliveryClient("x") + const client = createDeliveryClient("x") .withUnknownSchema() // should use general string for validation .publicApi() .create({ @@ -88,7 +88,7 @@ describe("Schema validation", () => { }); test("Response should be successful when an empty array is provided as codenames source", async () => { - const client = getDeliveryClient("x") + const client = createDeliveryClient("x") .withSchema({ languageCodenames: [] }) // empty array .publicApi() .create({ diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index f32bc2cb..91ed26f5 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -2,11 +2,11 @@ import type { ErrorReason } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, test } from "vitest"; import { ZodError } from "zod"; -import { getDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; describe("Response validation", () => { test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { - const query = getDeliveryClient("x") + const query = createDeliveryClient("x") .withUnknownSchema() .publicApi() .create({ @@ -39,7 +39,7 @@ describe("Response validation", () => { }); test("Error should not be returned when response does not match schema but validation is disabled", async ({ expect }) => { - const { success, error } = await getDeliveryClient("x") + const { success, error } = await createDeliveryClient("x") .withUnknownSchema() .publicApi() .create({ diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 1762dda8..b096f9bc 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,4 +1,4 @@ -import type { ContinuationHeaderName, Header } from "@kontent-ai/core-sdk"; +import type { ContinuationHeaderName, Header, PagingQuery, Query } from "@kontent-ai/core-sdk"; import chalk from "chalk"; import { config } from "dotenv"; @@ -23,3 +23,7 @@ export const fakeXContinuationTokenHeader: Header = { name: "X-Continuation" satisfies ContinuationHeaderName, value: "x", }; + +export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { + return "toPromise" in query && "toAllPromise" in query; +} From 8330e1b5d2fd2aefeed5a1f0ad861ec913186255 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Feb 2026 16:06:36 +0100 Subject: [PATCH 018/221] updates core sdk & paging --- lib/queries/languages/list-languages-query.ts | 4 ++-- lib/utils/paging.utils.ts | 16 +++++++--------- package-lock.json | 8 ++++---- package.json | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index bef1ff34..dfe62d7f 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,7 +1,7 @@ import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; -import { getPaginationByUrl } from "../../utils/paging.utils.js"; +import { getNextPageByUrl } from "../../utils/paging.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -21,7 +21,7 @@ export function getListLanguagesQuery { return {}; }, - pagination: getPaginationByUrl(), + getNextPageData: getNextPageByUrl(), request: { url, body: null, diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index 312917de..bbcaeca7 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,13 +1,11 @@ -import type { Pagination } from "@kontent-ai/core-sdk"; +import type { GetNextPageData } from "@kontent-ai/core-sdk"; import type { PaginationSchema } from "../models/core.models.js"; -export function getPaginationByUrl(): Pagination { - return { - getNextPageData: (response) => { - return { - continuationToken: undefined, - nextPageUrl: response.payload.pagination.next_page, - }; - }, +export function getNextPageByUrl(): GetNextPageData { + return (response) => { + return { + continuationToken: undefined, + nextPageUrl: response.payload.pagination.next_page, + }; }; } diff --git a/package-lock.json b/package-lock.json index b214ede0..b7ca1117 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "17.0.0-preview.0", "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.10", + "@kontent-ai/core-sdk": "12.0.0-preview.11", "zod": "4.3.6" }, "devDependencies": { @@ -952,9 +952,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.10", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.10.tgz", - "integrity": "sha512-EnewFspJztr23cgTatMTIZ6IItc6dCA/ILAFd4yskkQjdZyb+uBMKrOfWKMaC6tRZ5r3sNDuqMhUVeeU8N0aEg==", + "version": "12.0.0-preview.11", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.11.tgz", + "integrity": "sha512-q7YGcUL4ObeSaMd2jGWBifjkx7/H3NbV/13PVwCjiTGxMg5y6Z7gsKSwLlTtJbK0Ym66Kco6dqNqGPWlnd3eqQ==", "license": "MIT", "dependencies": { "ts-pattern": "5.9.0", diff --git a/package.json b/package.json index c2e3d06a..f0d5c48e 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.10", + "@kontent-ai/core-sdk": "12.0.0-preview.11", "zod": "4.3.6" }, "devDependencies": { From 7e40777729ffca0e688772414032648f7f7a89f5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 25 Feb 2026 13:02:05 +0100 Subject: [PATCH 019/221] updates deps --- package-lock.json | 702 ++++++++++++++++++++-------------------------- package.json | 14 +- 2 files changed, 314 insertions(+), 402 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7ca1117..abf95ead 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,30 +8,30 @@ "name": "@kontent-ai/delivery-sdk", "version": "17.0.0-preview.0", "license": "MIT", - "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.11", - "zod": "4.3.6" - }, "devDependencies": { - "@biomejs/biome": "2.4.2", + "@biomejs/biome": "2.4.4", "@kontent-ai/biome-config": "0.7.0", - "@kontent-ai/eslint-config": "2.3.0", - "@types/node": "25.2.3", + "@kontent-ai/eslint-config": "2.4.1", + "@types/node": "25.3.0", "chalk": "5.6.2", "dotenv": "17.3.1", - "eslint": "10.0.0", + "eslint": "10.0.2", "tsx": "4.21.0", "typescript": "5.9.3", "vitest": "4.0.18" }, "engines": { "node": ">= 22" + }, + "peerDependencies": { + "@kontent-ai/core-sdk": "^12.0.0-preview.11", + "zod": "^4.3.6" } }, "node_modules/@biomejs/biome": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.2.tgz", - "integrity": "sha512-vVE/FqLxNLbvYnFDYg3Xfrh1UdFhmPT5i+yPT9GE2nTUgI4rkqo5krw5wK19YHBd7aE7J6r91RRmb8RWwkjy6w==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.4.tgz", + "integrity": "sha512-tigwWS5KfJf0cABVd52NVaXyAVv4qpUXOWJ1rxFL8xF1RVoeS2q/LK+FHgYoKMclJCuRoCWAPy1IXaN9/mS61Q==", "dev": true, "license": "MIT OR Apache-2.0", "peer": true, @@ -46,20 +46,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.2", - "@biomejs/cli-darwin-x64": "2.4.2", - "@biomejs/cli-linux-arm64": "2.4.2", - "@biomejs/cli-linux-arm64-musl": "2.4.2", - "@biomejs/cli-linux-x64": "2.4.2", - "@biomejs/cli-linux-x64-musl": "2.4.2", - "@biomejs/cli-win32-arm64": "2.4.2", - "@biomejs/cli-win32-x64": "2.4.2" + "@biomejs/cli-darwin-arm64": "2.4.4", + "@biomejs/cli-darwin-x64": "2.4.4", + "@biomejs/cli-linux-arm64": "2.4.4", + "@biomejs/cli-linux-arm64-musl": "2.4.4", + "@biomejs/cli-linux-x64": "2.4.4", + "@biomejs/cli-linux-x64-musl": "2.4.4", + "@biomejs/cli-win32-arm64": "2.4.4", + "@biomejs/cli-win32-x64": "2.4.4" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.2.tgz", - "integrity": "sha512-3pEcKCP/1POKyaZZhXcxFl3+d9njmeAihZ17k8lL/1vk+6e0Cbf0yPzKItFiT+5Yh6TQA4uKvnlqe0oVZwRxCA==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.4.tgz", + "integrity": "sha512-jZ+Xc6qvD6tTH5jM6eKX44dcbyNqJHssfl2nnwT6vma6B1sj7ZLTGIk6N5QwVBs5xGN52r3trk5fgd3sQ9We9A==", "cpu": [ "arm64" ], @@ -74,9 +74,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.2.tgz", - "integrity": "sha512-P7hK1jLVny+0R9UwyGcECxO6sjETxfPyBm/1dmFjnDOHgdDPjPqozByunrwh4xPKld8sxOr5eAsSqal5uKgeBg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.4.tgz", + "integrity": "sha512-Dh1a/+W+SUCXhEdL7TiX3ArPTFCQKJTI1mGncZNWfO+6suk+gYA4lNyJcBB+pwvF49uw0pEbUS49BgYOY4hzUg==", "cpu": [ "x64" ], @@ -91,9 +91,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.2.tgz", - "integrity": "sha512-DI3Mi7GT2zYNgUTDEbSjl3e1KhoP76OjQdm8JpvZYZWtVDRyLd3w8llSr2TWk1z+U3P44kUBWY3X7H9MD1/DGQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.4.tgz", + "integrity": "sha512-V/NFfbWhsUU6w+m5WYbBenlEAz8eYnSqRMDMAW3K+3v0tYVkNyZn8VU0XPxk/lOqNXLSCCrV7FmV/u3SjCBShg==", "cpu": [ "arm64" ], @@ -108,9 +108,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.2.tgz", - "integrity": "sha512-/x04YK9+7erw6tYEcJv9WXoBHcULI/wMOvNdAyE9S3JStZZ9yJyV67sWAI+90UHuDo/BDhq0d96LDqGlSVv7WA==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.4.tgz", + "integrity": "sha512-+sPAXq3bxmFwhVFJnSwkSF5Rw2ZAJMH3MF6C9IveAEOdSpgajPhoQhbbAK12SehN9j2QrHpk4J/cHsa/HqWaYQ==", "cpu": [ "arm64" ], @@ -125,9 +125,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.2.tgz", - "integrity": "sha512-GK2ErnrKpWFigYP68cXiCHK4RTL4IUWhK92AFS3U28X/nuAL5+hTuy6hyobc8JZRSt+upXt1nXChK+tuHHx4mA==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.4.tgz", + "integrity": "sha512-R4+ZCDtG9kHArasyBO+UBD6jr/FcFCTH8QkNTOCu0pRJzCWyWC4EtZa2AmUZB5h3e0jD7bRV2KvrENcf8rndBg==", "cpu": [ "x64" ], @@ -142,9 +142,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.2.tgz", - "integrity": "sha512-wbBmTkeAoAYbOQ33f6sfKG7pcRSydQiF+dTYOBjJsnXO2mWEOQHllKlC2YVnedqZFERp2WZhFUoO7TNRwnwEHQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.4.tgz", + "integrity": "sha512-gGvFTGpOIQDb5CQ2VC0n9Z2UEqlP46c4aNgHmAMytYieTGEcfqhfCFnhs6xjt0S3igE6q5GLuIXtdQt3Izok+g==", "cpu": [ "x64" ], @@ -159,9 +159,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.2.tgz", - "integrity": "sha512-k2uqwLYrNNxnaoiW3RJxoMGnbKda8FuCmtYG3cOtVljs3CzWxaTR+AoXwKGHscC9thax9R4kOrtWqWN0+KdPTw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.4.tgz", + "integrity": "sha512-trzCqM7x+Gn832zZHgr28JoYagQNX4CZkUZhMUac2YxvvyDRLJDrb5m9IA7CaZLlX6lTQmADVfLEKP1et1Ma4Q==", "cpu": [ "arm64" ], @@ -176,9 +176,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.2.tgz", - "integrity": "sha512-9ma7C4g8Sq3cBlRJD2yrsHXB1mnnEBdpy7PhvFrylQWQb4PoyCmPucdX7frvsSBQuFtIiKCrolPl/8tCZrKvgQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.4.tgz", + "integrity": "sha512-gnOHKVPFAAPrpoPt2t+Q6FZ7RPry/FDV3GcpU53P3PtLNnQjBmKyN2Vh/JtqXet+H4pme8CC76rScwdjDcT1/A==", "cpu": [ "x64" ], @@ -664,62 +664,20 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.1.tgz", - "integrity": "sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.2.tgz", + "integrity": "sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^3.0.1", + "@eslint/object-schema": "^3.0.2", "debug": "^4.3.1", - "minimatch": "^10.1.1" + "minimatch": "^10.2.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-array/node_modules/balanced-match": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", - "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "jackspeak": "^4.2.3" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@eslint/config-helpers": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", @@ -747,20 +705,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.3", "strip-json-comments": "^3.1.1" }, "engines": { @@ -770,6 +728,13 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -823,9 +788,9 @@ } }, "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==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -836,9 +801,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -849,9 +814,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.1.tgz", - "integrity": "sha512-P9cq2dpr+LU8j3qbLygLcSZrl2/ds/pUpfnHNNuk5HW7mnngHs+6WSq5C9mO3rqRX8A1poxqLTC9cu0KOyJlBg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.2.tgz", + "integrity": "sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -924,16 +889,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -956,6 +911,7 @@ "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.11.tgz", "integrity": "sha512-q7YGcUL4ObeSaMd2jGWBifjkx7/H3NbV/13PVwCjiTGxMg5y6Z7gsKSwLlTtJbK0Ym66Kco6dqNqGPWlnd3eqQ==", "license": "MIT", + "peer": true, "dependencies": { "ts-pattern": "5.9.0", "zod": "4.3.6" @@ -968,14 +924,14 @@ } }, "node_modules/@kontent-ai/eslint-config": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.3.0.tgz", - "integrity": "sha512-jitXKJwj56QGzcV9Y2gOVxT6ApIkmS/fcJwbNFhLvuW2DR92gLY7qWnEgscDnCYWKZ9a4gSCVINcRBbZoWSOzg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.4.1.tgz", + "integrity": "sha512-4tIyNDDIxeYaPK17lMN00Ch1kqNbayLmrV+/tcia62XzCejR/cHcXcsWVGhmxS1RjyVpqhstnTWbUrcvmXge2Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "^8.46.3", - "@typescript-eslint/parser": "^8.46.3", + "@typescript-eslint/eslint-plugin": "^8.56.0", + "@typescript-eslint/parser": "^8.56.0", "eslint": "^9.39.1", "eslint-plugin-react": "^7.37.5" } @@ -1045,6 +1001,13 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@kontent-ai/eslint-config/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1074,9 +1037,9 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "peer": true, @@ -1087,7 +1050,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -1226,9 +1189,9 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -1249,9 +1212,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -1263,9 +1226,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -1277,9 +1240,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -1291,9 +1254,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -1305,9 +1268,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -1319,9 +1282,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -1333,9 +1296,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -1347,9 +1310,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -1361,9 +1324,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -1375,9 +1338,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -1389,9 +1352,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], @@ -1403,9 +1366,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -1417,9 +1380,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], @@ -1431,9 +1394,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -1445,9 +1408,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1459,9 +1422,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1473,9 +1436,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1487,9 +1450,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -1501,9 +1464,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1515,9 +1478,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -1529,9 +1492,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1543,9 +1506,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1557,9 +1520,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1571,9 +1534,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1585,9 +1548,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1645,28 +1608,28 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", - "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/type-utils": "8.56.0", - "@typescript-eslint/utils": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1679,23 +1642,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.0", + "@typescript-eslint/parser": "^8.56.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", - "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3" }, "engines": { @@ -1711,14 +1674,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", - "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.0", - "@typescript-eslint/types": "^8.56.0", + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", "debug": "^4.4.3" }, "engines": { @@ -1733,14 +1696,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", - "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0" + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1751,9 +1714,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", - "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", "dev": true, "license": "MIT", "engines": { @@ -1768,15 +1731,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", - "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0", - "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -1793,9 +1756,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", - "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", "dev": true, "license": "MIT", "engines": { @@ -1807,18 +1770,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", - "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.0", - "@typescript-eslint/tsconfig-utils": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/visitor-keys": "8.56.0", + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" @@ -1835,16 +1798,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", - "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.0", - "@typescript-eslint/types": "8.56.0", - "@typescript-eslint/typescript-estree": "8.56.0" + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1859,13 +1822,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", - "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/types": "8.56.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1877,9 +1840,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2001,9 +1964,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "peer": true, @@ -2025,9 +1988,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2239,20 +2202,26 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/call-bind": { @@ -2776,16 +2745,16 @@ } }, "node_modules/eslint": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.0.tgz", - "integrity": "sha512-O0piBKY36YSJhlFSG8p9VUdPV/SxxS4FYDWVpr/9GJuMaepzwlf4J8I4ov1b+ySQfDTPhc3DtLaxcT1fN0yqCg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.2.tgz", + "integrity": "sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.0", + "@eslint/config-array": "^0.23.2", "@eslint/config-helpers": "^0.5.2", "@eslint/core": "^1.1.0", "@eslint/plugin-kit": "^0.6.0", @@ -2793,13 +2762,13 @@ "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.0", - "eslint-visitor-keys": "^5.0.0", - "espree": "^11.1.0", + "eslint-scope": "^9.1.1", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2810,7 +2779,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.1.1", + "minimatch": "^10.2.1", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -2833,9 +2802,9 @@ } }, "node_modules/eslint-scope": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.0.tgz", - "integrity": "sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.1.tgz", + "integrity": "sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2864,36 +2833,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/balanced-match": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", - "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "jackspeak": "^4.2.3" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2913,32 +2856,16 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.1.tgz", - "integrity": "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/espree": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz", - "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.1.tgz", + "integrity": "sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.0" + "eslint-visitor-keys": "^5.0.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -2948,9 +2875,9 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3884,22 +3811,6 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^9.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4038,16 +3949,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4537,9 +4448,9 @@ } }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -4553,31 +4464,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -5189,9 +5100,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -5509,6 +5420,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index f0d5c48e..8a842dda 100644 --- a/package.json +++ b/package.json @@ -41,16 +41,16 @@ "clean": "tsx scripts/clean.ts", "update:version": "tsx ./scripts/update-version.ts" }, - "dependencies": { - "@kontent-ai/core-sdk": "12.0.0-preview.11", - "zod": "4.3.6" + "peerDependencies": { + "@kontent-ai/core-sdk": "^12.0.0-preview.11", + "zod": "^4.3.6" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", - "@kontent-ai/eslint-config": "2.3.0", - "eslint": "10.0.0", - "@biomejs/biome": "2.4.2", - "@types/node": "25.2.3", + "@kontent-ai/eslint-config": "2.4.1", + "eslint": "10.0.2", + "@biomejs/biome": "2.4.4", + "@types/node": "25.3.0", "chalk": "5.6.2", "typescript": "5.9.3", "vitest": "4.0.18", From 724d3fb04e8d79764737ac70a95470424362e13e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 25 Feb 2026 14:05:25 +0100 Subject: [PATCH 020/221] Updates deps & simplifies paging query --- lib/client/delivery-client.ts | 4 +-- lib/queries/languages/list-languages-query.ts | 25 ++++++++----------- package-lock.json | 18 ++++++------- package.json | 2 +- tests/utils/test.utils.ts | 2 +- 5 files changed, 22 insertions(+), 29 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 857b62fa..81eebe8b 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -5,7 +5,7 @@ import type { DeliveryClientSchema, DeliveryClientTypes, } from "../models/core.models.js"; -import { getListLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import { createListLanguagesQuery } from "../queries/languages/list-languages-query.js"; type DeliverySchemaBuilder = { withSchema: ( @@ -93,6 +93,6 @@ function buildDeliveryClient { return { config, - listLanguages: () => getListLanguagesQuery(config, schema), + listLanguages: () => createListLanguagesQuery(config, schema), }; } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index dfe62d7f..0793172f 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,37 +1,32 @@ import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; -import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { getNextPageByUrl } from "../../utils/paging.utils.js"; import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = PagingQuery>; +export type ListLanguagesQuery = PagingQuery< + ListLanguagesPayload, + null +>; -export function getListLanguagesQuery( +export function createListLanguagesQuery( config: DeliveryClientConfig, schema: DeliveryClientSchema, -): ReturnType["listLanguages"]> { - const url = getDeliveryEndpointUrl({ path: "/languages", ...config }); - - const { toPromise, toAllPromise } = createPagingQuery, null>({ +): ListLanguagesQuery { + return createPagingQuery, null, null>({ config, zodSchema: listLanguagesPayload(schema), sdkInfo: deliverySdkInfo, authorizationApiKey: config.deliveryApiKey, mapMetadata: () => { - return {}; + return null; }, getNextPageData: getNextPageByUrl(), request: { - url, + url: getDeliveryEndpointUrl({ path: "/languages", ...config }), body: null, method: "GET", }, }); - - return { - toUrl: () => url, - toPromise, - toAllPromise, - }; } diff --git a/package-lock.json b/package-lock.json index abf95ead..0d363f51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.11", + "@kontent-ai/core-sdk": "^12.0.0-preview.13", "zod": "^4.3.6" } }, @@ -907,20 +907,17 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.11", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.11.tgz", - "integrity": "sha512-q7YGcUL4ObeSaMd2jGWBifjkx7/H3NbV/13PVwCjiTGxMg5y6Z7gsKSwLlTtJbK0Ym66Kco6dqNqGPWlnd3eqQ==", + "version": "12.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.13.tgz", + "integrity": "sha512-sdWzKJZx5Crz6ovL9p+jIDSX4rRRObqcNHzo8mIIbvuhS8WlijddNGiqrsCrcJFffAyU6kXzHoyuCvXZaPdkrQ==", "license": "MIT", "peer": true, - "dependencies": { - "ts-pattern": "5.9.0", - "zod": "4.3.6" - }, "engines": { "node": ">=22" }, "peerDependencies": { - "zod": "4.3.6" + "ts-pattern": "^5.9.0", + "zod": "^4.3.6" } }, "node_modules/@kontent-ai/eslint-config": { @@ -4951,7 +4948,8 @@ "version": "5.9.0", "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", diff --git a/package.json b/package.json index 8a842dda..800f2e9a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.11", + "@kontent-ai/core-sdk": "^12.0.0-preview.13", "zod": "^4.3.6" }, "devDependencies": { diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index b096f9bc..e9acf226 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -24,6 +24,6 @@ export const fakeXContinuationTokenHeader: Header = { value: "x", }; -export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { +export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { return "toPromise" in query && "toAllPromise" in query; } From 812e64ea535f78f8e72028a7617c3e48ecf3902b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 25 Feb 2026 14:42:40 +0100 Subject: [PATCH 021/221] Removes unused code --- lib/models/core.models.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index cb5bffe3..54a36ec5 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,4 @@ -import type { AdapterResponse, ContinuationHeaderName, SdkConfig } from "@kontent-ai/core-sdk"; +import type { AdapterResponse, SdkConfig } from "@kontent-ai/core-sdk"; import z from "zod"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; @@ -67,12 +67,6 @@ export type DeliveryClient; -export class MissingContinuationTokenError extends Error { - constructor() { - super(`Missing '${"X-Continuation" satisfies ContinuationHeaderName}' header`); - } -} - export const paginationSchema = z.object({ pagination: z .object({ @@ -85,5 +79,3 @@ export const paginationSchema = z.object({ }); export type PaginationSchema = Readonly>; - -export type ResponseWithPagination = TPayload & PaginationSchema; From 9feb6644dd4495d909c8721a774da748c8294865 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 25 Feb 2026 15:03:19 +0100 Subject: [PATCH 022/221] Tests languages url --- tests/integration/languages/list-languages-query.spec.ts | 9 ++++++++- tests/utils/test.utils.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 7bb72d8e..56160354 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { getDeliveryEndpointUrl } from "../../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../../integration-tests.config.js"; import { isPagingQuery } from "../../utils/test.utils.js"; @@ -10,7 +11,13 @@ describe("List languages query", async () => { baseUrl: config.env.deliveryBaseUrl, }); - const { response, success, error } = await client.listLanguages().toPromise(); + const query = client.listLanguages(); + + const { response, success, error } = await query.toPromise(); + + it("Expect url to be correct", () => { + expect(query.toUrl()).toBe(`${getDeliveryEndpointUrl({ apiMode: "public", environmentId: config.env.id, path: "/languages" })}`); + }); it("Query should be a paging query", () => { expect(isPagingQuery(client.listLanguages())).toBeTruthy(); diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index e9acf226..c28f9934 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -25,5 +25,5 @@ export const fakeXContinuationTokenHeader: Header = { }; export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { - return "toPromise" in query && "toAllPromise" in query; + return "toPromise" in query && "toAllPromise" in query && "pages" in query; } From 33af7817d51c7a9638c63113ac15e1b806cc7a37 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 25 Feb 2026 15:25:32 +0100 Subject: [PATCH 023/221] Improve typing for Delivery URLs --- lib/models/core.models.ts | 13 +++++++++++++ lib/queries/languages/list-languages-query.ts | 4 ++-- lib/utils/url.utils.ts | 6 +++--- .../languages/list-languages-query.spec.ts | 4 ++-- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 54a36ec5..4d5983de 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -79,3 +79,16 @@ export const paginationSchema = z.object({ }); export type PaginationSchema = Readonly>; + +export type DeliveryEndpoints = + | "languages" + | "items" + | `items/${string}` + | "items-feed" + | `assets/${string}/used-in` + | `items/${string}/used-in` + | "taxonomies" + | `taxonomies/${string}` + | "types" + | `types/${string}` + | `types/${string}/elements/${string}`; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 0793172f..0abb3b49 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -2,7 +2,7 @@ import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; import { deliverySdkInfo } from "../../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { getNextPageByUrl } from "../../utils/paging.utils.js"; -import { getDeliveryEndpointUrl } from "../../utils/url.utils.js"; +import { getDeliveryUrl } from "../../utils/url.utils.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = PagingQuery< @@ -24,7 +24,7 @@ export function createListLanguagesQuery): string { +}: { readonly path: DeliveryEndpoints } & Pick): string { return getEndpointUrl({ environmentId, path, diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts index 56160354..894f0efc 100644 --- a/tests/integration/languages/list-languages-query.spec.ts +++ b/tests/integration/languages/list-languages-query.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getDeliveryEndpointUrl } from "../../../lib/utils/url.utils.js"; +import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../../integration-tests.config.js"; import { isPagingQuery } from "../../utils/test.utils.js"; @@ -16,7 +16,7 @@ describe("List languages query", async () => { const { response, success, error } = await query.toPromise(); it("Expect url to be correct", () => { - expect(query.toUrl()).toBe(`${getDeliveryEndpointUrl({ apiMode: "public", environmentId: config.env.id, path: "/languages" })}`); + expect(query.toUrl()).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: config.env.id, path: "languages" })}`); }); it("Query should be a paging query", () => { From d970509ab9baa72bb009a0894d8b1677f386c8f1 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 08:54:13 +0100 Subject: [PATCH 024/221] Extends validation tests, fixes language schema, adds schema comments --- lib/client/delivery-client.ts | 14 ++++++ lib/queries/languages/language.models.ts | 3 +- ...schema-validation-with-extra-props.spec.ts | 46 +++++++++++++++++++ ...hema-validation-with-missing-props.spec.ts | 40 ++++++++++++++++ .../unit/validation/schema-validation.spec.ts | 1 + 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 tests/unit/validation/schema-validation-with-extra-props.spec.ts create mode 100644 tests/unit/validation/schema-validation-with-missing-props.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 81eebe8b..24858c8c 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -8,9 +8,23 @@ import type { import { createListLanguagesQuery } from "../queries/languages/list-languages-query.js"; type DeliverySchemaBuilder = { + /** + * By providing a schema, you get stronger type safety, + * which means many potential errors are caught at compile time rather than at runtime. + * + * Schemas can be generated using the `@kontent-ai/model-generator` npm package. + */ withSchema: ( schema: DeliveryClientSchema, ) => DeliveryApiBuilder; + /** + * Use this only when you cannot provide a schema and have a strong reason to accept reduced type safety. + * + * Prefer `withSchema` whenever possible to ensure potential errors are caught at compile time + * rather than at runtime. + * + * Schemas can be generated using the `@kontent-ai/model-generator` npm package. + */ withUnknownSchema: () => DeliveryApiBuilder; }; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 27735a80..a553d3de 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -8,6 +8,7 @@ export const languagePayload = z .object({ - languages: z.array(languagePayload(schema)), + languages: z.array(languagePayload(schema)).readonly(), ...paginationSchema.shape, }) .readonly(); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts new file mode 100644 index 00000000..4b731860 --- /dev/null +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -0,0 +1,46 @@ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, test } from "vitest"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; + +describe("Valid schema validation with extra props", () => { + const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { + languages: [ + { + system: { + id: "1", + codename: "de-DE", + name: "German", + }, + }, + ], + extraProperty: "extra", + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, + }; + + test("Validation should be successful when response includes additional properties", async () => { + const client = createDeliveryClient("x") + .withUnknownSchema() + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); + }); +}); diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts new file mode 100644 index 00000000..6e92a55a --- /dev/null +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -0,0 +1,40 @@ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, test } from "vitest"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; + +describe("Valid schema validation with missing props", () => { + const mockPayload: Omit, "pagination"> = { + languages: [ + { + system: { + id: "1", + codename: "de-DE", + name: "German", + }, + }, + ], + }; + + test("Validation should fail when response is missing schema properties", async () => { + const client = createDeliveryClient("x") + .withUnknownSchema() + .publicApi() + .create({ + responseValidation: { + enable: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().toPromise(); + + expect(error).toBeDefined(); + expect(success).toBeFalsy(); + expect(error?.details.reason).toBe("validationFailed"); + }); +}); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index a1e65b4a..e45c999c 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -15,6 +15,7 @@ describe("Schema validation", () => { system: { id: "1", codename: "de-DE", + name: "German", }, }, ], From a9bb07f92886190570a07af27f6eece994f830de Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 11:27:46 +0100 Subject: [PATCH 025/221] Adds support for list taxonomies, creates testing function for integration queries --- lib/client/delivery-client.ts | 6 +- lib/models/core.models.ts | 6 + lib/queries/languages/list-languages-query.ts | 2 +- .../taxonomies/list-taxonomies-query.ts | 32 +++++ lib/queries/taxonomies/taxonomy.models.ts | 45 +++++++ .../languages/list-languages-query.spec.ts | 40 ------- .../queries/list-languages-query.spec.ts | 29 +++++ .../queries/list-taxonomies-query.spec.ts | 58 +++++++++ tests/unit/errors/custom-errors.spec.ts | 3 +- tests/unit/headers/headers.spec.ts | 3 +- tests/unit/headers/preview-api.spec.ts | 3 +- tests/unit/headers/public-deliver-api.spec.ts | 3 +- tests/unit/headers/secure-api.spec.ts | 3 +- ...schema-validation-with-extra-props.spec.ts | 3 +- ...hema-validation-with-missing-props.spec.ts | 3 +- .../unit/validation/schema-validation.spec.ts | 9 +- .../validation/validation-properties.spec.ts | 3 +- tests/utils/test.utils.ts | 113 +++++++++++++++++- 18 files changed, 308 insertions(+), 56 deletions(-) create mode 100644 lib/queries/taxonomies/list-taxonomies-query.ts create mode 100644 lib/queries/taxonomies/taxonomy.models.ts delete mode 100644 tests/integration/languages/list-languages-query.spec.ts create mode 100644 tests/integration/queries/list-languages-query.spec.ts create mode 100644 tests/integration/queries/list-taxonomies-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 24858c8c..e005a3e6 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -5,7 +5,8 @@ import type { DeliveryClientSchema, DeliveryClientTypes, } from "../models/core.models.js"; -import { createListLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; type DeliverySchemaBuilder = { /** @@ -107,6 +108,7 @@ function buildDeliveryClient { return { config, - listLanguages: () => createListLanguagesQuery(config, schema), + listLanguages: () => listLanguagesQuery(config, schema), + listTaxonomies: () => listTaxonomiesQuery(config, schema), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 4d5983de..619c48cd 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,6 +1,7 @@ import type { AdapterResponse, SdkConfig } from "@kontent-ai/core-sdk"; import z from "zod"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; export type DeliveryClientTypes = { // readonly contentItemType: IContentItem; @@ -63,6 +64,11 @@ export type DeliveryClient; + + /** + * List taxonomies. + */ + listTaxonomies(): ListTaxonomiesQuery; }; export type CreateDeliveryClientOptions = Omit; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 0abb3b49..7856a7fd 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -10,7 +10,7 @@ export type ListLanguagesQuery null >; -export function createListLanguagesQuery( +export function listLanguagesQuery( config: DeliveryClientConfig, schema: DeliveryClientSchema, ): ListLanguagesQuery { diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts new file mode 100644 index 00000000..82099676 --- /dev/null +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -0,0 +1,32 @@ +import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; +import { deliverySdkInfo } from "../../delivery-sdk-info.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import { getNextPageByUrl } from "../../utils/paging.utils.js"; +import { getDeliveryUrl } from "../../utils/url.utils.js"; +import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; + +export type ListTaxonomiesQuery = PagingQuery< + ListTaxonomiesPayload, + null +>; + +export function listTaxonomiesQuery( + config: DeliveryClientConfig, + schema: DeliveryClientSchema, +): ListTaxonomiesQuery { + return createPagingQuery, null, null>({ + config, + zodSchema: listTaxonomiesPayload(schema), + sdkInfo: deliverySdkInfo, + authorizationApiKey: config.deliveryApiKey, + mapMetadata: () => { + return null; + }, + getNextPageData: getNextPageByUrl(), + request: { + url: getDeliveryUrl({ path: "taxonomies", ...config }), + body: null, + method: "GET", + }, + }); +} diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts new file mode 100644 index 00000000..e5bf34e3 --- /dev/null +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -0,0 +1,45 @@ +import { z } from "zod"; +import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { getCodenameSchema } from "../../utils/type.utils.js"; + +export const taxonomyTermPayload = (schema: DeliveryClientSchema) => + z.object({ + name: z.string(), + codename: getCodenameSchema(schema.taxonomyCodenames), + get terms() { + return z.array(taxonomyTermPayload(schema)).readonly(); + }, + }); + +export const taxonomyPayload = (schema: DeliveryClientSchema) => + z + .object({ + system: z + .object({ + id: z.string(), + name: z.string(), + codename: getCodenameSchema(schema.taxonomyCodenames), + last_modified: z.iso.datetime(), + }) + .readonly(), + terms: z.array(taxonomyTermPayload(schema)).readonly(), + }) + .readonly(); + +export const listTaxonomiesPayload = ( + schema: DeliveryClientSchema, +) => + z + .object({ + taxonomies: z.array(taxonomyPayload(schema)).readonly(), + ...paginationSchema.shape, + }) + .readonly(); + +export type ListTaxonomiesPayload = z.infer< + ReturnType> +>; + +export type TaxonomyPayload = z.infer< + ReturnType> +>; diff --git a/tests/integration/languages/list-languages-query.spec.ts b/tests/integration/languages/list-languages-query.spec.ts deleted file mode 100644 index 894f0efc..00000000 --- a/tests/integration/languages/list-languages-query.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import { listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; -import { getIntegrationTestConfig } from "../../integration-tests.config.js"; -import { isPagingQuery } from "../../utils/test.utils.js"; - -describe("List languages query", async () => { - const config = getIntegrationTestConfig(); - const client = createDeliveryClient(config.env.id).withUnknownSchema().publicApi().create({ - baseUrl: config.env.deliveryBaseUrl, - }); - - const query = client.listLanguages(); - - const { response, success, error } = await query.toPromise(); - - it("Expect url to be correct", () => { - expect(query.toUrl()).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: config.env.id, path: "languages" })}`); - }); - - it("Query should be a paging query", () => { - expect(isPagingQuery(client.listLanguages())).toBeTruthy(); - }); - - it("Response should be successful", () => { - expect(success).toBeTruthy(); - expect(error).toBeUndefined(); - }); - - it("Response payload should match schema", async () => { - const { error: parseError, success: parseSuccess } = await listLanguagesPayload({}).safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); - }); - - it("Response should contain at least one language", () => { - expect(response?.payload?.languages?.length).toBeGreaterThanOrEqual(1); - }); -}); diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/list-languages-query.spec.ts new file mode 100644 index 00000000..ad9dd7bf --- /dev/null +++ b/tests/integration/queries/list-languages-query.spec.ts @@ -0,0 +1,29 @@ +import { describe } from "vitest"; +import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import { type ListLanguagesPayload, listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { runQueryIntegrationTestsAsync } from "../../utils/test.utils.js"; + +describe("List languages query", async () => { + await runQueryIntegrationTestsAsync>({ + endpoint: "languages", + unitTestPayload: { + languages: [ + { + system: { + id: "00000000-0000-0000-0000-000000000000", + name: "Default project language", + codename: "default", + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, + }, + selectQuery: (client) => client.listLanguages(), + expectedSchema: listLanguagesPayload({}), + }); +}); diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/list-taxonomies-query.spec.ts new file mode 100644 index 00000000..6bb921a5 --- /dev/null +++ b/tests/integration/queries/list-taxonomies-query.spec.ts @@ -0,0 +1,58 @@ +import { describe } from "vitest"; +import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../lib/queries/taxonomies/taxonomy.models.js"; +import { runQueryIntegrationTestsAsync } from "../../utils/test.utils.js"; + +describe("List taxonomies query", async () => { + await runQueryIntegrationTestsAsync>({ + endpoint: "taxonomies", + unitTestPayload: { + taxonomies: [ + { + system: { + id: "b7f516a3-36b9-4108-919f-ed83ea91926e", + name: "Movie type", + codename: "movie_type", + last_modified: "2026-02-26T10:12:21.5095299Z", + }, + terms: [ + { + name: "Drama", + codename: "drama", + terms: [], + }, + { + name: "Comedy", + codename: "comedy", + terms: [ + { + name: "Sitcom", + codename: "sitcom", + terms: [], + }, + { + name: "Stand-up", + codename: "stand_up", + terms: [], + }, + ], + }, + { + name: "Action", + codename: "action", + terms: [], + }, + ], + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, + }, + selectQuery: (client) => client.listTaxonomies(), + expectedSchema: listTaxonomiesPayload({}), + }); +}); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 8b0a9199..52a5f52a 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -1,11 +1,12 @@ import { type ErrorReason, getDefaultHttpService } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; class CustomError extends Error {} describe("Handling of custom errors", async () => { - const { success, error } = await createDeliveryClient("x") + const { success, error } = await createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 0573df42..9da73078 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -2,6 +2,7 @@ import { getDefaultHttpAdapter, getDefaultHttpService, getSdkIdHeader, type Head import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Delivery tracking header", async () => { const expectedHeader = getSdkIdHeader({ @@ -22,7 +23,7 @@ describe("Delivery tracking header", async () => { let requestHeaders: readonly Header[] = []; - const query = createDeliveryClient("x") + const query = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/headers/preview-api.spec.ts index f082900d..440c8f05 100644 --- a/tests/unit/headers/preview-api.spec.ts +++ b/tests/unit/headers/preview-api.spec.ts @@ -2,6 +2,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, t import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Preview API", async () => { afterEach(() => { @@ -17,7 +18,7 @@ describe("Preview API", async () => { let requestHeaders: readonly Header[] = []; const previewApiKey = "y"; - const query = createDeliveryClient("x") + const query = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .previewApi(previewApiKey) .create({ diff --git a/tests/unit/headers/public-deliver-api.spec.ts b/tests/unit/headers/public-deliver-api.spec.ts index deec723f..0e43ef77 100644 --- a/tests/unit/headers/public-deliver-api.spec.ts +++ b/tests/unit/headers/public-deliver-api.spec.ts @@ -2,6 +2,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, t import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Public deliver API", async () => { afterEach(() => { @@ -16,7 +17,7 @@ describe("Public deliver API", async () => { let requestHeaders: readonly Header[] = []; - const query = createDeliveryClient("x") + const query = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/headers/secure-api.spec.ts index b9f8fded..055d2c14 100644 --- a/tests/unit/headers/secure-api.spec.ts +++ b/tests/unit/headers/secure-api.spec.ts @@ -2,6 +2,7 @@ import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, t import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Secure API", async () => { afterEach(() => { @@ -17,7 +18,7 @@ describe("Secure API", async () => { let requestHeaders: readonly Header[] = []; const secureApiKey = "y"; - const query = createDeliveryClient("x") + const query = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .secureApi(secureApiKey) .create({ diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index 4b731860..da7eedfd 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -3,6 +3,7 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with extra props", () => { const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { @@ -25,7 +26,7 @@ describe("Valid schema validation with extra props", () => { }; test("Validation should be successful when response includes additional properties", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 6e92a55a..a94bc428 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -3,6 +3,7 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with missing props", () => { const mockPayload: Omit, "pagination"> = { @@ -18,7 +19,7 @@ describe("Valid schema validation with missing props", () => { }; test("Validation should fail when response is missing schema properties", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index e45c999c..53859ac7 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -3,6 +3,7 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; type TestDeliveryClientTypes = DeliveryClientTypes & { readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; @@ -28,7 +29,7 @@ describe("Schema validation", () => { }; test("Response should NOT be successful when response does not match defined language codenames schema", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) // does not include "de-DE" .publicApi() .create({ @@ -49,7 +50,7 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches defines language codenames schema", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withSchema({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] }) // includes all allowed codenames .publicApi() .create({ @@ -69,7 +70,7 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches general string codename schema", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() // should use general string for validation .publicApi() .create({ @@ -89,7 +90,7 @@ describe("Schema validation", () => { }); test("Response should be successful when an empty array is provided as codenames source", async () => { - const client = createDeliveryClient("x") + const client = createDeliveryClient(unitEnvironmentId) .withSchema({ languageCodenames: [] }) // empty array .publicApi() .create({ diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index 91ed26f5..b9f85167 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -3,10 +3,11 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit import { describe, test } from "vitest"; import { ZodError } from "zod"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Response validation", () => { test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { - const query = createDeliveryClient("x") + const query = createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() .create({ diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index c28f9934..261c1977 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,6 +1,13 @@ -import type { ContinuationHeaderName, Header, PagingQuery, Query } from "@kontent-ai/core-sdk"; +import type { ContinuationHeaderName, Header, JsonValue, PagingQuery, Query } from "@kontent-ai/core-sdk"; +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import chalk from "chalk"; import { config } from "dotenv"; +import { expect, it } from "vitest"; +import type { ZodType } from "zod"; +import type { DeliveryClient, DeliveryClientTypes, DeliveryEndpoints } from "../../lib/models/core.models.js"; +import { createDeliveryClient } from "../../lib/public_api.js"; +import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; +import { getIntegrationTestConfig } from "../integration-tests.config.js"; // needed to load .env environment to current process when run via package.json script config(); @@ -27,3 +34,107 @@ export const fakeXContinuationTokenHeader: Header = { export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { return "toPromise" in query && "toAllPromise" in query && "pages" in query; } + +export async function runQueryIntegrationTestsAsync({ + endpoint, + unitTestPayload, + selectQuery, + expectedSchema, +}: { + readonly expectedSchema: ZodType; + readonly endpoint: DeliveryEndpoints; + readonly unitTestPayload: TResponsePayload; + readonly selectQuery: (client: DeliveryClient) => Query; +}): Promise { + const integrationTextConfig = getIntegrationTestConfig(); + + const clients: readonly DeliveryClient[] = [ + createDeliveryClient(unitEnvironmentId) + .withUnknownSchema() + .publicApi() + .create({ + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: unitTestPayload, + statusCode: 200, + }), + }), + createDeliveryClient(integrationTextConfig.env.id).withUnknownSchema().publicApi().create({ + baseUrl: integrationTextConfig.env.deliveryBaseUrl, + }), + ]; + + for (const client of clients) { + const isIntegrationTest = client.config.environmentId === integrationTextConfig.env.id; + const testType = isIntegrationTest ? "Integration" : "Unit"; + const testName = `${testType}[${endpoint}]: `; + + const query = selectQuery(client); + const { response, success, error } = await query.toPromise(); + + it(`${testName} Expect url to be correct`, () => { + expect(query.toUrl()).toBe( + `${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`, + ); + }); + + it(`${testName} Response should be successful`, () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + + it(`${testName} Response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + + if (testType === "Unit") { + it(`${testName} Payload should be equal to unit test payload`, () => { + expect(response?.payload).toEqual(unitTestPayload); + }); + } + + if (isPagingQuery(query)) { + const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); + + it(`${testName} Response should be successful`, () => { + expect(pagingSuccess).toBeTruthy(); + expect(pagingError).toBeUndefined(); + }); + + if (testType === "Unit") { + const firstResponse = pagingResponses?.[0]; + + it(`${testName} First paging response payload should match schema`, () => { + expect(firstResponse?.payload).toEqual(unitTestPayload); + }); + } + + it(`${testName} First paging response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + + const iteratorPayloads: TResponsePayload[] = []; + const maxPagesCount = 1; + for await (const response of query.pages({ maxPagesCount })) { + iteratorPayloads.push(response?.payload); + } + + it(`${testName} Iterator responses should be equal to paging responses`, () => { + expect(iteratorPayloads.length).toEqual(maxPagesCount); + }); + + if (testType === "Unit") { + const firstIteratorResponse = iteratorPayloads?.[0]; + + it(`${testName} First iterator response payload should match schema`, () => { + expect(firstIteratorResponse).toEqual(unitTestPayload); + }); + } + } + } +} + +export const unitEnvironmentId = "xyz"; From f80759631347585e18296a0790b1ba16ef01b8ad Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 11:29:11 +0100 Subject: [PATCH 026/221] Separates integration-test utils --- .../queries/list-languages-query.spec.ts | 2 +- .../queries/list-taxonomies-query.spec.ts | 2 +- tests/utils/integration-test.utils.ts | 111 ++++++++++++++++++ tests/utils/test.utils.ts | 111 +----------------- 4 files changed, 114 insertions(+), 112 deletions(-) create mode 100644 tests/utils/integration-test.utils.ts diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/list-languages-query.spec.ts index ad9dd7bf..4ad927fb 100644 --- a/tests/integration/queries/list-languages-query.spec.ts +++ b/tests/integration/queries/list-languages-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { runQueryIntegrationTestsAsync } from "../../utils/test.utils.js"; +import { runQueryIntegrationTestsAsync } from "../../utils/integration-test.utils.js"; describe("List languages query", async () => { await runQueryIntegrationTestsAsync>({ diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/list-taxonomies-query.spec.ts index 6bb921a5..4083ca11 100644 --- a/tests/integration/queries/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/list-taxonomies-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../lib/queries/taxonomies/taxonomy.models.js"; -import { runQueryIntegrationTestsAsync } from "../../utils/test.utils.js"; +import { runQueryIntegrationTestsAsync } from "../../utils/integration-test.utils.js"; describe("List taxonomies query", async () => { await runQueryIntegrationTestsAsync>({ diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts new file mode 100644 index 00000000..aaaf3213 --- /dev/null +++ b/tests/utils/integration-test.utils.ts @@ -0,0 +1,111 @@ +import type { JsonValue, Query } from "@kontent-ai/core-sdk"; +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { expect, it } from "vitest"; +import type { ZodType } from "zod"; +import type { DeliveryClient, DeliveryClientTypes, DeliveryEndpoints } from "../../lib/models/core.models.js"; +import { createDeliveryClient } from "../../lib/public_api.js"; +import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; +import { getIntegrationTestConfig } from "../integration-tests.config.js"; +import { isPagingQuery, unitEnvironmentId } from "./test.utils.js"; + +export async function runQueryIntegrationTestsAsync({ + endpoint, + unitTestPayload, + selectQuery, + expectedSchema, +}: { + readonly expectedSchema: ZodType; + readonly endpoint: DeliveryEndpoints; + readonly unitTestPayload: TResponsePayload; + readonly selectQuery: (client: DeliveryClient) => Query; +}): Promise { + const integrationTextConfig = getIntegrationTestConfig(); + + const clients: readonly DeliveryClient[] = [ + createDeliveryClient(unitEnvironmentId) + .withUnknownSchema() + .publicApi() + .create({ + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: unitTestPayload, + statusCode: 200, + }), + }), + createDeliveryClient(integrationTextConfig.env.id).withUnknownSchema().publicApi().create({ + baseUrl: integrationTextConfig.env.deliveryBaseUrl, + }), + ]; + + for (const client of clients) { + const isIntegrationTest = client.config.environmentId === integrationTextConfig.env.id; + const testType = isIntegrationTest ? "Integration" : "Unit"; + const testName = `${testType}[${endpoint}]: `; + + const query = selectQuery(client); + const { response, success, error } = await query.toPromise(); + + it(`${testName} Expect url to be correct`, () => { + expect(query.toUrl()).toBe( + `${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`, + ); + }); + + it(`${testName} Response should be successful`, () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + + it(`${testName} Response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + + if (testType === "Unit") { + it(`${testName} Payload should be equal to unit test payload`, () => { + expect(response?.payload).toEqual(unitTestPayload); + }); + } + + if (isPagingQuery(query)) { + const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); + + it(`${testName} Response should be successful`, () => { + expect(pagingSuccess).toBeTruthy(); + expect(pagingError).toBeUndefined(); + }); + + if (testType === "Unit") { + const firstResponse = pagingResponses?.[0]; + + it(`${testName} First paging response payload should match schema`, () => { + expect(firstResponse?.payload).toEqual(unitTestPayload); + }); + } + + it(`${testName} First paging response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + + const iteratorPayloads: TResponsePayload[] = []; + const maxPagesCount = 1; + for await (const response of query.pages({ maxPagesCount })) { + iteratorPayloads.push(response?.payload); + } + + it(`${testName} Iterator responses should be equal to paging responses`, () => { + expect(iteratorPayloads.length).toEqual(maxPagesCount); + }); + + if (testType === "Unit") { + const firstIteratorResponse = iteratorPayloads?.[0]; + + it(`${testName} First iterator response payload should match schema`, () => { + expect(firstIteratorResponse).toEqual(unitTestPayload); + }); + } + } + } +} diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 261c1977..a9bee047 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,13 +1,6 @@ -import type { ContinuationHeaderName, Header, JsonValue, PagingQuery, Query } from "@kontent-ai/core-sdk"; -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import type { ContinuationHeaderName, Header, PagingQuery, Query } from "@kontent-ai/core-sdk"; import chalk from "chalk"; import { config } from "dotenv"; -import { expect, it } from "vitest"; -import type { ZodType } from "zod"; -import type { DeliveryClient, DeliveryClientTypes, DeliveryEndpoints } from "../../lib/models/core.models.js"; -import { createDeliveryClient } from "../../lib/public_api.js"; -import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; -import { getIntegrationTestConfig } from "../integration-tests.config.js"; // needed to load .env environment to current process when run via package.json script config(); @@ -35,106 +28,4 @@ export function isPagingQuery(query: Query | PagingQu return "toPromise" in query && "toAllPromise" in query && "pages" in query; } -export async function runQueryIntegrationTestsAsync({ - endpoint, - unitTestPayload, - selectQuery, - expectedSchema, -}: { - readonly expectedSchema: ZodType; - readonly endpoint: DeliveryEndpoints; - readonly unitTestPayload: TResponsePayload; - readonly selectQuery: (client: DeliveryClient) => Query; -}): Promise { - const integrationTextConfig = getIntegrationTestConfig(); - - const clients: readonly DeliveryClient[] = [ - createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: unitTestPayload, - statusCode: 200, - }), - }), - createDeliveryClient(integrationTextConfig.env.id).withUnknownSchema().publicApi().create({ - baseUrl: integrationTextConfig.env.deliveryBaseUrl, - }), - ]; - - for (const client of clients) { - const isIntegrationTest = client.config.environmentId === integrationTextConfig.env.id; - const testType = isIntegrationTest ? "Integration" : "Unit"; - const testName = `${testType}[${endpoint}]: `; - - const query = selectQuery(client); - const { response, success, error } = await query.toPromise(); - - it(`${testName} Expect url to be correct`, () => { - expect(query.toUrl()).toBe( - `${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`, - ); - }); - - it(`${testName} Response should be successful`, () => { - expect(success).toBeTruthy(); - expect(error).toBeUndefined(); - }); - - it(`${testName} Response payload should match schema`, async () => { - const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); - }); - - if (testType === "Unit") { - it(`${testName} Payload should be equal to unit test payload`, () => { - expect(response?.payload).toEqual(unitTestPayload); - }); - } - - if (isPagingQuery(query)) { - const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); - - it(`${testName} Response should be successful`, () => { - expect(pagingSuccess).toBeTruthy(); - expect(pagingError).toBeUndefined(); - }); - - if (testType === "Unit") { - const firstResponse = pagingResponses?.[0]; - - it(`${testName} First paging response payload should match schema`, () => { - expect(firstResponse?.payload).toEqual(unitTestPayload); - }); - } - - it(`${testName} First paging response payload should match schema`, async () => { - const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); - }); - - const iteratorPayloads: TResponsePayload[] = []; - const maxPagesCount = 1; - for await (const response of query.pages({ maxPagesCount })) { - iteratorPayloads.push(response?.payload); - } - - it(`${testName} Iterator responses should be equal to paging responses`, () => { - expect(iteratorPayloads.length).toEqual(maxPagesCount); - }); - - if (testType === "Unit") { - const firstIteratorResponse = iteratorPayloads?.[0]; - - it(`${testName} First iterator response payload should match schema`, () => { - expect(firstIteratorResponse).toEqual(unitTestPayload); - }); - } - } - } -} - export const unitEnvironmentId = "xyz"; From 011324cc9930abe48daf2755f2717dc85e2b0590 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 14:23:40 +0100 Subject: [PATCH 027/221] Refactors query test helper --- .../queries/list-languages-query.spec.ts | 4 +- .../queries/list-taxonomies-query.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 271 +++++++++++++----- 3 files changed, 205 insertions(+), 74 deletions(-) diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/list-languages-query.spec.ts index 4ad927fb..ea4d3eb3 100644 --- a/tests/integration/queries/list-languages-query.spec.ts +++ b/tests/integration/queries/list-languages-query.spec.ts @@ -1,10 +1,10 @@ import { describe } from "vitest"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { runQueryIntegrationTestsAsync } from "../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../utils/integration-test.utils.js"; describe("List languages query", async () => { - await runQueryIntegrationTestsAsync>({ + await runQueryTestsAsync>({ endpoint: "languages", unitTestPayload: { languages: [ diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/list-taxonomies-query.spec.ts index 4083ca11..b50a4022 100644 --- a/tests/integration/queries/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/list-taxonomies-query.spec.ts @@ -1,10 +1,10 @@ import { describe } from "vitest"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../lib/queries/taxonomies/taxonomy.models.js"; -import { runQueryIntegrationTestsAsync } from "../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../utils/integration-test.utils.js"; describe("List taxonomies query", async () => { - await runQueryIntegrationTestsAsync>({ + await runQueryTestsAsync>({ endpoint: "taxonomies", unitTestPayload: { taxonomies: [ diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index aaaf3213..49abf960 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,4 @@ -import type { JsonValue, Query } from "@kontent-ai/core-sdk"; +import type { JsonValue, PagingQuery, Query } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; @@ -8,7 +8,9 @@ import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../integration-tests.config.js"; import { isPagingQuery, unitEnvironmentId } from "./test.utils.js"; -export async function runQueryIntegrationTestsAsync({ +type TestType = "Integration" | "Unit"; + +export async function runQueryTestsAsync({ endpoint, unitTestPayload, selectQuery, @@ -19,9 +21,58 @@ export async function runQueryIntegrationTestsAsync) => Query; }): Promise { - const integrationTextConfig = getIntegrationTestConfig(); + const integrationTestConfig = getIntegrationTestConfig(); + const clients = createTestClients({ + unitTestPayload, + environmentId: integrationTestConfig.env.id, + deliveryBaseUrl: integrationTestConfig.env.deliveryBaseUrl, + }); + + for (const client of clients) { + const { testType, testName } = createTestMetadata({ + clientEnvironmentId: client.config.environmentId, + integrationEnvironmentId: integrationTestConfig.env.id, + endpoint, + }); - const clients: readonly DeliveryClient[] = [ + const { query, response, success, error } = await executeDefaultQueryAsync({ client, selectQuery }); + + registerBaseTests({ + testName, + endpoint, + client, + query, + response, + success, + error, + expectedSchema, + unitTestPayload, + testType, + }); + + if (isPagingQuery(query)) { + registerPagingTests({ + testName, + testType, + unitTestPayload, + expectedSchema, + response, + ...(await executePagingQueryAsync({ query })), + }); + } + } +} + +function createTestClients({ + unitTestPayload, + environmentId, + deliveryBaseUrl, +}: { + readonly unitTestPayload: TResponsePayload; + readonly environmentId: string; + readonly deliveryBaseUrl: string | undefined; +}): readonly DeliveryClient[] { + return [ createDeliveryClient(unitEnvironmentId) .withUnknownSchema() .publicApi() @@ -31,81 +82,161 @@ export async function runQueryIntegrationTestsAsync { - expect(query.toUrl()).toBe( - `${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`, - ); +function registerBaseTests({ + testName, + endpoint, + client, + query, + response, + success, + error, + expectedSchema, + unitTestPayload, + testType, +}: { + readonly testName: string; + readonly endpoint: DeliveryEndpoints; + readonly client: DeliveryClient; + readonly query: Query; + readonly response: { readonly payload: TResponsePayload } | undefined; + readonly success: boolean; + readonly error: unknown; + readonly expectedSchema: ZodType; + readonly unitTestPayload: TResponsePayload; + readonly testType: TestType; +}): void { + it(`${testName} Expect url to be correct`, () => { + expect(query.toUrl()).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); + }); + it(`${testName} Response should be successful`, () => { + expect(success).toBeTruthy(); + expect(error).toBeUndefined(); + }); + it(`${testName} Response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + if (testType === "Unit") { + it(`${testName} Payload should be equal to unit test payload`, () => { + expect(response?.payload).toEqual(unitTestPayload); }); + } +} - it(`${testName} Response should be successful`, () => { - expect(success).toBeTruthy(); - expect(error).toBeUndefined(); +function registerPagingTests({ + testName, + testType, + unitTestPayload, + expectedSchema, + response, + pagingResponses, + pagingSuccess, + pagingError, + iteratorPayloads, + maxPagesCount, +}: { + readonly testName: string; + readonly testType: TestType; + readonly unitTestPayload: TResponsePayload; + readonly expectedSchema: ZodType; + readonly response: { readonly payload: TResponsePayload } | undefined; + readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; + readonly pagingSuccess: boolean; + readonly pagingError: unknown; + readonly iteratorPayloads: readonly TResponsePayload[]; + readonly maxPagesCount: number; +}): void { + it(`${testName} Response should be successful`, () => { + expect(pagingSuccess).toBeTruthy(); + expect(pagingError).toBeUndefined(); + }); + if (testType === "Unit") { + const firstResponse = pagingResponses?.[0]; + it(`${testName} First paging response payload should match schema`, () => { + expect(firstResponse?.payload).toEqual(unitTestPayload); }); - - it(`${testName} Response payload should match schema`, async () => { - const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); + } + it(`${testName} First paging response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); + expect(parseSuccess).toBeTruthy(); + expect(parseError).toBeUndefined(); + }); + it(`${testName} Iterator responses should be equal to paging responses`, () => { + expect(iteratorPayloads.length).toEqual(maxPagesCount); + }); + if (testType === "Unit") { + const firstIteratorResponse = iteratorPayloads?.[0]; + it(`${testName} First iterator response payload should match schema`, () => { + expect(firstIteratorResponse).toEqual(unitTestPayload); }); + } +} - if (testType === "Unit") { - it(`${testName} Payload should be equal to unit test payload`, () => { - expect(response?.payload).toEqual(unitTestPayload); - }); - } - - if (isPagingQuery(query)) { - const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); - - it(`${testName} Response should be successful`, () => { - expect(pagingSuccess).toBeTruthy(); - expect(pagingError).toBeUndefined(); - }); - - if (testType === "Unit") { - const firstResponse = pagingResponses?.[0]; - - it(`${testName} First paging response payload should match schema`, () => { - expect(firstResponse?.payload).toEqual(unitTestPayload); - }); - } - - it(`${testName} First paging response payload should match schema`, async () => { - const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); - expect(parseError).toBeUndefined(); - }); - - const iteratorPayloads: TResponsePayload[] = []; - const maxPagesCount = 1; - for await (const response of query.pages({ maxPagesCount })) { - iteratorPayloads.push(response?.payload); - } - - it(`${testName} Iterator responses should be equal to paging responses`, () => { - expect(iteratorPayloads.length).toEqual(maxPagesCount); - }); - - if (testType === "Unit") { - const firstIteratorResponse = iteratorPayloads?.[0]; +async function executeDefaultQueryAsync({ + client, + selectQuery, +}: { + readonly client: DeliveryClient; + readonly selectQuery: (client: DeliveryClient) => Query; +}): Promise<{ + readonly query: Query; + readonly response: { readonly payload: TResponsePayload } | undefined; + readonly success: boolean; + readonly error: unknown; +}> { + const query = selectQuery(client); + const { response, success, error } = await query.toPromise(); + return { query, response, success, error }; +} - it(`${testName} First iterator response payload should match schema`, () => { - expect(firstIteratorResponse).toEqual(unitTestPayload); - }); - } - } +async function executePagingQueryAsync({ + query, +}: { + readonly query: PagingQuery; +}): Promise<{ + readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; + readonly pagingSuccess: boolean; + readonly pagingError: unknown; + readonly iteratorPayloads: readonly TResponsePayload[]; + readonly maxPagesCount: number; +}> { + const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); + const iteratorPayloads: TResponsePayload[] = []; + const maxPagesCount = 1; + for await (const pageResponse of query.pages({ maxPagesCount })) { + iteratorPayloads.push(pageResponse?.payload); } + return { + pagingResponses, + pagingSuccess, + pagingError, + iteratorPayloads, + maxPagesCount, + }; } From 86cc9e8375d275516bafe3942d3e80fa48dd89af Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 14:36:41 +0100 Subject: [PATCH 028/221] Simplifies creation of paging query in delivery SDK --- lib/queries/delivery-queries.ts | 32 +++++++++++++++++++ lib/queries/languages/list-languages-query.ts | 20 +++--------- .../taxonomies/list-taxonomies-query.ts | 20 +++--------- 3 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 lib/queries/delivery-queries.ts diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts new file mode 100644 index 00000000..3b7ea158 --- /dev/null +++ b/lib/queries/delivery-queries.ts @@ -0,0 +1,32 @@ +import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; +import type { ZodType } from "zod"; +import { deliverySdkInfo } from "../delivery-sdk-info.js"; +import type { DeliveryClientConfig, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; +import { getNextPageByUrl } from "../utils/paging.utils.js"; +import { getDeliveryUrl } from "../utils/url.utils.js"; + +export function createDeliveryPagingQuery({ + config, + zodSchema, + endpoint, +}: { + readonly config: DeliveryClientConfig; + readonly zodSchema: ZodType; + readonly endpoint: DeliveryEndpoints; +}): PagingQuery { + return createPagingQuery({ + config, + zodSchema: zodSchema, + sdkInfo: deliverySdkInfo, + authorizationApiKey: config.deliveryApiKey, + mapMetadata: () => { + return null; + }, + getNextPageData: getNextPageByUrl(), + request: { + url: getDeliveryUrl({ path: endpoint, ...config }), + body: null, + method: "GET", + }, + }); +} diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 7856a7fd..a3e0c230 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,8 +1,6 @@ -import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; -import { deliverySdkInfo } from "../../delivery-sdk-info.js"; +import type { PagingQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; -import { getNextPageByUrl } from "../../utils/paging.utils.js"; -import { getDeliveryUrl } from "../../utils/url.utils.js"; +import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = PagingQuery< @@ -14,19 +12,9 @@ export function listLanguagesQuery, ): ListLanguagesQuery { - return createPagingQuery, null, null>({ + return createDeliveryPagingQuery({ config, zodSchema: listLanguagesPayload(schema), - sdkInfo: deliverySdkInfo, - authorizationApiKey: config.deliveryApiKey, - mapMetadata: () => { - return null; - }, - getNextPageData: getNextPageByUrl(), - request: { - url: getDeliveryUrl({ path: "languages", ...config }), - body: null, - method: "GET", - }, + endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 82099676..e563dc50 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,8 +1,6 @@ -import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; -import { deliverySdkInfo } from "../../delivery-sdk-info.js"; +import type { PagingQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; -import { getNextPageByUrl } from "../../utils/paging.utils.js"; -import { getDeliveryUrl } from "../../utils/url.utils.js"; +import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = PagingQuery< @@ -14,19 +12,9 @@ export function listTaxonomiesQuery, ): ListTaxonomiesQuery { - return createPagingQuery, null, null>({ + return createDeliveryPagingQuery({ config, zodSchema: listTaxonomiesPayload(schema), - sdkInfo: deliverySdkInfo, - authorizationApiKey: config.deliveryApiKey, - mapMetadata: () => { - return null; - }, - getNextPageData: getNextPageByUrl(), - request: { - url: getDeliveryUrl({ path: "taxonomies", ...config }), - body: null, - method: "GET", - }, + endpoint: "taxonomies", }); } From 4df616ebf95d696853af51651683e2c43779e58b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 26 Feb 2026 15:42:36 +0100 Subject: [PATCH 029/221] Prepares content type listing query (without support for elements), use strict uuid zod schema --- lib/client/delivery-client.ts | 2 + lib/models/core.models.ts | 10 ++ .../content-types/content-type.models.ts | 36 +++++++ .../content-types/list-content-types-query.ts | 20 ++++ lib/queries/languages/language.models.ts | 4 +- lib/queries/taxonomies/taxonomy.models.ts | 4 +- .../queries/list-content-types-query.spec.ts | 97 +++++++++++++++++++ ...schema-validation-with-extra-props.spec.ts | 4 +- ...hema-validation-with-missing-props.spec.ts | 4 +- .../unit/validation/schema-validation.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 8 +- tests/utils/test.utils.ts | 5 + 12 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 lib/queries/content-types/content-type.models.ts create mode 100644 lib/queries/content-types/list-content-types-query.ts create mode 100644 tests/integration/queries/list-content-types-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index e005a3e6..2ddfba63 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -5,6 +5,7 @@ import type { DeliveryClientSchema, DeliveryClientTypes, } from "../models/core.models.js"; +import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -110,5 +111,6 @@ function buildDeliveryClient listLanguagesQuery(config, schema), listTaxonomies: () => listTaxonomiesQuery(config, schema), + listContentTypes: () => listContentTypes(config, schema), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 619c48cd..1bbcd484 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,5 +1,6 @@ import type { AdapterResponse, SdkConfig } from "@kontent-ai/core-sdk"; import z from "zod"; +import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -69,6 +70,11 @@ export type DeliveryClient; + + /** + * List content types. + */ + listContentTypes(): ListContentTypesQuery; }; export type CreateDeliveryClientOptions = Omit; @@ -98,3 +104,7 @@ export type DeliveryEndpoints = | "types" | `types/${string}` | `types/${string}/elements/${string}`; + +export const nilUuid = "00000000-0000-0000-0000-000000000000"; + +export const kontentUuidSchema = z.union([z.uuid({ version: "v4" }), z.literal(nilUuid)]); diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts new file mode 100644 index 00000000..ed475ca8 --- /dev/null +++ b/lib/queries/content-types/content-type.models.ts @@ -0,0 +1,36 @@ +import { z } from "zod"; +import { type DeliveryClientSchema, type DeliveryClientTypes, kontentUuidSchema, paginationSchema } from "../../models/core.models.js"; +import { getCodenameSchema } from "../../utils/type.utils.js"; + +export const contentTypePayload = (schema: DeliveryClientSchema) => + z + .object({ + system: z + .object({ + id: kontentUuidSchema, + name: z.string(), + codename: getCodenameSchema(schema.taxonomyCodenames), + last_modified: z.iso.datetime(), + }) + .readonly(), + elements: z.any(), + }) + .readonly(); + +export const listContentTypesPayload = ( + schema: DeliveryClientSchema, +) => + z + .object({ + types: z.array(contentTypePayload(schema)).readonly(), + ...paginationSchema.shape, + }) + .readonly(); + +export type ListContentTypesPayload = z.infer< + ReturnType> +>; + +export type ContentTypePayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts new file mode 100644 index 00000000..0e226caa --- /dev/null +++ b/lib/queries/content-types/list-content-types-query.ts @@ -0,0 +1,20 @@ +import type { PagingQuery } from "@kontent-ai/core-sdk"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; + +export type ListContentTypesQuery = PagingQuery< + ListContentTypesPayload, + null +>; + +export function listContentTypes( + config: DeliveryClientConfig, + schema: DeliveryClientSchema, +): ListContentTypesQuery { + return createDeliveryPagingQuery({ + config, + zodSchema: listContentTypesPayload(schema), + endpoint: "types", + }); +} diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index a553d3de..1f8fb273 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientSchema, type DeliveryClientTypes, kontentUuidSchema, paginationSchema } from "../../models/core.models.js"; import { getCodenameSchema } from "../../utils/type.utils.js"; export const languagePayload = (schema: DeliveryClientSchema) => @@ -7,7 +7,7 @@ export const languagePayload = (schema: DeliveryClientSchema) => @@ -16,7 +16,7 @@ export const taxonomyPayload = { + await runQueryTestsAsync>({ + endpoint: "types", + unitTestPayload: { + types: [ + { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "text", + name: "Title", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + }, + description: { + type: "rich_text", + name: "Description", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + options: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + }, + cover: { + type: "asset", + name: "Cover", + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + }, + url: { + type: "url_slug", + name: "Url", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + }, + cast: { + type: "modular_content", + name: "Cast", + }, + }, + }, + { + system: { + id: "068c2ea7-144f-4472-ac0a-70e6f53034bf", + name: "Stars", + codename: "stars", + last_modified: "2026-02-26T14:02:20.3307783Z", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + }, + lastname: { + type: "text", + name: "Lastname", + }, + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 2, + next_page: "", + }, + }, + selectQuery: (client) => client.listContentTypes(), + expectedSchema: listContentTypesPayload({}), + }); +}); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index da7eedfd..f364498f 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -3,14 +3,14 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { unitEnvironmentId } from "../../utils/test.utils.js"; +import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with extra props", () => { const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { languages: [ { system: { - id: "1", + id: getFakeUuid(), codename: "de-DE", name: "German", }, diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index a94bc428..11d03213 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -3,14 +3,14 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { unitEnvironmentId } from "../../utils/test.utils.js"; +import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with missing props", () => { const mockPayload: Omit, "pagination"> = { languages: [ { system: { - id: "1", + id: getFakeUuid(), codename: "de-DE", name: "German", }, diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 53859ac7..b67da07f 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -3,7 +3,7 @@ import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { unitEnvironmentId } from "../../utils/test.utils.js"; +import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; type TestDeliveryClientTypes = DeliveryClientTypes & { readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; @@ -14,7 +14,7 @@ describe("Schema validation", () => { languages: [ { system: { - id: "1", + id: getFakeUuid(), codename: "de-DE", name: "German", }, diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 49abf960..af39ac81 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -134,13 +134,13 @@ function registerBaseTests({ expect(query.toUrl()).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); }); it(`${testName} Response should be successful`, () => { - expect(success).toBeTruthy(); expect(error).toBeUndefined(); + expect(success).toBeTruthy(); }); it(`${testName} Response payload should match schema`, async () => { const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); + expect(parseSuccess).toBeTruthy(); }); if (testType === "Unit") { it(`${testName} Payload should be equal to unit test payload`, () => { @@ -173,8 +173,8 @@ function registerPagingTests({ readonly maxPagesCount: number; }): void { it(`${testName} Response should be successful`, () => { - expect(pagingSuccess).toBeTruthy(); expect(pagingError).toBeUndefined(); + expect(pagingSuccess).toBeTruthy(); }); if (testType === "Unit") { const firstResponse = pagingResponses?.[0]; @@ -184,8 +184,8 @@ function registerPagingTests({ } it(`${testName} First paging response payload should match schema`, async () => { const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); - expect(parseSuccess).toBeTruthy(); expect(parseError).toBeUndefined(); + expect(parseSuccess).toBeTruthy(); }); it(`${testName} Iterator responses should be equal to paging responses`, () => { expect(iteratorPayloads.length).toEqual(maxPagesCount); diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index a9bee047..effab2d1 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,6 +1,7 @@ import type { ContinuationHeaderName, Header, PagingQuery, Query } from "@kontent-ai/core-sdk"; import chalk from "chalk"; import { config } from "dotenv"; +import { nilUuid } from "../../lib/models/core.models.js"; // needed to load .env environment to current process when run via package.json script config(); @@ -29,3 +30,7 @@ export function isPagingQuery(query: Query | PagingQu } export const unitEnvironmentId = "xyz"; + +export function getFakeUuid(): string { + return nilUuid; +} From 40e17ff16e531e88422e2760326e413046bf8520 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 27 Feb 2026 11:44:30 +0100 Subject: [PATCH 030/221] Moves shared / common to Core & use it --- lib/models/core.models.ts | 4 ---- lib/public_api.ts | 10 +++++++++ .../content-types/content-type.models.ts | 4 ++-- lib/queries/languages/language.models.ts | 4 ++-- lib/queries/taxonomies/taxonomy.models.ts | 4 ++-- lib/utils/type.utils.ts | 5 ----- lib/utils/url.utils.ts | 17 +------------- package-lock.json | 16 +++++++------- package.json | 4 ++-- tests/integration-tests.config.ts | 4 ++-- tests/utils/integration-test.utils.ts | 4 ++-- tests/utils/test.utils.ts | 22 +------------------ 12 files changed, 32 insertions(+), 66 deletions(-) delete mode 100644 lib/utils/type.utils.ts diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 1bbcd484..faeb1775 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -104,7 +104,3 @@ export type DeliveryEndpoints = | "types" | `types/${string}` | `types/${string}/elements/${string}`; - -export const nilUuid = "00000000-0000-0000-0000-000000000000"; - -export const kontentUuidSchema = z.union([z.uuid({ version: "v4" }), z.literal(nilUuid)]); diff --git a/lib/public_api.ts b/lib/public_api.ts index d97ec30e..200c5583 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -11,7 +11,17 @@ export type { DeliveryResponseMeta, } from "./models/core.models.js"; /* +Content Types +*/ +export { type ContentTypePayload, ListContentTypesPayload } from "./queries/content-types/content-type.models.js"; +export type { ListContentTypesQuery } from "./queries/content-types/list-content-types-query.js"; +/* Languages */ export { type LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; +/* +Taxonomies +*/ +export type { ListTaxonomiesQuery } from "./queries/taxonomies/list-taxonomies-query.js"; +export { ListTaxonomiesPayload, type TaxonomyPayload } from "./queries/taxonomies/taxonomy.models.js"; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index ed475ca8..4324e168 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,6 +1,6 @@ +import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, kontentUuidSchema, paginationSchema } from "../../models/core.models.js"; -import { getCodenameSchema } from "../../utils/type.utils.js"; +import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; export const contentTypePayload = (schema: DeliveryClientSchema) => z diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 1f8fb273..bee22627 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,6 +1,6 @@ +import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, kontentUuidSchema, paginationSchema } from "../../models/core.models.js"; -import { getCodenameSchema } from "../../utils/type.utils.js"; +import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; export const languagePayload = (schema: DeliveryClientSchema) => z diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index f7e6beeb..5ea8b713 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,6 +1,6 @@ +import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, kontentUuidSchema, paginationSchema } from "../../models/core.models.js"; -import { getCodenameSchema } from "../../utils/type.utils.js"; +import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; export const taxonomyTermPayload = (schema: DeliveryClientSchema) => z.object({ diff --git a/lib/utils/type.utils.ts b/lib/utils/type.utils.ts deleted file mode 100644 index 7f65da64..00000000 --- a/lib/utils/type.utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { z } from "zod"; - -export function getCodenameSchema(codenames?: TCodenames): z.ZodType { - return codenames && codenames.length > 0 ? z.enum(codenames) : z.string(); -} diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 58d27c4d..391c3c39 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,3 +1,4 @@ +import { getEndpointUrl } from "@kontent-ai/core-sdk"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; export function getDeliveryUrl({ @@ -13,18 +14,6 @@ export function getDeliveryUrl({ }); } -export function getEndpointUrl({ - environmentId, - path, - baseUrl, -}: { - readonly environmentId: string; - readonly path: string; - readonly baseUrl: string; -}): string { - return removeDuplicateSlashes(`${baseUrl}/${environmentId}/${path}`); -} - function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { if (apiMode === "preview") { return "https://preview-deliver.kontent.ai"; @@ -32,7 +21,3 @@ function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { return "https://deliver.kontent.ai"; } - -function removeDuplicateSlashes(path: string): string { - return path.replace(/\/+/g, "/"); -} diff --git a/package-lock.json b/package-lock.json index 0d363f51..636930be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@biomejs/biome": "2.4.4", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "@types/node": "25.3.0", + "@types/node": "25.3.2", "chalk": "5.6.2", "dotenv": "17.3.1", "eslint": "10.0.2", @@ -24,7 +24,7 @@ "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.13", + "@kontent-ai/core-sdk": "^12.0.0-preview.15", "zod": "^4.3.6" } }, @@ -907,9 +907,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.13.tgz", - "integrity": "sha512-sdWzKJZx5Crz6ovL9p+jIDSX4rRRObqcNHzo8mIIbvuhS8WlijddNGiqrsCrcJFffAyU6kXzHoyuCvXZaPdkrQ==", + "version": "12.0.0-preview.15", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.15.tgz", + "integrity": "sha512-MD4AxOOdHcAK5f24Fnm2Ji780KaKMmzzGF4HySHVCPXQJ2UVzL+qn/LGqa/MJJWNWUYYFRkN/sePztiojgNMVQ==", "license": "MIT", "peer": true, "engines": { @@ -1605,9 +1605,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "version": "25.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", + "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index 800f2e9a..d3c2d894 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.13", + "@kontent-ai/core-sdk": "^12.0.0-preview.15", "zod": "^4.3.6" }, "devDependencies": { @@ -50,7 +50,7 @@ "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.0.2", "@biomejs/biome": "2.4.4", - "@types/node": "25.3.0", + "@types/node": "25.3.2", "chalk": "5.6.2", "typescript": "5.9.3", "vitest": "4.0.18", diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts index 75f73700..0110b340 100644 --- a/tests/integration-tests.config.ts +++ b/tests/integration-tests.config.ts @@ -1,5 +1,5 @@ -import { getEndpointUrl } from "../lib/utils/url.utils.js"; -import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "./utils/test.utils.js"; +import { getEndpointUrl } from "@kontent-ai/core-sdk"; +import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "@kontent-ai/core-sdk/devkit"; export function getIntegrationTestConfig() { const integrationEnv = { diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index af39ac81..c24a4e3d 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,4 @@ -import type { JsonValue, PagingQuery, Query } from "@kontent-ai/core-sdk"; +import { isPagingQuery, type JsonValue, type PagingQuery, type Query } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; @@ -6,7 +6,7 @@ import type { DeliveryClient, DeliveryClientTypes, DeliveryEndpoints } from "../ import { createDeliveryClient } from "../../lib/public_api.js"; import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../integration-tests.config.js"; -import { isPagingQuery, unitEnvironmentId } from "./test.utils.js"; +import { unitEnvironmentId } from "./test.utils.js"; type TestType = "Integration" | "Unit"; diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index effab2d1..6616f692 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,34 +1,14 @@ -import type { ContinuationHeaderName, Header, PagingQuery, Query } from "@kontent-ai/core-sdk"; -import chalk from "chalk"; +import { type ContinuationHeaderName, type Header, nilUuid } from "@kontent-ai/core-sdk"; import { config } from "dotenv"; -import { nilUuid } from "../../lib/models/core.models.js"; // needed to load .env environment to current process when run via package.json script 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]; -} - export const fakeXContinuationTokenHeader: Header = { name: "X-Continuation" satisfies ContinuationHeaderName, value: "x", }; -export function isPagingQuery(query: Query | PagingQuery): query is PagingQuery { - return "toPromise" in query && "toAllPromise" in query && "pages" in query; -} - export const unitEnvironmentId = "xyz"; export function getFakeUuid(): string { From cc869b4722e9fb827ed874fb884f303ef6899bf9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 13 Mar 2026 10:51:46 +0100 Subject: [PATCH 031/221] Upgrades deps including TS@6 and core-sdk-js --- .npmignore | 6 +- eslint.config.mjs | 4 +- lib/client/delivery-client.ts | 2 +- lib/delivery-sdk-info.ts | 5 +- lib/models/core.models.ts | 4 +- .../content-types/list-content-types-query.ts | 6 +- lib/queries/delivery-queries.ts | 10 +- lib/queries/languages/list-languages-query.ts | 6 +- .../taxonomies/list-taxonomies-query.ts | 6 +- lib/sdk-info.ts | 4 - package-lock.json | 1691 ++++++++++------- package.json | 16 +- scripts/update-version.ts | 2 +- tests/integration-tests.config.ts | 14 + tests/types/delivery-client-types.test.ts | 6 +- .../unit/api-mode/custom-base-url-api.spec.ts | 28 + .../deliver-api.spec.ts} | 8 +- .../{headers => api-mode}/preview-api.spec.ts | 8 +- .../{headers => api-mode}/secure-api.spec.ts | 8 +- tests/unit/errors/custom-errors.spec.ts | 10 +- tests/unit/headers/headers.spec.ts | 6 +- ...schema-validation-with-extra-props.spec.ts | 2 +- ...hema-validation-with-missing-props.spec.ts | 2 +- .../unit/validation/schema-validation.spec.ts | 8 +- .../validation/validation-properties.spec.ts | 7 +- tests/utils/integration-test.utils.ts | 35 +- tests/utils/test.utils.ts | 4 - tsconfig.build.json | 3 +- tsconfig.json | 25 +- vitest-integration.config.ts | 3 - vitest-unit.config.ts | 3 - 31 files changed, 1149 insertions(+), 793 deletions(-) delete mode 100644 lib/sdk-info.ts create mode 100644 tests/unit/api-mode/custom-base-url-api.spec.ts rename tests/unit/{headers/public-deliver-api.spec.ts => api-mode/deliver-api.spec.ts} (86%) rename tests/unit/{headers => api-mode}/preview-api.spec.ts (86%) rename tests/unit/{headers => api-mode}/secure-api.spec.ts (86%) diff --git a/.npmignore b/.npmignore index 8e61670b..587b685a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,10 +1,6 @@ # Ignore everything * - -# But descend into directories - -# Recursively allow files under subtree -!/lib/** +# And allow following !/dist/** !package.json !.npmignore diff --git a/eslint.config.mjs b/eslint.config.mjs index 72c60293..d79f27cf 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,8 +3,8 @@ import { defineConfig } from "eslint/config"; export default defineConfig( { - // Global ignores (applies regardless of which configs/plugins match files) - ignores: ["dist/**/*", "_legacy/**/*", "coverage/**/*"], + // Global ignores + ignores: ["dist/**/*", "_legacy/**/*"], }, { extends: [kontentAiConfig], diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 2ddfba63..8f9a344a 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -71,7 +71,7 @@ export function createDeliveryClient(environmentId: string): DeliverySchemaBuild return getApiBuilder(environmentId, schema); }, withUnknownSchema: () => { - return getApiBuilder(environmentId, { languageCodenames: undefined }); + return getApiBuilder(environmentId, { languageCodenames: [] }); }, }; } diff --git a/lib/delivery-sdk-info.ts b/lib/delivery-sdk-info.ts index 737c0e05..558d21ff 100644 --- a/lib/delivery-sdk-info.ts +++ b/lib/delivery-sdk-info.ts @@ -1,8 +1,7 @@ import type { SDKInfo } from "@kontent-ai/core-sdk"; -import { sdkInfo } from "./sdk-info.js"; export const deliverySdkInfo: SDKInfo = { - name: sdkInfo.name, - version: sdkInfo.version, + version: "{{version}}", + name: "@kontent-ai/delivery-sdk", host: "npmjs.com", }; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index faeb1775..e2ea72f6 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,4 @@ -import type { AdapterResponse, SdkConfig } from "@kontent-ai/core-sdk"; +import type { AdapterResponse, JsonValue, SdkConfig } from "@kontent-ai/core-sdk"; import z from "zod"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; @@ -20,7 +20,7 @@ export type DeliveryClientSchema = Pick & { +export type DeliveryResponseMeta = Pick, "status" | "responseHeaders"> & { readonly continuationToken?: string; } & TExtraMetadata; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 0e226caa..a4bf2c99 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,11 +1,11 @@ -import type { PagingQuery } from "@kontent-ai/core-sdk"; +import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; -export type ListContentTypesQuery = PagingQuery< +export type ListContentTypesQuery = PagedFetchQuery< ListContentTypesPayload, - null + unknown >; export function listContentTypes( diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 3b7ea158..f9e03132 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,4 +1,4 @@ -import { createPagingQuery, type PagingQuery } from "@kontent-ai/core-sdk"; +import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; @@ -13,20 +13,18 @@ export function createDeliveryPagingQuery({ readonly config: DeliveryClientConfig; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; -}): PagingQuery { - return createPagingQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ config, zodSchema: zodSchema, sdkInfo: deliverySdkInfo, - authorizationApiKey: config.deliveryApiKey, mapMetadata: () => { return null; }, getNextPageData: getNextPageByUrl(), request: { url: getDeliveryUrl({ path: endpoint, ...config }), - body: null, - method: "GET", + authorizationApiKey: config.deliveryApiKey, }, }); } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index a3e0c230..97552957 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,11 +1,11 @@ -import type { PagingQuery } from "@kontent-ai/core-sdk"; +import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = PagingQuery< +export type ListLanguagesQuery = PagedFetchQuery< ListLanguagesPayload, - null + unknown >; export function listLanguagesQuery( diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index e563dc50..c59f941c 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,11 +1,11 @@ -import type { PagingQuery } from "@kontent-ai/core-sdk"; +import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; -export type ListTaxonomiesQuery = PagingQuery< +export type ListTaxonomiesQuery = PagedFetchQuery< ListTaxonomiesPayload, - null + unknown >; export function listTaxonomiesQuery( diff --git a/lib/sdk-info.ts b/lib/sdk-info.ts deleted file mode 100644 index e4899988..00000000 --- a/lib/sdk-info.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const sdkInfo = { - version: "{{version}}", - name: "@kontent-ai/delivery-sdk", -}; diff --git a/package-lock.json b/package-lock.json index 636930be..e0cf420f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,32 +9,29 @@ "version": "17.0.0-preview.0", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.4.4", + "@biomejs/biome": "2.4.6", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "@types/node": "25.3.2", - "chalk": "5.6.2", - "dotenv": "17.3.1", - "eslint": "10.0.2", + "@types/node": "25.5.0", + "eslint": "10.0.3", "tsx": "4.21.0", - "typescript": "5.9.3", - "vitest": "4.0.18" + "typescript": "6.0.1-rc", + "vitest": "4.1.0" }, "engines": { "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.15", - "zod": "^4.3.6" + "@kontent-ai/core-sdk": "^12.0.0-preview.16", + "zod": "^4" } }, "node_modules/@biomejs/biome": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.4.tgz", - "integrity": "sha512-tigwWS5KfJf0cABVd52NVaXyAVv4qpUXOWJ1rxFL8xF1RVoeS2q/LK+FHgYoKMclJCuRoCWAPy1IXaN9/mS61Q==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.6.tgz", + "integrity": "sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ==", "dev": true, "license": "MIT OR Apache-2.0", - "peer": true, "bin": { "biome": "bin/biome" }, @@ -46,20 +43,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.4", - "@biomejs/cli-darwin-x64": "2.4.4", - "@biomejs/cli-linux-arm64": "2.4.4", - "@biomejs/cli-linux-arm64-musl": "2.4.4", - "@biomejs/cli-linux-x64": "2.4.4", - "@biomejs/cli-linux-x64-musl": "2.4.4", - "@biomejs/cli-win32-arm64": "2.4.4", - "@biomejs/cli-win32-x64": "2.4.4" + "@biomejs/cli-darwin-arm64": "2.4.6", + "@biomejs/cli-darwin-x64": "2.4.6", + "@biomejs/cli-linux-arm64": "2.4.6", + "@biomejs/cli-linux-arm64-musl": "2.4.6", + "@biomejs/cli-linux-x64": "2.4.6", + "@biomejs/cli-linux-x64-musl": "2.4.6", + "@biomejs/cli-win32-arm64": "2.4.6", + "@biomejs/cli-win32-x64": "2.4.6" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.4.tgz", - "integrity": "sha512-jZ+Xc6qvD6tTH5jM6eKX44dcbyNqJHssfl2nnwT6vma6B1sj7ZLTGIk6N5QwVBs5xGN52r3trk5fgd3sQ9We9A==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.6.tgz", + "integrity": "sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ==", "cpu": [ "arm64" ], @@ -74,9 +71,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.4.tgz", - "integrity": "sha512-Dh1a/+W+SUCXhEdL7TiX3ArPTFCQKJTI1mGncZNWfO+6suk+gYA4lNyJcBB+pwvF49uw0pEbUS49BgYOY4hzUg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.6.tgz", + "integrity": "sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw==", "cpu": [ "x64" ], @@ -91,13 +88,16 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.4.tgz", - "integrity": "sha512-V/NFfbWhsUU6w+m5WYbBenlEAz8eYnSqRMDMAW3K+3v0tYVkNyZn8VU0XPxk/lOqNXLSCCrV7FmV/u3SjCBShg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.6.tgz", + "integrity": "sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -108,13 +108,16 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.4.tgz", - "integrity": "sha512-+sPAXq3bxmFwhVFJnSwkSF5Rw2ZAJMH3MF6C9IveAEOdSpgajPhoQhbbAK12SehN9j2QrHpk4J/cHsa/HqWaYQ==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.6.tgz", + "integrity": "sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -125,13 +128,16 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.4.tgz", - "integrity": "sha512-R4+ZCDtG9kHArasyBO+UBD6jr/FcFCTH8QkNTOCu0pRJzCWyWC4EtZa2AmUZB5h3e0jD7bRV2KvrENcf8rndBg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.6.tgz", + "integrity": "sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -142,13 +148,16 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.4.tgz", - "integrity": "sha512-gGvFTGpOIQDb5CQ2VC0n9Z2UEqlP46c4aNgHmAMytYieTGEcfqhfCFnhs6xjt0S3igE6q5GLuIXtdQt3Izok+g==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.6.tgz", + "integrity": "sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -159,9 +168,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.4.tgz", - "integrity": "sha512-trzCqM7x+Gn832zZHgr28JoYagQNX4CZkUZhMUac2YxvvyDRLJDrb5m9IA7CaZLlX6lTQmADVfLEKP1et1Ma4Q==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.6.tgz", + "integrity": "sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg==", "cpu": [ "arm64" ], @@ -176,9 +185,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.4.tgz", - "integrity": "sha512-gnOHKVPFAAPrpoPt2t+Q6FZ7RPry/FDV3GcpU53P3PtLNnQjBmKyN2Vh/JtqXet+H4pme8CC76rScwdjDcT1/A==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.6.tgz", + "integrity": "sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg==", "cpu": [ "x64" ], @@ -192,6 +201,40 @@ "node": ">=14.21.3" } }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -664,15 +707,15 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.2.tgz", - "integrity": "sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^3.0.2", + "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", - "minimatch": "^10.2.1" + "minimatch": "^10.2.4" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -692,9 +735,9 @@ } }, "node_modules/@eslint/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz", - "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -814,9 +857,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.2.tgz", - "integrity": "sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -824,13 +867,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz", - "integrity": "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.0", + "@eslint/core": "^1.1.1", "levn": "^0.4.1" }, "engines": { @@ -907,17 +950,17 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.15", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.15.tgz", - "integrity": "sha512-MD4AxOOdHcAK5f24Fnm2Ji780KaKMmzzGF4HySHVCPXQJ2UVzL+qn/LGqa/MJJWNWUYYFRkN/sePztiojgNMVQ==", + "version": "12.0.0-preview.16", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.16.tgz", + "integrity": "sha512-pp2Rqczh4tgg7BJh6yRCOqBLAJty9DrhSL9kAPZ60VjZ3YpXRkPEbjNxX8Kw+bRBlvKweuuCE4I2qnz953C0YQ==", "license": "MIT", "peer": true, "engines": { "node": ">=22" }, "peerDependencies": { - "ts-pattern": "^5.9.0", - "zod": "^4.3.6" + "ts-pattern": "^5", + "zod": "^4" } }, "node_modules/@kontent-ai/eslint-config": { @@ -998,6 +1041,238 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@kontent-ai/eslint-config/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1039,7 +1314,6 @@ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -1208,24 +1482,75 @@ "semver": "bin/semver.js" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], + "node_modules/@kontent-ai/eslint-config/node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", + "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@oxc-project/runtime": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", + "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.115.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", "cpu": [ "arm64" ], @@ -1234,12 +1559,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", "cpu": [ "arm64" ], @@ -1248,12 +1576,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", "cpu": [ "x64" ], @@ -1262,26 +1593,15 @@ "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", "cpu": [ "x64" ], @@ -1290,26 +1610,15 @@ "optional": true, "os": [ "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", "cpu": [ "arm" ], @@ -1318,180 +1627,135 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", "cpu": [ "arm64" ], @@ -1500,40 +1764,49 @@ "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", "cpu": [ - "arm64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", "cpu": [ "x64" ], @@ -1542,21 +1815,17 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, "node_modules/@standard-schema/spec": { "version": "1.1.0", @@ -1565,6 +1834,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -1605,140 +1885,24 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", - "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/type-utils": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.56.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", - "debug": "^4.4.3" - }, - "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 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1746,16 +1910,12 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", "dev": true, "license": "MIT", "engines": { @@ -1766,66 +1926,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.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 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/types": "8.57.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1850,54 +1958,27 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", "dev": true, "license": "MIT", "dependencies": { @@ -1908,13 +1989,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.18", + "@vitest/utils": "4.1.0", "pathe": "^2.0.3" }, "funding": { @@ -1922,13 +2003,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -1937,9 +2019,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", "dev": true, "license": "MIT", "funding": { @@ -1947,13 +2029,14 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", "tinyrainbow": "^3.0.3" }, "funding": { @@ -1966,7 +2049,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2291,19 +2373,6 @@ "node": ">=18" } }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2331,6 +2400,13 @@ "dev": true, "license": "MIT" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2461,30 +2537,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, - "funding": { - "url": "https://dotenvx.com" + "engines": { + "node": ">=0.10.0" } }, "node_modules/dunder-proto": { @@ -2620,9 +2693,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, "license": "MIT" }, @@ -2742,19 +2815,18 @@ } }, "node_modules/eslint": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.2.tgz", - "integrity": "sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.2", + "@eslint/config-array": "^0.23.3", "@eslint/config-helpers": "^0.5.2", - "@eslint/core": "^1.1.0", - "@eslint/plugin-kit": "^0.6.0", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2763,7 +2835,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.1", + "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.1.1", "esquery": "^1.7.0", @@ -2776,7 +2848,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.1", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -2799,9 +2871,9 @@ } }, "node_modules/eslint-scope": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.1.tgz", - "integrity": "sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3342,16 +3414,6 @@ "node": ">= 0.4" } }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -3889,6 +3951,279 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3946,9 +4281,9 @@ } }, "node_modules/minimatch": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", - "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4270,7 +4605,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -4289,9 +4623,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -4444,49 +4778,38 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "node_modules/rolldown": { + "version": "1.0.0-rc.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@oxc-project/types": "=0.115.0", + "@rolldown/pluginutils": "1.0.0-rc.9" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", + "@rolldown/binding-darwin-x64": "1.0.0-rc.9", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" } }, "node_modules/safe-array-concat": { @@ -4544,19 +4867,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "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", @@ -4730,9 +5040,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", "dev": true, "license": "MIT" }, @@ -4922,28 +5232,15 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ts-pattern": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", @@ -4951,13 +5248,20 @@ "license": "MIT", "peer": true }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -5064,12 +5368,11 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.1-rc", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.1-rc.tgz", + "integrity": "sha512-7XlzYb+p/7YxX6qSOzwB4mxVFRdAgWWkj1PgAZ+jzldeuFV6Z77vwFbNxHsUXAL/bhlWY2jCT8shLwDJR8337g==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5115,18 +5418,17 @@ } }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", + "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", + "@oxc-project/runtime": "0.115.0", + "lightningcss": "^1.32.0", "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.9", "tinyglobby": "^0.2.15" }, "bin": { @@ -5143,9 +5445,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.0.0-alpha.31", + "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -5158,13 +5461,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { + "optional": true + }, + "jiti": { "optional": true }, - "lightningcss": { + "less": { "optional": true }, "sass": { @@ -5191,31 +5497,31 @@ } }, "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -5231,12 +5537,13 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -5265,6 +5572,36 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true } } }, diff --git a/package.json b/package.json index d3c2d894..dcbe402f 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,17 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.15", - "zod": "^4.3.6" + "@kontent-ai/core-sdk": "^12.0.0-preview.16", + "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.0.2", - "@biomejs/biome": "2.4.4", - "@types/node": "25.3.2", - "chalk": "5.6.2", - "typescript": "5.9.3", - "vitest": "4.0.18", - "dotenv": "17.3.1", + "eslint": "10.0.3", + "@biomejs/biome": "2.4.6", + "@types/node": "25.5.0", + "typescript": "6.0.1-rc", + "vitest": "4.1.0", "tsx": "4.21.0" } } diff --git a/scripts/update-version.ts b/scripts/update-version.ts index bfe306fe..6ffaab6b 100644 --- a/scripts/update-version.ts +++ b/scripts/update-version.ts @@ -2,4 +2,4 @@ import { replaceSdkVersionPlaceholder } from "@kontent-ai/core-sdk/devkit"; // biome-ignore lint/correctness/useImportExtensions: package.json is a JSON file import packageJson from "../package.json" with { type: "json" }; -replaceSdkVersionPlaceholder("./dist/sdk-info.js", packageJson.version); +replaceSdkVersionPlaceholder("./dist/delivery-sdk-info.js", packageJson.version); diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts index 0110b340..b2db3b49 100644 --- a/tests/integration-tests.config.ts +++ b/tests/integration-tests.config.ts @@ -1,7 +1,13 @@ +import { existsSync } from "node:fs"; +import path from "node:path"; +import { loadEnvFile } from "node:process"; +import { fileURLToPath } from "node:url"; import { getEndpointUrl } from "@kontent-ai/core-sdk"; import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "@kontent-ai/core-sdk/devkit"; export function getIntegrationTestConfig() { + loadEnvironmentVariables(); + const integrationEnv = { id: getEnvironmentRequiredValue("INTEGRATION_ENVIRONMENT_ID"), mapiKey: getEnvironmentRequiredValue("INTEGRATION_MANAGEMENT_API_KEY"), @@ -88,3 +94,11 @@ export function getIntegrationTestConfig() { }, }; } + +function loadEnvironmentVariables(): void { + const envFilePath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".env"); + + if (existsSync(envFilePath)) { + loadEnvFile(envFilePath); + } +} diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index b1dfdeb5..d7969e61 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -23,11 +23,7 @@ const client: DeliveryClient = createDeliveryClient("x") }), }); -const { response: languageResponse } = await client.listLanguages().toPromise(); - -if (!languageResponse) { - throw new Error("Language response is undefined"); -} +const languageResponse = await client.listLanguages().fetchPage(); // Verifies that the language codenames are assignable from the response schema const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.payload.languages.map( diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts new file mode 100644 index 00000000..d2399992 --- /dev/null +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -0,0 +1,28 @@ +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, it } from "vitest"; +import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +describe("Custom base URL API", async () => { + const customBaseUrl = "https://domain.com"; + + const query = createDeliveryClient(unitEnvironmentId) + .withUnknownSchema() + .publicApi() + .create({ + baseUrl: customBaseUrl, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), + }) + .listLanguages(); + + // execute query so that http service is called and request headers are captured + const { response } = await query.fetchPageSafe(); + + it("URL should point to custom base URL", () => { + const { origin } = new URL(response?.meta?.url ?? "n/a"); + expect(origin).toEqual(customBaseUrl); + }); +}); diff --git a/tests/unit/headers/public-deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts similarity index 86% rename from tests/unit/headers/public-deliver-api.spec.ts rename to tests/unit/api-mode/deliver-api.spec.ts index 0e43ef77..d340d1dc 100644 --- a/tests/unit/headers/public-deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -23,10 +23,10 @@ describe("Public deliver API", async () => { .create({ httpService: getDefaultHttpService({ adapter: { - requestAsync: async (options) => { + executeRequest: async (options) => { requestHeaders = options.requestHeaders ?? []; - return await getDefaultHttpAdapter().requestAsync(options); + return await getDefaultHttpAdapter().executeRequest(options); }, }, }), @@ -34,7 +34,7 @@ describe("Public deliver API", async () => { .listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error } = await query.toPromise(); + const { success, error, response } = await query.fetchPageSafe(); it("Response should be successful", () => { expect(success).toBeTruthy(); @@ -47,7 +47,7 @@ describe("Public deliver API", async () => { }); it("URL should point to public deliver API", () => { - const { host } = new URL(query.toUrl()); + const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("deliver.kontent.ai"); }); }); diff --git a/tests/unit/headers/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts similarity index 86% rename from tests/unit/headers/preview-api.spec.ts rename to tests/unit/api-mode/preview-api.spec.ts index 440c8f05..4d148a7d 100644 --- a/tests/unit/headers/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -24,10 +24,10 @@ describe("Preview API", async () => { .create({ httpService: getDefaultHttpService({ adapter: { - requestAsync: async (options) => { + executeRequest: async (options) => { requestHeaders = options.requestHeaders ?? []; - return await getDefaultHttpAdapter().requestAsync(options); + return await getDefaultHttpAdapter().executeRequest(options); }, }, }), @@ -35,7 +35,7 @@ describe("Preview API", async () => { .listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error } = await query.toPromise(); + const { success, error, response } = await query.fetchPageSafe(); it("Response should be successful", () => { expect(success).toBeTruthy(); @@ -48,7 +48,7 @@ describe("Preview API", async () => { }); it("URL should point to preview API", () => { - const { host } = new URL(query.toUrl()); + const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("preview-deliver.kontent.ai"); }); }); diff --git a/tests/unit/headers/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts similarity index 86% rename from tests/unit/headers/secure-api.spec.ts rename to tests/unit/api-mode/secure-api.spec.ts index 055d2c14..baf110a3 100644 --- a/tests/unit/headers/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -24,10 +24,10 @@ describe("Secure API", async () => { .create({ httpService: getDefaultHttpService({ adapter: { - requestAsync: async (options) => { + executeRequest: async (options) => { requestHeaders = options.requestHeaders ?? []; - return await getDefaultHttpAdapter().requestAsync(options); + return await getDefaultHttpAdapter().executeRequest(options); }, }, }), @@ -35,7 +35,7 @@ describe("Secure API", async () => { .listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error } = await query.toPromise(); + const { success, error, response } = await query.fetchPageSafe(); it("Response should be successful", () => { expect(success).toBeTruthy(); @@ -48,7 +48,7 @@ describe("Secure API", async () => { }); it("URL should point to secure API", () => { - const { host } = new URL(query.toUrl()); + const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("deliver.kontent.ai"); }); }); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 52a5f52a..56d7b119 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -15,25 +15,25 @@ describe("Handling of custom errors", async () => { }, httpService: getDefaultHttpService({ adapter: { - requestAsync: () => { + executeRequest: () => { throw new CustomError(); }, }, }), }) .listLanguages() - .toPromise(); + .fetchPageSafe(); it("Success should be false", () => { expect(success).toBe(false); }); - it("Error should be unknown", () => { - expect(error?.details.reason).toBe("unknown"); + it("Error should be adapterError", () => { + expect(error?.details.reason).toBe("adapterError"); }); it("Original error should be propagated and be of proper type", () => { - if (error?.details.reason === "unknown") { + if (error?.details.reason === "adapterError") { expect(error.details.originalError).toBeInstanceOf(CustomError); } else { throw new Error("Error should be unknown"); diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 9da73078..9effdd75 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -29,10 +29,10 @@ describe("Delivery tracking header", async () => { .create({ httpService: getDefaultHttpService({ adapter: { - requestAsync: async (options) => { + executeRequest: async (options) => { requestHeaders = options.requestHeaders ?? []; - return await getDefaultHttpAdapter().requestAsync(options); + return await getDefaultHttpAdapter().executeRequest(options); }, }, }), @@ -40,7 +40,7 @@ describe("Delivery tracking header", async () => { .listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error } = await query.toPromise(); + const { success, error } = await query.fetchPageSafe(); it("Response should be successful", () => { expect(success).toBeTruthy(); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index f364498f..f7414275 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -39,7 +39,7 @@ describe("Valid schema validation with extra props", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeUndefined(); expect(success).toBeTruthy(); diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 11d03213..020a295f 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -32,7 +32,7 @@ describe("Valid schema validation with missing props", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeDefined(); expect(success).toBeFalsy(); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index b67da07f..bd3ba0f7 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -42,7 +42,7 @@ describe("Schema validation", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeDefined(); expect(success).toBeFalsy(); @@ -63,7 +63,7 @@ describe("Schema validation", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeUndefined(); expect(success).toBeTruthy(); @@ -83,7 +83,7 @@ describe("Schema validation", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeUndefined(); expect(success).toBeTruthy(); @@ -103,7 +103,7 @@ describe("Schema validation", () => { }), }); - const { success, error } = await client.listLanguages().toPromise(); + const { success, error } = await client.listLanguages().fetchPageSafe(); expect(error).toBeUndefined(); expect(success).toBeTruthy(); diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index b9f85167..e53eb0b2 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -23,16 +23,15 @@ describe("Response validation", () => { }) .listLanguages(); - const { success, error } = await query.toPromise(); + const { success, error } = await query.fetchPageSafe(); expect(success).toBe(false); expect(error).toBeDefined(); expect(error?.details.reason).toStrictEqual("validationFailed"); if (error?.details.reason === "validationFailed") { - expect(error.details.url).toStrictEqual(query.toUrl()); + expect(error.details.url).toStrictEqual(query.url); expect(error.details.zodError).toBeInstanceOf(ZodError); - expect(error.details.message).toBeDefined(); expect(error.details.response).toBeDefined(); } else { throw new Error(`Unexpected error reason '${error?.details.reason}'`); @@ -56,7 +55,7 @@ describe("Response validation", () => { }), }) .listLanguages() - .toPromise(); + .fetchPageSafe(); expect(success).toBe(true); expect(error).toBeUndefined(); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index c24a4e3d..461c2f3f 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,4 @@ -import { isPagingQuery, type JsonValue, type PagingQuery, type Query } from "@kontent-ai/core-sdk"; +import { type FetchQuery, isPagingQuery, type JsonValue, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; @@ -10,6 +10,10 @@ import { unitEnvironmentId } from "./test.utils.js"; type TestType = "Integration" | "Unit"; +type SelectQuery = ( + client: DeliveryClient, +) => FetchQuery | PagedFetchQuery; + export async function runQueryTestsAsync({ endpoint, unitTestPayload, @@ -19,7 +23,7 @@ export async function runQueryTestsAsync({ readonly expectedSchema: ZodType; readonly endpoint: DeliveryEndpoints; readonly unitTestPayload: TResponsePayload; - readonly selectQuery: (client: DeliveryClient) => Query; + readonly selectQuery: SelectQuery; }): Promise { const integrationTestConfig = getIntegrationTestConfig(); const clients = createTestClients({ @@ -82,9 +86,12 @@ function createTestClients({ statusCode: 200, }), }), - createDeliveryClient(environmentId).withUnknownSchema().publicApi().create({ - baseUrl: deliveryBaseUrl, - }), + createDeliveryClient(environmentId) + .withUnknownSchema() + .publicApi() + .create({ + ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), + }), ]; } @@ -122,7 +129,7 @@ function registerBaseTests({ readonly testName: string; readonly endpoint: DeliveryEndpoints; readonly client: DeliveryClient; - readonly query: Query; + readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; readonly error: unknown; @@ -131,7 +138,7 @@ function registerBaseTests({ readonly testType: TestType; }): void { it(`${testName} Expect url to be correct`, () => { - expect(query.toUrl()).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); + expect(query.url).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); }); it(`${testName} Response should be successful`, () => { expect(error).toBeUndefined(); @@ -203,22 +210,26 @@ async function executeDefaultQueryAsync({ selectQuery, }: { readonly client: DeliveryClient; - readonly selectQuery: (client: DeliveryClient) => Query; + readonly selectQuery: SelectQuery; }): Promise<{ - readonly query: Query; + readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; readonly error: unknown; }> { const query = selectQuery(client); - const { response, success, error } = await query.toPromise(); + if (isPagingQuery(query)) { + const { response, success, error } = await query.fetchPageSafe(); + return { query, response, success, error }; + } + const { response, success, error } = await query.fetchSafe(); return { query, response, success, error }; } async function executePagingQueryAsync({ query, }: { - readonly query: PagingQuery; + readonly query: PagedFetchQuery; }): Promise<{ readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; readonly pagingSuccess: boolean; @@ -226,7 +237,7 @@ async function executePagingQueryAsync({ readonly iteratorPayloads: readonly TResponsePayload[]; readonly maxPagesCount: number; }> { - const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.toAllPromise(); + const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.fetchAllPagesSafe(); const iteratorPayloads: TResponsePayload[] = []; const maxPagesCount = 1; for await (const pageResponse of query.pages({ maxPagesCount })) { diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 6616f692..ed203272 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,8 +1,4 @@ import { type ContinuationHeaderName, type Header, nilUuid } from "@kontent-ai/core-sdk"; -import { config } from "dotenv"; - -// needed to load .env environment to current process when run via package.json script -config(); export const fakeXContinuationTokenHeader: Header = { name: "X-Continuation" satisfies ContinuationHeaderName, diff --git a/tsconfig.build.json b/tsconfig.build.json index 0304f06a..d776d4cf 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -2,7 +2,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": false, - "outDir": "dist" + "outDir": "dist", + "rootDir": "./lib" }, "include": ["lib/**/*"], "exclude": ["tests/**/*", "scripts/**/*"] diff --git a/tsconfig.json b/tsconfig.json index 0b9d8d4b..90157bc5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,43 +2,36 @@ "compileOnSave": true, "compilerOptions": { // Language + runtime environment - "target": "es2022", + "rootDir": ".", + "target": "esnext", "lib": ["esnext"], // Modules + resolution "module": "NodeNext", "moduleResolution": "nodenext", "resolveJsonModule": true, - "allowSyntheticDefaultImports": true, // Emit behavior (even if `noEmit` is true, these are useful for tooling expectations) "noEmit": true, "declaration": true, "sourceMap": true, - "importHelpers": true, - - // Decorators - "experimentalDecorators": true, - "emitDecoratorMetadata": true, // Strictness + type safety "strict": true, - "alwaysStrict": true, "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictPropertyInitialization": true, - - // Lint-like correctness checks "noImplicitReturns": true, "allowUnreachableCode": false, "noUnusedLocals": true, "noUnusedParameters": true, "forceConsistentCasingInFileNames": true, - - // Perf / compatibility + "exactOptionalPropertyTypes": true, + "noUncheckedIndexedAccess": true, + "noFallthroughCasesInSwitch": true, + "useUnknownInCatchVariables": true, "skipLibCheck": true, - "typeRoots": ["./node_modules/@types"] + + // Types + "types": ["node"] }, "include": ["lib/**/*", "tests/**/*", "eslint.config.js", "vitest.config.ts", "sample/**/*", "scripts/**/*"], "exclude": ["node_modules", "_legacy"] diff --git a/vitest-integration.config.ts b/vitest-integration.config.ts index 53b896ad..71f06313 100644 --- a/vitest-integration.config.ts +++ b/vitest-integration.config.ts @@ -1,4 +1,3 @@ -import { loadEnv } from "vite"; import { defineConfig } from "vitest/config"; export default defineConfig({ @@ -7,8 +6,6 @@ export default defineConfig({ dir: "tests/integration", globals: true, environment: "node", - setupFiles: ["dotenv/config"], - env: loadEnv("", process.cwd(), ""), // loads .env variables }, build: { target: "esnext", diff --git a/vitest-unit.config.ts b/vitest-unit.config.ts index bd4a522e..7746e8f5 100644 --- a/vitest-unit.config.ts +++ b/vitest-unit.config.ts @@ -1,4 +1,3 @@ -import { loadEnv } from "vite"; import { defineConfig } from "vitest/config"; export default defineConfig({ @@ -7,8 +6,6 @@ export default defineConfig({ dir: "tests/unit", globals: true, environment: "node", - setupFiles: ["dotenv/config"], - env: loadEnv("", process.cwd(), ""), // loads .env variables }, build: { target: "esnext", From 75899d3d96415059ad202bc507c55d09dff290ed Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 13 Mar 2026 19:27:33 +0100 Subject: [PATCH 032/221] generics refactor --- lib/client/delivery-client.ts | 155 +++++++----------- lib/models/core.models.ts | 61 ++++--- lib/public_api.ts | 1 - .../content-types/list-content-types-query.ts | 7 +- lib/queries/delivery-queries.ts | 2 +- lib/queries/languages/list-languages-query.ts | 7 +- .../taxonomies/list-taxonomies-query.ts | 7 +- lib/utils/schema.utils.ts | 7 + .../queries/list-content-types-query.spec.ts | 2 +- .../queries/list-languages-query.spec.ts | 5 +- .../queries/list-taxonomies-query.spec.ts | 2 +- tests/types/delivery-client-types.test.ts | 25 +-- .../unit/api-mode/custom-base-url-api.spec.ts | 24 +-- tests/unit/api-mode/deliver-api.spec.ts | 30 ++-- tests/unit/api-mode/preview-api.spec.ts | 31 ++-- tests/unit/api-mode/secure-api.spec.ts | 31 ++-- tests/unit/errors/custom-errors.spec.ts | 31 ++-- tests/unit/headers/headers.spec.ts | 30 ++-- ...schema-validation-with-extra-props.spec.ts | 27 +-- ...hema-validation-with-missing-props.spec.ts | 27 +-- .../unit/validation/schema-validation.spec.ts | 87 +++++----- .../validation/validation-properties.spec.ts | 54 +++--- tests/utils/integration-test.utils.ts | 43 +++-- 23 files changed, 356 insertions(+), 340 deletions(-) create mode 100644 lib/utils/schema.utils.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 8f9a344a..e00be1ed 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,116 +1,85 @@ import type { - CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, + DeliveryClientConfigWithSchema, DeliveryClientSchema, DeliveryClientTypes, } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; +import { toRequiredSchema } from "../utils/schema.utils.js"; -type DeliverySchemaBuilder = { - /** - * By providing a schema, you get stronger type safety, - * which means many potential errors are caught at compile time rather than at runtime. - * - * Schemas can be generated using the `@kontent-ai/model-generator` npm package. - */ - withSchema: ( - schema: DeliveryClientSchema, - ) => DeliveryApiBuilder; - /** - * Use this only when you cannot provide a schema and have a strong reason to accept reduced type safety. - * - * Prefer `withSchema` whenever possible to ensure potential errors are caught at compile time - * rather than at runtime. - * - * Schemas can be generated using the `@kontent-ai/model-generator` npm package. - */ - withUnknownSchema: () => DeliveryApiBuilder; -}; - -type DeliveryApiBuilder = { - /** - * Use publicly available API for requests. - */ - publicApi: () => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; - }; - /** - * Use preview API for requests. - * - * Requires a delivery API key with preview access. - */ - previewApi: (deliveryApiKey: string) => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; - }; - - /** - * Use secure API for requests. - * - * Requires a delivery API key with secure access. - */ - secureApi: (deliveryApiKey: string) => { - create: (options?: CreateDeliveryClientOptions) => DeliveryClient; - }; +export type InferClientTypesFromSchema> = { + readonly languageCodenames: NonNullable; + readonly taxonomyCodenames: NonNullable; }; /** - * Creates a new delivery client instance using fluent API. + * Creates a strongly typed delivery client using the provided schema. * - * You may choose to use public, preview or secure API. + * The schema is used to infer codenames and other metadata, so your code + * gets full compile-time safety. * - * Options can be set within the 'create' function. + * We strongly recommend generating the schema using the `@kontent-ai/model-generator` + * npm package and passing it here. * - * @param environmentId - The Id of the Kontent.ai environment. + * @example + * const client = createDeliveryClient({ + * apiMode: "public", + * environmentId: "x", + * schema: { + * languageCodenames: ["en-us", "de-de"] as const, + * taxonomyCodenames: ["categories"] as const, + * }, + * }); */ -export function createDeliveryClient(environmentId: string): DeliverySchemaBuilder { - return { - withSchema: (schema: DeliveryClientSchema) => { - return getApiBuilder(environmentId, schema); - }, - withUnknownSchema: () => { - return getApiBuilder(environmentId, { languageCodenames: [] }); - }, - }; -} - -function getApiBuilder( - environmentId: string, - schema: DeliveryClientSchema, -) { - return { - publicApi: () => { - return withClient({ apiMode: "public", environmentId }, schema); - }, - previewApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "preview", environmentId, deliveryApiKey }, schema); - }, - secureApi: (deliveryApiKey: string) => { - return withClient({ apiMode: "secure", environmentId, deliveryApiKey }, schema); - }, - }; -} +export function createDeliveryClient>( + config: DeliveryClientConfig> & { readonly schema: TSchema }, +): DeliveryClient>; -function withClient( - requiredConfig: Pick, - schema: DeliveryClientSchema, -) { - return { - create: (options?: CreateDeliveryClientOptions): DeliveryClient => - buildDeliveryClient({ ...requiredConfig, ...options }, schema), +/** + * Creates a delivery client when you don't want to provide a concrete schema. + * + * This overload is more permissive and keeps codenames as generic strings, + * which means you lose the compile-time guarantees that the typed overload provides. + * + * Prefer the overload above with an explicit `schema` whenever possible to get + * better type safety and earlier feedback from the compiler. + */ +export function createDeliveryClient(config: DeliveryClientConfig): DeliveryClient { + const configWithSchema: DeliveryClientConfigWithSchema = { + ...config, + schema: toRequiredSchema(config.schema), }; -} - -function buildDeliveryClient( - config: DeliveryClientConfig, - schema: DeliveryClientSchema, -): DeliveryClient { return { config, - listLanguages: () => listLanguagesQuery(config, schema), - listTaxonomies: () => listTaxonomiesQuery(config, schema), - listContentTypes: () => listContentTypes(config, schema), + listTaxonomies: () => listTaxonomiesQuery(configWithSchema), + listLanguages: () => listLanguagesQuery(configWithSchema), + listContentTypes: () => listContentTypes(configWithSchema), }; } + +// const fe = createDeliveryClient({ +// apiMode: "preview", +// deliveryApiKey: "x", +// environmentId: "c", +// schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, +// }); + +// type Fe3 = InferClientTypesFromSchema<{ +// readonly taxonomyCodenames: readonly ("categories" | "tags")[]; +// readonly languageCodenames: readonly ("en-us" | "de-de")[]; +// }>; + +// const fe3: DeliveryClient = createDeliveryClient({ +// apiMode: "preview", +// deliveryApiKey: "x", +// environmentId: "c", +// schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, +// }); + +// const query = await fe.listLanguages().fetchAllPages(); +// const query3 = await fe3.listLanguages().fetchAllPages(); +// query.responses[0]?.payload.languages[0]?.system.codename === "en-s"; +// query3.responses[0]?.payload.languages[0]?.system.codename === "de-d"; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index e2ea72f6..b7673e19 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -16,8 +16,8 @@ export type DeliveryClientTypes = { }; export type DeliveryClientSchema = { - readonly taxonomyCodenames?: TDeliveryClientTypes["taxonomyCodenames"]; - readonly languageCodenames?: TDeliveryClientTypes["languageCodenames"]; + readonly taxonomyCodenames: TDeliveryClientTypes["taxonomyCodenames"]; + readonly languageCodenames: TDeliveryClientTypes["languageCodenames"]; }; export type DeliveryResponseMeta = Pick, "status" | "responseHeaders"> & { @@ -31,27 +31,39 @@ export type DeliveryResponse = { export type ApiMode = "public" | "preview" | "secure"; -export type DeliveryClientConfig = SdkConfig & { - /** - * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. - */ - readonly environmentId: string; +export type DeliveryClientConfig = SdkConfig & + ApiDeliveryClientConfig & { + /** + * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. + */ + readonly environmentId: string; + + /** + * Schema for the delivery client. + * + * If you provide schema, you can get stronger type safety by enabling the response validation. + * + * Generate using the `@kontent-ai/model-generator` npm package. + * + * @see https://github.com/kontent-ai/model-generator-js + */ + readonly schema?: DeliveryClientSchema; + }; + +export type ApiDeliveryClientConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; + +export type PublicDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; +}; - /** - * Delivery API key. - * - * Required for secure and preview modes. - */ - readonly deliveryApiKey?: string; +export type PreviewDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; + readonly deliveryApiKey: string; +}; - /** - * Mode for the API. - * - * Secure mode requires a delivery API key with secure access. - * Preview mode requires a delivery API key with preview access. - * Delivery mode is used for public access. - */ - readonly apiMode: ApiMode; +export type SecureDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; + readonly deliveryApiKey: string; }; /** @@ -59,7 +71,7 @@ export type DeliveryClientConfig = SdkConfig & { * */ export type DeliveryClient = { - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; /** * List languages. @@ -77,7 +89,8 @@ export type DeliveryClient; }; -export type CreateDeliveryClientOptions = Omit; +export type DeliveryClientConfigWithSchema = DeliveryClientConfig & + Required, "schema">>; export const paginationSchema = z.object({ pagination: z @@ -104,3 +117,5 @@ export type DeliveryEndpoints = | "types" | `types/${string}` | `types/${string}/elements/${string}`; + +type PickStringLiteral = U; diff --git a/lib/public_api.ts b/lib/public_api.ts index 200c5583..803ad913 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,7 +2,6 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, - CreateDeliveryClientOptions, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index a4bf2c99..2eaba384 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,5 +1,5 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; @@ -9,12 +9,11 @@ export type ListContentTypesQuery; export function listContentTypes( - config: DeliveryClientConfig, - schema: DeliveryClientSchema, + config: DeliveryClientConfigWithSchema, ): ListContentTypesQuery { return createDeliveryPagingQuery({ config, - zodSchema: listContentTypesPayload(schema), + zodSchema: listContentTypesPayload(config.schema), endpoint: "types", }); } diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index f9e03132..a3d5976e 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -24,7 +24,7 @@ export function createDeliveryPagingQuery({ getNextPageData: getNextPageByUrl(), request: { url: getDeliveryUrl({ path: endpoint, ...config }), - authorizationApiKey: config.deliveryApiKey, + authorizationApiKey: "deliveryApiKey" in config ? config.deliveryApiKey : undefined, }, }); } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 97552957..c2bdef70 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,5 +1,5 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -9,12 +9,11 @@ export type ListLanguagesQuery >; export function listLanguagesQuery( - config: DeliveryClientConfig, - schema: DeliveryClientSchema, + config: DeliveryClientConfigWithSchema, ): ListLanguagesQuery { return createDeliveryPagingQuery({ config, - zodSchema: listLanguagesPayload(schema), + zodSchema: listLanguagesPayload(config.schema), endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index c59f941c..5a0cfda9 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,5 +1,5 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; @@ -9,12 +9,11 @@ export type ListTaxonomiesQuery; export function listTaxonomiesQuery( - config: DeliveryClientConfig, - schema: DeliveryClientSchema, + config: DeliveryClientConfigWithSchema, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, - zodSchema: listTaxonomiesPayload(schema), + zodSchema: listTaxonomiesPayload(config.schema), endpoint: "taxonomies", }); } diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts new file mode 100644 index 00000000..b5d2badf --- /dev/null +++ b/lib/utils/schema.utils.ts @@ -0,0 +1,7 @@ +import type { DeliveryClientSchema, DeliveryClientTypes } from "../models/core.models.js"; + +export function toRequiredSchema( + schema?: DeliveryClientSchema, +): DeliveryClientSchema { + return schema ?? { languageCodenames: [], taxonomyCodenames: [] }; +} diff --git a/tests/integration/queries/list-content-types-query.spec.ts b/tests/integration/queries/list-content-types-query.spec.ts index fc85da9e..9e7a47b4 100644 --- a/tests/integration/queries/list-content-types-query.spec.ts +++ b/tests/integration/queries/list-content-types-query.spec.ts @@ -92,6 +92,6 @@ describe("List content types query", async () => { }, }, selectQuery: (client) => client.listContentTypes(), - expectedSchema: listContentTypesPayload({}), + expectedSchema: listContentTypesPayload({ languageCodenames: [], taxonomyCodenames: [] }), }); }); diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/list-languages-query.spec.ts index ea4d3eb3..21a0df71 100644 --- a/tests/integration/queries/list-languages-query.spec.ts +++ b/tests/integration/queries/list-languages-query.spec.ts @@ -24,6 +24,9 @@ describe("List languages query", async () => { }, }, selectQuery: (client) => client.listLanguages(), - expectedSchema: listLanguagesPayload({}), + expectedSchema: listLanguagesPayload({ + languageCodenames: [], + taxonomyCodenames: [], + }), }); }); diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/list-taxonomies-query.spec.ts index b50a4022..97942fb4 100644 --- a/tests/integration/queries/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/list-taxonomies-query.spec.ts @@ -53,6 +53,6 @@ describe("List taxonomies query", async () => { }, }, selectQuery: (client) => client.listTaxonomies(), - expectedSchema: listTaxonomiesPayload({}), + expectedSchema: listTaxonomiesPayload({ languageCodenames: [], taxonomyCodenames: [] }), }); }); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index d7969e61..de0bdb9d 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -8,20 +8,21 @@ type DeliveryTypes = DeliveryClientTypes & { const schema: DeliveryClientSchema = { languageCodenames: ["en-US", "cs-CZ"], + taxonomyCodenames: ["categories"], }; -const client: DeliveryClient = createDeliveryClient("x") - .withSchema(schema) - .publicApi() - .create({ - responseValidation: { - enable: false, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), - }); +const client: DeliveryClient = createDeliveryClient({ + apiMode: "public", + environmentId: "x", + schema, + responseValidation: { + enable: false, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), +}); const languageResponse = await client.listLanguages().fetchPage(); diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts index d2399992..897417aa 100644 --- a/tests/unit/api-mode/custom-base-url-api.spec.ts +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -6,17 +6,19 @@ import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Custom base URL API", async () => { const customBaseUrl = "https://domain.com"; - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - baseUrl: customBaseUrl, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), - }) - .listLanguages(); + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), + baseUrl: customBaseUrl, + }).listLanguages(); // execute query so that http service is called and request headers are captured const { response } = await query.fetchPageSafe(); diff --git a/tests/unit/api-mode/deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts index d340d1dc..224c7c74 100644 --- a/tests/unit/api-mode/deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -17,21 +17,23 @@ describe("Public deliver API", async () => { let requestHeaders: readonly Header[] = []; - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); }, - }), - }) - .listLanguages(); + }, + }), + }).listLanguages(); // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); diff --git a/tests/unit/api-mode/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts index 4d148a7d..59aa0bcc 100644 --- a/tests/unit/api-mode/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -18,21 +18,24 @@ describe("Preview API", async () => { let requestHeaders: readonly Header[] = []; const previewApiKey = "y"; - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .previewApi(previewApiKey) - .create({ - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, + const query = createDeliveryClient({ + apiMode: "preview", + environmentId: unitEnvironmentId, + deliveryApiKey: previewApiKey, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); }, - }), - }) - .listLanguages(); + }, + }), + }).listLanguages(); // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); diff --git a/tests/unit/api-mode/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts index baf110a3..668fd914 100644 --- a/tests/unit/api-mode/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -18,21 +18,24 @@ describe("Secure API", async () => { let requestHeaders: readonly Header[] = []; const secureApiKey = "y"; - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .secureApi(secureApiKey) - .create({ - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, + const query = createDeliveryClient({ + apiMode: "secure", + environmentId: unitEnvironmentId, + deliveryApiKey: secureApiKey, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); }, - }), - }) - .listLanguages(); + }, + }), + }).listLanguages(); // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 56d7b119..f1bf0a4d 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -6,21 +6,24 @@ import { unitEnvironmentId } from "../../utils/test.utils.js"; class CustomError extends Error {} describe("Handling of custom errors", async () => { - const { success, error } = await createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getDefaultHttpService({ - adapter: { - executeRequest: () => { - throw new CustomError(); - }, + const { success, error } = await createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: () => { + throw new CustomError(); }, - }), - }) + }, + }), + responseValidation: { + enable: true, + }, + }) .listLanguages() .fetchPageSafe(); diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 9effdd75..1e4715c3 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -23,21 +23,23 @@ describe("Delivery tracking header", async () => { let requestHeaders: readonly Header[] = []; - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); }, - }), - }) - .listLanguages(); + }, + }), + }).listLanguages(); // execute query so that http service is called and request headers are captured const { success, error } = await query.fetchPageSafe(); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index f7414275..652b2a1b 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -26,18 +26,21 @@ describe("Valid schema validation with extra props", () => { }; test("Validation should be successful when response includes additional properties", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + responseValidation: { + enable: true, + }, + }); const { success, error } = await client.listLanguages().fetchPageSafe(); diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 020a295f..5c46a73e 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -19,18 +19,21 @@ describe("Valid schema validation with missing props", () => { }; test("Validation should fail when response is missing schema properties", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + responseValidation: { + enable: true, + }, + }); const { success, error } = await client.listLanguages().fetchPageSafe(); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index bd3ba0f7..0db1b306 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -29,18 +29,18 @@ describe("Schema validation", () => { }; test("Response should NOT be successful when response does not match defined language codenames schema", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withSchema({ languageCodenames: ["en-US", "cs-CZ"] }) // does not include "de-DE" - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: ["en-US", "cs-CZ"], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + responseValidation: { + enable: true, + }, + }); const { success, error } = await client.listLanguages().fetchPageSafe(); @@ -50,18 +50,15 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches defines language codenames schema", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withSchema({ languageCodenames: ["en-US", "cs-CZ", "de-DE"] }) // includes all allowed codenames - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: ["en-US", "cs-CZ", "de-DE"], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); const { success, error } = await client.listLanguages().fetchPageSafe(); @@ -70,18 +67,15 @@ describe("Schema validation", () => { }); test("Response should be successful when response matches general string codename schema", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() // should use general string for validation - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); const { success, error } = await client.listLanguages().fetchPageSafe(); @@ -90,18 +84,15 @@ describe("Schema validation", () => { }); test("Response should be successful when an empty array is provided as codenames source", async () => { - const client = createDeliveryClient(unitEnvironmentId) - .withSchema({ languageCodenames: [] }) // empty array - .publicApi() - .create({ - responseValidation: { - enable: true, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); const { success, error } = await client.listLanguages().fetchPageSafe(); diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index e53eb0b2..c7f48fde 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -7,21 +7,20 @@ import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Response validation", () => { test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { - const query = createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - responseValidation: { - enable: true, + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + result: "invalidValue", }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: { - result: "invalidValue", - }, - statusCode: 200, - }), - }) - .listLanguages(); + statusCode: 200, + }), + responseValidation: { + enable: true, + }, + }).listLanguages(); const { success, error } = await query.fetchPageSafe(); @@ -39,21 +38,20 @@ describe("Response validation", () => { }); test("Error should not be returned when response does not match schema but validation is disabled", async ({ expect }) => { - const { success, error } = await createDeliveryClient("x") - .withUnknownSchema() - .publicApi() - .create({ - responseValidation: { - enable: false, + const { success, error } = await createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + value: "invalidValue", }, - - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: { - value: "invalidValue", - }, - statusCode: 200, - }), - }) + statusCode: 200, + }), + responseValidation: { + enable: false, + }, + }) .listLanguages() .fetchPageSafe(); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 461c2f3f..c5a43a7d 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -77,21 +77,36 @@ function createTestClients({ readonly deliveryBaseUrl: string | undefined; }): readonly DeliveryClient[] { return [ - createDeliveryClient(unitEnvironmentId) - .withUnknownSchema() - .publicApi() - .create({ - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: unitTestPayload, - statusCode: 200, - }), - }), - createDeliveryClient(environmentId) - .withUnknownSchema() - .publicApi() - .create({ - ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), + createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: unitTestPayload, + statusCode: 200, }), + }), + // createDeliveryClient(unitEnvironmentId) + // .withUnknownSchema() + // .publicApi() + // .create({ + // httpService: getTestHttpServiceWithJsonResponse({ + // jsonResponse: unitTestPayload, + // statusCode: 200, + // }), + // }), + createDeliveryClient({ + apiMode: "public", + environmentId: environmentId, + schema: { languageCodenames: [], taxonomyCodenames: [] }, + ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), + }), + // createDeliveryClient(environmentId) + // .withUnknownSchema() + // .publicApi() + // .create({ + // ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), + // }), ]; } From b7a4a079d41440e2c6be5a33144ff900866f7e55 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 10:53:22 +0100 Subject: [PATCH 033/221] more types refactoring --- lib/client/delivery-client.ts | 128 ++++++++++-------- lib/models/core.models.ts | 48 ++++--- lib/public_api.ts | 3 +- .../content-types/content-type.models.ts | 18 +-- .../content-types/list-content-types-query.ts | 13 +- lib/queries/delivery-queries.ts | 11 +- lib/queries/languages/language.models.ts | 18 +-- lib/queries/languages/list-languages-query.ts | 13 +- .../taxonomies/list-taxonomies-query.ts | 15 +- lib/queries/taxonomies/taxonomy.models.ts | 24 ++-- lib/utils/schema.utils.ts | 15 +- tests/types/delivery-client-types.test.ts | 26 ++-- .../unit/validation/schema-validation.spec.ts | 6 +- 13 files changed, 171 insertions(+), 167 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index e00be1ed..b51ba4cd 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,85 +1,103 @@ import type { + DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig, DeliveryClientConfigWithSchema, - DeliveryClientSchema, - DeliveryClientTypes, + InferClientTypesFromSchema, } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; import { toRequiredSchema } from "../utils/schema.utils.js"; -export type InferClientTypesFromSchema> = { - readonly languageCodenames: NonNullable; - readonly taxonomyCodenames: NonNullable; -}; - /** - * Creates a strongly typed delivery client using the provided schema. + * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. + * When schema is omitted or undefined, codenames are generic strings. * - * The schema is used to infer codenames and other metadata, so your code - * gets full compile-time safety. + * We highly recommend generating the schema using the `@kontent-ai/model-generator` npm package. + * and passing it here for full compile-time safety. * - * We strongly recommend generating the schema using the `@kontent-ai/model-generator` - * npm package and passing it here. + * By enabling the response validation, you can also achieve a run-time type safety. * * @example + * // With schema – narrow codename types * const client = createDeliveryClient({ * apiMode: "public", * environmentId: "x", - * schema: { - * languageCodenames: ["en-us", "de-de"] as const, - * taxonomyCodenames: ["categories"] as const, - * }, + * schema: { languageCodenames: ["en-us", "es-es"], taxonomyCodenames: ["tags"] }, * }); - */ -export function createDeliveryClient>( - config: DeliveryClientConfig> & { readonly schema: TSchema }, -): DeliveryClient>; - -/** - * Creates a delivery client when you don't want to provide a concrete schema. * - * This overload is more permissive and keeps codenames as generic strings, - * which means you lose the compile-time guarantees that the typed overload provides. - * - * Prefer the overload above with an explicit `schema` whenever possible to get - * better type safety and earlier feedback from the compiler. + * @example + * // Without schema – schema optional, codenames are string + * const client = createDeliveryClient({ + * apiMode: "public", + * environmentId: "x", + * }); */ -export function createDeliveryClient(config: DeliveryClientConfig): DeliveryClient { - const configWithSchema: DeliveryClientConfigWithSchema = { +export function createDeliveryClient( + config: DeliveryClientConfig, +): DeliveryClient { + if (config.schema === undefined) { + const schema = toRequiredSchema(undefined); + const configWithSchema: DeliveryClientConfigWithSchema = { + ...config, + schema, + }; + return { + config: config, + listTaxonomies: () => listTaxonomiesQuery(configWithSchema), + listLanguages: () => listLanguagesQuery(configWithSchema), + listContentTypes: () => listContentTypes(configWithSchema), + } as DeliveryClient; + } + const schema = config.schema; + const configWithSchema: DeliveryClientConfigWithSchema = { ...config, - schema: toRequiredSchema(config.schema), + schema, }; return { - config, - listTaxonomies: () => listTaxonomiesQuery(configWithSchema), - listLanguages: () => listLanguagesQuery(configWithSchema), - listContentTypes: () => listContentTypes(configWithSchema), + config: config, + listTaxonomies: () => listTaxonomiesQuery(configWithSchema), + listLanguages: () => listLanguagesQuery(configWithSchema), + listContentTypes: () => listContentTypes(configWithSchema), }; } -// const fe = createDeliveryClient({ -// apiMode: "preview", -// deliveryApiKey: "x", -// environmentId: "c", -// schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, -// }); +const fe = createDeliveryClient({ + apiMode: "preview", + deliveryApiKey: "x", + environmentId: "c", + schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: [] }, +}); + +type Fe3 = InferClientTypesFromSchema<{ + readonly taxonomyCodenames: readonly ("categories" | "tags")[]; + readonly languageCodenames: readonly ("en-us" | "de-de")[]; + readonly contentTypeCodenames: readonly ("article" | "product")[]; +}>; -// type Fe3 = InferClientTypesFromSchema<{ -// readonly taxonomyCodenames: readonly ("categories" | "tags")[]; -// readonly languageCodenames: readonly ("en-us" | "de-de")[]; -// }>; +const fe3: DeliveryClient = createDeliveryClient({ + apiMode: "preview", + deliveryApiKey: "x", + environmentId: "c", + schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: [] }, +}); -// const fe3: DeliveryClient = createDeliveryClient({ -// apiMode: "preview", -// deliveryApiKey: "x", -// environmentId: "c", -// schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, -// }); +const fe4 = createDeliveryClient({ + apiMode: "preview", + deliveryApiKey: "x", + environmentId: "c", +}); + +const query = await fe.listLanguages().fetchAllPages(); +const query3 = await fe3.listLanguages().fetchAllPages(); +const query4 = await fe4.listLanguages().fetchAllPages(); + +if (query.responses[0]?.payload.languages[0]) { + query.responses[0].payload.languages[0].system.codename === ""; + query.responses[0].payload.languages[0].system.codename === "de-de"; +} -// const query = await fe.listLanguages().fetchAllPages(); -// const query3 = await fe3.listLanguages().fetchAllPages(); -// query.responses[0]?.payload.languages[0]?.system.codename === "en-s"; -// query3.responses[0]?.payload.languages[0]?.system.codename === "de-d"; +query.responses[0]?.payload.languages[0]?.system.codename === "de-de2"; +query3.responses[0]?.payload.languages[0]?.system.codename === "de-de45"; +query4.responses[0]?.payload.languages[0]?.system.codename === "en-us"; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index b7673e19..7339917a 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -4,20 +4,24 @@ import type { ListContentTypesQuery } from "../queries/content-types/list-conten import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; -export type DeliveryClientTypes = { - // readonly contentItemType: IContentItem; - // readonly contentTypeCodenames: readonly [string, ...string[]]; - // readonly workflowCodenames: readonly [string, ...string[]]; - // readonly workflowStepCodenames: readonly [string, ...string[]]; - // readonly collectionCodenames: readonly [string, ...string[]]; - readonly taxonomyCodenames: readonly string[]; +export type InferClientTypesFromSchema = { + readonly languageCodenames: TSchema["languageCodenames"]; + readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; + readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; +}; + +export type DeliveryClientSchema = { readonly languageCodenames: readonly string[]; - // readonly elementCodenames: readonly [string, ...string[]]; + readonly taxonomyCodenames: readonly string[]; + readonly contentTypeCodenames: readonly string[]; }; -export type DeliveryClientSchema = { - readonly taxonomyCodenames: TDeliveryClientTypes["taxonomyCodenames"]; - readonly languageCodenames: TDeliveryClientTypes["languageCodenames"]; +export type DefaultDeliveryClientSchema = DeliveryClientSchema; + +export type DeliveryClientTypesFromSchema = { + readonly languageCodenames: TSchema["languageCodenames"]; + readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; + readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; }; export type DeliveryResponseMeta = Pick, "status" | "responseHeaders"> & { @@ -31,7 +35,7 @@ export type DeliveryResponse = { export type ApiMode = "public" | "preview" | "secure"; -export type DeliveryClientConfig = SdkConfig & +export type DeliveryClientConfig = SdkConfig & ApiDeliveryClientConfig & { /** * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. @@ -47,7 +51,7 @@ export type DeliveryClientConfig; + readonly schema?: TSchema | undefined; }; export type ApiDeliveryClientConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; @@ -66,32 +70,32 @@ export type SecureDeliveryClientConfig = { readonly deliveryApiKey: string; }; +export type DeliveryClientConfigWithSchema = DeliveryClientConfig & { + readonly schema: TSchema; +}; + /** * Delivery client instance. This is the main entry point for the delivery API. - * */ -export type DeliveryClient = { - readonly config: DeliveryClientConfig; +export type DeliveryClient = { + readonly config: DeliveryClientConfig; /** * List languages. */ - listLanguages(): ListLanguagesQuery; + listLanguages(): ListLanguagesQuery; /** * List taxonomies. */ - listTaxonomies(): ListTaxonomiesQuery; + listTaxonomies(): ListTaxonomiesQuery; /** * List content types. */ - listContentTypes(): ListContentTypesQuery; + listContentTypes(): ListContentTypesQuery; }; -export type DeliveryClientConfigWithSchema = DeliveryClientConfig & - Required, "schema">>; - export const paginationSchema = z.object({ pagination: z .object({ diff --git a/lib/public_api.ts b/lib/public_api.ts index 803ad913..2632c1ea 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,10 +2,11 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, + DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - DeliveryClientTypes, + DeliveryClientTypesFromSchema, DeliveryResponse, DeliveryResponseMeta, } from "./models/core.models.js"; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 4324e168..4c49df85 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,15 +1,15 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const contentTypePayload = (schema: DeliveryClientSchema) => +export const contentTypePayload = (schema: TSchema) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.taxonomyCodenames), + codename: getCodenameSchema>(schema.contentTypeCodenames), last_modified: z.iso.datetime(), }) .readonly(), @@ -17,9 +17,7 @@ export const contentTypePayload = ( - schema: DeliveryClientSchema, -) => +export const listContentTypesPayload = (schema: TSchema) => z .object({ types: z.array(contentTypePayload(schema)).readonly(), @@ -27,10 +25,8 @@ export const listContentTypesPayload = = z.infer< - ReturnType> ->; +export type ContentTypePayload = z.infer>>; -export type ContentTypePayload = z.infer< - ReturnType> +export type ListContentTypesPayload = z.infer< + ReturnType> >; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 2eaba384..43144eaa 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,16 +1,13 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; -export type ListContentTypesQuery = PagedFetchQuery< - ListContentTypesPayload, - unknown ->; +export type ListContentTypesQuery = PagedFetchQuery, unknown>; -export function listContentTypes( - config: DeliveryClientConfigWithSchema, -): ListContentTypesQuery { +export function listContentTypes( + config: DeliveryClientConfigWithSchema, +): ListContentTypesQuery { return createDeliveryPagingQuery({ config, zodSchema: listContentTypesPayload(config.schema), diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index a3d5976e..69ae76c6 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,7 +1,12 @@ import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfig, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; +import type { + DefaultDeliveryClientSchema, + DeliveryClientConfigWithSchema, + DeliveryEndpoints, + PaginationSchema, +} from "../models/core.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; @@ -10,7 +15,7 @@ export function createDeliveryPagingQuery({ zodSchema, endpoint, }: { - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfigWithSchema; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { @@ -24,7 +29,7 @@ export function createDeliveryPagingQuery({ getNextPageData: getNextPageByUrl(), request: { url: getDeliveryUrl({ path: endpoint, ...config }), - authorizationApiKey: "deliveryApiKey" in config ? config.deliveryApiKey : undefined, + authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, }, }); } diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index bee22627..1a3a5aab 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,23 +1,21 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (schema: DeliveryClientSchema) => +export const languagePayload = (schema: TSchema) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.languageCodenames), + codename: getCodenameSchema(schema.languageCodenames), }) .readonly(), }) .readonly(); -export const listLanguagesPayload = ( - schema: DeliveryClientSchema, -) => +export const listLanguagesPayload = (schema: TSchema) => z .object({ languages: z.array(languagePayload(schema)).readonly(), @@ -25,10 +23,6 @@ export const listLanguagesPayload = = z.infer< - ReturnType> ->; +export type LanguagePayload = z.infer>>; -export type LanguagePayload = z.infer< - ReturnType> ->; +export type ListLanguagesPayload = z.infer>>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index c2bdef70..da62b729 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,16 +1,13 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = PagedFetchQuery< - ListLanguagesPayload, - unknown ->; +export type ListLanguagesQuery = PagedFetchQuery, unknown>; -export function listLanguagesQuery( - config: DeliveryClientConfigWithSchema, -): ListLanguagesQuery { +export function listLanguagesQuery( + config: DeliveryClientConfigWithSchema, +): ListLanguagesQuery { return createDeliveryPagingQuery({ config, zodSchema: listLanguagesPayload(config.schema), diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 5a0cfda9..63b1950a 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,19 +1,16 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientTypes } from "../../models/core.models.js"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; -export type ListTaxonomiesQuery = PagedFetchQuery< - ListTaxonomiesPayload, - unknown ->; +export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; -export function listTaxonomiesQuery( - config: DeliveryClientConfigWithSchema, -): ListTaxonomiesQuery { +export function listTaxonomiesQuery( + config: DeliveryClientConfigWithSchema, +): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, - zodSchema: listTaxonomiesPayload(config.schema), + zodSchema: listTaxonomiesPayload(config.schema), endpoint: "taxonomies", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 5ea8b713..6f4a40a7 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,24 +1,24 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, type DeliveryClientTypes, paginationSchema } from "../../models/core.models.js"; +import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const taxonomyTermPayload = (schema: DeliveryClientSchema) => +export const taxonomyTermPayload = (schema: TSchema) => z.object({ name: z.string(), - codename: getCodenameSchema(schema.taxonomyCodenames), + codename: getCodenameSchema(schema.taxonomyCodenames), get terms() { return z.array(taxonomyTermPayload(schema)).readonly(); }, }); -export const taxonomyPayload = (schema: DeliveryClientSchema) => +export const taxonomyPayload = (schema: TSchema) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.taxonomyCodenames), + codename: getCodenameSchema(schema.taxonomyCodenames), last_modified: z.iso.datetime(), }) .readonly(), @@ -26,9 +26,7 @@ export const taxonomyPayload = ( - schema: DeliveryClientSchema, -) => +export const listTaxonomiesPayload = (schema: TSchema) => z .object({ taxonomies: z.array(taxonomyPayload(schema)).readonly(), @@ -36,10 +34,8 @@ export const listTaxonomiesPayload = = z.infer< - ReturnType> ->; +export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer< - ReturnType> ->; +export type TaxonomyPayload = z.infer>>; + +export type ListTaxonomiesPayload = z.infer>>; diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts index b5d2badf..a1dccdb9 100644 --- a/lib/utils/schema.utils.ts +++ b/lib/utils/schema.utils.ts @@ -1,7 +1,12 @@ -import type { DeliveryClientSchema, DeliveryClientTypes } from "../models/core.models.js"; +import type { DefaultDeliveryClientSchema } from "../models/core.models.js"; -export function toRequiredSchema( - schema?: DeliveryClientSchema, -): DeliveryClientSchema { - return schema ?? { languageCodenames: [], taxonomyCodenames: [] }; +const defaultSchema = { + languageCodenames: [] as const, + taxonomyCodenames: [] as const, +} satisfies DefaultDeliveryClientSchema; + +export function toRequiredSchema( + schema?: T, +): [T] extends [undefined] ? DefaultDeliveryClientSchema : NonNullable { + return (schema ?? defaultSchema) as [T] extends [undefined] ? DefaultDeliveryClientSchema : NonNullable; } diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index de0bdb9d..78954402 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,20 +1,13 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; -import type { DeliveryClient, DeliveryClientSchema, DeliveryClientTypes } from "../../lib/models/core.models.js"; -type DeliveryTypes = DeliveryClientTypes & { - readonly languageCodenames: readonly ["en-US", "cs-CZ"]; -}; - -const schema: DeliveryClientSchema = { - languageCodenames: ["en-US", "cs-CZ"], - taxonomyCodenames: ["categories"], -}; - -const client: DeliveryClient = createDeliveryClient({ +const client = createDeliveryClient({ apiMode: "public", environmentId: "x", - schema, + schema: { + languageCodenames: ["en-US", "cs-CZ"] as const, + taxonomyCodenames: ["categories"] as const, + }, responseValidation: { enable: false, }, @@ -27,12 +20,13 @@ const client: DeliveryClient = createDeliveryClient({ const languageResponse = await client.listLanguages().fetchPage(); // Verifies that the language codenames are assignable from the response schema -const validLanguageCodenames: readonly ("en-US" | "cs-CZ")[] = languageResponse.payload.languages.map( - (language) => language.system.codename, -); +const validLanguageCodenames = languageResponse.payload.languages.map((language) => language.system.codename) as readonly ( + | "en-US" + | "cs-CZ" +)[]; // @ts-expect-error - "de-DE" is not allowed -const invalidLanguageCodename: DeliveryTypes["languageCodenames"][number] = "de-DE"; +const invalidLanguageCodename: "en-US" | "cs-CZ" = "de-DE"; void validLanguageCodenames; void invalidLanguageCodename; diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 0db1b306..b88c1a42 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -1,13 +1,13 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { InferClientTypesFromSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -type TestDeliveryClientTypes = DeliveryClientTypes & { +type TestDeliveryClientTypes = InferClientTypesFromSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; -}; +}>; describe("Schema validation", () => { const mockPayload: ListLanguagesPayload = { From 471b56ad61297b5b870b01f1fc57c3ec7a663fff Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 12:09:34 +0100 Subject: [PATCH 034/221] refactoring --- lib/client/delivery-client.ts | 31 ++++++------ lib/models/core.models.ts | 24 ++++++++-- lib/queries/languages/language.models.ts | 11 +++-- lib/utils/schema.utils.ts | 1 + .../unit/validation/schema-validation.spec.ts | 47 +++++++++++++++++-- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index b51ba4cd..5dcb1d9b 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -3,7 +3,8 @@ import type { DeliveryClient, DeliveryClientConfig, DeliveryClientConfigWithSchema, - InferClientTypesFromSchema, + FullDeliveryClientSchema, + PartialDeliveryClientShema, } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; @@ -34,29 +35,28 @@ import { toRequiredSchema } from "../utils/schema.utils.js"; * environmentId: "x", * }); */ -export function createDeliveryClient( +export function createDeliveryClient( config: DeliveryClientConfig, -): DeliveryClient { +): DeliveryClient> { if (config.schema === undefined) { - const schema = toRequiredSchema(undefined); const configWithSchema: DeliveryClientConfigWithSchema = { ...config, - schema, + schema: toRequiredSchema(undefined), }; return { - config: config, + config: configWithSchema, listTaxonomies: () => listTaxonomiesQuery(configWithSchema), listLanguages: () => listLanguagesQuery(configWithSchema), listContentTypes: () => listContentTypes(configWithSchema), - } as DeliveryClient; + }; } const schema = config.schema; - const configWithSchema: DeliveryClientConfigWithSchema = { + const configWithSchema: DeliveryClientConfigWithSchema> = { ...config, - schema, + schema: schema as FullDeliveryClientSchema, }; return { - config: config, + config: configWithSchema, listTaxonomies: () => listTaxonomiesQuery(configWithSchema), listLanguages: () => listLanguagesQuery(configWithSchema), listContentTypes: () => listContentTypes(configWithSchema), @@ -67,10 +67,13 @@ const fe = createDeliveryClient({ apiMode: "preview", deliveryApiKey: "x", environmentId: "c", - schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: [] }, + schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: ["g"] }, }); -type Fe3 = InferClientTypesFromSchema<{ +const fefe = await fe.listContentTypes().fetchAllPages(); +const ggg = fefe.responses[0]?.payload.types[0]?.system.codename; + +type Fe3 = FullDeliveryClientSchema<{ readonly taxonomyCodenames: readonly ("categories" | "tags")[]; readonly languageCodenames: readonly ("en-us" | "de-de")[]; readonly contentTypeCodenames: readonly ("article" | "product")[]; @@ -95,9 +98,9 @@ const query4 = await fe4.listLanguages().fetchAllPages(); if (query.responses[0]?.payload.languages[0]) { query.responses[0].payload.languages[0].system.codename === ""; - query.responses[0].payload.languages[0].system.codename === "de-de"; + query.responses[0].payload.languages[0].system.codename === "de-de2"; } query.responses[0]?.payload.languages[0]?.system.codename === "de-de2"; -query3.responses[0]?.payload.languages[0]?.system.codename === "de-de45"; +query3.responses[0]?.payload.languages[0]?.system.codename === "de-de"; query4.responses[0]?.payload.languages[0]?.system.codename === "en-us"; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 7339917a..9a82a971 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -4,10 +4,24 @@ import type { ListContentTypesQuery } from "../queries/content-types/list-conten import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; -export type InferClientTypesFromSchema = { - readonly languageCodenames: TSchema["languageCodenames"]; - readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; - readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; +export type PartialDeliveryClientShema = { + readonly languageCodenames?: readonly string[]; + readonly taxonomyCodenames?: readonly string[]; + readonly contentTypeCodenames?: readonly string[]; +}; + +export type AllDeliverySchema = { + readonly languageCodenames: readonly string[]; + readonly taxonomyCodenames: readonly string[]; + readonly contentTypeCodenames: readonly string[]; +}; + +export type FullDeliveryClientSchema = { + readonly languageCodenames: TSchema["languageCodenames"] extends readonly string[] ? TSchema["languageCodenames"] : readonly string[]; + readonly taxonomyCodenames: TSchema["taxonomyCodenames"] extends readonly string[] ? TSchema["taxonomyCodenames"] : readonly string[]; + readonly contentTypeCodenames: TSchema["contentTypeCodenames"] extends readonly string[] + ? TSchema["contentTypeCodenames"] + : readonly string[]; }; export type DeliveryClientSchema = { @@ -35,7 +49,7 @@ export type DeliveryResponse = { export type ApiMode = "public" | "preview" | "secure"; -export type DeliveryClientConfig = SdkConfig & +export type DeliveryClientConfig = SdkConfig & ApiDeliveryClientConfig & { /** * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 1a3a5aab..b0ad8049 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,21 +1,21 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import { type DefaultDeliveryClientSchema, type PartialDeliveryClientShema, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (schema: TSchema) => +export const languagePayload = (schema: TSchema) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.languageCodenames), + codename: getCodenameSchema>(schema.languageCodenames), }) .readonly(), }) .readonly(); -export const listLanguagesPayload = (schema: TSchema) => +export const listLanguagesPayload = (schema: TSchema) => z .object({ languages: z.array(languagePayload(schema)).readonly(), @@ -26,3 +26,6 @@ export const listLanguagesPayload = = z.infer>>; export type ListLanguagesPayload = z.infer>>; + +/** Non-distributive: when T is a union (e.g. readonly string[] | undefined), resolves to readonly string[] so the argument is assignable. */ +//type CodenameArray = [T] extends [readonly string[]] ? T : readonly string[]; diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts index a1dccdb9..fd51d8c0 100644 --- a/lib/utils/schema.utils.ts +++ b/lib/utils/schema.utils.ts @@ -3,6 +3,7 @@ import type { DefaultDeliveryClientSchema } from "../models/core.models.js"; const defaultSchema = { languageCodenames: [] as const, taxonomyCodenames: [] as const, + contentTypeCodenames: [] as const, } satisfies DefaultDeliveryClientSchema; export function toRequiredSchema( diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index b88c1a42..04a09890 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -1,15 +1,54 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { InferClientTypesFromSchema } from "../../../lib/models/core.models.js"; +import type { FullDeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -type TestDeliveryClientTypes = InferClientTypesFromSchema<{ - readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; -}>; +type PartialSchemaInput = { + readonly languageCodenames?: readonly string[]; + readonly taxonomyCodenames?: readonly string[]; + readonly contentTypeCodenames?: readonly string[]; +}; + +type InferFullSchema = { + readonly languageCodenames: T["languageCodenames"] extends readonly string[] ? T["languageCodenames"] : readonly string[]; + readonly taxonomyCodenames: T["taxonomyCodenames"] extends readonly string[] ? T["taxonomyCodenames"] : readonly string[]; + readonly contentTypeCodenames: T["contentTypeCodenames"] extends readonly string[] ? T["contentTypeCodenames"] : readonly string[]; +}; + +function createPartialShema(schema: T): InferFullSchema { + return { + languageCodenames: schema.languageCodenames ?? [], + taxonomyCodenames: schema.taxonomyCodenames ?? [], + contentTypeCodenames: schema.contentTypeCodenames ?? [], + }; +} + +const fe = createPartialShema({ + contentTypeCodenames: ["f"], +}); + +const clientfefe = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: ["en-US", "cs-CZ"] }, +}); +void fe; +void clientfefe; +const bbb = await clientfefe.listLanguages().fetchPage(); +const ccc = await clientfefe.listTaxonomies().fetchPage(); +bbb.payload.languages[0]?.system.codename === "cs-CZ2"; +const fgggge = ccc.payload.taxonomies[0]?.system.codename === "fefefe"; +const hzthzhz = ccc.payload.taxonomies[0]?.system.codename; describe("Schema validation", () => { + type TestDeliveryClientTypes = FullDeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly []; + }>; + const mockPayload: ListLanguagesPayload = { languages: [ { From bbf9cc90cdf720bd5b66cb6aa11a1a8cc27cc787 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 12:13:45 +0100 Subject: [PATCH 035/221] refactoring --- lib/client/delivery-client.ts | 7 ++++--- lib/queries/content-types/content-type.models.ts | 2 +- lib/queries/languages/language.models.ts | 11 ++++------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 5dcb1d9b..468c01c1 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -67,7 +67,7 @@ const fe = createDeliveryClient({ apiMode: "preview", deliveryApiKey: "x", environmentId: "c", - schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: ["g"] }, + schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, }); const fefe = await fe.listContentTypes().fetchAllPages(); @@ -97,10 +97,11 @@ const query3 = await fe3.listLanguages().fetchAllPages(); const query4 = await fe4.listLanguages().fetchAllPages(); if (query.responses[0]?.payload.languages[0]) { - query.responses[0].payload.languages[0].system.codename === ""; - query.responses[0].payload.languages[0].system.codename === "de-de2"; + query.responses[0].payload.languages[0].system.codename === "de-de"; + query.responses[0].payload.languages[0].system.codename === "de-deF"; } query.responses[0]?.payload.languages[0]?.system.codename === "de-de2"; query3.responses[0]?.payload.languages[0]?.system.codename === "de-de"; + query4.responses[0]?.payload.languages[0]?.system.codename === "en-us"; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 4c49df85..3e99ec30 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -9,7 +9,7 @@ export const contentTypePayload = ( .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema>(schema.contentTypeCodenames), + codename: getCodenameSchema(schema.contentTypeCodenames), last_modified: z.iso.datetime(), }) .readonly(), diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index b0ad8049..1a3a5aab 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,21 +1,21 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DefaultDeliveryClientSchema, type PartialDeliveryClientShema, paginationSchema } from "../../models/core.models.js"; +import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (schema: TSchema) => +export const languagePayload = (schema: TSchema) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema>(schema.languageCodenames), + codename: getCodenameSchema(schema.languageCodenames), }) .readonly(), }) .readonly(); -export const listLanguagesPayload = (schema: TSchema) => +export const listLanguagesPayload = (schema: TSchema) => z .object({ languages: z.array(languagePayload(schema)).readonly(), @@ -26,6 +26,3 @@ export const listLanguagesPayload = export type LanguagePayload = z.infer>>; export type ListLanguagesPayload = z.infer>>; - -/** Non-distributive: when T is a union (e.g. readonly string[] | undefined), resolves to readonly string[] so the argument is assignable. */ -//type CodenameArray = [T] extends [readonly string[]] ? T : readonly string[]; From 59fdc1d4e14fd5fd6d20b6ed58fef8d1cf94cdb7 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 12:58:40 +0100 Subject: [PATCH 036/221] refactoring --- lib/client/delivery-client.ts | 69 ++----------------- lib/models/core.models.ts | 22 ++---- lib/public_api.ts | 2 +- .../content-types/content-type.models.ts | 12 ++-- .../content-types/list-content-types-query.ts | 6 +- lib/queries/delivery-queries.ts | 9 +-- lib/queries/languages/language.models.ts | 10 +-- lib/queries/languages/list-languages-query.ts | 6 +- .../taxonomies/list-taxonomies-query.ts | 6 +- lib/queries/taxonomies/taxonomy.models.ts | 14 ++-- lib/utils/schema.utils.ts | 24 ++++--- .../unit/validation/schema-validation.spec.ts | 43 +----------- 12 files changed, 55 insertions(+), 168 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 468c01c1..a577f8c6 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,15 +1,14 @@ import type { - DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig, DeliveryClientConfigWithSchema, - FullDeliveryClientSchema, + DeliveryClientSchema, PartialDeliveryClientShema, } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; -import { toRequiredSchema } from "../utils/schema.utils.js"; +import { getDefaultSchema, toFullSchema } from "../utils/schema.utils.js"; /** * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. @@ -25,7 +24,7 @@ import { toRequiredSchema } from "../utils/schema.utils.js"; * const client = createDeliveryClient({ * apiMode: "public", * environmentId: "x", - * schema: { languageCodenames: ["en-us", "es-es"], taxonomyCodenames: ["tags"] }, + * schema: { languageCodenames: ["en-us", "es-es"] }, * }); * * @example @@ -37,23 +36,10 @@ import { toRequiredSchema } from "../utils/schema.utils.js"; */ export function createDeliveryClient( config: DeliveryClientConfig, -): DeliveryClient> { - if (config.schema === undefined) { - const configWithSchema: DeliveryClientConfigWithSchema = { - ...config, - schema: toRequiredSchema(undefined), - }; - return { - config: configWithSchema, - listTaxonomies: () => listTaxonomiesQuery(configWithSchema), - listLanguages: () => listLanguagesQuery(configWithSchema), - listContentTypes: () => listContentTypes(configWithSchema), - }; - } - const schema = config.schema; - const configWithSchema: DeliveryClientConfigWithSchema> = { +): DeliveryClient> { + const configWithSchema: DeliveryClientConfigWithSchema> = { ...config, - schema: schema as FullDeliveryClientSchema, + schema: toFullSchema(config.schema ?? getDefaultSchema()), }; return { config: configWithSchema, @@ -62,46 +48,3 @@ export function createDeliveryClient listContentTypes(configWithSchema), }; } - -const fe = createDeliveryClient({ - apiMode: "preview", - deliveryApiKey: "x", - environmentId: "c", - schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"] }, -}); - -const fefe = await fe.listContentTypes().fetchAllPages(); -const ggg = fefe.responses[0]?.payload.types[0]?.system.codename; - -type Fe3 = FullDeliveryClientSchema<{ - readonly taxonomyCodenames: readonly ("categories" | "tags")[]; - readonly languageCodenames: readonly ("en-us" | "de-de")[]; - readonly contentTypeCodenames: readonly ("article" | "product")[]; -}>; - -const fe3: DeliveryClient = createDeliveryClient({ - apiMode: "preview", - deliveryApiKey: "x", - environmentId: "c", - schema: { languageCodenames: ["en-us", "de-de"], taxonomyCodenames: ["categories"], contentTypeCodenames: [] }, -}); - -const fe4 = createDeliveryClient({ - apiMode: "preview", - deliveryApiKey: "x", - environmentId: "c", -}); - -const query = await fe.listLanguages().fetchAllPages(); -const query3 = await fe3.listLanguages().fetchAllPages(); -const query4 = await fe4.listLanguages().fetchAllPages(); - -if (query.responses[0]?.payload.languages[0]) { - query.responses[0].payload.languages[0].system.codename === "de-de"; - query.responses[0].payload.languages[0].system.codename === "de-deF"; -} - -query.responses[0]?.payload.languages[0]?.system.codename === "de-de2"; -query3.responses[0]?.payload.languages[0]?.system.codename === "de-de"; - -query4.responses[0]?.payload.languages[0]?.system.codename === "en-us"; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 9a82a971..78326086 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -10,13 +10,7 @@ export type PartialDeliveryClientShema = { readonly contentTypeCodenames?: readonly string[]; }; -export type AllDeliverySchema = { - readonly languageCodenames: readonly string[]; - readonly taxonomyCodenames: readonly string[]; - readonly contentTypeCodenames: readonly string[]; -}; - -export type FullDeliveryClientSchema = { +export type DeliveryClientSchema = { readonly languageCodenames: TSchema["languageCodenames"] extends readonly string[] ? TSchema["languageCodenames"] : readonly string[]; readonly taxonomyCodenames: TSchema["taxonomyCodenames"] extends readonly string[] ? TSchema["taxonomyCodenames"] : readonly string[]; readonly contentTypeCodenames: TSchema["contentTypeCodenames"] extends readonly string[] @@ -24,15 +18,7 @@ export type FullDeliveryClientSchema : readonly string[]; }; -export type DeliveryClientSchema = { - readonly languageCodenames: readonly string[]; - readonly taxonomyCodenames: readonly string[]; - readonly contentTypeCodenames: readonly string[]; -}; - -export type DefaultDeliveryClientSchema = DeliveryClientSchema; - -export type DeliveryClientTypesFromSchema = { +export type DeliveryClientTypesFromSchema = { readonly languageCodenames: TSchema["languageCodenames"]; readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; @@ -84,14 +70,14 @@ export type SecureDeliveryClientConfig = { readonly deliveryApiKey: string; }; -export type DeliveryClientConfigWithSchema = DeliveryClientConfig & { +export type DeliveryClientConfigWithSchema = DeliveryClientConfig & { readonly schema: TSchema; }; /** * Delivery client instance. This is the main entry point for the delivery API. */ -export type DeliveryClient = { +export type DeliveryClient = { readonly config: DeliveryClientConfig; /** diff --git a/lib/public_api.ts b/lib/public_api.ts index 2632c1ea..9b4d2e5d 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,9 +2,9 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, - DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig, + DeliveryClientSchema as DefaultDeliveryClientSchema, DeliveryClientSchema, DeliveryClientTypesFromSchema, DeliveryResponse, diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 3e99ec30..dc8e32cb 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,8 +1,8 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const contentTypePayload = (schema: TSchema) => +export const contentTypePayload = (schema: TSchema) => z .object({ system: z @@ -17,7 +17,7 @@ export const contentTypePayload = ( }) .readonly(); -export const listContentTypesPayload = (schema: TSchema) => +export const listContentTypesPayload = (schema: TSchema) => z .object({ types: z.array(contentTypePayload(schema)).readonly(), @@ -25,8 +25,6 @@ export const listContentTypesPayload = = z.infer>>; +export type ContentTypePayload = z.infer>>; -export type ListContentTypesPayload = z.infer< - ReturnType> ->; +export type ListContentTypesPayload = z.infer>>; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 43144eaa..c3d17651 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,11 +1,11 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; -export type ListContentTypesQuery = PagedFetchQuery, unknown>; +export type ListContentTypesQuery = PagedFetchQuery, unknown>; -export function listContentTypes( +export function listContentTypes( config: DeliveryClientConfigWithSchema, ): ListContentTypesQuery { return createDeliveryPagingQuery({ diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 69ae76c6..7a6f4ed9 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,12 +1,7 @@ import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { - DefaultDeliveryClientSchema, - DeliveryClientConfigWithSchema, - DeliveryEndpoints, - PaginationSchema, -} from "../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientSchema, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; @@ -15,7 +10,7 @@ export function createDeliveryPagingQuery({ zodSchema, endpoint, }: { - readonly config: DeliveryClientConfigWithSchema; + readonly config: DeliveryClientConfigWithSchema; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 1a3a5aab..d86385a3 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,8 +1,8 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (schema: TSchema) => +export const languagePayload = (schema: TSchema) => z .object({ system: z @@ -15,7 +15,7 @@ export const languagePayload = (sch }) .readonly(); -export const listLanguagesPayload = (schema: TSchema) => +export const listLanguagesPayload = (schema: TSchema) => z .object({ languages: z.array(languagePayload(schema)).readonly(), @@ -23,6 +23,6 @@ export const listLanguagesPayload = = z.infer>>; +export type LanguagePayload = z.infer>>; -export type ListLanguagesPayload = z.infer>>; +export type ListLanguagesPayload = z.infer>>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index da62b729..369cdc63 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,11 +1,11 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = PagedFetchQuery, unknown>; +export type ListLanguagesQuery = PagedFetchQuery, unknown>; -export function listLanguagesQuery( +export function listLanguagesQuery( config: DeliveryClientConfigWithSchema, ): ListLanguagesQuery { return createDeliveryPagingQuery({ diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 63b1950a..591dcbf6 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,11 +1,11 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfigWithSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; -export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; +export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; -export function listTaxonomiesQuery( +export function listTaxonomiesQuery( config: DeliveryClientConfigWithSchema, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 6f4a40a7..9e319abf 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,8 +1,8 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DefaultDeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const taxonomyTermPayload = (schema: TSchema) => +export const taxonomyTermPayload = (schema: TSchema) => z.object({ name: z.string(), codename: getCodenameSchema(schema.taxonomyCodenames), @@ -11,7 +11,7 @@ export const taxonomyTermPayload = }, }); -export const taxonomyPayload = (schema: TSchema) => +export const taxonomyPayload = (schema: TSchema) => z .object({ system: z @@ -26,7 +26,7 @@ export const taxonomyPayload = (sch }) .readonly(); -export const listTaxonomiesPayload = (schema: TSchema) => +export const listTaxonomiesPayload = (schema: TSchema) => z .object({ taxonomies: z.array(taxonomyPayload(schema)).readonly(), @@ -34,8 +34,8 @@ export const listTaxonomiesPayload = = z.infer>>; +export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer>>; +export type TaxonomyPayload = z.infer>>; -export type ListTaxonomiesPayload = z.infer>>; +export type ListTaxonomiesPayload = z.infer>>; diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts index fd51d8c0..6d39e244 100644 --- a/lib/utils/schema.utils.ts +++ b/lib/utils/schema.utils.ts @@ -1,13 +1,17 @@ -import type { DefaultDeliveryClientSchema } from "../models/core.models.js"; +import type { DeliveryClientSchema, PartialDeliveryClientShema } from "../models/core.models.js"; -const defaultSchema = { - languageCodenames: [] as const, - taxonomyCodenames: [] as const, - contentTypeCodenames: [] as const, -} satisfies DefaultDeliveryClientSchema; +export function getDefaultSchema(): DeliveryClientSchema { + return { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + }; +} -export function toRequiredSchema( - schema?: T, -): [T] extends [undefined] ? DefaultDeliveryClientSchema : NonNullable { - return (schema ?? defaultSchema) as [T] extends [undefined] ? DefaultDeliveryClientSchema : NonNullable; +export function toFullSchema(schema: TSchema): DeliveryClientSchema { + return { + languageCodenames: schema.languageCodenames ?? [], + taxonomyCodenames: schema.taxonomyCodenames ?? [], + contentTypeCodenames: schema.contentTypeCodenames ?? [], + }; } diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 04a09890..0266759b 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -1,52 +1,13 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { FullDeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -type PartialSchemaInput = { - readonly languageCodenames?: readonly string[]; - readonly taxonomyCodenames?: readonly string[]; - readonly contentTypeCodenames?: readonly string[]; -}; - -type InferFullSchema = { - readonly languageCodenames: T["languageCodenames"] extends readonly string[] ? T["languageCodenames"] : readonly string[]; - readonly taxonomyCodenames: T["taxonomyCodenames"] extends readonly string[] ? T["taxonomyCodenames"] : readonly string[]; - readonly contentTypeCodenames: T["contentTypeCodenames"] extends readonly string[] ? T["contentTypeCodenames"] : readonly string[]; -}; - -function createPartialShema(schema: T): InferFullSchema { - return { - languageCodenames: schema.languageCodenames ?? [], - taxonomyCodenames: schema.taxonomyCodenames ?? [], - contentTypeCodenames: schema.contentTypeCodenames ?? [], - }; -} - -const fe = createPartialShema({ - contentTypeCodenames: ["f"], -}); - -const clientfefe = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { languageCodenames: ["en-US", "cs-CZ"] }, -}); -void fe; -void clientfefe; -const bbb = await clientfefe.listLanguages().fetchPage(); -const ccc = await clientfefe.listTaxonomies().fetchPage(); -bbb.payload.languages[0]?.system.codename === "cs-CZ2"; -const fgggge = ccc.payload.taxonomies[0]?.system.codename === "fefefe"; -const hzthzhz = ccc.payload.taxonomies[0]?.system.codename; - describe("Schema validation", () => { - type TestDeliveryClientTypes = FullDeliveryClientSchema<{ + type TestDeliveryClientTypes = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; - readonly taxonomyCodenames: readonly []; - readonly contentTypeCodenames: readonly []; }>; const mockPayload: ListLanguagesPayload = { From 49606da15f462a2d872b691f6585598fc52ddd66 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 14:08:46 +0100 Subject: [PATCH 037/221] refactoring --- lib/client/delivery-client.ts | 4 +- lib/models/core.models.ts | 33 +- lib/public_api.ts | 7 +- lib/utils/schema.utils.ts | 12 +- package-lock.json | 640 ++++++++---------- package.json | 4 +- .../queries/list-content-types-query.spec.ts | 8 +- .../queries/list-languages-query.spec.ts | 11 +- .../queries/list-taxonomies-query.spec.ts | 8 +- ...schema-validation-with-extra-props.spec.ts | 4 +- ...hema-validation-with-missing-props.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 33 +- 12 files changed, 338 insertions(+), 430 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index a577f8c6..124d8ab0 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -8,7 +8,7 @@ import type { import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; -import { getDefaultSchema, toFullSchema } from "../utils/schema.utils.js"; +import { resolveSchema } from "../utils/schema.utils.js"; /** * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. @@ -39,7 +39,7 @@ export function createDeliveryClient> { const configWithSchema: DeliveryClientConfigWithSchema> = { ...config, - schema: toFullSchema(config.schema ?? getDefaultSchema()), + schema: resolveSchema(config.schema), }; return { config: configWithSchema, diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 78326086..9101dff9 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,4 @@ -import type { AdapterResponse, JsonValue, SdkConfig } from "@kontent-ai/core-sdk"; +import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import z from "zod"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; @@ -18,21 +18,6 @@ export type DeliveryClientSchema = { - readonly languageCodenames: TSchema["languageCodenames"]; - readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; - readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; -}; - -export type DeliveryResponseMeta = Pick, "status" | "responseHeaders"> & { - readonly continuationToken?: string; -} & TExtraMetadata; - -export type DeliveryResponse = { - readonly payload: TPayload; - readonly meta: DeliveryResponseMeta; -}; - export type ApiMode = "public" | "preview" | "secure"; export type DeliveryClientConfig = SdkConfig & @@ -74,25 +59,11 @@ export type DeliveryClientConfigWithSchema readonly schema: TSchema; }; -/** - * Delivery client instance. This is the main entry point for the delivery API. - */ export type DeliveryClient = { readonly config: DeliveryClientConfig; - /** - * List languages. - */ listLanguages(): ListLanguagesQuery; - - /** - * List taxonomies. - */ listTaxonomies(): ListTaxonomiesQuery; - - /** - * List content types. - */ listContentTypes(): ListContentTypesQuery; }; @@ -121,5 +92,3 @@ export type DeliveryEndpoints = | "types" | `types/${string}` | `types/${string}/elements/${string}`; - -type PickStringLiteral = U; diff --git a/lib/public_api.ts b/lib/public_api.ts index 9b4d2e5d..c8dff108 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -1,14 +1,13 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the public API is fine export { createDeliveryClient } from "./client/delivery-client.js"; export type { + ApiDeliveryClientConfig, ApiMode, DeliveryClient, DeliveryClientConfig, - DeliveryClientSchema as DefaultDeliveryClientSchema, DeliveryClientSchema, - DeliveryClientTypesFromSchema, - DeliveryResponse, - DeliveryResponseMeta, + PaginationSchema, + PartialDeliveryClientShema, } from "./models/core.models.js"; /* Content Types diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts index 6d39e244..ba573416 100644 --- a/lib/utils/schema.utils.ts +++ b/lib/utils/schema.utils.ts @@ -1,6 +1,14 @@ import type { DeliveryClientSchema, PartialDeliveryClientShema } from "../models/core.models.js"; -export function getDefaultSchema(): DeliveryClientSchema { +/** + * Resolves schema from config, filling defaults when undefined. + * Centralizes the schema resolution so the delivery client stays assertion-free. + */ +export function resolveSchema(schema: TSchema | undefined): DeliveryClientSchema { + return schema ? toFullSchema(schema) : getDefaultSchema(); +} + +function getDefaultSchema(): DeliveryClientSchema { return { languageCodenames: [], taxonomyCodenames: [], @@ -8,7 +16,7 @@ export function getDefaultSchema(): DeliveryClientSchema { }; } -export function toFullSchema(schema: TSchema): DeliveryClientSchema { +function toFullSchema(schema: TSchema): DeliveryClientSchema { return { languageCodenames: schema.languageCodenames ?? [], taxonomyCodenames: schema.taxonomyCodenames ?? [], diff --git a/package-lock.json b/package-lock.json index e0cf420f..4a488c8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "17.0.0-preview.0", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.4.6", + "@biomejs/biome": "2.4.7", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "@types/node": "25.5.0", @@ -22,14 +22,14 @@ "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.16", + "@kontent-ai/core-sdk": "^12.0.0-preview.17", "zod": "^4" } }, "node_modules/@biomejs/biome": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.6.tgz", - "integrity": "sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.7.tgz", + "integrity": "sha512-vXrgcmNGZ4lpdwZSpMf1hWw1aWS6B+SyeSYKTLrNsiUsAdSRN0J4d/7mF3ogJFbIwFFSOL3wT92Zzxia/d5/ng==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -43,20 +43,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.6", - "@biomejs/cli-darwin-x64": "2.4.6", - "@biomejs/cli-linux-arm64": "2.4.6", - "@biomejs/cli-linux-arm64-musl": "2.4.6", - "@biomejs/cli-linux-x64": "2.4.6", - "@biomejs/cli-linux-x64-musl": "2.4.6", - "@biomejs/cli-win32-arm64": "2.4.6", - "@biomejs/cli-win32-x64": "2.4.6" + "@biomejs/cli-darwin-arm64": "2.4.7", + "@biomejs/cli-darwin-x64": "2.4.7", + "@biomejs/cli-linux-arm64": "2.4.7", + "@biomejs/cli-linux-arm64-musl": "2.4.7", + "@biomejs/cli-linux-x64": "2.4.7", + "@biomejs/cli-linux-x64-musl": "2.4.7", + "@biomejs/cli-win32-arm64": "2.4.7", + "@biomejs/cli-win32-x64": "2.4.7" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.6.tgz", - "integrity": "sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.7.tgz", + "integrity": "sha512-Oo0cF5mHzmvDmTXw8XSjhCia8K6YrZnk7aCS54+/HxyMdZMruMO3nfpDsrlar/EQWe41r1qrwKiCa2QDYHDzWA==", "cpu": [ "arm64" ], @@ -71,9 +71,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.6.tgz", - "integrity": "sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.7.tgz", + "integrity": "sha512-I+cOG3sd/7HdFtvDSnF9QQPrWguUH7zrkIMMykM3PtfWU9soTcS2yRb9Myq6MHmzbeCT08D1UmY+BaiMl5CcoQ==", "cpu": [ "x64" ], @@ -88,9 +88,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.6.tgz", - "integrity": "sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.7.tgz", + "integrity": "sha512-om6FugwmibzfP/6ALj5WRDVSND4H2G9X0nkI1HZpp2ySf9lW2j0X68oQSaHEnls6666oy4KDsc5RFjT4m0kV0w==", "cpu": [ "arm64" ], @@ -108,9 +108,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.6.tgz", - "integrity": "sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.7.tgz", + "integrity": "sha512-I2NvM9KPb09jWml93O2/5WMfNR7Lee5Latag1JThDRMURVhPX74p9UDnyTw3Ae6cE1DgXfw7sqQgX7rkvpc0vw==", "cpu": [ "arm64" ], @@ -128,9 +128,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.6.tgz", - "integrity": "sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.7.tgz", + "integrity": "sha512-bV8/uo2Tj+gumnk4sUdkerWyCPRabaZdv88IpbmDWARQQoA/Q0YaqPz1a+LSEDIL7OfrnPi9Hq1Llz4ZIGyIQQ==", "cpu": [ "x64" ], @@ -148,9 +148,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.6.tgz", - "integrity": "sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.7.tgz", + "integrity": "sha512-00kx4YrBMU8374zd2wHuRV5wseh0rom5HqRND+vDldJPrWwQw+mzd/d8byI9hPx926CG+vWzq6AeiT7Yi5y59g==", "cpu": [ "x64" ], @@ -168,9 +168,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.6.tgz", - "integrity": "sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.7.tgz", + "integrity": "sha512-hOUHBMlFCvDhu3WCq6vaBoG0dp0LkWxSEnEEsxxXvOa9TfT6ZBnbh72A/xBM7CBYB7WgwqboetzFEVDnMxelyw==", "cpu": [ "arm64" ], @@ -185,9 +185,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.6.tgz", - "integrity": "sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.7.tgz", + "integrity": "sha512-qEpGjSkPC3qX4ycbMUthXvi9CkRq7kZpkqMY1OyhmYlYLnANnooDQ7hDerM8+0NJ+DZKVnsIc07h30XOpt7LtQ==", "cpu": [ "x64" ], @@ -236,9 +236,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], @@ -253,9 +253,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], @@ -270,9 +270,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], @@ -287,9 +287,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], @@ -304,9 +304,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], @@ -321,9 +321,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], @@ -338,9 +338,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], @@ -355,9 +355,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], @@ -372,9 +372,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], @@ -389,9 +389,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], @@ -406,9 +406,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], @@ -423,9 +423,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], @@ -440,9 +440,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], @@ -457,9 +457,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], @@ -474,9 +474,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], @@ -491,9 +491,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], @@ -508,9 +508,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], @@ -525,9 +525,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], @@ -542,9 +542,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], @@ -559,9 +559,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], @@ -576,9 +576,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], @@ -593,9 +593,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], @@ -610,9 +610,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], @@ -627,9 +627,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], @@ -644,9 +644,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], @@ -661,9 +661,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], @@ -696,6 +696,19 @@ "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.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", @@ -722,13 +735,13 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz", - "integrity": "sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.0" + "@eslint/core": "^1.1.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -748,9 +761,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", - "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { @@ -761,7 +774,7 @@ "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -820,20 +833,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -844,9 +847,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -950,9 +953,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.16", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.16.tgz", - "integrity": "sha512-pp2Rqczh4tgg7BJh6yRCOqBLAJty9DrhSL9kAPZ60VjZ3YpXRkPEbjNxX8Kw+bRBlvKweuuCE4I2qnz953C0YQ==", + "version": "12.0.0-preview.17", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.17.tgz", + "integrity": "sha512-VU6Ygc/9RRPgmF/88q8fp0DdqOXHzT85AdJU23H/t4FfKfkD7wStM1nvWigxpVTvQRWgKM+Zhqk5ZVodEJB33Q==", "license": "MIT", "peer": true, "engines": { @@ -977,20 +980,33 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-helpers": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", @@ -1197,58 +1213,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", @@ -1291,43 +1255,26 @@ "concat-map": "0.0.1" } }, - "node_modules/@kontent-ai/eslint-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@kontent-ai/eslint-config/node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -1346,7 +1293,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -1401,6 +1348,29 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@kontent-ai/eslint-config/node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -1431,6 +1401,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@kontent-ai/eslint-config/node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@kontent-ai/eslint-config/node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -1449,39 +1432,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@kontent-ai/eslint-config/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/minimatch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", - "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@kontent-ai/eslint-config/node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -1944,19 +1894,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@vitest/expect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", @@ -2291,9 +2228,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", "dependencies": { @@ -2373,6 +2310,23 @@ "node": ">=18" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2665,9 +2619,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2686,6 +2640,7 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", "safe-array-concat": "^1.1.3" }, "engines": { @@ -2760,9 +2715,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2773,32 +2728,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escape-string-regexp": { @@ -2890,19 +2845,6 @@ } }, "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/node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", @@ -2915,20 +2857,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/espree": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.1.tgz", - "integrity": "sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2943,19 +2875,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -3106,9 +3025,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", "dev": true, "license": "ISC" }, @@ -3414,6 +3333,16 @@ "node": ">= 0.4" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -4867,6 +4796,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "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", @@ -5205,9 +5147,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index dcbe402f..fbf0cc7e 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,14 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.16", + "@kontent-ai/core-sdk": "^12.0.0-preview.17", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.0.3", - "@biomejs/biome": "2.4.6", + "@biomejs/biome": "2.4.7", "@types/node": "25.5.0", "typescript": "6.0.1-rc", "vitest": "4.1.0", diff --git a/tests/integration/queries/list-content-types-query.spec.ts b/tests/integration/queries/list-content-types-query.spec.ts index 9e7a47b4..150915dc 100644 --- a/tests/integration/queries/list-content-types-query.spec.ts +++ b/tests/integration/queries/list-content-types-query.spec.ts @@ -1,10 +1,10 @@ import { describe } from "vitest"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "../../../lib/queries/content-types/content-type.models.js"; -import { runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; describe("List content types query", async () => { - await runQueryTestsAsync>({ + await runQueryTestsAsync>({ endpoint: "types", unitTestPayload: { types: [ @@ -92,6 +92,6 @@ describe("List content types query", async () => { }, }, selectQuery: (client) => client.listContentTypes(), - expectedSchema: listContentTypesPayload({ languageCodenames: [], taxonomyCodenames: [] }), + expectedSchema: listContentTypesPayload(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/list-languages-query.spec.ts index 21a0df71..254f6b4d 100644 --- a/tests/integration/queries/list-languages-query.spec.ts +++ b/tests/integration/queries/list-languages-query.spec.ts @@ -1,10 +1,10 @@ import { describe } from "vitest"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; describe("List languages query", async () => { - await runQueryTestsAsync>({ + await runQueryTestsAsync>({ endpoint: "languages", unitTestPayload: { languages: [ @@ -24,9 +24,6 @@ describe("List languages query", async () => { }, }, selectQuery: (client) => client.listLanguages(), - expectedSchema: listLanguagesPayload({ - languageCodenames: [], - taxonomyCodenames: [], - }), + expectedSchema: listLanguagesPayload(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/list-taxonomies-query.spec.ts index 97942fb4..6f4fef48 100644 --- a/tests/integration/queries/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/list-taxonomies-query.spec.ts @@ -1,10 +1,10 @@ import { describe } from "vitest"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../lib/queries/taxonomies/taxonomy.models.js"; -import { runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; describe("List taxonomies query", async () => { - await runQueryTestsAsync>({ + await runQueryTestsAsync>({ endpoint: "taxonomies", unitTestPayload: { taxonomies: [ @@ -53,6 +53,6 @@ describe("List taxonomies query", async () => { }, }, selectQuery: (client) => client.listTaxonomies(), - expectedSchema: listTaxonomiesPayload({ languageCodenames: [], taxonomyCodenames: [] }), + expectedSchema: listTaxonomiesPayload(getIntegrationTestsSchema()), }); }); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index 652b2a1b..f6eb75e6 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -1,12 +1,12 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with extra props", () => { - const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { + const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { languages: [ { system: { diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 5c46a73e..29f2dfc1 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -1,12 +1,12 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientTypes } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Valid schema validation with missing props", () => { - const mockPayload: Omit, "pagination"> = { + const mockPayload: Omit, "pagination"> = { languages: [ { system: { diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index c5a43a7d..5788fc13 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -2,7 +2,7 @@ import { type FetchQuery, isPagingQuery, type JsonValue, type PagedFetchQuery } import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; -import type { DeliveryClient, DeliveryClientTypes, DeliveryEndpoints } from "../../lib/models/core.models.js"; +import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoints } from "../../lib/models/core.models.js"; import { createDeliveryClient } from "../../lib/public_api.js"; import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../integration-tests.config.js"; @@ -11,9 +11,17 @@ import { unitEnvironmentId } from "./test.utils.js"; type TestType = "Integration" | "Unit"; type SelectQuery = ( - client: DeliveryClient, + client: DeliveryClient, ) => FetchQuery | PagedFetchQuery; +export function getIntegrationTestsSchema(): DeliveryClientSchema { + return { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + }; +} + export async function runQueryTestsAsync({ endpoint, unitTestPayload, @@ -75,7 +83,7 @@ function createTestClients({ readonly unitTestPayload: TResponsePayload; readonly environmentId: string; readonly deliveryBaseUrl: string | undefined; -}): readonly DeliveryClient[] { +}): readonly DeliveryClient[] { return [ createDeliveryClient({ apiMode: "public", @@ -86,27 +94,12 @@ function createTestClients({ statusCode: 200, }), }), - // createDeliveryClient(unitEnvironmentId) - // .withUnknownSchema() - // .publicApi() - // .create({ - // httpService: getTestHttpServiceWithJsonResponse({ - // jsonResponse: unitTestPayload, - // statusCode: 200, - // }), - // }), createDeliveryClient({ apiMode: "public", environmentId: environmentId, schema: { languageCodenames: [], taxonomyCodenames: [] }, ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), }), - // createDeliveryClient(environmentId) - // .withUnknownSchema() - // .publicApi() - // .create({ - // ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), - // }), ]; } @@ -143,7 +136,7 @@ function registerBaseTests({ }: { readonly testName: string; readonly endpoint: DeliveryEndpoints; - readonly client: DeliveryClient; + readonly client: DeliveryClient; readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; @@ -224,7 +217,7 @@ async function executeDefaultQueryAsync({ client, selectQuery, }: { - readonly client: DeliveryClient; + readonly client: DeliveryClient; readonly selectQuery: SelectQuery; }): Promise<{ readonly query: ReturnType>; From bf0a26616cfbb0b920ad39850322f3cbead28a11 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 14:12:06 +0100 Subject: [PATCH 038/221] simplifies client config --- lib/models/core.models.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 9101dff9..0017e300 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -41,20 +41,6 @@ export type DeliveryClientConfig; -}; - -export type PreviewDeliveryClientConfig = { - readonly apiMode: PickStringLiteral; - readonly deliveryApiKey: string; -}; - -export type SecureDeliveryClientConfig = { - readonly apiMode: PickStringLiteral; - readonly deliveryApiKey: string; -}; - export type DeliveryClientConfigWithSchema = DeliveryClientConfig & { readonly schema: TSchema; }; @@ -92,3 +78,17 @@ export type DeliveryEndpoints = | "types" | `types/${string}` | `types/${string}/elements/${string}`; + +type PublicDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; +}; + +type PreviewDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; + readonly deliveryApiKey: string; +}; + +type SecureDeliveryClientConfig = { + readonly apiMode: PickStringLiteral; + readonly deliveryApiKey: string; +}; From 15d1512b70d3466cc8bb0e465a14585017029445 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:11:15 +0100 Subject: [PATCH 039/221] Simplifies config --- lib/client/delivery-client.ts | 37 +++++++++++-------- lib/models/core.models.ts | 12 ++++-- .../content-types/content-type.models.ts | 6 +-- .../content-types/list-content-types-query.ts | 4 +- lib/queries/delivery-queries.ts | 4 +- lib/queries/languages/language.models.ts | 10 +++-- lib/queries/languages/list-languages-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 4 +- lib/queries/taxonomies/taxonomy.models.ts | 10 ++--- 9 files changed, 52 insertions(+), 39 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 124d8ab0..36d8999f 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,14 +1,7 @@ -import type { - DeliveryClient, - DeliveryClientConfig, - DeliveryClientConfigWithSchema, - DeliveryClientSchema, - PartialDeliveryClientShema, -} from "../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, PartialDeliveryClientShema } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; -import { resolveSchema } from "../utils/schema.utils.js"; /** * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. @@ -37,14 +30,26 @@ import { resolveSchema } from "../utils/schema.utils.js"; export function createDeliveryClient( config: DeliveryClientConfig, ): DeliveryClient> { - const configWithSchema: DeliveryClientConfigWithSchema> = { - ...config, - schema: resolveSchema(config.schema), - }; return { - config: configWithSchema, - listTaxonomies: () => listTaxonomiesQuery(configWithSchema), - listLanguages: () => listLanguagesQuery(configWithSchema), - listContentTypes: () => listContentTypes(configWithSchema), + config, + listTaxonomies: () => listTaxonomiesQuery(config), + listLanguages: () => listLanguagesQuery(config), + listContentTypes: () => listContentTypes(config), }; } + +const fe4 = createDeliveryClient({ + apiMode: "preview", + deliveryApiKey: "x", + environmentId: "c", + schema: { + languageCodenames: ["en-us", "de-de"], + }, +}); + +const query4 = await fe4.listLanguages().fetchAllPages(); + +if (query4.responses[0]?.payload.languages[0]) { + query4.responses[0].payload.languages[0].system.codename === "de-de"; + query4.responses[0].payload.languages[0].system.codename === "aaaa"; +} diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 0017e300..1b74629e 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -11,10 +11,14 @@ export type PartialDeliveryClientShema = { }; export type DeliveryClientSchema = { - readonly languageCodenames: TSchema["languageCodenames"] extends readonly string[] ? TSchema["languageCodenames"] : readonly string[]; - readonly taxonomyCodenames: TSchema["taxonomyCodenames"] extends readonly string[] ? TSchema["taxonomyCodenames"] : readonly string[]; - readonly contentTypeCodenames: TSchema["contentTypeCodenames"] extends readonly string[] - ? TSchema["contentTypeCodenames"] + readonly languageCodenames?: NonNullable extends readonly string[] + ? NonNullable + : readonly string[]; + readonly taxonomyCodenames?: NonNullable extends readonly string[] + ? NonNullable + : readonly string[]; + readonly contentTypeCodenames?: NonNullable extends readonly string[] + ? NonNullable : readonly string[]; }; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index dc8e32cb..45896d71 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -2,14 +2,14 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const contentTypePayload = (schema: TSchema) => +export const contentTypePayload = (schema: TSchema | undefined) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.contentTypeCodenames), + codename: getCodenameSchema>(schema?.contentTypeCodenames), last_modified: z.iso.datetime(), }) .readonly(), @@ -17,7 +17,7 @@ export const contentTypePayload = (schema: }) .readonly(); -export const listContentTypesPayload = (schema: TSchema) => +export const listContentTypesPayload = (schema: TSchema | undefined) => z .object({ types: z.array(contentTypePayload(schema)).readonly(), diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index c3d17651..0e6ae5a3 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,12 +1,12 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = PagedFetchQuery, unknown>; export function listContentTypes( - config: DeliveryClientConfigWithSchema, + config: DeliveryClientConfig, ): ListContentTypesQuery { return createDeliveryPagingQuery({ config, diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 7a6f4ed9..ae3d5837 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,7 +1,7 @@ import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfigWithSchema, DeliveryClientSchema, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; @@ -10,7 +10,7 @@ export function createDeliveryPagingQuery({ zodSchema, endpoint, }: { - readonly config: DeliveryClientConfigWithSchema; + readonly config: DeliveryClientConfig; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index d86385a3..168464d8 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -2,20 +2,20 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const languagePayload = (schema: TSchema) => +export const languagePayload = (schema: TSchema | undefined) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.languageCodenames), + codename: getLanguageCodenameSchema(schema?.languageCodenames), }) .readonly(), }) .readonly(); -export const listLanguagesPayload = (schema: TSchema) => +export const listLanguagesPayload = (schema: TSchema | undefined) => z .object({ languages: z.array(languagePayload(schema)).readonly(), @@ -26,3 +26,7 @@ export const listLanguagesPayload = (schem export type LanguagePayload = z.infer>>; export type ListLanguagesPayload = z.infer>>; + +function getLanguageCodenameSchema(codenames: TCodenames | undefined): z.ZodType { + return getCodenameSchema(codenames); +} diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 369cdc63..bdd9fd1d 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,12 +1,12 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = PagedFetchQuery, unknown>; export function listLanguagesQuery( - config: DeliveryClientConfigWithSchema, + config: DeliveryClientConfig, ): ListLanguagesQuery { return createDeliveryPagingQuery({ config, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 591dcbf6..a0a7835e 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,12 +1,12 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfigWithSchema, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; export function listTaxonomiesQuery( - config: DeliveryClientConfigWithSchema, + config: DeliveryClientConfig, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 9e319abf..3f54aab3 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -2,23 +2,23 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; -export const taxonomyTermPayload = (schema: TSchema) => +export const taxonomyTermPayload = (schema: TSchema | undefined) => z.object({ name: z.string(), - codename: getCodenameSchema(schema.taxonomyCodenames), + codename: getCodenameSchema>(schema?.taxonomyCodenames), get terms() { return z.array(taxonomyTermPayload(schema)).readonly(); }, }); -export const taxonomyPayload = (schema: TSchema) => +export const taxonomyPayload = (schema: TSchema | undefined) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema.taxonomyCodenames), + codename: getCodenameSchema>(schema?.taxonomyCodenames), last_modified: z.iso.datetime(), }) .readonly(), @@ -26,7 +26,7 @@ export const taxonomyPayload = (schema: TS }) .readonly(); -export const listTaxonomiesPayload = (schema: TSchema) => +export const listTaxonomiesPayload = (schema: TSchema | undefined) => z .object({ taxonomies: z.array(taxonomyPayload(schema)).readonly(), From da21b0ead0f3ae35dc55c54f1e20b75dc084c137 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:11:49 +0100 Subject: [PATCH 040/221] Update language.models.ts --- lib/queries/languages/language.models.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 168464d8..2219ccdc 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -9,7 +9,7 @@ export const languagePayload = (schema: TS .object({ id: kontentUuidSchema, name: z.string(), - codename: getLanguageCodenameSchema(schema?.languageCodenames), + codename: getCodenameSchema>(schema?.languageCodenames), }) .readonly(), }) @@ -26,7 +26,3 @@ export const listLanguagesPayload = (schem export type LanguagePayload = z.infer>>; export type ListLanguagesPayload = z.infer>>; - -function getLanguageCodenameSchema(codenames: TCodenames | undefined): z.ZodType { - return getCodenameSchema(codenames); -} From a907a897b295ad6cf0e446a4840b7432fce90171 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:13:23 +0100 Subject: [PATCH 041/221] Update delivery-client.ts --- lib/client/delivery-client.ts | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 36d8999f..f2a5990d 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,4 @@ -import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, PartialDeliveryClientShema } from "../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -29,7 +29,7 @@ import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query */ export function createDeliveryClient( config: DeliveryClientConfig, -): DeliveryClient> { +): DeliveryClient { return { config, listTaxonomies: () => listTaxonomiesQuery(config), @@ -37,19 +37,3 @@ export function createDeliveryClient listContentTypes(config), }; } - -const fe4 = createDeliveryClient({ - apiMode: "preview", - deliveryApiKey: "x", - environmentId: "c", - schema: { - languageCodenames: ["en-us", "de-de"], - }, -}); - -const query4 = await fe4.listLanguages().fetchAllPages(); - -if (query4.responses[0]?.payload.languages[0]) { - query4.responses[0].payload.languages[0].system.codename === "de-de"; - query4.responses[0].payload.languages[0].system.codename === "aaaa"; -} From 901687f944ed28e44a2f47ba43a329442d6763e9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:22:22 +0100 Subject: [PATCH 042/221] Adds paging utils test --- tests/unit/paging/paging.utils.spec.ts | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tests/unit/paging/paging.utils.spec.ts diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts new file mode 100644 index 00000000..1cddbc61 --- /dev/null +++ b/tests/unit/paging/paging.utils.spec.ts @@ -0,0 +1,32 @@ +import type { QueryResponse } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import type { PaginationSchema } from "../../../lib/models/core.models.js"; +import { getNextPageByUrl } from "../../../lib/utils/paging.utils.js"; + +describe("Paging utils", () => { + it("Next page URL should be returned", () => { + const response: QueryResponse = { + meta: { + status: 200, + responseHeaders: [], + url: "https://domain.com", + continuationToken: undefined, + }, + payload: { + pagination: { + skip: 0, + limit: 10, + count: 100, + next_page: "https://domain.com/next", + }, + }, + }; + + const result = getNextPageByUrl()(response); + + expect(result).toEqual({ + continuationToken: undefined, + nextPageUrl: "https://domain.com/next", + }); + }); +}); From 48b054900f90239f75df65bd57b320a1dfd81333 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:28:25 +0100 Subject: [PATCH 043/221] types test update --- tests/types/delivery-client-types.test.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 78954402..e6aa2951 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,12 +1,17 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; +const languageCodenames = ["en-US", "cs-CZ"] as const; +const taxonomyCodenames = ["categories"] as const; + +type ValidLanguageCodename = (typeof languageCodenames)[number]; + const client = createDeliveryClient({ apiMode: "public", environmentId: "x", schema: { - languageCodenames: ["en-US", "cs-CZ"] as const, - taxonomyCodenames: ["categories"] as const, + languageCodenames, + taxonomyCodenames, }, responseValidation: { enable: false, @@ -20,13 +25,8 @@ const client = createDeliveryClient({ const languageResponse = await client.listLanguages().fetchPage(); // Verifies that the language codenames are assignable from the response schema -const validLanguageCodenames = languageResponse.payload.languages.map((language) => language.system.codename) as readonly ( - | "en-US" - | "cs-CZ" -)[]; - -// @ts-expect-error - "de-DE" is not allowed -const invalidLanguageCodename: "en-US" | "cs-CZ" = "de-DE"; +const responseLanguageCodenames: readonly ValidLanguageCodename[] = languageResponse.payload.languages.map( + (language) => language.system.codename, +); -void validLanguageCodenames; -void invalidLanguageCodename; +void responseLanguageCodenames; From 95a1920fc0890d3f6331a6aeb8b225908d8ad404 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:32:55 +0100 Subject: [PATCH 044/221] Update public_api.ts --- lib/public_api.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index c8dff108..eb1c5fc0 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -9,18 +9,12 @@ export type { PaginationSchema, PartialDeliveryClientShema, } from "./models/core.models.js"; -/* -Content Types -*/ +// Content Types export { type ContentTypePayload, ListContentTypesPayload } from "./queries/content-types/content-type.models.js"; export type { ListContentTypesQuery } from "./queries/content-types/list-content-types-query.js"; -/* -Languages -*/ +// Languages export { type LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; -/* -Taxonomies -*/ +// Taxonomies export type { ListTaxonomiesQuery } from "./queries/taxonomies/list-taxonomies-query.js"; export { ListTaxonomiesPayload, type TaxonomyPayload } from "./queries/taxonomies/taxonomy.models.js"; From 1770b9583d365558f97a5849e8e2e78da2e10cb4 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 16:38:26 +0100 Subject: [PATCH 045/221] Separates paging models --- lib/models/core.models.ts | 14 ----------- lib/models/pagination.models.ts | 14 +++++++++++ lib/public_api.ts | 2 +- .../content-types/content-type.models.ts | 3 ++- lib/queries/delivery-queries.ts | 3 ++- lib/queries/languages/language.models.ts | 3 ++- lib/queries/taxonomies/taxonomy.models.ts | 3 ++- lib/utils/paging.utils.ts | 2 +- lib/utils/schema.utils.ts | 25 ------------------- tests/unit/paging/paging.utils.spec.ts | 2 +- 10 files changed, 25 insertions(+), 46 deletions(-) create mode 100644 lib/models/pagination.models.ts delete mode 100644 lib/utils/schema.utils.ts diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 1b74629e..8f64c7b7 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,5 +1,4 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; -import z from "zod"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -57,19 +56,6 @@ export type DeliveryClient; }; -export const paginationSchema = z.object({ - pagination: z - .object({ - skip: z.number(), - limit: z.number(), - count: z.number(), - next_page: z.string(), - }) - .readonly(), -}); - -export type PaginationSchema = Readonly>; - export type DeliveryEndpoints = | "languages" | "items" diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts new file mode 100644 index 00000000..2b47ab41 --- /dev/null +++ b/lib/models/pagination.models.ts @@ -0,0 +1,14 @@ +import z from "zod"; + +export const paginationSchema = z.object({ + pagination: z + .object({ + skip: z.number(), + limit: z.number(), + count: z.number(), + next_page: z.string(), + }) + .readonly(), +}); + +export type PaginationSchema = Readonly>; diff --git a/lib/public_api.ts b/lib/public_api.ts index eb1c5fc0..bd11ec3c 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -6,9 +6,9 @@ export type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - PaginationSchema, PartialDeliveryClientShema, } from "./models/core.models.js"; +export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; // Content Types export { type ContentTypePayload, ListContentTypesPayload } from "./queries/content-types/content-type.models.js"; export type { ListContentTypesQuery } from "./queries/content-types/list-content-types-query.js"; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 45896d71..02d1ac1f 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,6 +1,7 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.models.js"; export const contentTypePayload = (schema: TSchema | undefined) => z diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index ae3d5837..b52b3f29 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,7 +1,8 @@ import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, PaginationSchema } from "../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; +import type { PaginationSchema } from "../models/pagination.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 2219ccdc..da448e84 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,6 +1,7 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.models.js"; export const languagePayload = (schema: TSchema | undefined) => z diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 3f54aab3..2ae007c4 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,6 +1,7 @@ import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import { type DeliveryClientSchema, paginationSchema } from "../../models/core.models.js"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.models.js"; export const taxonomyTermPayload = (schema: TSchema | undefined) => z.object({ diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index bbcaeca7..044b0587 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,5 +1,5 @@ import type { GetNextPageData } from "@kontent-ai/core-sdk"; -import type { PaginationSchema } from "../models/core.models.js"; +import type { PaginationSchema } from "../models/pagination.models.js"; export function getNextPageByUrl(): GetNextPageData { return (response) => { diff --git a/lib/utils/schema.utils.ts b/lib/utils/schema.utils.ts deleted file mode 100644 index ba573416..00000000 --- a/lib/utils/schema.utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { DeliveryClientSchema, PartialDeliveryClientShema } from "../models/core.models.js"; - -/** - * Resolves schema from config, filling defaults when undefined. - * Centralizes the schema resolution so the delivery client stays assertion-free. - */ -export function resolveSchema(schema: TSchema | undefined): DeliveryClientSchema { - return schema ? toFullSchema(schema) : getDefaultSchema(); -} - -function getDefaultSchema(): DeliveryClientSchema { - return { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - }; -} - -function toFullSchema(schema: TSchema): DeliveryClientSchema { - return { - languageCodenames: schema.languageCodenames ?? [], - taxonomyCodenames: schema.taxonomyCodenames ?? [], - contentTypeCodenames: schema.contentTypeCodenames ?? [], - }; -} diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts index 1cddbc61..07f967bf 100644 --- a/tests/unit/paging/paging.utils.spec.ts +++ b/tests/unit/paging/paging.utils.spec.ts @@ -1,6 +1,6 @@ import type { QueryResponse } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; -import type { PaginationSchema } from "../../../lib/models/core.models.js"; +import type { PaginationSchema } from "../../../lib/models/pagination.models.js"; import { getNextPageByUrl } from "../../../lib/utils/paging.utils.js"; describe("Paging utils", () => { From da4f3e661cb17c01e61edd2eb19c701b31c22f50 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 16 Mar 2026 17:37:16 +0100 Subject: [PATCH 046/221] Prepares fetch taxonomy query --- lib/client/delivery-client.ts | 2 + lib/models/core.models.ts | 2 + lib/queries/delivery-queries.ts | 60 ++++++++++++++++--- .../taxonomies/fetch-taxonomy-query.ts | 17 ++++++ 4 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 lib/queries/taxonomies/fetch-taxonomy-query.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index f2a5990d..40bd298a 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,6 +1,7 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import { fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; /** @@ -35,5 +36,6 @@ export function createDeliveryClient listTaxonomiesQuery(config), listLanguages: () => listLanguagesQuery(config), listContentTypes: () => listContentTypes(config), + fetchTaxonomy: (codename: NonNullable[number]) => fetchTaxonomyQuery(codename, config), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 8f64c7b7..1b516a62 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,6 +1,7 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import type { FetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; export type PartialDeliveryClientShema = { @@ -54,6 +55,7 @@ export type DeliveryClient; listTaxonomies(): ListTaxonomiesQuery; listContentTypes(): ListContentTypesQuery; + fetchTaxonomy(codename: NonNullable[number]): FetchTaxonomyQuery; }; export type DeliveryEndpoints = diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index b52b3f29..5f677066 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -1,4 +1,11 @@ -import { createPagedFetchQuery, type PagedFetchQuery } from "@kontent-ai/core-sdk"; +import { + createFetchQuery, + createPagedFetchQuery, + type FetchQuery, + type FetchQueryRequest, + type JsonValue, + type PagedFetchQuery, +} from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; @@ -16,16 +23,53 @@ export function createDeliveryPagingQuery({ readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { return createPagedFetchQuery({ + ...getSharedRequestData({ config, endpoint, zodSchema }), + getNextPageData: getNextPageByUrl(), + }); +} + +export function createDeliveryFetchQuery({ + config, + zodSchema, + endpoint, +}: { + readonly config: DeliveryClientConfig; + readonly zodSchema: ZodType; + readonly endpoint: DeliveryEndpoints; +}): FetchQuery { + return createFetchQuery(getSharedRequestData({ config, endpoint, zodSchema })); +} + +function getSharedRequestData({ + config, + endpoint, + zodSchema, +}: { + readonly config: DeliveryClientConfig; + readonly endpoint: DeliveryEndpoints; + readonly zodSchema: ZodType; +}): Pick, "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "request" | "zodSchema"> { + return { + abortSignal: undefined, config, - zodSchema: zodSchema, sdkInfo: deliverySdkInfo, mapMetadata: () => { return null; }, - getNextPageData: getNextPageByUrl(), - request: { - url: getDeliveryUrl({ path: endpoint, ...config }), - authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, - }, - }); + request: getRequestData({ config, endpoint }), + zodSchema, + }; +} + +function getRequestData({ + config, + endpoint, +}: { + readonly config: DeliveryClientConfig; + readonly endpoint: DeliveryEndpoints; +}): FetchQueryRequest["request"] { + return { + url: getDeliveryUrl({ path: endpoint, ...config }), + authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, + }; } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts new file mode 100644 index 00000000..7d8fba0b --- /dev/null +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -0,0 +1,17 @@ +import type { FetchQuery } from "@kontent-ai/core-sdk"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import { createDeliveryFetchQuery } from "../delivery-queries.js"; +import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; + +export type FetchTaxonomyQuery = FetchQuery, unknown>; + +export function fetchTaxonomyQuery( + codename: string, + config: DeliveryClientConfig, +): FetchTaxonomyQuery { + return createDeliveryFetchQuery({ + config, + zodSchema: taxonomyPayload(config.schema), + endpoint: `taxonomies/${codename}`, + }); +} From 57b68801f99f88674ceeff0b351f003f9963d623 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 10:23:37 +0100 Subject: [PATCH 047/221] Adds basic request config support --- .env.template | 6 +- lib/client/delivery-client.ts | 17 ++-- lib/models/core.models.ts | 28 ++++-- lib/models/request.models.ts | 20 +++++ .../content-types/list-content-types-query.ts | 3 + lib/queries/delivery-queries.ts | 28 +++++- lib/queries/languages/list-languages-query.ts | 3 + .../taxonomies/fetch-taxonomy-query.ts | 10 ++- .../taxonomies/list-taxonomies-query.ts | 3 + tests/integration-tests.config.ts | 78 ---------------- tests/unit/headers/headers.spec.ts | 89 ++++++++++++++++--- 11 files changed, 174 insertions(+), 111 deletions(-) create mode 100644 lib/models/request.models.ts diff --git a/.env.template b/.env.template index 11db59d1..2b8f8e66 100644 --- a/.env.template +++ b/.env.template @@ -1,8 +1,4 @@ # Name of Kontent.ai project: SDK Integration tests -INTEGRATION_ENVIRONMENT_ID=x -INTEGRATION_MANAGEMENT_API_KEY=x -INTEGRATION_MANAGEMENT_BASE_URL=x #can be used to customize base url for MAPI requests +INTEGRATION_ENVIRONMENT_ID=6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b INTEGRATION_DELIVERY_BASE_URL=x -INTEGRATION_DELIVERY_SYNC_BASE_URL=x - diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 40bd298a..300300df 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,7 +1,8 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; +import type { DeliveryRequest } from "../models/request.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; -import { fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; +import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; /** @@ -14,7 +15,8 @@ import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query * By enabling the response validation, you can also achieve a run-time type safety. * * @example - * // With schema – narrow codename types + * With schema – narrow codename types + * * const client = createDeliveryClient({ * apiMode: "public", * environmentId: "x", @@ -22,7 +24,8 @@ import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query * }); * * @example - * // Without schema – schema optional, codenames are string + * Without schema – schema optional, codenames are string + * * const client = createDeliveryClient({ * apiMode: "public", * environmentId: "x", @@ -33,9 +36,9 @@ export function createDeliveryClient { return { config, - listTaxonomies: () => listTaxonomiesQuery(config), - listLanguages: () => listLanguagesQuery(config), - listContentTypes: () => listContentTypes(config), - fetchTaxonomy: (codename: NonNullable[number]) => fetchTaxonomyQuery(codename, config), + listTaxonomies: (request?: DeliveryRequest) => listTaxonomiesQuery(config, request), + listLanguages: (request?: DeliveryRequest) => listLanguagesQuery(config, request), + listContentTypes: (request?: DeliveryRequest) => listContentTypes(config, request), + fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 1b516a62..6b341700 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,8 +1,9 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; -import type { FetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; +import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { DeliveryRequest } from "./request.models.js"; export type PartialDeliveryClientShema = { readonly languageCodenames?: readonly string[]; @@ -27,7 +28,7 @@ export type ApiMode = "public" | "preview" | "secure"; export type DeliveryClientConfig = SdkConfig & ApiDeliveryClientConfig & { /** - * The environment ID of your Kontent.ai project. Can be found under 'Project settings' in the Kontent.ai app. + * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. */ readonly environmentId: string; @@ -52,10 +53,10 @@ export type DeliveryClientConfigWithSchema export type DeliveryClient = { readonly config: DeliveryClientConfig; - listLanguages(): ListLanguagesQuery; - listTaxonomies(): ListTaxonomiesQuery; - listContentTypes(): ListContentTypesQuery; - fetchTaxonomy(codename: NonNullable[number]): FetchTaxonomyQuery; + listLanguages(request?: DeliveryRequest): ListLanguagesQuery; + listTaxonomies(request?: DeliveryRequest): ListTaxonomiesQuery; + listContentTypes(request?: DeliveryRequest): ListContentTypesQuery; + fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; }; export type DeliveryEndpoints = @@ -72,15 +73,30 @@ export type DeliveryEndpoints = | `types/${string}/elements/${string}`; type PublicDeliveryClientConfig = { + /** + * The API mode of the delivery client. Public access is the default mode. + */ readonly apiMode: PickStringLiteral; }; type PreviewDeliveryClientConfig = { + /** + * The API mode of the delivery client. + */ readonly apiMode: PickStringLiteral; + /** + * The delivery API key of your Kontent.ai project with preview access enabled. + */ readonly deliveryApiKey: string; }; type SecureDeliveryClientConfig = { + /** + * The API mode of the delivery client. + */ readonly apiMode: PickStringLiteral; + /** + * The delivery API key of your Kontent.ai project with secure access enabled. + */ readonly deliveryApiKey: string; }; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts new file mode 100644 index 00000000..dffb5b39 --- /dev/null +++ b/lib/models/request.models.ts @@ -0,0 +1,20 @@ +import type { Header } from "@kontent-ai/core-sdk"; + +export type DeliveryRequest = { + readonly config?: DeliveryRequestConfig; +}; + +export type DeliveryRequestConfig = { + /** + * When enabled, sets the `X-KC-Wait-For-Loading-New-Content` header so the Delivery API + * waits for the latest content to be loaded before responding instead of serving + * a potentially stale response from the CDN cache. Useful when you know the + * requested content has just changed (for example, after handling a webhook). + */ + readonly bypassCdnCache?: boolean; + + /** + * Additional headers to be added to the request. + */ + readonly headers?: readonly Header[]; +}; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 0e6ae5a3..198ddce8 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,5 +1,6 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; @@ -7,9 +8,11 @@ export type ListContentTypesQuery = PagedF export function listContentTypes( config: DeliveryClientConfig, + request?: DeliveryRequest, ): ListContentTypesQuery { return createDeliveryPagingQuery({ config, + request, zodSchema: listContentTypesPayload(config.schema), endpoint: "types", }); diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 5f677066..0e6808f3 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -3,6 +3,7 @@ import { createPagedFetchQuery, type FetchQuery, type FetchQueryRequest, + type Header, type JsonValue, type PagedFetchQuery, } from "@kontent-ai/core-sdk"; @@ -10,6 +11,7 @@ import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; +import type { DeliveryRequest } from "../models/request.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; @@ -17,13 +19,15 @@ export function createDeliveryPagingQuery({ config, zodSchema, endpoint, + request, }: { + readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { return createPagedFetchQuery({ - ...getSharedRequestData({ config, endpoint, zodSchema }), + ...getSharedRequestData({ config, endpoint, zodSchema, request }), getNextPageData: getNextPageByUrl(), }); } @@ -32,19 +36,23 @@ export function createDeliveryFetchQuery({ config, zodSchema, endpoint, + request, }: { + readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly zodSchema: ZodType; readonly endpoint: DeliveryEndpoints; }): FetchQuery { - return createFetchQuery(getSharedRequestData({ config, endpoint, zodSchema })); + return createFetchQuery(getSharedRequestData({ config, endpoint, zodSchema, request })); } function getSharedRequestData({ config, endpoint, zodSchema, + request, }: { + readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; readonly zodSchema: ZodType; @@ -56,20 +64,34 @@ function getSharedRequestData({ mapMetadata: () => { return null; }, - request: getRequestData({ config, endpoint }), + request: getRequestData({ config, endpoint, request }), zodSchema, }; } function getRequestData({ + request, config, endpoint, }: { + readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; }): FetchQueryRequest["request"] { return { + requestHeaders: getHeaders(request), url: getDeliveryUrl({ path: endpoint, ...config }), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, }; } + +function getHeaders(request?: DeliveryRequest): readonly Header[] { + if (!request?.config) { + return []; + } + return [...(request.config?.headers ?? []), ...(request.config.bypassCdnCache ? [getBypassCdnCacheHeader()] : [])]; +} + +function getBypassCdnCacheHeader(): Header { + return { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; +} diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index bdd9fd1d..d2ea9e4b 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,5 +1,6 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -7,9 +8,11 @@ export type ListLanguagesQuery = PagedFetc export function listLanguagesQuery( config: DeliveryClientConfig, + request?: DeliveryRequest, ): ListLanguagesQuery { return createDeliveryPagingQuery({ config, + request, zodSchema: listLanguagesPayload(config.schema), endpoint: "languages", }); diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 7d8fba0b..3b9d2f97 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,17 +1,23 @@ import type { FetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; export type FetchTaxonomyQuery = FetchQuery, unknown>; +export type FetchTaxonomyQueryRequest = DeliveryRequest & { + readonly codename: NonNullable[number]; +}; + export function fetchTaxonomyQuery( - codename: string, config: DeliveryClientConfig, + request: FetchTaxonomyQueryRequest, ): FetchTaxonomyQuery { return createDeliveryFetchQuery({ config, + request, zodSchema: taxonomyPayload(config.schema), - endpoint: `taxonomies/${codename}`, + endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index a0a7835e..4b6493d4 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,5 +1,6 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; @@ -7,9 +8,11 @@ export type ListTaxonomiesQuery = PagedFet export function listTaxonomiesQuery( config: DeliveryClientConfig, + request?: DeliveryRequest, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, + request, zodSchema: listTaxonomiesPayload(config.schema), endpoint: "taxonomies", }); diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts index b2db3b49..052087f2 100644 --- a/tests/integration-tests.config.ts +++ b/tests/integration-tests.config.ts @@ -2,7 +2,6 @@ import { existsSync } from "node:fs"; import path from "node:path"; import { loadEnvFile } from "node:process"; import { fileURLToPath } from "node:url"; -import { getEndpointUrl } from "@kontent-ai/core-sdk"; import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "@kontent-ai/core-sdk/devkit"; export function getIntegrationTestConfig() { @@ -10,88 +9,11 @@ export function getIntegrationTestConfig() { const integrationEnv = { id: getEnvironmentRequiredValue("INTEGRATION_ENVIRONMENT_ID"), - mapiKey: getEnvironmentRequiredValue("INTEGRATION_MANAGEMENT_API_KEY"), - mapiBaseUrl: getEnvironmentOptionalValue("INTEGRATION_MANAGEMENT_BASE_URL"), deliveryBaseUrl: getEnvironmentOptionalValue("INTEGRATION_DELIVERY_BASE_URL"), } as const; - const languageVariantUrl = (itemCodename: string, languageCodename: string) => - getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: `/items/codename/${itemCodename}/variants/codename/${languageCodename}`, - }); - - const getMapiEndpointUrl = ({ environmentId, path }: { readonly environmentId: string; readonly path: string }): string => { - return getEndpointUrl({ - environmentId, - path, - baseUrl: integrationEnv.mapiBaseUrl ?? "https://manage.kontent.ai/v2/projects/", - }); - }; - - const getDeliveryEndpointUrl = ({ environmentId, path }: { readonly environmentId: string; readonly path: string }): string => { - return getEndpointUrl({ - environmentId, - path, - baseUrl: integrationEnv.deliveryBaseUrl ?? "https://deliver.kontent.ai/", - }); - }; - return { env: integrationEnv, - mapiUrls: { - contentType: (codename: string) => - getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: `/types/codename/${codename}`, - }), - taxonomy: (codename: string) => - getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: `/taxonomies/codename/${codename}`, - }), - contentItem: (codename: string) => - getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: `/items/codename/${codename}`, - }), - language: (codename: string) => - getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: `/languages/codename/${codename}`, - }), - languageVariant: languageVariantUrl, - publish: (itemCodename: string, languageCodename: string) => `${languageVariantUrl(itemCodename, languageCodename)}/publish`, - contentTypes: getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: "/types", - }), - taxonomies: getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: "/taxonomies", - }), - contentItems: getMapiEndpointUrl({ - environmentId: integrationEnv.id, - path: "/items", - }), - }, - deliveryUrls: { - contentType: (codename: string) => - getDeliveryEndpointUrl({ - environmentId: integrationEnv.id, - path: `/types/${codename}`, - }), - taxonomy: (codename: string) => - getDeliveryEndpointUrl({ - environmentId: integrationEnv.id, - path: `/taxonomies/${codename}`, - }), - contentItem: (codename: string) => - getDeliveryEndpointUrl({ - environmentId: integrationEnv.id, - path: `/items/${codename}`, - }), - }, }; } diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 1e4715c3..f009dd9a 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -4,6 +4,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; +const waitingForLoadingNewContentHeader: Header = { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; + describe("Delivery tracking header", async () => { const expectedHeader = getSdkIdHeader({ name: "@kontent-ai/delivery-sdk", @@ -26,10 +28,6 @@ describe("Delivery tracking header", async () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { @@ -42,12 +40,7 @@ describe("Delivery tracking header", async () => { }).listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error } = await query.fetchPageSafe(); - - it("Response should be successful", () => { - expect(success).toBeTruthy(); - expect(error).toBeUndefined(); - }); + await query.fetchPageSafe(); const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); @@ -55,3 +48,79 @@ describe("Delivery tracking header", async () => { expect(syncTrackingHeader?.value).toEqual(expectedHeader.value); }); }); + +describe("Bypass CDN cache header should be present when bypassCdnCache is true", async () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); + }, + }, + }), + }).listLanguages({ + config: { + bypassCdnCache: true, + }, + }); + + // execute query so that http service is called and request headers are captured + await query.fetchPageSafe(); + + it("Request headers should contain bypass CDN cache header", () => { + const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); + expect(bypassCdnCacheHeader?.value).toEqual(waitingForLoadingNewContentHeader.value); + }); +}); + +describe("Bypass CDN cache header should be absent by default", async () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + + return await getDefaultHttpAdapter().executeRequest(options); + }, + }, + }), + }).listLanguages(); + + // execute query so that http service is called and request headers are captured + await query.fetchPageSafe(); + + it("Request headers should NOT contain bypass CDN cache header", () => { + const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); + expect(bypassCdnCacheHeader).toBeUndefined(); + }); +}); From 4b0c0b9580df4a88126086b1d7622b03c745f613 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 10:30:27 +0100 Subject: [PATCH 048/221] Adds test covering extra headers --- tests/unit/headers/headers.spec.ts | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index f009dd9a..87953878 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -124,3 +124,44 @@ describe("Bypass CDN cache header should be absent by default", async () => { expect(bypassCdnCacheHeader).toBeUndefined(); }); }); + +describe("Extra headers should be present", async () => { + const extraHeader: Header = { name: "X-Extra-Header", value: "extra" }; + + afterEach(() => { + vi.resetAllMocks(); + }); + + mockGlobalFetchJsonResponse({ + jsonResponse: {}, + statusCode: 200, + continuationToken: "x", + }); + + let requestHeaders: readonly Header[] = []; + + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + requestHeaders = options.requestHeaders ?? []; + return await getDefaultHttpAdapter().executeRequest(options); + }, + }, + }), + }).listLanguages({ + config: { + headers: [extraHeader], + }, + }); + + // execute query so that http service is called and request headers are captured + await query.fetchPageSafe(); + + it("Request headers should contain extra header", () => { + const foundHeader = requestHeaders.find((header) => header.name === extraHeader.name); + expect(foundHeader?.value).toEqual("extra"); + }); +}); From c4793fa5fcb5b06bffb0065f2309b370d1b57ec6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 10:37:31 +0100 Subject: [PATCH 049/221] Adds fetch taxonomy query test --- .../list-content-types-query.spec.ts | 6 +-- .../list-languages-query.spec.ts | 6 +-- .../taxonomies/fetch-taxonomy-query.spec.ts | 49 +++++++++++++++++++ .../list-taxonomies-query.spec.ts | 6 +-- 4 files changed, 58 insertions(+), 9 deletions(-) rename tests/integration/queries/{ => content-types}/list-content-types-query.spec.ts (91%) rename tests/integration/queries/{ => languages}/list-languages-query.spec.ts (79%) create mode 100644 tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts rename tests/integration/queries/{ => taxonomies}/list-taxonomies-query.spec.ts (87%) diff --git a/tests/integration/queries/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts similarity index 91% rename from tests/integration/queries/list-content-types-query.spec.ts rename to tests/integration/queries/content-types/list-content-types-query.spec.ts index 150915dc..c4b82fbe 100644 --- a/tests/integration/queries/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import { type ListContentTypesPayload, listContentTypesPayload } from "../../../lib/queries/content-types/content-type.models.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ListContentTypesPayload, listContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; describe("List content types query", async () => { await runQueryTestsAsync>({ diff --git a/tests/integration/queries/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts similarity index 79% rename from tests/integration/queries/list-languages-query.spec.ts rename to tests/integration/queries/languages/list-languages-query.spec.ts index 254f6b4d..d59fb106 100644 --- a/tests/integration/queries/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import { type ListLanguagesPayload, listLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ListLanguagesPayload, listLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; describe("List languages query", async () => { await runQueryTestsAsync>({ diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts new file mode 100644 index 00000000..6653a21d --- /dev/null +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -0,0 +1,49 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type TaxonomyPayload, taxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; + +describe("Fetch taxonomy query", async () => { + const taxonomyCodename = "movie_type"; + await runQueryTestsAsync>({ + endpoint: `taxonomies/${taxonomyCodename}`, + unitTestPayload: { + system: { + id: "b7f516a3-36b9-4108-919f-ed83ea91926e", + name: "Movie type", + codename: "movie_type", + last_modified: "2026-02-26T10:12:41.5176081Z", + }, + terms: [ + { + name: "Drama", + codename: "drama", + terms: [], + }, + { + name: "Comedy", + codename: "comedy", + terms: [ + { + name: "Sitcom", + codename: "sitcom", + terms: [], + }, + { + name: "Stand-up", + codename: "stand_up", + terms: [], + }, + ], + }, + { + name: "Action", + codename: "action", + terms: [], + }, + ], + }, + selectQuery: (client) => client.fetchTaxonomy({ codename: taxonomyCodename }), + expectedSchema: taxonomyPayload(getIntegrationTestsSchema()), + }); +}); diff --git a/tests/integration/queries/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts similarity index 87% rename from tests/integration/queries/list-taxonomies-query.spec.ts rename to tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index 6f4fef48..c11eff75 100644 --- a/tests/integration/queries/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../lib/queries/taxonomies/taxonomy.models.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../utils/integration-test.utils.js"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; describe("List taxonomies query", async () => { await runQueryTestsAsync>({ From 6764d0162fbb3729cd5a24cbc0f2b7fc4fe5cfbf Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 10:51:44 +0100 Subject: [PATCH 050/221] Adds tests for existence of expected query props --- tests/utils/integration-test.utils.ts | 13 ++++++++- tests/utils/test.utils.ts | 39 ++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 5788fc13..66076ceb 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -6,7 +6,7 @@ import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoints } from ".. import { createDeliveryClient } from "../../lib/public_api.js"; import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../integration-tests.config.js"; -import { unitEnvironmentId } from "./test.utils.js"; +import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "./test.utils.js"; type TestType = "Integration" | "Unit"; @@ -64,6 +64,7 @@ export async function runQueryTestsAsync({ if (isPagingQuery(query)) { registerPagingTests({ + query, testName, testType, unitTestPayload, @@ -157,6 +158,11 @@ function registerBaseTests({ expect(parseError).toBeUndefined(); expect(parseSuccess).toBeTruthy(); }); + if (!isPagingQuery(query)) { + it(`${testName} Query should be a fetch query with expected functions`, () => { + expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + } if (testType === "Unit") { it(`${testName} Payload should be equal to unit test payload`, () => { expect(response?.payload).toEqual(unitTestPayload); @@ -165,6 +171,7 @@ function registerBaseTests({ } function registerPagingTests({ + query, testName, testType, unitTestPayload, @@ -176,6 +183,7 @@ function registerPagingTests({ iteratorPayloads, maxPagesCount, }: { + readonly query: PagedFetchQuery; readonly testName: string; readonly testType: TestType; readonly unitTestPayload: TResponsePayload; @@ -205,6 +213,9 @@ function registerPagingTests({ it(`${testName} Iterator responses should be equal to paging responses`, () => { expect(iteratorPayloads.length).toEqual(maxPagesCount); }); + it(`${testName} Query should be a paged fetch query with expected functions`, () => { + expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); if (testType === "Unit") { const firstIteratorResponse = iteratorPayloads?.[0]; it(`${testName} First iterator response payload should match schema`, () => { diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index ed203272..41fad58e 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,4 +1,4 @@ -import { type ContinuationHeaderName, type Header, nilUuid } from "@kontent-ai/core-sdk"; +import { type ContinuationHeaderName, type FetchQuery, type Header, nilUuid, type PagedFetchQuery } from "@kontent-ai/core-sdk"; export const fakeXContinuationTokenHeader: Header = { name: "X-Continuation" satisfies ContinuationHeaderName, @@ -10,3 +10,40 @@ export const unitEnvironmentId = "xyz"; export function getFakeUuid(): string { return nilUuid; } + +export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { + type ExpectedFunctions = keyof FetchQuery; + if (!query || typeof query !== "object") { + return false; + } + + const expectedFunctions: readonly ExpectedFunctions[] = ["fetchSafe", "fetch", "schema", "url"]; + + if (expectedFunctions.every((func) => func in query)) { + return true; + } + return false; +} + +export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is PagedFetchQuery { + type ExpectedFunctions = keyof PagedFetchQuery; + if (!query || typeof query !== "object") { + return false; + } + + const expectedFunctions: readonly ExpectedFunctions[] = [ + "fetchAllPagesSafe", + "fetchPageSafe", + "pages", + "schema", + "url", + "fetchAllPages", + "fetchPage", + "pagesSafe", + ]; + + if (expectedFunctions.every((func) => func in query)) { + return true; + } + return false; +} From 25bec9174fe0555aaf0f8132c00973cbee1b43e2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 15:11:27 +0100 Subject: [PATCH 051/221] Adds support for query parameters --- lib/client/delivery-client.ts | 4 +- lib/models/core.models.ts | 4 +- lib/models/request.models.ts | 8 ++++ lib/queries/delivery-queries.ts | 38 ++++++++++++++++++- .../taxonomies/fetch-taxonomy-query.ts | 7 ++-- .../taxonomies/list-taxonomies-query.ts | 10 ++++- tests/unit/queries/query-parameters.spec.ts | 22 +++++++++++ 7 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 tests/unit/queries/query-parameters.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 300300df..cfd9cba6 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -3,7 +3,7 @@ import type { DeliveryRequest } from "../models/request.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; -import { listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; +import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; /** * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. @@ -36,7 +36,7 @@ export function createDeliveryClient { return { config, - listTaxonomies: (request?: DeliveryRequest) => listTaxonomiesQuery(config, request), + listTaxonomies: (request?: ListTaxonomiesQueryRequest) => listTaxonomiesQuery(config, request), listLanguages: (request?: DeliveryRequest) => listLanguagesQuery(config, request), listContentTypes: (request?: DeliveryRequest) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 6b341700..e14c82a0 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -2,7 +2,7 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; -import type { ListTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; import type { DeliveryRequest } from "./request.models.js"; export type PartialDeliveryClientShema = { @@ -54,7 +54,7 @@ export type DeliveryClient; listLanguages(request?: DeliveryRequest): ListLanguagesQuery; - listTaxonomies(request?: DeliveryRequest): ListTaxonomiesQuery; + listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; listContentTypes(request?: DeliveryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; }; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index dffb5b39..14871fbb 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -4,6 +4,14 @@ export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; }; +export type QueryRequestWithCodename = { + readonly codename: TCodenames[number]; +}; + +export type QueryParameters> = { + readonly query?: TParameters; +}; + export type DeliveryRequestConfig = { /** * When enabled, sets the `X-KC-Wait-For-Loading-New-Content` header so the Delivery API diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 0e6808f3..90f871d6 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -11,7 +11,7 @@ import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { DeliveryRequest } from "../models/request.models.js"; +import type { DeliveryRequest, QueryParameters } from "../models/request.models.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { getDeliveryUrl } from "../utils/url.utils.js"; @@ -80,7 +80,7 @@ function getRequestData({ }): FetchQueryRequest["request"] { return { requestHeaders: getHeaders(request), - url: getDeliveryUrl({ path: endpoint, ...config }), + url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, }; } @@ -95,3 +95,37 @@ function getHeaders(request?: DeliveryRequest): readonly Header[] { function getBypassCdnCacheHeader(): Header { return { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; } + +function addQueryParametersToUrl(url: string, request: DeliveryRequest | undefined): string { + if (!isQueryWithParameters(request)) { + return url; + } + return `${url}${url.includes("?") ? "&" : "?"}${getUrlSearchParams(request).toString()}`; +} + +function getUrlSearchParams(request: QueryParameters>): URLSearchParams { + return new URLSearchParams( + Object.entries(request.query ?? {}) + .filter(hasDefinedQueryValue) + .map(([key, value]) => [key, value.toString()]), + ); +} + +function isQueryWithParameters( + request: DeliveryRequest | undefined, +): request is DeliveryRequest & QueryParameters> { + if (!request) { + return false; + } + + if (("query" satisfies keyof QueryParameters>) in request) { + return true; + } + + return false; +} + +function hasDefinedQueryValue(item: [K, V | undefined]): item is [K, V] { + const [, value] = item; + return value !== undefined || value !== null; +} diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 3b9d2f97..ed3b91ef 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,14 +1,13 @@ import type { FetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest } from "../../models/request.models.js"; +import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; export type FetchTaxonomyQuery = FetchQuery, unknown>; -export type FetchTaxonomyQueryRequest = DeliveryRequest & { - readonly codename: NonNullable[number]; -}; +export type FetchTaxonomyQueryRequest = DeliveryRequest & + QueryRequestWithCodename>; export function fetchTaxonomyQuery( config: DeliveryClientConfig, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 4b6493d4..ed25bdbe 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,14 +1,20 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest } from "../../models/request.models.js"; +import type { DeliveryRequest, QueryParameters } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; +export type ListTaxonomiesQueryRequest = DeliveryRequest & + QueryParameters<{ + readonly skip?: number; + readonly limit?: number; + }>; + export function listTaxonomiesQuery( config: DeliveryClientConfig, - request?: DeliveryRequest, + request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts new file mode 100644 index 00000000..19c62bfe --- /dev/null +++ b/tests/unit/queries/query-parameters.spec.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from "vitest"; +import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +describe("Query parameters", () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + }); + + it("Skip and limit query parameters should be added to the url", () => { + const { url } = client.listTaxonomies({ + query: { + skip: 5, + limit: 10, + }, + }); + const parsedUrl = new URL(url); + expect(parsedUrl.searchParams.get("skip")).toBe("5"); + expect(parsedUrl.searchParams.get("limit")).toBe("10"); + }); +}); From 3568ecdcb3b0c087fc52698df1a61e7b1f4eb0e5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 15:31:09 +0100 Subject: [PATCH 052/221] Adds query param support to listing languages, prepares order query param --- lib/client/delivery-client.ts | 16 ++++++++++++++-- lib/models/core.models.ts | 4 ++-- lib/models/request.models.ts | 4 ++++ lib/queries/languages/list-languages-query.ts | 13 ++++++++++--- tests/unit/queries/query-parameters.spec.ts | 4 +++- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index cfd9cba6..d387d4a6 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,7 +1,7 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; import type { DeliveryRequest } from "../models/request.models.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; -import { listLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -37,8 +37,20 @@ export function createDeliveryClient listTaxonomiesQuery(config, request), - listLanguages: (request?: DeliveryRequest) => listLanguagesQuery(config, request), + listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), listContentTypes: (request?: DeliveryRequest) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), }; } + +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "x", + schema: { languageCodenames: ["en-us", "es-es"] }, +}); + +client.listLanguages({ + query: { + order: "system.codename[desc]", + }, +}); diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index e14c82a0..df7f33da 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,6 +1,6 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; -import type { ListLanguagesQuery } from "../queries/languages/list-languages-query.js"; +import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; import type { DeliveryRequest } from "./request.models.js"; @@ -53,7 +53,7 @@ export type DeliveryClientConfigWithSchema export type DeliveryClient = { readonly config: DeliveryClientConfig; - listLanguages(request?: DeliveryRequest): ListLanguagesQuery; + listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; listContentTypes(request?: DeliveryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 14871fbb..e86c80df 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -26,3 +26,7 @@ export type DeliveryRequestConfig = { */ readonly headers?: readonly Header[]; }; + +export type OrderDirection = "asc" | "desc"; + +export type SystemOrderQueryParam = `system.${TSortableProperties}[${OrderDirection}]`; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index d2ea9e4b..de806100 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,14 +1,21 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest } from "../../models/request.models.js"; +import type { DeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; -import { type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; +import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = PagedFetchQuery, unknown>; +export type ListLanguagesQueryRequest = DeliveryRequest & + QueryParameters<{ + readonly skip?: number; + readonly limit?: number; + readonly order?: SystemOrderQueryParam["system"]>; + }>; + export function listLanguagesQuery( config: DeliveryClientConfig, - request?: DeliveryRequest, + request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { return createDeliveryPagingQuery({ config, diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 19c62bfe..0ebab93d 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -9,14 +9,16 @@ describe("Query parameters", () => { }); it("Skip and limit query parameters should be added to the url", () => { - const { url } = client.listTaxonomies({ + const { url } = client.listLanguages({ query: { skip: 5, limit: 10, + order: "system.name[asc]", }, }); const parsedUrl = new URL(url); expect(parsedUrl.searchParams.get("skip")).toBe("5"); expect(parsedUrl.searchParams.get("limit")).toBe("10"); + expect(parsedUrl.searchParams.get("order")).toBe("system.name[asc]"); }); }); From c54020e73a4cb14191e3fe810257d4b01132412a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 17 Mar 2026 15:41:01 +0100 Subject: [PATCH 053/221] Improves order handling --- lib/models/request.models.ts | 6 ++++++ lib/queries/content-types/list-content-types-query.ts | 9 +++++++-- lib/queries/languages/list-languages-query.ts | 6 ++---- lib/queries/taxonomies/list-taxonomies-query.ts | 9 ++++----- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index e86c80df..dc757c9e 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -4,6 +4,12 @@ export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; }; +export type PagingDeliveryRequest = DeliveryRequest & + QueryParameters<{ + readonly skip?: number; + readonly limit?: number; + }>; + export type QueryRequestWithCodename = { readonly codename: TCodenames[number]; }; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 198ddce8..1c0c06b0 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,11 +1,16 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest } from "../../models/request.models.js"; +import type { DeliveryRequest, PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; -import { type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; +import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = PagedFetchQuery, unknown>; +export type ListContentTypesQueryRequest = PagingDeliveryRequest & + QueryParameters<{ + readonly order?: SystemOrderQueryParam["system"]>; + }>; + export function listContentTypes( config: DeliveryClientConfig, request?: DeliveryRequest, diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index de806100..6dd70dce 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,15 +1,13 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = PagedFetchQuery, unknown>; -export type ListLanguagesQueryRequest = DeliveryRequest & +export type ListLanguagesQueryRequest = PagingDeliveryRequest & QueryParameters<{ - readonly skip?: number; - readonly limit?: number; readonly order?: SystemOrderQueryParam["system"]>; }>; diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index ed25bdbe..8ca746cf 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,15 +1,14 @@ import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; -import type { DeliveryRequest, QueryParameters } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; -import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "./taxonomy.models.js"; +import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; -export type ListTaxonomiesQueryRequest = DeliveryRequest & +export type ListTaxonomiesQueryRequest = PagingDeliveryRequest & QueryParameters<{ - readonly skip?: number; - readonly limit?: number; + readonly order?: SystemOrderQueryParam["system"]>; }>; export function listTaxonomiesQuery( From e9be71414057c635525d6859ad6c47a7c5b98075 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Mar 2026 10:28:38 +0100 Subject: [PATCH 054/221] Adds fetch content type query --- lib/client/delivery-client.ts | 14 +--- lib/models/core.models.ts | 2 + .../content-types/fetch-content-type-query.ts | 22 ++++++ .../fetch-content-type-query.spec.ts | 70 +++++++++++++++++++ .../taxonomies/fetch-taxonomy-query.spec.ts | 6 +- 5 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 lib/queries/content-types/fetch-content-type-query.ts create mode 100644 tests/integration/queries/content-types/fetch-content-type-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index d387d4a6..64eadf99 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,5 +1,6 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; import type { DeliveryRequest } from "../models/request.models.js"; +import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; @@ -40,17 +41,6 @@ export function createDeliveryClient listLanguagesQuery(config, request), listContentTypes: (request?: DeliveryRequest) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), + fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), }; } - -const client = createDeliveryClient({ - apiMode: "public", - environmentId: "x", - schema: { languageCodenames: ["en-us", "es-es"] }, -}); - -client.listLanguages({ - query: { - order: "system.codename[desc]", - }, -}); diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index df7f33da..9c2ad7c5 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,5 @@ import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; +import type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "../queries/content-types/fetch-content-type-query.js"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; @@ -57,6 +58,7 @@ export type DeliveryClient; listContentTypes(request?: DeliveryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; + fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; }; export type DeliveryEndpoints = diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts new file mode 100644 index 00000000..4e76c51c --- /dev/null +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -0,0 +1,22 @@ +import type { FetchQuery } from "@kontent-ai/core-sdk"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; +import { createDeliveryFetchQuery } from "../delivery-queries.js"; +import { type ContentTypePayload, contentTypePayload } from "./content-type.models.js"; + +export type FetchContentTypeQuery = FetchQuery, unknown>; + +export type FetchContentTypeQueryRequest = DeliveryRequest & + QueryRequestWithCodename>; + +export function fetchContentTypeQuery( + config: DeliveryClientConfig, + request: FetchContentTypeQueryRequest, +): FetchContentTypeQuery { + return createDeliveryFetchQuery({ + config, + request, + zodSchema: contentTypePayload(config.schema), + endpoint: `types/${request.codename}`, + }); +} diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts new file mode 100644 index 00000000..a19df9be --- /dev/null +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -0,0 +1,70 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ContentTypePayload, contentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; + +describe("Fetch content type query", async () => { + const codename = "movie"; + await runQueryTestsAsync>({ + endpoint: `types/${codename}`, + unitTestPayload: { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "text", + name: "Title", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + }, + description: { + type: "rich_text", + name: "Description", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + options: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + }, + cover: { + type: "asset", + name: "Cover", + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + }, + url: { + type: "url_slug", + name: "Url", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + }, + cast: { + type: "modular_content", + name: "Cast", + }, + }, + }, + selectQuery: (client) => client.fetchContentType({ codename: codename }), + expectedSchema: contentTypePayload(getIntegrationTestsSchema()), + }); +}); diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index 6653a21d..c8d93528 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -4,9 +4,9 @@ import { type TaxonomyPayload, taxonomyPayload } from "../../../../lib/queries/t import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; describe("Fetch taxonomy query", async () => { - const taxonomyCodename = "movie_type"; + const codename = "movie_type"; await runQueryTestsAsync>({ - endpoint: `taxonomies/${taxonomyCodename}`, + endpoint: `taxonomies/${codename}`, unitTestPayload: { system: { id: "b7f516a3-36b9-4108-919f-ed83ea91926e", @@ -43,7 +43,7 @@ describe("Fetch taxonomy query", async () => { }, ], }, - selectQuery: (client) => client.fetchTaxonomy({ codename: taxonomyCodename }), + selectQuery: (client) => client.fetchTaxonomy({ codename: codename }), expectedSchema: taxonomyPayload(getIntegrationTestsSchema()), }); }); From fd1ea575509d15eda55a8e82c701845b4019680e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Mar 2026 10:38:39 +0100 Subject: [PATCH 055/221] renames zod schema --- .../content-types/fetch-content-type-query.ts | 2 +- .../content-types/list-content-types-query.ts | 2 +- lib/queries/delivery-queries.ts | 18 +++++++++--------- lib/queries/languages/list-languages-query.ts | 2 +- lib/queries/taxonomies/fetch-taxonomy-query.ts | 2 +- .../taxonomies/list-taxonomies-query.ts | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 4e76c51c..1ed6bd23 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -16,7 +16,7 @@ export function fetchContentTypeQuery( return createDeliveryFetchQuery({ config, request, - zodSchema: contentTypePayload(config.schema), + schema: contentTypePayload(config.schema), endpoint: `types/${request.codename}`, }); } diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 1c0c06b0..9985b068 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -18,7 +18,7 @@ export function listContentTypes( return createDeliveryPagingQuery({ config, request, - zodSchema: listContentTypesPayload(config.schema), + schema: listContentTypesPayload(config.schema), endpoint: "types", }); } diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 90f871d6..f705a09e 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -17,45 +17,45 @@ import { getDeliveryUrl } from "../utils/url.utils.js"; export function createDeliveryPagingQuery({ config, - zodSchema, + schema, endpoint, request, }: { readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly zodSchema: ZodType; + readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; }): PagedFetchQuery { return createPagedFetchQuery({ - ...getSharedRequestData({ config, endpoint, zodSchema, request }), + ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), }); } export function createDeliveryFetchQuery({ config, - zodSchema, + schema, endpoint, request, }: { readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly zodSchema: ZodType; + readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; }): FetchQuery { - return createFetchQuery(getSharedRequestData({ config, endpoint, zodSchema, request })); + return createFetchQuery(getSharedRequestData({ config, endpoint, schema: schema, request })); } function getSharedRequestData({ config, endpoint, - zodSchema, + schema, request, }: { readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; - readonly zodSchema: ZodType; + readonly schema: ZodType; }): Pick, "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "request" | "zodSchema"> { return { abortSignal: undefined, @@ -65,7 +65,7 @@ function getSharedRequestData({ return null; }, request: getRequestData({ config, endpoint, request }), - zodSchema, + zodSchema: schema, }; } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 6dd70dce..9ddd778e 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -18,7 +18,7 @@ export function listLanguagesQuery( return createDeliveryPagingQuery({ config, request, - zodSchema: listLanguagesPayload(config.schema), + schema: listLanguagesPayload(config.schema), endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index ed3b91ef..17ca2727 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -16,7 +16,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - zodSchema: taxonomyPayload(config.schema), + schema: taxonomyPayload(config.schema), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 8ca746cf..ab1cc6f0 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -18,7 +18,7 @@ export function listTaxonomiesQuery( return createDeliveryPagingQuery({ config, request, - zodSchema: listTaxonomiesPayload(config.schema), + schema: listTaxonomiesPayload(config.schema), endpoint: "taxonomies", }); } From 983012717ae90e9c691f780234ca9751cb7368c5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Mar 2026 10:40:50 +0100 Subject: [PATCH 056/221] Update delivery-queries.ts --- lib/queries/delivery-queries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index f705a09e..5ea357cf 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -125,7 +125,7 @@ function isQueryWithParameters( return false; } -function hasDefinedQueryValue(item: [K, V | undefined]): item is [K, V] { +function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { const [, value] = item; return value !== undefined || value !== null; } From ed9407b96ba38305480a7b15dadad313c9dd71cd Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Mar 2026 10:46:21 +0100 Subject: [PATCH 057/221] Adds abstraction over delivery fetch queries --- lib/models/core.models.ts | 6 +++++- lib/queries/content-types/fetch-content-type-query.ts | 5 ++--- lib/queries/content-types/list-content-types-query.ts | 5 ++--- lib/queries/languages/list-languages-query.ts | 5 ++--- lib/queries/taxonomies/fetch-taxonomy-query.ts | 5 ++--- lib/queries/taxonomies/list-taxonomies-query.ts | 5 ++--- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 9c2ad7c5..f3e5222e 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,4 @@ -import type { PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; +import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "../queries/content-types/fetch-content-type-query.js"; import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; @@ -61,6 +61,10 @@ export type DeliveryClient): FetchContentTypeQuery; }; +export type DeliveryFetchQuery = FetchQuery; + +export type DeliveryPagedFetchQuery = PagedFetchQuery; + export type DeliveryEndpoints = | "languages" | "items" diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 1ed6bd23..37578d0f 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,10 +1,9 @@ -import type { FetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypePayload, contentTypePayload } from "./content-type.models.js"; -export type FetchContentTypeQuery = FetchQuery, unknown>; +export type FetchContentTypeQuery = DeliveryFetchQuery>; export type FetchContentTypeQueryRequest = DeliveryRequest & QueryRequestWithCodename>; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 9985b068..78ff969f 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,10 +1,9 @@ -import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequest, PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; -export type ListContentTypesQuery = PagedFetchQuery, unknown>; +export type ListContentTypesQuery = DeliveryPagedFetchQuery>; export type ListContentTypesQueryRequest = PagingDeliveryRequest & QueryParameters<{ diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 9ddd778e..2a8edfdf 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,10 +1,9 @@ -import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; -export type ListLanguagesQuery = PagedFetchQuery, unknown>; +export type ListLanguagesQuery = DeliveryPagedFetchQuery>; export type ListLanguagesQueryRequest = PagingDeliveryRequest & QueryParameters<{ diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 17ca2727..103e66e2 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,10 +1,9 @@ -import type { FetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; -export type FetchTaxonomyQuery = FetchQuery, unknown>; +export type FetchTaxonomyQuery = DeliveryFetchQuery>; export type FetchTaxonomyQueryRequest = DeliveryRequest & QueryRequestWithCodename>; diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index ab1cc6f0..4d6ecaad 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,10 +1,9 @@ -import type { PagedFetchQuery } from "@kontent-ai/core-sdk"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; -export type ListTaxonomiesQuery = PagedFetchQuery, unknown>; +export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; export type ListTaxonomiesQueryRequest = PagingDeliveryRequest & QueryParameters<{ From eb5b61fafc65eeac3ac2b49ba902ce57d81663b0 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 18 Mar 2026 14:48:08 +0100 Subject: [PATCH 058/221] Extends content type elements with discriminated union schema --- .../content-types/content-type.models.ts | 86 ++++++++++++++++++- .../fetch-content-type-query.spec.ts | 5 ++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 02d1ac1f..96604e74 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -3,6 +3,90 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; +const contentTypeElementOptionSchema = z + .object({ + name: z.string(), + codename: z.string(), + }) + .readonly(); + +const contentTypeElementSchema = z.discriminatedUnion("type", [ + z + .object({ + type: z.literal("text"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("number"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("rich_text"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("multiple_choice"), + name: z.string(), + options: z.array(contentTypeElementOptionSchema).readonly(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("date_time"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("asset"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("url_slug"), + name: z.string(), + }) + + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("modular_content"), + name: z.string(), + }) + .catchall(z.any()) + .readonly(), + z + .object({ + type: z.literal("custom"), + name: z.string(), + value: z.string().or(z.null()), + }) + .catchall(z.any()) + .readonly(), +]); + export const contentTypePayload = (schema: TSchema | undefined) => z .object({ @@ -14,7 +98,7 @@ export const contentTypePayload = (schema: last_modified: z.iso.datetime(), }) .readonly(), - elements: z.any(), + elements: z.record(z.string(), contentTypeElementSchema).readonly(), }) .readonly(); diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index a19df9be..6a72e645 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -62,6 +62,11 @@ describe("Fetch content type query", async () => { type: "modular_content", name: "Cast", }, + customElem: { + type: "custom", + name: "Custom element", + value: null, + }, }, }, selectQuery: (client) => client.fetchContentType({ codename: codename }), From 928705fe9c9fb1245492904a5fa1c1ac10cff320 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 19 Mar 2026 11:42:18 +0100 Subject: [PATCH 059/221] Improves typesafety on json value schemas --- .../content-types/content-type.models.ts | 22 +- package-lock.json | 363 +++++++++--------- package.json | 4 +- .../fetch-content-type-query.spec.ts | 71 +++- 4 files changed, 259 insertions(+), 201 deletions(-) diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 96604e74..7d3ef35e 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,4 +1,4 @@ -import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { getCodenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; @@ -16,21 +16,21 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ type: z.literal("text"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ type: z.literal("number"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ type: z.literal("rich_text"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ @@ -38,21 +38,21 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ name: z.string(), options: z.array(contentTypeElementOptionSchema).readonly(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ type: z.literal("date_time"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ type: z.literal("asset"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ @@ -60,7 +60,7 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ name: z.string(), taxonomy_group: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ @@ -68,14 +68,14 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ type: z.literal("modular_content"), name: z.string(), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), z .object({ @@ -83,7 +83,7 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ name: z.string(), value: z.string().or(z.null()), }) - .catchall(z.any()) + .catchall(jsonValueSchema) .readonly(), ]); diff --git a/package-lock.json b/package-lock.json index 4a488c8c..a32ed080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "17.0.0-preview.0", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.4.7", + "@biomejs/biome": "2.4.8", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "@types/node": "25.5.0", @@ -22,14 +22,14 @@ "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.17", + "@kontent-ai/core-sdk": "^12.0.0-preview.19", "zod": "^4" } }, "node_modules/@biomejs/biome": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.7.tgz", - "integrity": "sha512-vXrgcmNGZ4lpdwZSpMf1hWw1aWS6B+SyeSYKTLrNsiUsAdSRN0J4d/7mF3ogJFbIwFFSOL3wT92Zzxia/d5/ng==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.8.tgz", + "integrity": "sha512-ponn0oKOky1oRXBV+rlSaUlixUxf1aZvWC19Z41zBfUOUesthrQqL3OtiAlSB1EjFjyWpn98Q64DHelhA6jNlA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -43,20 +43,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.7", - "@biomejs/cli-darwin-x64": "2.4.7", - "@biomejs/cli-linux-arm64": "2.4.7", - "@biomejs/cli-linux-arm64-musl": "2.4.7", - "@biomejs/cli-linux-x64": "2.4.7", - "@biomejs/cli-linux-x64-musl": "2.4.7", - "@biomejs/cli-win32-arm64": "2.4.7", - "@biomejs/cli-win32-x64": "2.4.7" + "@biomejs/cli-darwin-arm64": "2.4.8", + "@biomejs/cli-darwin-x64": "2.4.8", + "@biomejs/cli-linux-arm64": "2.4.8", + "@biomejs/cli-linux-arm64-musl": "2.4.8", + "@biomejs/cli-linux-x64": "2.4.8", + "@biomejs/cli-linux-x64-musl": "2.4.8", + "@biomejs/cli-win32-arm64": "2.4.8", + "@biomejs/cli-win32-x64": "2.4.8" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.7.tgz", - "integrity": "sha512-Oo0cF5mHzmvDmTXw8XSjhCia8K6YrZnk7aCS54+/HxyMdZMruMO3nfpDsrlar/EQWe41r1qrwKiCa2QDYHDzWA==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.8.tgz", + "integrity": "sha512-ARx0tECE8I7S2C2yjnWYLNbBdDoPdq3oyNLhMglmuctThwUsuzFWRKrHmIGwIRWKz0Mat9DuzLEDp52hGnrxGQ==", "cpu": [ "arm64" ], @@ -71,9 +71,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.7.tgz", - "integrity": "sha512-I+cOG3sd/7HdFtvDSnF9QQPrWguUH7zrkIMMykM3PtfWU9soTcS2yRb9Myq6MHmzbeCT08D1UmY+BaiMl5CcoQ==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.8.tgz", + "integrity": "sha512-Jg9/PsB9vDCJlANE8uhG7qDhb5w0Ix69D7XIIc8IfZPUoiPrbLm33k2Ig3NOJ/7nb3UbesFz3D1aDKm9DvzjhQ==", "cpu": [ "x64" ], @@ -88,9 +88,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.7.tgz", - "integrity": "sha512-om6FugwmibzfP/6ALj5WRDVSND4H2G9X0nkI1HZpp2ySf9lW2j0X68oQSaHEnls6666oy4KDsc5RFjT4m0kV0w==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.8.tgz", + "integrity": "sha512-5CdrsJct76XG2hpKFwXnEtlT1p+4g4yV+XvvwBpzKsTNLO9c6iLlAxwcae2BJ7ekPGWjNGw9j09T5KGPKKxQig==", "cpu": [ "arm64" ], @@ -108,9 +108,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.7.tgz", - "integrity": "sha512-I2NvM9KPb09jWml93O2/5WMfNR7Lee5Latag1JThDRMURVhPX74p9UDnyTw3Ae6cE1DgXfw7sqQgX7rkvpc0vw==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.8.tgz", + "integrity": "sha512-Zo9OhBQDJ3IBGPlqHiTISloo5H0+FBIpemqIJdW/0edJ+gEcLR+MZeZozcUyz3o1nXkVA7++DdRKQT0599j9jA==", "cpu": [ "arm64" ], @@ -128,9 +128,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.7.tgz", - "integrity": "sha512-bV8/uo2Tj+gumnk4sUdkerWyCPRabaZdv88IpbmDWARQQoA/Q0YaqPz1a+LSEDIL7OfrnPi9Hq1Llz4ZIGyIQQ==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.8.tgz", + "integrity": "sha512-PdKXspVEaMCQLjtZCn6vfSck/li4KX9KGwSDbZdgIqlrizJ2MnMcE3TvHa2tVfXNmbjMikzcfJpuPWH695yJrw==", "cpu": [ "x64" ], @@ -148,9 +148,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.7.tgz", - "integrity": "sha512-00kx4YrBMU8374zd2wHuRV5wseh0rom5HqRND+vDldJPrWwQw+mzd/d8byI9hPx926CG+vWzq6AeiT7Yi5y59g==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.8.tgz", + "integrity": "sha512-Gi8quv8MEuDdKaPFtS2XjEnMqODPsRg6POT6KhoP+VrkNb+T2ywunVB+TvOU0LX1jAZzfBr+3V1mIbBhzAMKvw==", "cpu": [ "x64" ], @@ -168,9 +168,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.7.tgz", - "integrity": "sha512-hOUHBMlFCvDhu3WCq6vaBoG0dp0LkWxSEnEEsxxXvOa9TfT6ZBnbh72A/xBM7CBYB7WgwqboetzFEVDnMxelyw==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.8.tgz", + "integrity": "sha512-LoFatS0tnHv6KkCVpIy3qZCih+MxUMvdYiPWLHRri7mhi2vyOOs8OrbZBcLTUEWCS+ktO72nZMy4F96oMhkOHQ==", "cpu": [ "arm64" ], @@ -185,9 +185,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.7.tgz", - "integrity": "sha512-qEpGjSkPC3qX4ycbMUthXvi9CkRq7kZpkqMY1OyhmYlYLnANnooDQ7hDerM8+0NJ+DZKVnsIc07h30XOpt7LtQ==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.8.tgz", + "integrity": "sha512-vAn7iXDoUbqFXqVocuq1sMYAd33p8+mmurqJkWl6CtIhobd/O6moe4rY5AJvzbunn/qZCdiDVcveqtkFh1e7Hg==", "cpu": [ "x64" ], @@ -953,9 +953,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.17", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.17.tgz", - "integrity": "sha512-VU6Ygc/9RRPgmF/88q8fp0DdqOXHzT85AdJU23H/t4FfKfkD7wStM1nvWigxpVTvQRWgKM+Zhqk5ZVodEJB33Q==", + "version": "12.0.0-preview.19", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.19.tgz", + "integrity": "sha512-rJ+XzcgOEzqa0XmvJdhS+tRmIYbahslMC6RYSkLxXmSZeIl8eCIEafIge7XdqQIgmvwnq5WPFqb5np+LHXzfWw==", "license": "MIT", "peer": true, "engines": { @@ -1058,17 +1058,17 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", - "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/type-utils": "8.57.0", - "@typescript-eslint/utils": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1081,7 +1081,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.57.0", + "@typescript-eslint/parser": "^8.57.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -1097,16 +1097,16 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", - "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", "debug": "^4.4.3" }, "engines": { @@ -1122,14 +1122,14 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/project-service": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", - "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.0", - "@typescript-eslint/types": "^8.57.0", + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", "debug": "^4.4.3" }, "engines": { @@ -1144,9 +1144,9 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", - "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", "dev": true, "license": "MIT", "engines": { @@ -1161,15 +1161,15 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/type-utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", - "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0", - "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -1186,16 +1186,16 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", - "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.57.0", - "@typescript-eslint/tsconfig-utils": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0", + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1214,16 +1214,16 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", - "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.0", - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/typescript-estree": "8.57.0" + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1433,9 +1433,9 @@ } }, "node_modules/@kontent-ai/eslint-config/node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -1477,20 +1477,10 @@ "url": "https://github.com/sponsors/Brooooooklyn" } }, - "node_modules/@oxc-project/runtime": { - "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", - "integrity": "sha512-Rg8Wlt5dCbXhQnsXPrkOjL1DTSvXLgb2R/KYfnf1/K+R0k6UMLEmbQXPM+kwrWqSmWA2t0B1EtHy2/3zikQpvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@oxc-project/types": { - "version": "0.115.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.115.0.tgz", - "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==", + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz", + "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==", "dev": true, "license": "MIT", "funding": { @@ -1498,9 +1488,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==", "cpu": [ "arm64" ], @@ -1515,9 +1505,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==", "cpu": [ "arm64" ], @@ -1532,9 +1522,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==", "cpu": [ "x64" ], @@ -1549,9 +1539,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.9.tgz", - "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz", + "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==", "cpu": [ "x64" ], @@ -1566,9 +1556,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.9.tgz", - "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz", + "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==", "cpu": [ "arm" ], @@ -1583,9 +1573,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==", "cpu": [ "arm64" ], @@ -1603,9 +1593,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.9.tgz", - "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==", "cpu": [ "arm64" ], @@ -1623,9 +1613,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==", "cpu": [ "ppc64" ], @@ -1643,9 +1633,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==", "cpu": [ "s390x" ], @@ -1663,9 +1653,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.9.tgz", - "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz", + "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==", "cpu": [ "x64" ], @@ -1683,9 +1673,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.9.tgz", - "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz", + "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==", "cpu": [ "x64" ], @@ -1703,9 +1693,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.9.tgz", - "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz", + "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==", "cpu": [ "arm64" ], @@ -1720,9 +1710,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.9.tgz", - "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz", + "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==", "cpu": [ "wasm32" ], @@ -1737,9 +1727,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==", "cpu": [ "arm64" ], @@ -1754,9 +1744,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.9.tgz", - "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz", + "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==", "cpu": [ "x64" ], @@ -1771,9 +1761,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.9.tgz", - "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz", + "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==", "dev": true, "license": "MIT" }, @@ -1845,14 +1835,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", - "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.0", - "@typescript-eslint/visitor-keys": "8.57.0" + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1863,9 +1853,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", - "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", "dev": true, "license": "MIT", "engines": { @@ -1877,13 +1867,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", - "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/types": "8.57.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3025,9 +3015,9 @@ } }, "node_modules/flatted": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", - "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -4708,14 +4698,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.9", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.9.tgz", - "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz", + "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.115.0", - "@rolldown/pluginutils": "1.0.0-rc.9" + "@oxc-project/types": "=0.120.0", + "@rolldown/pluginutils": "1.0.0-rc.10" }, "bin": { "rolldown": "bin/cli.mjs" @@ -4724,21 +4714,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.9", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.9", - "@rolldown/binding-darwin-x64": "1.0.0-rc.9", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.9", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.9", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.9", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.9", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.9", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.9", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.9", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.9", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.9" + "@rolldown/binding-android-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", + "@rolldown/binding-darwin-x64": "1.0.0-rc.10", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" } }, "node_modules/safe-array-concat": { @@ -5360,17 +5350,16 @@ } }, "node_modules/vite": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", - "integrity": "sha512-fPGaRNj9Zytaf8LEiBhY7Z6ijnFKdzU/+mL8EFBaKr7Vw1/FWcTBAMW0wLPJAGMPX38ZPVCVgLceWiEqeoqL2Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz", + "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/runtime": "0.115.0", "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.9", + "rolldown": "1.0.0-rc.10", "tinyglobby": "^0.2.15" }, "bin": { @@ -5387,7 +5376,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.0.0-alpha.31", + "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", diff --git a/package.json b/package.json index fbf0cc7e..75809ea4 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,14 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.17", + "@kontent-ai/core-sdk": "^12.0.0-preview.19", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.0.3", - "@biomejs/biome": "2.4.7", + "@biomejs/biome": "2.4.8", "@types/node": "25.5.0", "typescript": "6.0.1-rc", "vitest": "4.1.0", diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index 6a72e645..71f6110d 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -1,4 +1,4 @@ -import { describe } from "vitest"; +import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ContentTypePayload, contentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; @@ -73,3 +73,72 @@ describe("Fetch content type query", async () => { expectedSchema: contentTypePayload(getIntegrationTestsSchema()), }); }); + +describe("Fetch content type query with extra field in element", async () => { + const payload = { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "text", + name: "Title", + extra: "Field", + }, + }, + }; + + const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + + it("Parsing should be successful when extra field is present in element", () => { + expect(success).toBeTruthy(); + }); +}); + +describe("Fetch content type query with invalid field type in element should fail", async () => { + const payload = { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "invalid_field", + name: "Title", + }, + }, + }; + + const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + + it("Parsing should fail when invalid field type is present in element", () => { + expect(success).toBeFalsy(); + }); +}); + +describe("Fetch query with missing system field should fail", async () => { + const payload = { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + }, + elements: { + title: { + type: "invalid_field", + name: "Title", + }, + }, + }; + + const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + + it("Parsing should fail when system field is missing", () => { + expect(success).toBeFalsy(); + }); +}); From f0b50ab2de080569eda3e718a4a706492a92a392 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 19 Mar 2026 16:08:03 +0100 Subject: [PATCH 060/221] Adds support for strongly typed elements in query --- lib/client/delivery-client.ts | 5 +- lib/models/core.models.ts | 9 ++-- lib/models/request.models.ts | 20 +++++++- .../content-types/fetch-content-type-query.ts | 12 ++++- .../content-types/list-content-types-query.ts | 12 +++-- lib/queries/delivery-queries.ts | 6 +-- tests/types/delivery-client-types.test.ts | 32 ++++++------ tests/unit/queries/query-parameters.spec.ts | 49 ++++++++++++++++--- 8 files changed, 105 insertions(+), 40 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 64eadf99..6671c59b 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,7 +1,6 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; -import type { DeliveryRequest } from "../models/request.models.js"; import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; -import { listContentTypes } from "../queries/content-types/list-content-types-query.js"; +import { type ListContentTypesQueryRequest, listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -39,7 +38,7 @@ export function createDeliveryClient listTaxonomiesQuery(config, request), listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), - listContentTypes: (request?: DeliveryRequest) => listContentTypes(config, request), + listContentTypes: (request?: ListContentTypesQueryRequest) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), }; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index f3e5222e..ae4814b2 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,15 +1,15 @@ import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "../queries/content-types/fetch-content-type-query.js"; -import type { ListContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; +import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; -import type { DeliveryRequest } from "./request.models.js"; export type PartialDeliveryClientShema = { readonly languageCodenames?: readonly string[]; readonly taxonomyCodenames?: readonly string[]; readonly contentTypeCodenames?: readonly string[]; + readonly elementCodenames?: readonly string[]; }; export type DeliveryClientSchema = { @@ -22,6 +22,9 @@ export type DeliveryClientSchema extends readonly string[] ? NonNullable : readonly string[]; + readonly elementCodenames?: NonNullable extends readonly string[] + ? NonNullable + : readonly string[]; }; export type ApiMode = "public" | "preview" | "secure"; @@ -56,7 +59,7 @@ export type DeliveryClient; listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; - listContentTypes(request?: DeliveryRequest): ListContentTypesQuery; + listContentTypes(request?: ListContentTypesQueryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; }; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index dc757c9e..e0485c72 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -14,7 +14,7 @@ export type QueryRequestWithCodename = { readonly codename: TCodenames[number]; }; -export type QueryParameters> = { +export type QueryParameters> = { readonly query?: TParameters; }; @@ -35,4 +35,22 @@ export type DeliveryRequestConfig = { export type OrderDirection = "asc" | "desc"; +/** + * Matches the format of the order parameter in the Delivery API. + * + * @example + * ```ts + * `order=system.name[asc]` + * `order=system.name[desc]` + * `order=system.id[asc]` + */ export type SystemOrderQueryParam = `system.${TSortableProperties}[${OrderDirection}]`; + +/** + * Array of element codenames that will get transformed into a comma-separated list used in the elements parameter. + * + * @example + * ```ts + * `elements=title,summary,related_articles` + */ +export type ElementSelectionQueryParam = readonly TElementCodenames[]; diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 37578d0f..2f225df4 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,12 +1,20 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; -import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; +import type { + DeliveryRequest, + ElementSelectionQueryParam, + QueryParameters, + QueryRequestWithCodename, +} from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypePayload, contentTypePayload } from "./content-type.models.js"; export type FetchContentTypeQuery = DeliveryFetchQuery>; export type FetchContentTypeQueryRequest = DeliveryRequest & - QueryRequestWithCodename>; + QueryRequestWithCodename> & + QueryParameters<{ + readonly elements?: ElementSelectionQueryParam[number]>; + }>; export function fetchContentTypeQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 78ff969f..e1578f82 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,18 +1,24 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { DeliveryRequest, PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { + ElementSelectionQueryParam, + PagingDeliveryRequest, + QueryParameters, + SystemOrderQueryParam, +} from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = DeliveryPagedFetchQuery>; -export type ListContentTypesQueryRequest = PagingDeliveryRequest & +export type ListContentTypesQueryRequest = PagingDeliveryRequest & QueryParameters<{ readonly order?: SystemOrderQueryParam["system"]>; + readonly elements?: ElementSelectionQueryParam[number]>; }>; export function listContentTypes( config: DeliveryClientConfig, - request?: DeliveryRequest, + request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { return createDeliveryPagingQuery({ config, diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 5ea357cf..f75b67d6 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -118,11 +118,7 @@ function isQueryWithParameters( return false; } - if (("query" satisfies keyof QueryParameters>) in request) { - return true; - } - - return false; + return ("query" satisfies keyof QueryParameters>) in request; } function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index e6aa2951..d5722971 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,26 +1,28 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; +import type { DeliveryClient } from "../../lib/models/core.models.js"; const languageCodenames = ["en-US", "cs-CZ"] as const; const taxonomyCodenames = ["categories"] as const; type ValidLanguageCodename = (typeof languageCodenames)[number]; -const client = createDeliveryClient({ - apiMode: "public", - environmentId: "x", - schema: { - languageCodenames, - taxonomyCodenames, - }, - responseValidation: { - enable: false, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), -}); +const client: DeliveryClient<{ languageCodenames: typeof languageCodenames; taxonomyCodenames: typeof taxonomyCodenames }> = + createDeliveryClient({ + apiMode: "public", + environmentId: "x", + schema: { + languageCodenames, + taxonomyCodenames, + }, + responseValidation: { + enable: false, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), + }); const languageResponse = await client.listLanguages().fetchPage(); diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 0ebab93d..374b9ad5 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -1,4 +1,6 @@ +import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; +import type { DeliveryPagedFetchQuery } from "../../../lib/models/core.models.js"; import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; @@ -8,17 +10,48 @@ describe("Query parameters", () => { environmentId: unitEnvironmentId, }); - it("Skip and limit query parameters should be added to the url", () => { - const { url } = client.listLanguages({ + it("Paging parameters should be added to the url", () => { + const listingQueries: readonly DeliveryPagedFetchQuery[] = [ + client.listLanguages({ + query: { + order: "system.name[asc]", + skip: 5, + limit: 10, + }, + }), + client.listTaxonomies({ + query: { + order: "system.name[asc]", + skip: 5, + limit: 10, + }, + }), + client.listContentTypes({ + query: { + order: "system.name[asc]", + skip: 5, + limit: 10, + }, + }), + ]; + + for (const query of listingQueries) { + const { url } = query; + const parsedUrl = new URL(url); + expect(parsedUrl.searchParams.get("skip")).toStrictEqual("5"); + expect(parsedUrl.searchParams.get("limit")).toStrictEqual("10"); + expect(parsedUrl.searchParams.get("order")).toStrictEqual("system.name[asc]"); + } + }); + + it("Elements query parameter should be added as a comma-separated list in the url", () => { + const { url } = client.listContentTypes({ query: { - skip: 5, - limit: 10, - order: "system.name[asc]", + elements: ["x", "y", "z"], }, }); + const parsedUrl = new URL(url); - expect(parsedUrl.searchParams.get("skip")).toBe("5"); - expect(parsedUrl.searchParams.get("limit")).toBe("10"); - expect(parsedUrl.searchParams.get("order")).toBe("system.name[asc]"); + expect(parsedUrl.searchParams.get("elements")).toStrictEqual("x,y,z"); }); }); From a6b7273905ddf05916bdf52ff6562d1df03cae9c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 20 Mar 2026 09:34:52 +0100 Subject: [PATCH 061/221] Adds sortable props to delivery paging query --- lib/models/request.models.ts | 3 ++- .../content-types/list-content-types-query.ts | 12 ++++-------- lib/queries/languages/list-languages-query.ts | 7 ++----- lib/queries/taxonomies/list-taxonomies-query.ts | 7 ++----- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index e0485c72..d34a285d 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -4,10 +4,11 @@ export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; }; -export type PagingDeliveryRequest = DeliveryRequest & +export type PagingDeliveryRequest = DeliveryRequest & QueryParameters<{ readonly skip?: number; readonly limit?: number; + readonly order?: SystemOrderQueryParam; }>; export type QueryRequestWithCodename = { diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index e1578f82..6b9335e5 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,18 +1,14 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { - ElementSelectionQueryParam, - PagingDeliveryRequest, - QueryParameters, - SystemOrderQueryParam, -} from "../../models/request.models.js"; +import type { ElementSelectionQueryParam, PagingDeliveryRequest, QueryParameters } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = DeliveryPagedFetchQuery>; -export type ListContentTypesQueryRequest = PagingDeliveryRequest & +export type ListContentTypesQueryRequest = PagingDeliveryRequest< + keyof ContentTypePayload["system"] +> & QueryParameters<{ - readonly order?: SystemOrderQueryParam["system"]>; readonly elements?: ElementSelectionQueryParam[number]>; }>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 2a8edfdf..ca3b55a2 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,14 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingDeliveryRequest } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; -export type ListLanguagesQueryRequest = PagingDeliveryRequest & - QueryParameters<{ - readonly order?: SystemOrderQueryParam["system"]>; - }>; +export type ListLanguagesQueryRequest = PagingDeliveryRequest["system"]>; export function listLanguagesQuery( config: DeliveryClientConfig, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 4d6ecaad..65c901ea 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,14 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, QueryParameters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingDeliveryRequest } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; -export type ListTaxonomiesQueryRequest = PagingDeliveryRequest & - QueryParameters<{ - readonly order?: SystemOrderQueryParam["system"]>; - }>; +export type ListTaxonomiesQueryRequest = PagingDeliveryRequest["system"]>; export function listTaxonomiesQuery( config: DeliveryClientConfig, From fd60b3ff81083743b73d60a6716ee434c610b605 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 20 Mar 2026 12:10:31 +0100 Subject: [PATCH 062/221] Adds fetch content type element query --- lib/client/delivery-client.ts | 5 ++++ lib/models/core.models.ts | 5 ++++ .../content-types/content-type.models.ts | 17 ++++++++++++++ .../fetch-content-type-element-query.ts | 23 +++++++++++++++++++ .../fetch-content-type-element-query.spec.ts | 19 +++++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 lib/queries/content-types/fetch-content-type-element-query.ts create mode 100644 tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 6671c59b..8ddcfa4e 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,8 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; +import { + fetchContentTypeElementQuery, + type FetchContentTypeElementQueryRequest, +} from "../queries/content-types/fetch-content-type-element-query.js"; import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; import { type ListContentTypesQueryRequest, listContentTypes } from "../queries/content-types/list-content-types-query.js"; import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; @@ -41,5 +45,6 @@ export function createDeliveryClient) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), + fetchContentTypeElement: (request: FetchContentTypeElementQueryRequest) => fetchContentTypeElementQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index ae4814b2..3b0090cd 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -4,6 +4,10 @@ import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../que import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { + FetchContentTypeElementQuery, + FetchContentTypeElementQueryRequest, +} from "../queries/content-types/fetch-content-type-element-query.js"; export type PartialDeliveryClientShema = { readonly languageCodenames?: readonly string[]; @@ -62,6 +66,7 @@ export type DeliveryClient): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; + fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; }; export type DeliveryFetchQuery = FetchQuery; diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 7d3ef35e..510bec82 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -110,6 +110,23 @@ export const listContentTypesPayload = (sc }) .readonly(); +export const contentTypeElementPayload = (schema: TSchema | undefined) => + z + .intersection( + contentTypeElementSchema, + z + .object({ + // Required only for the endpoint `types/{type}/elements/{element}` + codename: getCodenameSchema>(schema?.elementCodenames), + }) + .readonly(), + ) + .readonly(); + export type ContentTypePayload = z.infer>>; +export type ContentTypeElementPayload = z.infer< + ReturnType> +>; + export type ListContentTypesPayload = z.infer>>; diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts new file mode 100644 index 00000000..203975f5 --- /dev/null +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -0,0 +1,23 @@ +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { DeliveryRequest } from "../../models/request.models.js"; +import { createDeliveryFetchQuery } from "../delivery-queries.js"; +import { contentTypeElementPayload, type ContentTypeElementPayload } from "./content-type.models.js"; + +export type FetchContentTypeElementQuery = DeliveryFetchQuery>; + +export type FetchContentTypeElementQueryRequest = DeliveryRequest & { + readonly elementCodename: NonNullable[number]; + readonly typeCodename: NonNullable[number]; +}; + +export function fetchContentTypeElementQuery( + config: DeliveryClientConfig, + request: FetchContentTypeElementQueryRequest, +): FetchContentTypeElementQuery { + return createDeliveryFetchQuery({ + config, + request, + schema: contentTypeElementPayload(config.schema), + endpoint: `types/${request.typeCodename}/elements/${request.elementCodename}`, + }); +} diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts new file mode 100644 index 00000000..80329e7c --- /dev/null +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -0,0 +1,19 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ContentTypeElementPayload, contentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; + +describe("Fetch content type element query", async () => { + const typeCodename = "movie"; + const elementCodename = "title"; + await runQueryTestsAsync>({ + endpoint: `types/${typeCodename}/elements/${elementCodename}`, + unitTestPayload: { + type: "text", + name: "Title", + codename: "title", + }, + selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename }), + expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), + }); +}); From 69ef53eb51616ad8018863ea14e3e68d1a9022b5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 20 Mar 2026 12:11:15 +0100 Subject: [PATCH 063/221] format fixes --- lib/client/delivery-client.ts | 2 +- lib/models/core.models.ts | 8 ++++---- .../content-types/fetch-content-type-element-query.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 8ddcfa4e..17410a44 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,7 +1,7 @@ import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; import { - fetchContentTypeElementQuery, type FetchContentTypeElementQueryRequest, + fetchContentTypeElementQuery, } from "../queries/content-types/fetch-content-type-element-query.js"; import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; import { type ListContentTypesQueryRequest, listContentTypes } from "../queries/content-types/list-content-types-query.js"; diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 3b0090cd..6fc27791 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,13 +1,13 @@ import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; +import type { + FetchContentTypeElementQuery, + FetchContentTypeElementQueryRequest, +} from "../queries/content-types/fetch-content-type-element-query.js"; import type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "../queries/content-types/fetch-content-type-query.js"; import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../queries/content-types/list-content-types-query.js"; import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; -import type { - FetchContentTypeElementQuery, - FetchContentTypeElementQueryRequest, -} from "../queries/content-types/fetch-content-type-element-query.js"; export type PartialDeliveryClientShema = { readonly languageCodenames?: readonly string[]; diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 203975f5..cd4e77d0 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { contentTypeElementPayload, type ContentTypeElementPayload } from "./content-type.models.js"; +import { type ContentTypeElementPayload, contentTypeElementPayload } from "./content-type.models.js"; export type FetchContentTypeElementQuery = DeliveryFetchQuery>; From 5ed32bcfe2560dadd825fe6573267fbda504d13c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 12:25:07 +0200 Subject: [PATCH 064/221] Ignores claudes local settings --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 883c776e..b0e53ff2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Custom .editorconfig .env +.claude/settings.local.json # See http://help.github.com/ignore-files/ for more about ignoring files. From 79229b60bb4783a138774374a872011356e83bb6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 13:00:36 +0200 Subject: [PATCH 065/221] Updates Schema definitions and codename schemas --- lib/client/delivery-client.ts | 4 +- lib/models/core.models.ts | 30 +- lib/public_api.ts | 2 +- .../content-types/content-type.models.ts | 6 +- lib/queries/languages/language.models.ts | 2 +- lib/queries/taxonomies/taxonomy.models.ts | 4 +- package-lock.json | 429 +++++++++--------- package.json | 10 +- tests/types/delivery-client-types.test.ts | 38 +- .../unit/api-mode/custom-base-url-api.spec.ts | 4 - tests/unit/api-mode/deliver-api.spec.ts | 4 - tests/unit/api-mode/preview-api.spec.ts | 4 - tests/unit/api-mode/secure-api.spec.ts | 4 - tests/unit/errors/custom-errors.spec.ts | 2 + ...schema-validation-with-extra-props.spec.ts | 2 + ...hema-validation-with-missing-props.spec.ts | 2 + .../unit/validation/schema-validation.spec.ts | 16 +- .../validation/validation-properties.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 5 +- 19 files changed, 287 insertions(+), 285 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 17410a44..fb6f3ecc 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,4 @@ -import type { DeliveryClient, DeliveryClientConfig, PartialDeliveryClientShema } from "../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientShema } from "../models/core.models.js"; import { type FetchContentTypeElementQueryRequest, fetchContentTypeElementQuery, @@ -35,7 +35,7 @@ import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries * environmentId: "x", * }); */ -export function createDeliveryClient( +export function createDeliveryClient( config: DeliveryClientConfig, ): DeliveryClient { return { diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 6fc27791..5ae307ce 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -9,31 +9,23 @@ import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/l import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; -export type PartialDeliveryClientShema = { - readonly languageCodenames?: readonly string[]; - readonly taxonomyCodenames?: readonly string[]; - readonly contentTypeCodenames?: readonly string[]; - readonly elementCodenames?: readonly string[]; +export type FullDeliveryClientShema = { + readonly languageCodenames: readonly string[]; + readonly taxonomyCodenames: readonly string[]; + readonly contentTypeCodenames: readonly string[]; + readonly elementCodenames: readonly string[]; }; -export type DeliveryClientSchema = { - readonly languageCodenames?: NonNullable extends readonly string[] - ? NonNullable - : readonly string[]; - readonly taxonomyCodenames?: NonNullable extends readonly string[] - ? NonNullable - : readonly string[]; - readonly contentTypeCodenames?: NonNullable extends readonly string[] - ? NonNullable - : readonly string[]; - readonly elementCodenames?: NonNullable extends readonly string[] - ? NonNullable - : readonly string[]; +export type DeliveryClientSchema = { + readonly languageCodenames: TSchema["languageCodenames"]; + readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; + readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; + readonly elementCodenames: TSchema["elementCodenames"]; }; export type ApiMode = "public" | "preview" | "secure"; -export type DeliveryClientConfig = SdkConfig & +export type DeliveryClientConfig = SdkConfig & ApiDeliveryClientConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. diff --git a/lib/public_api.ts b/lib/public_api.ts index bd11ec3c..1c91abd6 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -6,7 +6,7 @@ export type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - PartialDeliveryClientShema, + FullDeliveryClientShema as PartialDeliveryClientShema, } from "./models/core.models.js"; export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; // Content Types diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 510bec82..ed2c87ac 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -94,11 +94,11 @@ export const contentTypePayload = (schema: .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema>(schema?.contentTypeCodenames), + codename: getCodenameSchema(schema?.contentTypeCodenames), last_modified: z.iso.datetime(), }) .readonly(), - elements: z.record(z.string(), contentTypeElementSchema).readonly(), + elements: z.record(getCodenameSchema(schema?.elementCodenames), contentTypeElementSchema), }) .readonly(); @@ -117,7 +117,7 @@ export const contentTypeElementPayload = ( z .object({ // Required only for the endpoint `types/{type}/elements/{element}` - codename: getCodenameSchema>(schema?.elementCodenames), + codename: getCodenameSchema(schema?.elementCodenames), }) .readonly(), ) diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index da448e84..1e989bb3 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -10,7 +10,7 @@ export const languagePayload = (schema: TS .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema>(schema?.languageCodenames), + codename: getCodenameSchema(schema?.languageCodenames), }) .readonly(), }) diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 2ae007c4..fd29d1e9 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -6,7 +6,7 @@ import { paginationSchema } from "../../models/pagination.models.js"; export const taxonomyTermPayload = (schema: TSchema | undefined) => z.object({ name: z.string(), - codename: getCodenameSchema>(schema?.taxonomyCodenames), + codename: getCodenameSchema(schema?.taxonomyCodenames), get terms() { return z.array(taxonomyTermPayload(schema)).readonly(); }, @@ -19,7 +19,7 @@ export const taxonomyPayload = (schema: TS .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema>(schema?.taxonomyCodenames), + codename: getCodenameSchema(schema?.taxonomyCodenames), last_modified: z.iso.datetime(), }) .readonly(), diff --git a/package-lock.json b/package-lock.json index a32ed080..1643c0d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,27 @@ "version": "17.0.0-preview.0", "license": "MIT", "devDependencies": { - "@biomejs/biome": "2.4.8", + "@biomejs/biome": "2.4.9", "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "@types/node": "25.5.0", - "eslint": "10.0.3", + "eslint": "10.1.0", "tsx": "4.21.0", - "typescript": "6.0.1-rc", - "vitest": "4.1.0" + "typescript": "6.0.2", + "vitest": "4.1.2" }, "engines": { "node": ">= 22" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.19", + "@kontent-ai/core-sdk": "^12.0.0-preview.20", "zod": "^4" } }, "node_modules/@biomejs/biome": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.8.tgz", - "integrity": "sha512-ponn0oKOky1oRXBV+rlSaUlixUxf1aZvWC19Z41zBfUOUesthrQqL3OtiAlSB1EjFjyWpn98Q64DHelhA6jNlA==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.9.tgz", + "integrity": "sha512-wvZW92FrwitTcacvCBT8xdAbfbxWfDLwjYMmU3djjqQTh7Ni4ZdiWIT/x5VcZ+RQuxiKzIOzi5D+dcyJDFZMsA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -43,20 +43,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.8", - "@biomejs/cli-darwin-x64": "2.4.8", - "@biomejs/cli-linux-arm64": "2.4.8", - "@biomejs/cli-linux-arm64-musl": "2.4.8", - "@biomejs/cli-linux-x64": "2.4.8", - "@biomejs/cli-linux-x64-musl": "2.4.8", - "@biomejs/cli-win32-arm64": "2.4.8", - "@biomejs/cli-win32-x64": "2.4.8" + "@biomejs/cli-darwin-arm64": "2.4.9", + "@biomejs/cli-darwin-x64": "2.4.9", + "@biomejs/cli-linux-arm64": "2.4.9", + "@biomejs/cli-linux-arm64-musl": "2.4.9", + "@biomejs/cli-linux-x64": "2.4.9", + "@biomejs/cli-linux-x64-musl": "2.4.9", + "@biomejs/cli-win32-arm64": "2.4.9", + "@biomejs/cli-win32-x64": "2.4.9" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.8.tgz", - "integrity": "sha512-ARx0tECE8I7S2C2yjnWYLNbBdDoPdq3oyNLhMglmuctThwUsuzFWRKrHmIGwIRWKz0Mat9DuzLEDp52hGnrxGQ==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.9.tgz", + "integrity": "sha512-d5G8Gf2RpH5pYwiHLPA+UpG3G9TLQu4WM+VK6sfL7K68AmhcEQ9r+nkj/DvR/GYhYox6twsHUtmWWWIKfcfQQA==", "cpu": [ "arm64" ], @@ -71,9 +71,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.8.tgz", - "integrity": "sha512-Jg9/PsB9vDCJlANE8uhG7qDhb5w0Ix69D7XIIc8IfZPUoiPrbLm33k2Ig3NOJ/7nb3UbesFz3D1aDKm9DvzjhQ==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.9.tgz", + "integrity": "sha512-LNCLNgqDMG7BLdc3a8aY/dwKPK7+R8/JXJoXjCvZh2gx8KseqBdFDKbhrr7HCWF8SzNhbTaALhTBoh/I6rf9lA==", "cpu": [ "x64" ], @@ -88,9 +88,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.8.tgz", - "integrity": "sha512-5CdrsJct76XG2hpKFwXnEtlT1p+4g4yV+XvvwBpzKsTNLO9c6iLlAxwcae2BJ7ekPGWjNGw9j09T5KGPKKxQig==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.9.tgz", + "integrity": "sha512-4adnkAUi6K4C/emPRgYznMOcLlUqZdXWM6aIui4VP4LraE764g6Q4YguygnAUoxKjKIXIWPteKMgRbN0wsgwcg==", "cpu": [ "arm64" ], @@ -108,9 +108,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.8.tgz", - "integrity": "sha512-Zo9OhBQDJ3IBGPlqHiTISloo5H0+FBIpemqIJdW/0edJ+gEcLR+MZeZozcUyz3o1nXkVA7++DdRKQT0599j9jA==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.9.tgz", + "integrity": "sha512-8RCww5xnPn2wpK4L/QDGDOW0dq80uVWfppPxHIUg6mOs9B6gRmqPp32h1Ls3T8GnW8Wo5A8u7vpTwz4fExN+sw==", "cpu": [ "arm64" ], @@ -128,9 +128,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.8.tgz", - "integrity": "sha512-PdKXspVEaMCQLjtZCn6vfSck/li4KX9KGwSDbZdgIqlrizJ2MnMcE3TvHa2tVfXNmbjMikzcfJpuPWH695yJrw==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.9.tgz", + "integrity": "sha512-L10na7POF0Ks/cgLFNF1ZvIe+X4onLkTi5oP9hY+Rh60Q+7fWzKDDCeGyiHUFf1nGIa9dQOOUPGe2MyYg8nMSQ==", "cpu": [ "x64" ], @@ -148,9 +148,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.8.tgz", - "integrity": "sha512-Gi8quv8MEuDdKaPFtS2XjEnMqODPsRg6POT6KhoP+VrkNb+T2ywunVB+TvOU0LX1jAZzfBr+3V1mIbBhzAMKvw==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.9.tgz", + "integrity": "sha512-5TD+WS9v5vzXKzjetF0hgoaNFHMcpQeBUwKKVi3JbG1e9UCrFuUK3Gt185fyTzvRdwYkJJEMqglRPjmesmVv4A==", "cpu": [ "x64" ], @@ -168,9 +168,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.8.tgz", - "integrity": "sha512-LoFatS0tnHv6KkCVpIy3qZCih+MxUMvdYiPWLHRri7mhi2vyOOs8OrbZBcLTUEWCS+ktO72nZMy4F96oMhkOHQ==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.9.tgz", + "integrity": "sha512-aDZr0RBC3sMGJOU10BvG7eZIlWLK/i51HRIfScE2lVhfts2dQTreowLiJJd+UYg/tHKxS470IbzpuKmd0MiD6g==", "cpu": [ "arm64" ], @@ -185,9 +185,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.8.tgz", - "integrity": "sha512-vAn7iXDoUbqFXqVocuq1sMYAd33p8+mmurqJkWl6CtIhobd/O6moe4rY5AJvzbunn/qZCdiDVcveqtkFh1e7Hg==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.9.tgz", + "integrity": "sha512-NS4g/2G9SoQ4ktKtz31pvyc/rmgzlcIDCGU/zWbmHJAqx6gcRj2gj5Q/guXhoWTzCUaQZDIqiCQXHS7BcGYc0w==", "cpu": [ "x64" ], @@ -202,24 +202,26 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", - "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", - "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -231,6 +233,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -953,9 +956,9 @@ } }, "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.19", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.19.tgz", - "integrity": "sha512-rJ+XzcgOEzqa0XmvJdhS+tRmIYbahslMC6RYSkLxXmSZeIl8eCIEafIge7XdqQIgmvwnq5WPFqb5np+LHXzfWw==", + "version": "12.0.0-preview.20", + "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.20.tgz", + "integrity": "sha512-GiNsVicCoIsA9E8uhrh/KpPSQETPPCsSrY6qRc8FwnvE7X+yaDDsbOkOHycWwocGew8JnLwFhCj4yOKj8qIwcw==", "license": "MIT", "peer": true, "engines": { @@ -1461,26 +1464,28 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@oxc-project/types": { - "version": "0.120.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz", - "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==", + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, "license": "MIT", "funding": { @@ -1488,9 +1493,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.10.tgz", - "integrity": "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", "cpu": [ "arm64" ], @@ -1505,9 +1510,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.10.tgz", - "integrity": "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", "cpu": [ "arm64" ], @@ -1522,9 +1527,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.10.tgz", - "integrity": "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", "cpu": [ "x64" ], @@ -1539,9 +1544,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.10.tgz", - "integrity": "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", "cpu": [ "x64" ], @@ -1556,9 +1561,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.10.tgz", - "integrity": "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", "cpu": [ "arm" ], @@ -1573,9 +1578,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.10.tgz", - "integrity": "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", "cpu": [ "arm64" ], @@ -1593,9 +1598,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.10.tgz", - "integrity": "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", "cpu": [ "arm64" ], @@ -1613,9 +1618,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.10.tgz", - "integrity": "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", "cpu": [ "ppc64" ], @@ -1633,9 +1638,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.10.tgz", - "integrity": "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", "cpu": [ "s390x" ], @@ -1653,9 +1658,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.10.tgz", - "integrity": "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", "cpu": [ "x64" ], @@ -1673,9 +1678,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.10.tgz", - "integrity": "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", "cpu": [ "x64" ], @@ -1693,9 +1698,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.10.tgz", - "integrity": "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", "cpu": [ "arm64" ], @@ -1710,9 +1715,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.10.tgz", - "integrity": "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", "cpu": [ "wasm32" ], @@ -1727,9 +1732,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.10.tgz", - "integrity": "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", "cpu": [ "arm64" ], @@ -1744,9 +1749,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.10.tgz", - "integrity": "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", "cpu": [ "x64" ], @@ -1761,9 +1766,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.10.tgz", - "integrity": "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", "dev": true, "license": "MIT" }, @@ -1885,44 +1890,71 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", - "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "chai": "^6.2.2", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", - "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", - "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.0", + "@vitest/utils": "4.1.2", "pathe": "^2.0.3" }, "funding": { @@ -1930,14 +1962,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", - "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -1946,9 +1978,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", - "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", "dev": true, "license": "MIT", "funding": { @@ -1956,15 +1988,15 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", + "@vitest/pretty-format": "4.1.2", "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2760,16 +2792,16 @@ } }, "node_modules/eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz", - "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", + "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.3", - "@eslint/config-helpers": "^0.5.2", + "@eslint/config-helpers": "^0.5.3", "@eslint/core": "^1.1.1", "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", @@ -2782,7 +2814,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", - "espree": "^11.1.1", + "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4519,9 +4551,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -4698,14 +4730,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.10.tgz", - "integrity": "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.120.0", - "@rolldown/pluginutils": "1.0.0-rc.10" + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" }, "bin": { "rolldown": "bin/cli.mjs" @@ -4714,21 +4746,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.10", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", - "@rolldown/binding-darwin-x64": "1.0.0-rc.10", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, "node_modules/safe-array-concat": { @@ -5300,9 +5332,9 @@ } }, "node_modules/typescript": { - "version": "6.0.1-rc", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.1-rc.tgz", - "integrity": "sha512-7XlzYb+p/7YxX6qSOzwB4mxVFRdAgWWkj1PgAZ+jzldeuFV6Z77vwFbNxHsUXAL/bhlWY2jCT8shLwDJR8337g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5350,16 +5382,16 @@ } }, "node_modules/vite": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.1.tgz", - "integrity": "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.3", + "picomatch": "^4.0.4", "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.10", + "rolldown": "1.0.0-rc.12", "tinyglobby": "^0.2.15" }, "bin": { @@ -5428,19 +5460,19 @@ } }, "node_modules/vitest": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", - "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.0", - "@vitest/mocker": "4.1.0", - "@vitest/pretty-format": "4.1.0", - "@vitest/runner": "4.1.0", - "@vitest/snapshot": "4.1.0", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -5451,8 +5483,8 @@ "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -5468,13 +5500,13 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.0", - "@vitest/browser-preview": "4.1.0", - "@vitest/browser-webdriverio": "4.1.0", - "@vitest/ui": "4.1.0", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", "happy-dom": "*", "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -5509,33 +5541,6 @@ } } }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", - "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 75809ea4..9d888274 100644 --- a/package.json +++ b/package.json @@ -42,17 +42,17 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.19", + "@kontent-ai/core-sdk": "^12.0.0-preview.20", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.0.3", - "@biomejs/biome": "2.4.8", + "eslint": "10.1.0", + "@biomejs/biome": "2.4.9", "@types/node": "25.5.0", - "typescript": "6.0.1-rc", - "vitest": "4.1.0", + "typescript": "6.0.2", + "vitest": "4.1.2", "tsx": "4.21.0" } } diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index d5722971..00c1a9be 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -7,22 +7,28 @@ const taxonomyCodenames = ["categories"] as const; type ValidLanguageCodename = (typeof languageCodenames)[number]; -const client: DeliveryClient<{ languageCodenames: typeof languageCodenames; taxonomyCodenames: typeof taxonomyCodenames }> = - createDeliveryClient({ - apiMode: "public", - environmentId: "x", - schema: { - languageCodenames, - taxonomyCodenames, - }, - responseValidation: { - enable: false, - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), - }); +const client: DeliveryClient<{ + languageCodenames: typeof languageCodenames; + taxonomyCodenames: typeof taxonomyCodenames; + contentTypeCodenames: string[]; + elementCodenames: string[]; +}> = createDeliveryClient({ + apiMode: "public", + environmentId: "x", + schema: { + languageCodenames, + taxonomyCodenames, + contentTypeCodenames: [], + elementCodenames: [], + }, + responseValidation: { + enable: false, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: {}, + statusCode: 200, + }), +}); const languageResponse = await client.listLanguages().fetchPage(); diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts index 897417aa..51b333ff 100644 --- a/tests/unit/api-mode/custom-base-url-api.spec.ts +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -9,10 +9,6 @@ describe("Custom base URL API", async () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: {}, statusCode: 200, diff --git a/tests/unit/api-mode/deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts index 224c7c74..da64e283 100644 --- a/tests/unit/api-mode/deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -20,10 +20,6 @@ describe("Public deliver API", async () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { diff --git a/tests/unit/api-mode/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts index 59aa0bcc..81f1a2d1 100644 --- a/tests/unit/api-mode/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -22,10 +22,6 @@ describe("Preview API", async () => { apiMode: "preview", environmentId: unitEnvironmentId, deliveryApiKey: previewApiKey, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { diff --git a/tests/unit/api-mode/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts index 668fd914..6e006bd4 100644 --- a/tests/unit/api-mode/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -22,10 +22,6 @@ describe("Secure API", async () => { apiMode: "secure", environmentId: unitEnvironmentId, deliveryApiKey: secureApiKey, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index f1bf0a4d..4f9b8a5d 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -12,6 +12,8 @@ describe("Handling of custom errors", async () => { schema: { languageCodenames: [], taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], }, httpService: getDefaultHttpService({ adapter: { diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index f6eb75e6..0fde665d 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -32,6 +32,8 @@ describe("Valid schema validation with extra props", () => { schema: { languageCodenames: [], taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 29f2dfc1..bfd951f9 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -25,6 +25,8 @@ describe("Valid schema validation with missing props", () => { schema: { languageCodenames: [], taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 0266759b..36f17843 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -8,6 +8,9 @@ import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Schema validation", () => { type TestDeliveryClientTypes = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly []; + readonly elementCodenames: readonly []; }>; const mockPayload: ListLanguagesPayload = { @@ -32,7 +35,7 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: ["en-US", "cs-CZ"], taxonomyCodenames: [] }, + schema: { languageCodenames: ["en-US", "cs-CZ"], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, @@ -53,7 +56,12 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: ["en-US", "cs-CZ", "de-DE"], taxonomyCodenames: [] }, + schema: { + languageCodenames: ["en-US", "cs-CZ", "de-DE"], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, @@ -70,7 +78,7 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, @@ -87,7 +95,7 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index c7f48fde..f41f1b46 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -10,7 +10,7 @@ describe("Response validation", () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: { result: "invalidValue", @@ -41,7 +41,7 @@ describe("Response validation", () => { const { success, error } = await createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: { value: "invalidValue", diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 66076ceb..0cab7fed 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -19,6 +19,7 @@ export function getIntegrationTestsSchema(): DeliveryClientSchema { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], + elementCodenames: [], }; } @@ -89,7 +90,7 @@ function createTestClients({ createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: unitTestPayload, statusCode: 200, @@ -98,7 +99,7 @@ function createTestClients({ createDeliveryClient({ apiMode: "public", environmentId: environmentId, - schema: { languageCodenames: [], taxonomyCodenames: [] }, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), }), ]; From 01c2ccbe5f821b313883ee9db701de772dcd3c9c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 13:07:49 +0200 Subject: [PATCH 066/221] run biome in claude hook --- .claude/settings.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .claude/settings.json diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 00000000..9c3a3d70 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,16 @@ +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write|NotebookEdit", + "hooks": [ + { + "type": "command", + "command": "node -e \"process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const p=JSON.parse(d);const f=p.tool_input?.file_path||p.tool_input?.notebook_path||'';process.stdout.write(f);});\" | { read -r f && [ -n \"$f\" ] && npm run biome:fix -- \"$f\"; } 2>/dev/null || true", + "statusMessage": "Running biome..." + } + ] + } + ] + } +} From ff1da7e207621e42dfbf5ef68b271d0958554879 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 13:14:04 +0200 Subject: [PATCH 067/221] Create CLAUDE.md --- CLAUDE.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..cc3ac5d7 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,20 @@ +# Code Style + +## Functional Programming + +- Prefer functional style: pure functions, immutable data, expressions over statements +- Small, single-purpose functions — if a function does more than one thing, split it +- `const` everywhere; never use `let` unless mutation is genuinely unavoidable, never use `var` +- `readonly` on all type properties, function parameters, and array types (`readonly T[]`) +- Avoid side effects — functions should return values, not mutate external state +- Prefer `map`, `filter`, `reduce`, and other higher-order functions over imperative loops +- Prefer early returns over nested conditionals + +## Libraries + +- Use **ts-pattern** for non-trivial `switch`/`if-else` chains — anything beyond a simple 2-branch condition should use `match()` from `ts-pattern` +- Use **Zod** to define schemas for all API response payloads and API endpoint inputs — the Zod schema is the source of truth; TypeScript types are always derived via `z.infer<>`, never written by hand alongside a schema + +## Exports + +- All API queries and API-related models must be exported from `lib/public_api.ts` — nothing is part of the public API unless it appears there From 1a20f807d21944ccfb8bd1d6d687a465946b48ac Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 13:31:01 +0200 Subject: [PATCH 068/221] Updates biome, extends exports --- .vscode/settings.json | 3 ++- biome.json | 8 ++++++++ lib/public_api.ts | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c4bdcf72..c020c803 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,8 @@ "typescript.updateImportsOnFileMove.enabled": "always", "editor.defaultFormatter": "biomejs.biome", "editor.codeActionsOnSave": { - "source.fixAll.biome": "explicit" + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" }, "editor.formatOnSave": true, "typescript.format.enable": false, diff --git a/biome.json b/biome.json index ae3496fa..468e5216 100644 --- a/biome.json +++ b/biome.json @@ -22,6 +22,14 @@ } } }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, "files": { "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "!_legacy/**/*"] } diff --git a/lib/public_api.ts b/lib/public_api.ts index 1c91abd6..7a9d1ff9 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -6,15 +6,21 @@ export type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - FullDeliveryClientShema as PartialDeliveryClientShema, + FullDeliveryClientShema, } from "./models/core.models.js"; export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; // Content Types -export { type ContentTypePayload, ListContentTypesPayload } from "./queries/content-types/content-type.models.js"; -export type { ListContentTypesQuery } from "./queries/content-types/list-content-types-query.js"; +export { + ContentTypeElementPayload, + type ContentTypePayload, + ListContentTypesPayload, +} from "./queries/content-types/content-type.models.js"; +export { type FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; +export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; // Languages export { type LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; -export type { ListLanguagesQuery } from "./queries/languages/list-languages-query.js"; +export type { ListLanguagesQuery, ListLanguagesQueryRequest } from "./queries/languages/list-languages-query.js"; // Taxonomies -export type { ListTaxonomiesQuery } from "./queries/taxonomies/list-taxonomies-query.js"; -export { ListTaxonomiesPayload, type TaxonomyPayload } from "./queries/taxonomies/taxonomy.models.js"; +export { type FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; +export type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "./queries/taxonomies/list-taxonomies-query.js"; +export type { ListTaxonomiesPayload, TaxonomyPayload, TaxonomyTermPayload } from "./queries/taxonomies/taxonomy.models.js"; From 2194c6487e7b51334e6bb7516d2d21d5ffc35ab9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 13:39:30 +0200 Subject: [PATCH 069/221] fix incorrect typeguard --- lib/queries/delivery-queries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index f75b67d6..8f5329f0 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -123,5 +123,5 @@ function isQueryWithParameters( function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { const [, value] = item; - return value !== undefined || value !== null; + return value !== undefined && value !== null; } From 53970f8fedb64507e4c3be3446e53d9e7c89fc4a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 14:05:04 +0200 Subject: [PATCH 070/221] Code improvements --- lib/models/pagination.models.ts | 2 +- lib/utils/url.utils.ts | 2 ++ tests/unit/queries/query-parameters.spec.ts | 14 ++++++++++++++ vitest-unit.config.ts | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index 2b47ab41..fdfda7d7 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,4 +1,4 @@ -import z from "zod"; +import { z } from "zod"; export const paginationSchema = z.object({ pagination: z diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 391c3c39..4e8b65d7 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -19,5 +19,7 @@ function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { return "https://preview-deliver.kontent.ai"; } + // Both "public" and "secure" modes use the same base URL. + // Secure mode is distinguished by the Authorization header, not a different endpoint. return "https://deliver.kontent.ai"; } diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 374b9ad5..81fe3209 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -54,4 +54,18 @@ describe("Query parameters", () => { const parsedUrl = new URL(url); expect(parsedUrl.searchParams.get("elements")).toStrictEqual("x,y,z"); }); + + it("Undefined query parameters should be omitted from the url", () => { + const { url } = client.listLanguages({ + query: { + skip: 5, + // limit and order are absent (undefined) — must not appear in URL + }, + }); + + const parsedUrl = new URL(url); + expect(parsedUrl.searchParams.get("skip")).toStrictEqual("5"); + expect(parsedUrl.searchParams.has("limit")).toBe(false); + expect(parsedUrl.searchParams.has("order")).toBe(false); + }); }); diff --git a/vitest-unit.config.ts b/vitest-unit.config.ts index 7746e8f5..b3db08a1 100644 --- a/vitest-unit.config.ts +++ b/vitest-unit.config.ts @@ -6,6 +6,10 @@ export default defineConfig({ dir: "tests/unit", globals: true, environment: "node", + coverage: { + provider: "v8", + include: ["lib/**/*.ts"], + }, }, build: { target: "esnext", From adb3d28f1155d5b9c6fa8eb60933b0a8f9b81ddd Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 14:07:24 +0200 Subject: [PATCH 071/221] fix json formatting --- .claude/settings.json | 28 ++++++++++++++-------------- biome.json | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 9c3a3d70..445ec904 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,16 +1,16 @@ { - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write|NotebookEdit", - "hooks": [ - { - "type": "command", - "command": "node -e \"process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const p=JSON.parse(d);const f=p.tool_input?.file_path||p.tool_input?.notebook_path||'';process.stdout.write(f);});\" | { read -r f && [ -n \"$f\" ] && npm run biome:fix -- \"$f\"; } 2>/dev/null || true", - "statusMessage": "Running biome..." - } - ] - } - ] - } + "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write|NotebookEdit", + "hooks": [ + { + "type": "command", + "command": "node -e \"process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const p=JSON.parse(d);const f=p.tool_input?.file_path||p.tool_input?.notebook_path||'';process.stdout.write(f);});\" | { read -r f && [ -n \"$f\" ] && npm run biome:fix -- \"$f\"; } 2>/dev/null || true", + "statusMessage": "Running biome..." + } + ] + } + ] + } } diff --git a/biome.json b/biome.json index 468e5216..35238129 100644 --- a/biome.json +++ b/biome.json @@ -31,6 +31,6 @@ } }, "files": { - "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "!_legacy/**/*"] + "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "**/*.json", "!_legacy/**/*"] } } From 61d2743c0edced36760e39d384433d0f43bd4c28 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 30 Mar 2026 14:28:07 +0200 Subject: [PATCH 072/221] updates test utils --- tests/unit/headers/headers.spec.ts | 109 ++++---------- tests/utils/integration-test.utils.ts | 206 +++++++++++++++++++------- 2 files changed, 182 insertions(+), 133 deletions(-) diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 87953878..ef9062a8 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -4,8 +4,31 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; +type ListLanguagesConfig = Parameters["listLanguages"]>[0]; + const waitingForLoadingNewContentHeader: Header = { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; +async function captureRequestHeaders(listLanguagesConfig?: ListLanguagesConfig): Promise { + let captured: readonly Header[] = []; + + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: async (options) => { + captured = options.requestHeaders ?? []; + return await getDefaultHttpAdapter().executeRequest(options); + }, + }, + }), + }); + + await client.listLanguages(listLanguagesConfig).fetchPageSafe(); + + return captured; +} + describe("Delivery tracking header", async () => { const expectedHeader = getSdkIdHeader({ name: "@kontent-ai/delivery-sdk", @@ -23,28 +46,10 @@ describe("Delivery tracking header", async () => { continuationToken: "x", }); - let requestHeaders: readonly Header[] = []; - - const query = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, - }, - }), - }).listLanguages(); - - // execute query so that http service is called and request headers are captured - await query.fetchPageSafe(); - - const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); + const requestHeaders = await captureRequestHeaders(); it("Request headers should contain sync tracking header with current package info", () => { + const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); expect(syncTrackingHeader?.value).toEqual(expectedHeader.value); }); }); @@ -60,28 +65,7 @@ describe("Bypass CDN cache header should be present when bypassCdnCache is true" continuationToken: "x", }); - let requestHeaders: readonly Header[] = []; - - const query = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, - }, - }), - }).listLanguages({ - config: { - bypassCdnCache: true, - }, - }); - - // execute query so that http service is called and request headers are captured - await query.fetchPageSafe(); + const requestHeaders = await captureRequestHeaders({ config: { bypassCdnCache: true } }); it("Request headers should contain bypass CDN cache header", () => { const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); @@ -100,24 +84,7 @@ describe("Bypass CDN cache header should be absent by default", async () => { continuationToken: "x", }); - let requestHeaders: readonly Header[] = []; - - const query = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - - return await getDefaultHttpAdapter().executeRequest(options); - }, - }, - }), - }).listLanguages(); - - // execute query so that http service is called and request headers are captured - await query.fetchPageSafe(); + const requestHeaders = await captureRequestHeaders(); it("Request headers should NOT contain bypass CDN cache header", () => { const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); @@ -138,27 +105,7 @@ describe("Extra headers should be present", async () => { continuationToken: "x", }); - let requestHeaders: readonly Header[] = []; - - const query = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - httpService: getDefaultHttpService({ - adapter: { - executeRequest: async (options) => { - requestHeaders = options.requestHeaders ?? []; - return await getDefaultHttpAdapter().executeRequest(options); - }, - }, - }), - }).listLanguages({ - config: { - headers: [extraHeader], - }, - }); - - // execute query so that http service is called and request headers are captured - await query.fetchPageSafe(); + const requestHeaders = await captureRequestHeaders({ config: { headers: [extraHeader] } }); it("Request headers should contain extra header", () => { const foundHeader = requestHeaders.find((header) => header.name === extraHeader.name); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 0cab7fed..d8323457 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -42,41 +42,76 @@ export async function runQueryTestsAsync({ }); for (const client of clients) { - const { testType, testName } = createTestMetadata({ - clientEnvironmentId: client.config.environmentId, + await runClientQueryTestsAsync({ + client, integrationEnvironmentId: integrationTestConfig.env.id, endpoint, + selectQuery, + expectedSchema, + unitTestPayload, }); + } +} + +async function runClientQueryTestsAsync({ + client, + integrationEnvironmentId, + endpoint, + selectQuery, + expectedSchema, + unitTestPayload, +}: { + readonly client: DeliveryClient; + readonly integrationEnvironmentId: string; + readonly endpoint: DeliveryEndpoints; + readonly selectQuery: SelectQuery; + readonly expectedSchema: ZodType; + readonly unitTestPayload: TResponsePayload; +}): Promise { + const { testType, testName } = createTestMetadata({ + clientEnvironmentId: client.config.environmentId, + integrationEnvironmentId, + endpoint, + }); - const { query, response, success, error } = await executeDefaultQueryAsync({ client, selectQuery }); + const { query, response, success, error } = await executeDefaultQueryAsync({ client, selectQuery }); - registerBaseTests({ - testName, - endpoint, - client, + registerBaseTests({ testName, endpoint, client, query, response, success, error, expectedSchema, unitTestPayload, testType }); + + if (isPagingQuery(query)) { + registerPagingTests({ query, - response, - success, - error, - expectedSchema, - unitTestPayload, + testName, testType, + unitTestPayload, + expectedSchema, + response, + ...(await executePagingQueryAsync({ query })), }); - - if (isPagingQuery(query)) { - registerPagingTests({ - query, - testName, - testType, - unitTestPayload, - expectedSchema, - response, - ...(await executePagingQueryAsync({ query })), - }); - } } } +function createUnitTestClient(unitTestPayload: TResponsePayload): DeliveryClient { + return createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: unitTestPayload, + statusCode: 200, + }), + }); +} + +function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: string | undefined): DeliveryClient { + return createDeliveryClient({ + apiMode: "public", + environmentId, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), + }); +} + function createTestClients({ unitTestPayload, environmentId, @@ -86,23 +121,7 @@ function createTestClients({ readonly environmentId: string; readonly deliveryBaseUrl: string | undefined; }): readonly DeliveryClient[] { - return [ - createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: unitTestPayload, - statusCode: 200, - }), - }), - createDeliveryClient({ - apiMode: "public", - environmentId: environmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, - ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), - }), - ]; + return [createUnitTestClient(unitTestPayload), createIntegrationTestClient(environmentId, deliveryBaseUrl)]; } function createTestMetadata({ @@ -146,10 +165,49 @@ function registerBaseTests({ readonly expectedSchema: ZodType; readonly unitTestPayload: TResponsePayload; readonly testType: TestType; +}): void { + registerQueryStructureTests({ testName, query, endpoint, client }); + registerResponseValidationTests({ testName, success, error, expectedSchema, response, testType, unitTestPayload }); +} + +function registerQueryStructureTests({ + testName, + query, + endpoint, + client, +}: { + readonly testName: string; + readonly query: ReturnType>; + readonly endpoint: DeliveryEndpoints; + readonly client: DeliveryClient; }): void { it(`${testName} Expect url to be correct`, () => { expect(query.url).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); }); + if (!isPagingQuery(query)) { + it(`${testName} Query should be a fetch query with expected functions`, () => { + expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + } +} + +function registerResponseValidationTests({ + testName, + success, + error, + expectedSchema, + response, + testType, + unitTestPayload, +}: { + readonly testName: string; + readonly success: boolean; + readonly error: unknown; + readonly expectedSchema: ZodType; + readonly response: { readonly payload: TResponsePayload } | undefined; + readonly testType: TestType; + readonly unitTestPayload: TResponsePayload; +}): void { it(`${testName} Response should be successful`, () => { expect(error).toBeUndefined(); expect(success).toBeTruthy(); @@ -159,11 +217,6 @@ function registerBaseTests({ expect(parseError).toBeUndefined(); expect(parseSuccess).toBeTruthy(); }); - if (!isPagingQuery(query)) { - it(`${testName} Query should be a fetch query with expected functions`, () => { - expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); - }); - } if (testType === "Unit") { it(`${testName} Payload should be equal to unit test payload`, () => { expect(response?.payload).toEqual(unitTestPayload); @@ -195,22 +248,71 @@ function registerPagingTests({ readonly pagingError: unknown; readonly iteratorPayloads: readonly TResponsePayload[]; readonly maxPagesCount: number; +}): void { + registerPagingResponseTests({ + testName, + pagingSuccess, + pagingError, + expectedSchema, + response, + testType, + pagingResponses, + unitTestPayload, + }); + registerPagingIteratorTests({ testName, query, iteratorPayloads, maxPagesCount, testType, unitTestPayload }); +} + +function registerPagingResponseTests({ + testName, + pagingSuccess, + pagingError, + expectedSchema, + response, + testType, + pagingResponses, + unitTestPayload, +}: { + readonly testName: string; + readonly pagingSuccess: boolean; + readonly pagingError: unknown; + readonly expectedSchema: ZodType; + readonly response: { readonly payload: TResponsePayload } | undefined; + readonly testType: TestType; + readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; + readonly unitTestPayload: TResponsePayload; }): void { it(`${testName} Response should be successful`, () => { expect(pagingError).toBeUndefined(); expect(pagingSuccess).toBeTruthy(); }); - if (testType === "Unit") { - const firstResponse = pagingResponses?.[0]; - it(`${testName} First paging response payload should match schema`, () => { - expect(firstResponse?.payload).toEqual(unitTestPayload); - }); - } it(`${testName} First paging response payload should match schema`, async () => { const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); expect(parseError).toBeUndefined(); expect(parseSuccess).toBeTruthy(); }); + if (testType === "Unit") { + const firstResponse = pagingResponses?.[0]; + it(`${testName} First paging response payload should match unit test payload`, () => { + expect(firstResponse?.payload).toEqual(unitTestPayload); + }); + } +} + +function registerPagingIteratorTests({ + testName, + query, + iteratorPayloads, + maxPagesCount, + testType, + unitTestPayload, +}: { + readonly testName: string; + readonly query: PagedFetchQuery; + readonly iteratorPayloads: readonly TResponsePayload[]; + readonly maxPagesCount: number; + readonly testType: TestType; + readonly unitTestPayload: TResponsePayload; +}): void { it(`${testName} Iterator responses should be equal to paging responses`, () => { expect(iteratorPayloads.length).toEqual(maxPagesCount); }); From 3e88c661ee285ab797d3d90ed2e792a40da06e6c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 11:23:58 +0200 Subject: [PATCH 073/221] Adds DeliverySdkError, udpates test, claude and deps --- .claude/settings.json | 15 +- .../{integration-tests.yml => tests.yml} | 8 +- .github/workflows/unit-tests.yml | 18 - .gitignore | 1 + CLAUDE.md | 6 +- lib/models/core.models.ts | 5 +- lib/models/error.models.ts | 15 + lib/models/request.models.ts | 4 +- lib/queries/delivery-queries.ts | 64 +- lib/utils/error.utils.ts | 6 + lib/utils/url.utils.ts | 21 + package-lock.json | 5700 ----------------- package.json | 13 +- pnpm-lock.yaml | 3524 ++++++++++ pnpm-workspace.yaml | 2 + tests/unit/utils/url-utils.spec.ts | 39 + tests/utils/integration-test.utils.ts | 10 +- tests/utils/test.utils.ts | 17 +- vitest.config.ts | 19 + 19 files changed, 3695 insertions(+), 5792 deletions(-) rename .github/workflows/{integration-tests.yml => tests.yml} (72%) delete mode 100644 .github/workflows/unit-tests.yml create mode 100644 lib/models/error.models.ts create mode 100644 lib/utils/error.utils.ts delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tests/unit/utils/url-utils.spec.ts create mode 100644 vitest.config.ts diff --git a/.claude/settings.json b/.claude/settings.json index 445ec904..4e069023 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -1,16 +1,3 @@ { - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write|NotebookEdit", - "hooks": [ - { - "type": "command", - "command": "node -e \"process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const p=JSON.parse(d);const f=p.tool_input?.file_path||p.tool_input?.notebook_path||'';process.stdout.write(f);});\" | { read -r f && [ -n \"$f\" ] && npm run biome:fix -- \"$f\"; } 2>/dev/null || true", - "statusMessage": "Running biome..." - } - ] - } - ] - } + "hooks": {} } diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/tests.yml similarity index 72% rename from .github/workflows/integration-tests.yml rename to .github/workflows/tests.yml index 72925782..aee382ff 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: Integration Tests +name: Tests & Coverage on: push: @@ -14,9 +14,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@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:integration + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run test diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml deleted file mode 100644 index b4c4a887..00000000 --- a/.github/workflows/unit-tests.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Unit Tests - -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 test:unit diff --git a/.gitignore b/.gitignore index b0e53ff2..f6c74648 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ /coverage /libpeerconnection.log npm-debug.log +package-lock.json testem.log /typings diff --git a/CLAUDE.md b/CLAUDE.md index cc3ac5d7..78f5572b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ - Prefer functional style: pure functions, immutable data, expressions over statements - Small, single-purpose functions — if a function does more than one thing, split it - `const` everywhere; never use `let` unless mutation is genuinely unavoidable, never use `var` -- `readonly` on all type properties, function parameters, and array types (`readonly T[]`) +- `readonly` on all type properties, function parameters, and array types (`readonly T[]`); exception: a mutable array used as a local accumulator within a single function body (built with `.push()`, never returned or exposed as mutable) is acceptable when the immutable alternative would cause repeated full-array copies — e.g. `[...acc, item]` inside a loop or recursion allocates a new array on every iteration (O(n) per step), whereas `.push()` is O(1) amortised - Avoid side effects — functions should return values, not mutate external state - Prefer `map`, `filter`, `reduce`, and other higher-order functions over imperative loops - Prefer early returns over nested conditionals @@ -18,3 +18,7 @@ ## Exports - All API queries and API-related models must be exported from `lib/public_api.ts` — nothing is part of the public API unless it appears there + +# Tooling + +- After making code changes, run `pnpm run biome:fix` to auto-format and fix lint issues diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 5ae307ce..b47c6aa5 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -8,6 +8,7 @@ import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../que import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { DeliverySdkError } from "./error.models.js"; export type FullDeliveryClientShema = { readonly languageCodenames: readonly string[]; @@ -61,9 +62,9 @@ export type DeliveryClient): FetchContentTypeElementQuery; }; -export type DeliveryFetchQuery = FetchQuery; +export type DeliveryFetchQuery = FetchQuery; -export type DeliveryPagedFetchQuery = PagedFetchQuery; +export type DeliveryPagedFetchQuery = PagedFetchQuery; export type DeliveryEndpoints = | "languages" diff --git a/lib/models/error.models.ts b/lib/models/error.models.ts new file mode 100644 index 00000000..fed39929 --- /dev/null +++ b/lib/models/error.models.ts @@ -0,0 +1,15 @@ +import { KontentSdkError } from "@kontent-ai/core-sdk"; + +export class DeliverySdkError extends KontentSdkError { + constructor(error: KontentSdkError) { + super({ + baseErrorData: { + message: error.message, + url: error.url, + retryStrategyOptions: error.retryStrategyOptions, + retryAttempt: error.retryAttempt, + }, + details: error.details, + }); + } +} diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index d34a285d..4be02549 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -4,6 +4,8 @@ export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; }; +export type QueryParameterRecord = Record; + export type PagingDeliveryRequest = DeliveryRequest & QueryParameters<{ readonly skip?: number; @@ -15,7 +17,7 @@ export type QueryRequestWithCodename = { readonly codename: TCodenames[number]; }; -export type QueryParameters> = { +export type QueryParameters = { readonly query?: TParameters; }; diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 8f5329f0..2bf36b5e 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -10,10 +10,12 @@ import { import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; +import type { DeliverySdkError } from "../models/error.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { DeliveryRequest, QueryParameters } from "../models/request.models.js"; +import type { DeliveryRequest, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; +import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; -import { getDeliveryUrl } from "../utils/url.utils.js"; +import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; export function createDeliveryPagingQuery({ config, @@ -25,8 +27,8 @@ export function createDeliveryPagingQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), }); @@ -42,8 +44,10 @@ export function createDeliveryFetchQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; -}): FetchQuery { - return createFetchQuery(getSharedRequestData({ config, endpoint, schema: schema, request })); +}): FetchQuery { + return createFetchQuery( + getSharedRequestData({ config, endpoint, schema: schema, request }), + ); } function getSharedRequestData({ @@ -56,7 +60,10 @@ function getSharedRequestData({ readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; readonly schema: ZodType; -}): Pick, "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "request" | "zodSchema"> { +}): Pick< + FetchQueryRequest, + "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "request" | "zodSchema" | "mapError" +> { return { abortSignal: undefined, config, @@ -66,6 +73,7 @@ function getSharedRequestData({ }, request: getRequestData({ config, endpoint, request }), zodSchema: schema, + mapError: mapDeliveryError, }; } @@ -77,14 +85,22 @@ function getRequestData({ readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; -}): FetchQueryRequest["request"] { +}): FetchQueryRequest["request"] { return { requestHeaders: getHeaders(request), - url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request), + url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request)), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, }; } +function getQueryParameters(request: DeliveryRequest | undefined): QueryParameterRecord | undefined { + if (!request || !isQueryWithParameters(request)) { + return undefined; + } + + return request.query; +} + function getHeaders(request?: DeliveryRequest): readonly Header[] { if (!request?.config) { return []; @@ -96,32 +112,6 @@ function getBypassCdnCacheHeader(): Header { return { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; } -function addQueryParametersToUrl(url: string, request: DeliveryRequest | undefined): string { - if (!isQueryWithParameters(request)) { - return url; - } - return `${url}${url.includes("?") ? "&" : "?"}${getUrlSearchParams(request).toString()}`; -} - -function getUrlSearchParams(request: QueryParameters>): URLSearchParams { - return new URLSearchParams( - Object.entries(request.query ?? {}) - .filter(hasDefinedQueryValue) - .map(([key, value]) => [key, value.toString()]), - ); -} - -function isQueryWithParameters( - request: DeliveryRequest | undefined, -): request is DeliveryRequest & QueryParameters> { - if (!request) { - return false; - } - - return ("query" satisfies keyof QueryParameters>) in request; -} - -function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { - const [, value] = item; - return value !== undefined && value !== null; +function isQueryWithParameters(request: DeliveryRequest): request is DeliveryRequest & QueryParameters { + return ("query" satisfies keyof QueryParameters) in request; } diff --git a/lib/utils/error.utils.ts b/lib/utils/error.utils.ts new file mode 100644 index 00000000..0aa8c1ae --- /dev/null +++ b/lib/utils/error.utils.ts @@ -0,0 +1,6 @@ +import type { KontentSdkError } from "@kontent-ai/core-sdk"; +import { DeliverySdkError } from "../models/error.models.js"; + +export function mapDeliveryError(error: KontentSdkError): DeliverySdkError { + return new DeliverySdkError(error); +} diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 4e8b65d7..7031936b 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,5 +1,6 @@ import { getEndpointUrl } from "@kontent-ai/core-sdk"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; +import type { QueryParameterRecord } from "../models/request.models.js"; export function getDeliveryUrl({ environmentId, @@ -14,6 +15,13 @@ export function getDeliveryUrl({ }); } +export function addQueryParametersToUrl(url: string, query: QueryParameterRecord | undefined): string { + if (!query) { + return url; + } + return `${url}${url.includes("?") ? "&" : "?"}${getUrlSearchParams(query).toString()}`; +} + function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { if (apiMode === "preview") { return "https://preview-deliver.kontent.ai"; @@ -23,3 +31,16 @@ function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { // Secure mode is distinguished by the Authorization header, not a different endpoint. return "https://deliver.kontent.ai"; } + +function getUrlSearchParams(query: QueryParameterRecord): URLSearchParams { + return new URLSearchParams( + Object.entries(query) + .filter(hasDefinedQueryValue) + .map(([key, value]) => [key, value.toString()]), + ); +} + +function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { + const [, value] = item; + return value !== undefined && value !== null; +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1643c0d2..00000000 --- a/package-lock.json +++ /dev/null @@ -1,5700 +0,0 @@ -{ - "name": "@kontent-ai/delivery-sdk", - "version": "17.0.0-preview.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@kontent-ai/delivery-sdk", - "version": "17.0.0-preview.0", - "license": "MIT", - "devDependencies": { - "@biomejs/biome": "2.4.9", - "@kontent-ai/biome-config": "0.7.0", - "@kontent-ai/eslint-config": "2.4.1", - "@types/node": "25.5.0", - "eslint": "10.1.0", - "tsx": "4.21.0", - "typescript": "6.0.2", - "vitest": "4.1.2" - }, - "engines": { - "node": ">= 22" - }, - "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.20", - "zod": "^4" - } - }, - "node_modules/@biomejs/biome": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.9.tgz", - "integrity": "sha512-wvZW92FrwitTcacvCBT8xdAbfbxWfDLwjYMmU3djjqQTh7Ni4ZdiWIT/x5VcZ+RQuxiKzIOzi5D+dcyJDFZMsA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.9", - "@biomejs/cli-darwin-x64": "2.4.9", - "@biomejs/cli-linux-arm64": "2.4.9", - "@biomejs/cli-linux-arm64-musl": "2.4.9", - "@biomejs/cli-linux-x64": "2.4.9", - "@biomejs/cli-linux-x64-musl": "2.4.9", - "@biomejs/cli-win32-arm64": "2.4.9", - "@biomejs/cli-win32-x64": "2.4.9" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.9.tgz", - "integrity": "sha512-d5G8Gf2RpH5pYwiHLPA+UpG3G9TLQu4WM+VK6sfL7K68AmhcEQ9r+nkj/DvR/GYhYox6twsHUtmWWWIKfcfQQA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.9.tgz", - "integrity": "sha512-LNCLNgqDMG7BLdc3a8aY/dwKPK7+R8/JXJoXjCvZh2gx8KseqBdFDKbhrr7HCWF8SzNhbTaALhTBoh/I6rf9lA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.9.tgz", - "integrity": "sha512-4adnkAUi6K4C/emPRgYznMOcLlUqZdXWM6aIui4VP4LraE764g6Q4YguygnAUoxKjKIXIWPteKMgRbN0wsgwcg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.9.tgz", - "integrity": "sha512-8RCww5xnPn2wpK4L/QDGDOW0dq80uVWfppPxHIUg6mOs9B6gRmqPp32h1Ls3T8GnW8Wo5A8u7vpTwz4fExN+sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.9.tgz", - "integrity": "sha512-L10na7POF0Ks/cgLFNF1ZvIe+X4onLkTi5oP9hY+Rh60Q+7fWzKDDCeGyiHUFf1nGIa9dQOOUPGe2MyYg8nMSQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.9.tgz", - "integrity": "sha512-5TD+WS9v5vzXKzjetF0hgoaNFHMcpQeBUwKKVi3JbG1e9UCrFuUK3Gt185fyTzvRdwYkJJEMqglRPjmesmVv4A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.9.tgz", - "integrity": "sha512-aDZr0RBC3sMGJOU10BvG7eZIlWLK/i51HRIfScE2lVhfts2dQTreowLiJJd+UYg/tHKxS470IbzpuKmd0MiD6g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.9.tgz", - "integrity": "sha512-NS4g/2G9SoQ4ktKtz31pvyc/rmgzlcIDCGU/zWbmHJAqx6gcRj2gj5Q/guXhoWTzCUaQZDIqiCQXHS7BcGYc0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", - "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", - "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", - "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/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.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", - "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.3", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", - "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.1.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", - "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", - "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.1.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - } - }, - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@kontent-ai/biome-config": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@kontent-ai/biome-config/-/biome-config-0.7.0.tgz", - "integrity": "sha512-/dnPAq6QFCuGzdste5dqV0sTa1mBaHP7gLXrNaSzpa3HOGBYYJnKO7kfMD7YUknjoAsOSJyoQ9aAQ7FFB2Yvzg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@biomejs/biome": "^2.3.11" - } - }, - "node_modules/@kontent-ai/core-sdk": { - "version": "12.0.0-preview.20", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-12.0.0-preview.20.tgz", - "integrity": "sha512-GiNsVicCoIsA9E8uhrh/KpPSQETPPCsSrY6qRc8FwnvE7X+yaDDsbOkOHycWwocGew8JnLwFhCj4yOKj8qIwcw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=22" - }, - "peerDependencies": { - "ts-pattern": "^5", - "zod": "^4" - } - }, - "node_modules/@kontent-ai/eslint-config": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@kontent-ai/eslint-config/-/eslint-config-2.4.1.tgz", - "integrity": "sha512-4tIyNDDIxeYaPK17lMN00Ch1kqNbayLmrV+/tcia62XzCejR/cHcXcsWVGhmxS1RjyVpqhstnTWbUrcvmXge2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^8.56.0", - "@typescript-eslint/parser": "^8.56.0", - "eslint": "^9.39.1", - "eslint-plugin-react": "^7.37.5" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "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/@kontent-ai/eslint-config/node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", - "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/type-utils": "8.57.1", - "@typescript-eslint/utils": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.57.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", - "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", - "debug": "^4.4.3" - }, - "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 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/project-service": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", - "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.1", - "@typescript-eslint/types": "^8.57.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", - "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/type-utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", - "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1", - "@typescript-eslint/utils": "8.57.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.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 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", - "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.57.1", - "@typescript-eslint/tsconfig-utils": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/@typescript-eslint/utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", - "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.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 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@kontent-ai/eslint-config/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/@kontent-ai/eslint-config/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", - "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", - "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/esrecurse": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", - "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "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/node": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", - "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", - "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", - "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/visitor-keys": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", - "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.57.1", - "eslint-visitor-keys": "^5.0.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": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", - "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.1.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", - "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", - "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.1.2", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", - "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.2", - "@vitest/utils": "4.1.2", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", - "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", - "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.1.2", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "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==", - "dev": true, - "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/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "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/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "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/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", - "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.4", - "@esbuild/android-arm": "0.27.4", - "@esbuild/android-arm64": "0.27.4", - "@esbuild/android-x64": "0.27.4", - "@esbuild/darwin-arm64": "0.27.4", - "@esbuild/darwin-x64": "0.27.4", - "@esbuild/freebsd-arm64": "0.27.4", - "@esbuild/freebsd-x64": "0.27.4", - "@esbuild/linux-arm": "0.27.4", - "@esbuild/linux-arm64": "0.27.4", - "@esbuild/linux-ia32": "0.27.4", - "@esbuild/linux-loong64": "0.27.4", - "@esbuild/linux-mips64el": "0.27.4", - "@esbuild/linux-ppc64": "0.27.4", - "@esbuild/linux-riscv64": "0.27.4", - "@esbuild/linux-s390x": "0.27.4", - "@esbuild/linux-x64": "0.27.4", - "@esbuild/netbsd-arm64": "0.27.4", - "@esbuild/netbsd-x64": "0.27.4", - "@esbuild/openbsd-arm64": "0.27.4", - "@esbuild/openbsd-x64": "0.27.4", - "@esbuild/openharmony-arm64": "0.27.4", - "@esbuild/sunos-x64": "0.27.4", - "@esbuild/win32-arm64": "0.27.4", - "@esbuild/win32-ia32": "0.27.4", - "@esbuild/win32-x64": "0.27.4" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", - "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.3", - "@eslint/config-helpers": "^0.5.3", - "@eslint/core": "^1.1.1", - "@eslint/plugin-kit": "^0.6.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^9.1.2", - "eslint-visitor-keys": "^5.0.1", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "minimatch": "^10.2.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "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-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-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-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.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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-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-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "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, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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" - } - }, - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.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, - "license": "MIT" - }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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-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/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "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/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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "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/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "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.11", - "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/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/resolve": { - "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rolldown": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.12" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-x64": "1.0.0-rc.12", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "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/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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": ">= 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/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" - } - }, - "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/std-env": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", - "dev": true, - "license": "MIT" - }, - "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.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ts-pattern": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", - "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", - "license": "MIT", - "peer": true - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "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/vite": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "@vitejs/devtools": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "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/vitest": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", - "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.2", - "@vitest/mocker": "4.1.2", - "@vitest/pretty-format": "4.1.2", - "@vitest/runner": "4.1.2", - "@vitest/snapshot": "4.1.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.2", - "@vitest/browser-preview": "4.1.2", - "@vitest/browser-webdriverio": "4.1.2", - "@vitest/ui": "4.1.2", - "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "vite": { - "optional": false - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "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-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "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.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "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" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/package.json b/package.json index 9d888274..470e2e00 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ "types": "./dist/public_api.d.ts", "type": "module", "scripts": { - "prepublishOnly": "npm run build", + "prepublishOnly": "pnpm run build", "eslint": "eslint -c eslint.config.mjs .", - "lint": "npm run biome:check && npm run eslint", - "build": "npm run lint && npm run build:noemit && npm run clean && tsc --p tsconfig.build.json && npm run update:version", + "lint": "pnpm run biome:check && pnpm run eslint", + "build": "pnpm run lint && pnpm run build:noemit && pnpm run clean && tsc --p tsconfig.build.json && pnpm run update:version", "build:noemit": "tsc --p tsconfig.json", - "test": "npm run test:unit && npm run test:integration && npm run test:types", + "test": "vitest run --config=vitest.config.ts --coverage", "test:unit": "vitest run --config=vitest-unit.config.ts", "test:integration": "vitest run --config=vitest-integration.config.ts", "test:types": "tsc --p tests/types/tsconfig.json", @@ -42,17 +42,18 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.20", + "@kontent-ai/core-sdk": "^12.0.0-preview.23", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.1.0", - "@biomejs/biome": "2.4.9", + "@biomejs/biome": "2.4.10", "@types/node": "25.5.0", "typescript": "6.0.2", "vitest": "4.1.2", + "@vitest/coverage-v8": "4.1.2", "tsx": "4.21.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..9a416c49 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3524 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@kontent-ai/core-sdk': + specifier: ^12.0.0-preview.23 + version: 12.0.0-preview.23(ts-pattern@5.9.0)(zod@4.3.6) + zod: + specifier: ^4 + version: 4.3.6 + devDependencies: + '@biomejs/biome': + specifier: 2.4.10 + version: 2.4.10 + '@kontent-ai/biome-config': + specifier: 0.7.0 + version: 0.7.0(@biomejs/biome@2.4.10) + '@kontent-ai/eslint-config': + specifier: 2.4.1 + version: 2.4.1(typescript@6.0.2) + '@types/node': + specifier: 25.5.0 + version: 25.5.0 + '@vitest/coverage-v8': + specifier: 4.1.2 + version: 4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0))) + eslint: + specifier: 10.1.0 + version: 10.1.0 + tsx: + specifier: 4.21.0 + version: 4.21.0 + typescript: + specifier: 6.0.2 + version: 6.0.2 + vitest: + specifier: 4.1.2 + version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + +packages: + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@biomejs/biome@2.4.10': + resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.10': + resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.10': + resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.10': + resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.4.10': + resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.4.10': + resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.4.10': + resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.4.10': + resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.10': + resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-array@0.23.3': + resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.5.3': + resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@3.0.3': + resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.6.1': + resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@kontent-ai/biome-config@0.7.0': + resolution: {integrity: sha512-/dnPAq6QFCuGzdste5dqV0sTa1mBaHP7gLXrNaSzpa3HOGBYYJnKO7kfMD7YUknjoAsOSJyoQ9aAQ7FFB2Yvzg==} + peerDependencies: + '@biomejs/biome': ^2.3.11 + + '@kontent-ai/core-sdk@12.0.0-preview.23': + resolution: {integrity: sha512-nRiFrR+hnrCkGV3uqo7Czo6HrHDYItfSijxd5EHbF4VbXjHHz6BT+ql7AkXWf9iTolP6DcyBJiBwij3mxtM4WA==} + engines: {node: '>=22'} + peerDependencies: + ts-pattern: ^5 + zod: ^4 + + '@kontent-ai/eslint-config@2.4.1': + resolution: {integrity: sha512-4tIyNDDIxeYaPK17lMN00Ch1kqNbayLmrV+/tcia62XzCejR/cHcXcsWVGhmxS1RjyVpqhstnTWbUrcvmXge2Q==} + + '@napi-rs/wasm-runtime@1.1.2': + resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + + '@rolldown/binding-android-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.12': + resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + + '@typescript-eslint/eslint-plugin@8.58.0': + resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.58.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.58.0': + resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.58.0': + resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.58.0': + resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.58.0': + resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.58.0': + resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.58.0': + resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.58.0': + resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.58.0': + resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.58.0': + resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/coverage-v8@4.1.2': + resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} + peerDependencies: + '@vitest/browser': 4.1.2 + vitest: 4.1.2 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.1.2': + resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} + + '@vitest/mocker@4.1.2': + resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.2': + resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + + '@vitest/runner@4.1.2': + resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} + + '@vitest/snapshot@4.1.2': + resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} + + '@vitest/spy@4.1.2': + resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} + + '@vitest/utils@4.1.2': + resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.3.1: + resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.1.0: + resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown@1.0.0-rc.12: + resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite@8.0.3: + resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.1.2: + resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.2 + '@vitest/browser-preview': 4.1.2 + '@vitest/browser-webdriverio': 4.1.2 + '@vitest/ui': 4.1.2 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@1.0.2': {} + + '@biomejs/biome@2.4.10': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.10 + '@biomejs/cli-darwin-x64': 2.4.10 + '@biomejs/cli-linux-arm64': 2.4.10 + '@biomejs/cli-linux-arm64-musl': 2.4.10 + '@biomejs/cli-linux-x64': 2.4.10 + '@biomejs/cli-linux-x64-musl': 2.4.10 + '@biomejs/cli-win32-arm64': 2.4.10 + '@biomejs/cli-win32-x64': 2.4.10 + + '@biomejs/cli-darwin-arm64@2.4.10': + optional: true + + '@biomejs/cli-darwin-x64@2.4.10': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.10': + optional: true + + '@biomejs/cli-linux-arm64@2.4.10': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.10': + optional: true + + '@biomejs/cli-linux-x64@2.4.10': + optional: true + + '@biomejs/cli-win32-arm64@2.4.10': + optional: true + + '@biomejs/cli-win32-x64@2.4.10': + optional: true + + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0)': + dependencies: + eslint: 10.1.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': + dependencies: + eslint: 9.39.4 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-array@0.23.3': + dependencies: + '@eslint/object-schema': 3.0.3 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/config-helpers@0.5.3': + dependencies: + '@eslint/core': 1.1.1 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@1.1.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.5': + dependencies: + ajv: 6.14.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.4': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/object-schema@3.0.3': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@eslint/plugin-kit@0.6.1': + dependencies: + '@eslint/core': 1.1.1 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.10)': + dependencies: + '@biomejs/biome': 2.4.10 + + '@kontent-ai/core-sdk@12.0.0-preview.23(ts-pattern@5.9.0)(zod@4.3.6)': + dependencies: + ts-pattern: 5.9.0 + zod: 4.3.6 + + '@kontent-ai/eslint-config@2.4.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + eslint: 9.39.4 + eslint-plugin-react: 7.37.5(eslint@9.39.4) + transitivePeerDependencies: + - jiti + - supports-color + - typescript + + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.122.0': {} + + '@rolldown/binding-android-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.12': {} + + '@standard-schema/spec@1.1.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@25.5.0': + dependencies: + undici-types: 7.18.2 + + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.0 + eslint: 9.39.4 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.0 + debug: 4.4.3 + eslint: 9.39.4 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.58.0(typescript@6.0.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) + '@typescript-eslint/types': 8.58.0 + debug: 4.4.3 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.58.0': + dependencies: + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 + + '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': + dependencies: + typescript: 6.0.2 + + '@typescript-eslint/type-utils@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + dependencies: + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + debug: 4.4.3 + eslint: 9.39.4 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.58.0': {} + + '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.2)': + dependencies: + '@typescript-eslint/project-service': 8.58.0(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/visitor-keys': 8.58.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) + eslint: 9.39.4 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.58.0': + dependencies: + '@typescript-eslint/types': 8.58.0 + eslint-visitor-keys: 5.0.1 + + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.2 + ast-v8-to-istanbul: 1.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.2 + obug: 2.1.1 + std-env: 4.0.0 + tinyrainbow: 3.1.0 + vitest: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + + '@vitest/expect@4.1.2': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0) + + '@vitest/pretty-format@4.1.2': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.2': + dependencies: + '@vitest/utils': 4.1.2 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.2': + dependencies: + '@vitest/pretty-format': 4.1.2 + '@vitest/utils': 4.1.2 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.2': {} + + '@vitest/utils@4.1.2': + dependencies: + '@vitest/pretty-format': 4.1.2 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.14.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + brace-expansion@1.1.13: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + chai@6.2.2: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-libc@2.1.2: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.3.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + safe-array-concat: 1.1.3 + + es-module-lexer@2.0.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react@7.37.5(eslint@9.39.4): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.3.1 + eslint: 9.39.4 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.6 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.1.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.3 + '@eslint/config-helpers': 0.5.3 + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + eslint@9.39.4: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.7: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.4 + + math-intrinsics@1.1.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.13 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obug@2.1.1: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + react-is@16.13.1: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + 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 + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.6: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1): + dependencies: + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.12 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-x64': 1.0.0-rc.12 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + semver@6.3.1: {} + + semver@7.7.4: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@4.0.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.4: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyrainbow@3.1.0: {} + + ts-api-utils@2.5.0(typescript@6.0.2): + dependencies: + typescript: 6.0.2 + + ts-pattern@5.9.0: {} + + tslib@2.8.1: + optional: true + + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.13.7 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@6.0.2: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.18.2: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.8 + rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.5.0 + esbuild: 0.27.4 + fsevents: 2.3.3 + tsx: 4.21.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)): + dependencies: + '@vitest/expect': 4.1.2 + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.2 + '@vitest/runner': 4.1.2 + '@vitest/snapshot': 4.1.2 + '@vitest/spy': 4.1.2 + '@vitest/utils': 4.1.2 + es-module-lexer: 2.0.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.0.4 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 25.5.0 + transitivePeerDependencies: + - msw + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.20: + 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 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} + + zod@4.3.6: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..fd4bae86 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +ignoredBuiltDependencies: + - esbuild \ No newline at end of file diff --git a/tests/unit/utils/url-utils.spec.ts b/tests/unit/utils/url-utils.spec.ts new file mode 100644 index 00000000..670a8df0 --- /dev/null +++ b/tests/unit/utils/url-utils.spec.ts @@ -0,0 +1,39 @@ +import { describe, expect, it } from "vitest"; +import { addQueryParametersToUrl } from "../../../lib/utils/url.utils.js"; + +describe("addQueryParametersToUrl", () => { + const baseUrl = "https://deliver.kontent.ai/xyz/languages"; + + it("returns URL unchanged when query is undefined", () => { + expect(addQueryParametersToUrl(baseUrl, undefined)).toStrictEqual(baseUrl); + }); + + it("appends parameters with ? when URL has no existing query string", () => { + const result = addQueryParametersToUrl(baseUrl, { skip: "5" }); + + expect(result).toStrictEqual(`${baseUrl}?skip=5`); + }); + + it("appends parameters with & when URL already contains a query string", () => { + const urlWithQuery = `${baseUrl}?existing=1`; + const result = addQueryParametersToUrl(urlWithQuery, { skip: "2" }); + + expect(result).toStrictEqual(`${urlWithQuery}&skip=2`); + }); + + it("converts number values to strings", () => { + const result = addQueryParametersToUrl(baseUrl, { skip: 3, limit: 7 }); + const params = new URL(result).searchParams; + + expect(params.get("skip")).toStrictEqual("3"); + expect(params.get("limit")).toStrictEqual("7"); + }); + + it("omits undefined query parameter values", () => { + const result = addQueryParametersToUrl(baseUrl, { skip: 1, limit: undefined }); + const params = new URL(result).searchParams; + + expect(params.get("skip")).toStrictEqual("1"); + expect(params.has("limit")).toBe(false); + }); +}); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index d8323457..47c2073a 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,4 @@ -import { type FetchQuery, isPagingQuery, type JsonValue, type PagedFetchQuery } from "@kontent-ai/core-sdk"; +import { type FetchQuery, isPagingQuery, type JsonValue, type KontentSdkError, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; @@ -12,7 +12,7 @@ type TestType = "Integration" | "Unit"; type SelectQuery = ( client: DeliveryClient, -) => FetchQuery | PagedFetchQuery; +) => FetchQuery | PagedFetchQuery; export function getIntegrationTestsSchema(): DeliveryClientSchema { return { @@ -237,7 +237,7 @@ function registerPagingTests({ iteratorPayloads, maxPagesCount, }: { - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; readonly testName: string; readonly testType: TestType; readonly unitTestPayload: TResponsePayload; @@ -307,7 +307,7 @@ function registerPagingIteratorTests({ unitTestPayload, }: { readonly testName: string; - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; readonly iteratorPayloads: readonly TResponsePayload[]; readonly maxPagesCount: number; readonly testType: TestType; @@ -351,7 +351,7 @@ async function executeDefaultQueryAsync({ async function executePagingQueryAsync({ query, }: { - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; }): Promise<{ readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; readonly pagingSuccess: boolean; diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 41fad58e..254f650c 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,4 +1,11 @@ -import { type ContinuationHeaderName, type FetchQuery, type Header, nilUuid, type PagedFetchQuery } from "@kontent-ai/core-sdk"; +import { + type ContinuationHeaderName, + type FetchQuery, + type Header, + type KontentSdkError, + nilUuid, + type PagedFetchQuery, +} from "@kontent-ai/core-sdk"; export const fakeXContinuationTokenHeader: Header = { name: "X-Continuation" satisfies ContinuationHeaderName, @@ -11,8 +18,8 @@ export function getFakeUuid(): string { return nilUuid; } -export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { - type ExpectedFunctions = keyof FetchQuery; +export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { + type ExpectedFunctions = keyof FetchQuery; if (!query || typeof query !== "object") { return false; } @@ -25,8 +32,8 @@ export function isFetchQueryWithExpectedFunctions(query: unknown): query is Fetc return false; } -export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is PagedFetchQuery { - type ExpectedFunctions = keyof PagedFetchQuery; +export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is PagedFetchQuery { + type ExpectedFunctions = keyof PagedFetchQuery; if (!query || typeof query !== "object") { return false; } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..5480742e --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + root: ".", + test: { + dir: "tests", + exclude: ["types/**"], + globals: true, + environment: "node", + coverage: { + provider: "v8", + thresholds: { lines: 100, functions: 100, branches: 100 }, + exclude: ["**/tests/**", "**/types/**"], + }, + }, + build: { + target: "esnext", + }, +}); From 019fde61e12efa0970c259752e2c52080d58d64b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 11:28:45 +0200 Subject: [PATCH 074/221] Only report coverage in console --- vitest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vitest.config.ts b/vitest.config.ts index 5480742e..9711a416 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ environment: "node", coverage: { provider: "v8", + reporter: ["text"], thresholds: { lines: 100, functions: 100, branches: 100 }, exclude: ["**/tests/**", "**/types/**"], }, From 93ecbc5c8662dc93fe79fac519635acd8b10eae3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 12:19:15 +0200 Subject: [PATCH 075/221] Tests that DeliverySDKError instance is returned --- tests/unit/errors/delivery-sdk-error.spec.ts | 25 +++++++++++++ tests/utils/integration-test.utils.ts | 37 +++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/unit/errors/delivery-sdk-error.spec.ts diff --git a/tests/unit/errors/delivery-sdk-error.spec.ts b/tests/unit/errors/delivery-sdk-error.spec.ts new file mode 100644 index 00000000..64be917f --- /dev/null +++ b/tests/unit/errors/delivery-sdk-error.spec.ts @@ -0,0 +1,25 @@ +import { getDefaultHttpService } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import { DeliverySdkError } from "../../../lib/models/error.models.js"; +import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +describe("DeliverySdkError", async () => { + const { error } = await createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: () => { + throw new Error("Simulated failure"); + }, + }, + }), + }) + .listLanguages() + .fetchPageSafe(); + + it("error returned from a failed query should be an instance of DeliverySdkError", () => { + expect(error).toBeInstanceOf(DeliverySdkError); + }); +}); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 47c2073a..59afc4c2 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,8 +1,9 @@ -import { type FetchQuery, isPagingQuery, type JsonValue, type KontentSdkError, type PagedFetchQuery } from "@kontent-ai/core-sdk"; +import { type FetchQuery, getDefaultHttpService, isPagingQuery, type JsonValue, type KontentSdkError, type PagedFetchQuery } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoints } from "../../lib/models/core.models.js"; +import { DeliverySdkError } from "../../lib/models/error.models.js"; import { createDeliveryClient } from "../../lib/public_api.js"; import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; import { getIntegrationTestConfig } from "../integration-tests.config.js"; @@ -51,6 +52,8 @@ export async function runQueryTestsAsync({ unitTestPayload, }); } + + await runFailingClientQueryTestAsync({ endpoint, selectQuery }); } async function runClientQueryTestsAsync({ @@ -91,6 +94,21 @@ async function runClientQueryTestsAsync({ } } +function createFailingUnitTestClient(): DeliveryClient { + return createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + httpService: getDefaultHttpService({ + adapter: { + executeRequest: () => { + throw new Error("Simulated failure"); + }, + }, + }), + }); +} + function createUnitTestClient(unitTestPayload: TResponsePayload): DeliveryClient { return createDeliveryClient({ apiMode: "public", @@ -327,6 +345,23 @@ function registerPagingIteratorTests({ } } +async function runFailingClientQueryTestAsync({ + endpoint, + selectQuery, +}: { + readonly endpoint: DeliveryEndpoints; + readonly selectQuery: SelectQuery; +}): Promise { + const client = createFailingUnitTestClient(); + const query = selectQuery(client); + const { error } = isPagingQuery(query) ? await query.fetchPageSafe() : await query.fetchSafe(); + const testName = `Unit[${endpoint}]: `; + + it(`${testName} Error should be an instance of DeliverySdkError`, () => { + expect(error).toBeInstanceOf(DeliverySdkError); + }); +} + async function executeDefaultQueryAsync({ client, selectQuery, From c233f87256cb8c8e0ea434be6d9dce90ce288d62 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 12:21:57 +0200 Subject: [PATCH 076/221] Update integration-test.utils.ts --- tests/utils/integration-test.utils.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 59afc4c2..1909b942 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,11 @@ -import { type FetchQuery, getDefaultHttpService, isPagingQuery, type JsonValue, type KontentSdkError, type PagedFetchQuery } from "@kontent-ai/core-sdk"; +import { + type FetchQuery, + getDefaultHttpService, + isPagingQuery, + type JsonValue, + type KontentSdkError, + type PagedFetchQuery, +} from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; From 6a36b99cb51e66075b3c445e7c54389682db39a6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 12:29:36 +0200 Subject: [PATCH 077/221] removes superfluous test --- tests/unit/validation/schema-validation.spec.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index 36f17843..bbd60629 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -90,21 +90,4 @@ describe("Schema validation", () => { expect(error).toBeUndefined(); expect(success).toBeTruthy(); }); - - test("Response should be successful when an empty array is provided as codenames source", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeUndefined(); - expect(success).toBeTruthy(); - }); }); From f51f8142c59ac2e522c747281bbb0323573ddd11 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 12:33:18 +0200 Subject: [PATCH 078/221] Update query-parameters.spec.ts --- tests/unit/queries/query-parameters.spec.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 81fe3209..374b9ad5 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -54,18 +54,4 @@ describe("Query parameters", () => { const parsedUrl = new URL(url); expect(parsedUrl.searchParams.get("elements")).toStrictEqual("x,y,z"); }); - - it("Undefined query parameters should be omitted from the url", () => { - const { url } = client.listLanguages({ - query: { - skip: 5, - // limit and order are absent (undefined) — must not appear in URL - }, - }); - - const parsedUrl = new URL(url); - expect(parsedUrl.searchParams.get("skip")).toStrictEqual("5"); - expect(parsedUrl.searchParams.has("limit")).toBe(false); - expect(parsedUrl.searchParams.has("order")).toBe(false); - }); }); From 1afc4aa5d0006996f3aa743ba691aac889b42add Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 2 Apr 2026 13:20:52 +0200 Subject: [PATCH 079/221] Separates json samples into dedicated files --- ...etch-content-type-element-query.payload.ts | 8 ++ .../fetch-content-type-element-query.spec.ts | 7 +- .../fetch-content-type-query.payload.ts | 65 ++++++++++++++ .../fetch-content-type-query.spec.ts | 64 +------------- .../list-content-types-query.payload.ts | 88 +++++++++++++++++++ .../list-content-types-query.spec.ts | 87 +----------------- .../languages/list-languages-query.payload.ts | 20 +++++ .../languages/list-languages-query.spec.ts | 19 +--- .../fetch-taxonomy-query.payload.ts | 39 ++++++++ .../taxonomies/fetch-taxonomy-query.spec.ts | 38 +------- .../list-taxonomies-query.payload.ts | 49 +++++++++++ .../taxonomies/list-taxonomies-query.spec.ts | 48 +--------- 12 files changed, 281 insertions(+), 251 deletions(-) create mode 100644 tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts create mode 100644 tests/integration/queries/content-types/fetch-content-type-query.payload.ts create mode 100644 tests/integration/queries/content-types/list-content-types-query.payload.ts create mode 100644 tests/integration/queries/languages/list-languages-query.payload.ts create mode 100644 tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts create mode 100644 tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts new file mode 100644 index 00000000..c4f58df8 --- /dev/null +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts @@ -0,0 +1,8 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; + +export default { + type: "text", + name: "Title", + codename: "title", +} satisfies ContentTypeElementPayload; diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 80329e7c..38d0d48a 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -2,17 +2,14 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ContentTypeElementPayload, contentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./fetch-content-type-element-query.payload.js"; describe("Fetch content type element query", async () => { const typeCodename = "movie"; const elementCodename = "title"; await runQueryTestsAsync>({ endpoint: `types/${typeCodename}/elements/${elementCodename}`, - unitTestPayload: { - type: "text", - name: "Title", - codename: "title", - }, + unitTestPayload, selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename }), expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), }); diff --git a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts new file mode 100644 index 00000000..9611014e --- /dev/null +++ b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts @@ -0,0 +1,65 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ContentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; + +export default { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "text", + name: "Title", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + }, + description: { + type: "rich_text", + name: "Description", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + options: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + }, + cover: { + type: "asset", + name: "Cover", + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + }, + url: { + type: "url_slug", + name: "Url", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + }, + cast: { + type: "modular_content", + name: "Cast", + }, + customElem: { + type: "custom", + name: "Custom element", + value: null, + }, + }, +} satisfies ContentTypePayload; diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index 71f6110d..a52a45de 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -2,73 +2,13 @@ import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ContentTypePayload, contentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./fetch-content-type-query.payload.js"; describe("Fetch content type query", async () => { const codename = "movie"; await runQueryTestsAsync>({ endpoint: `types/${codename}`, - unitTestPayload: { - system: { - id: "445da25c-d991-4b0e-bece-c572124d91f5", - name: "Movie", - codename: "movie", - last_modified: "2026-02-26T14:02:39.320664Z", - }, - elements: { - title: { - type: "text", - name: "Title", - }, - length_in_minutes: { - type: "number", - name: "Length in minutes", - }, - description: { - type: "rich_text", - name: "Description", - }, - is_blockbuster: { - type: "multiple_choice", - name: "Is blockbuster", - options: [ - { - name: "yes", - codename: "yes", - }, - ], - }, - release_date: { - type: "date_time", - name: "Release date", - }, - cover: { - type: "asset", - name: "Cover", - }, - category: { - type: "taxonomy", - name: "Category", - taxonomy_group: "movie_type", - }, - url: { - type: "url_slug", - name: "Url", - }, - metadata__metadata_description: { - type: "text", - name: "Metadata description", - }, - cast: { - type: "modular_content", - name: "Cast", - }, - customElem: { - type: "custom", - name: "Custom element", - value: null, - }, - }, - }, + unitTestPayload, selectQuery: (client) => client.fetchContentType({ codename: codename }), expectedSchema: contentTypePayload(getIntegrationTestsSchema()), }); diff --git a/tests/integration/queries/content-types/list-content-types-query.payload.ts b/tests/integration/queries/content-types/list-content-types-query.payload.ts new file mode 100644 index 00000000..98cf2f43 --- /dev/null +++ b/tests/integration/queries/content-types/list-content-types-query.payload.ts @@ -0,0 +1,88 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; + +export default { + types: [ + { + system: { + id: "445da25c-d991-4b0e-bece-c572124d91f5", + name: "Movie", + codename: "movie", + last_modified: "2026-02-26T14:02:39.320664Z", + }, + elements: { + title: { + type: "text", + name: "Title", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + }, + description: { + type: "rich_text", + name: "Description", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + options: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + }, + cover: { + type: "asset", + name: "Cover", + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + }, + url: { + type: "url_slug", + name: "Url", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + }, + cast: { + type: "modular_content", + name: "Cast", + }, + }, + }, + { + system: { + id: "068c2ea7-144f-4472-ac0a-70e6f53034bf", + name: "Stars", + codename: "stars", + last_modified: "2026-02-26T14:02:20.3307783Z", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + }, + lastname: { + type: "text", + name: "Lastname", + }, + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 2, + next_page: "", + }, +} satisfies ListContentTypesPayload; diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index c4b82fbe..3d2b9231 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -2,95 +2,12 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ListContentTypesPayload, listContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./list-content-types-query.payload.js"; describe("List content types query", async () => { await runQueryTestsAsync>({ endpoint: "types", - unitTestPayload: { - types: [ - { - system: { - id: "445da25c-d991-4b0e-bece-c572124d91f5", - name: "Movie", - codename: "movie", - last_modified: "2026-02-26T14:02:39.320664Z", - }, - elements: { - title: { - type: "text", - name: "Title", - }, - length_in_minutes: { - type: "number", - name: "Length in minutes", - }, - description: { - type: "rich_text", - name: "Description", - }, - is_blockbuster: { - type: "multiple_choice", - name: "Is blockbuster", - options: [ - { - name: "yes", - codename: "yes", - }, - ], - }, - release_date: { - type: "date_time", - name: "Release date", - }, - cover: { - type: "asset", - name: "Cover", - }, - category: { - type: "taxonomy", - name: "Category", - taxonomy_group: "movie_type", - }, - url: { - type: "url_slug", - name: "Url", - }, - metadata__metadata_description: { - type: "text", - name: "Metadata description", - }, - cast: { - type: "modular_content", - name: "Cast", - }, - }, - }, - { - system: { - id: "068c2ea7-144f-4472-ac0a-70e6f53034bf", - name: "Stars", - codename: "stars", - last_modified: "2026-02-26T14:02:20.3307783Z", - }, - elements: { - firstname: { - type: "text", - name: "Firstname", - }, - lastname: { - type: "text", - name: "Lastname", - }, - }, - }, - ], - pagination: { - skip: 0, - limit: 0, - count: 2, - next_page: "", - }, - }, + unitTestPayload, selectQuery: (client) => client.listContentTypes(), expectedSchema: listContentTypesPayload(getIntegrationTestsSchema()), }); diff --git a/tests/integration/queries/languages/list-languages-query.payload.ts b/tests/integration/queries/languages/list-languages-query.payload.ts new file mode 100644 index 00000000..d6710d72 --- /dev/null +++ b/tests/integration/queries/languages/list-languages-query.payload.ts @@ -0,0 +1,20 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ListLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; + +export default { + languages: [ + { + system: { + id: "00000000-0000-0000-0000-000000000000", + name: "Default project language", + codename: "default", + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, +} satisfies ListLanguagesPayload; diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index d59fb106..be28eca2 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -2,27 +2,12 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ListLanguagesPayload, listLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./list-languages-query.payload.js"; describe("List languages query", async () => { await runQueryTestsAsync>({ endpoint: "languages", - unitTestPayload: { - languages: [ - { - system: { - id: "00000000-0000-0000-0000-000000000000", - name: "Default project language", - codename: "default", - }, - }, - ], - pagination: { - skip: 0, - limit: 0, - count: 1, - next_page: "", - }, - }, + unitTestPayload, selectQuery: (client) => client.listLanguages(), expectedSchema: listLanguagesPayload(getIntegrationTestsSchema()), }); diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts new file mode 100644 index 00000000..047db5f6 --- /dev/null +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts @@ -0,0 +1,39 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; + +export default { + system: { + id: "b7f516a3-36b9-4108-919f-ed83ea91926e", + name: "Movie type", + codename: "movie_type", + last_modified: "2026-02-26T10:12:41.5176081Z", + }, + terms: [ + { + name: "Drama", + codename: "drama", + terms: [], + }, + { + name: "Comedy", + codename: "comedy", + terms: [ + { + name: "Sitcom", + codename: "sitcom", + terms: [], + }, + { + name: "Stand-up", + codename: "stand_up", + terms: [], + }, + ], + }, + { + name: "Action", + codename: "action", + terms: [], + }, + ], +} satisfies TaxonomyPayload; diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index c8d93528..49cec32d 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -2,47 +2,13 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type TaxonomyPayload, taxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./fetch-taxonomy-query.payload.js"; describe("Fetch taxonomy query", async () => { const codename = "movie_type"; await runQueryTestsAsync>({ endpoint: `taxonomies/${codename}`, - unitTestPayload: { - system: { - id: "b7f516a3-36b9-4108-919f-ed83ea91926e", - name: "Movie type", - codename: "movie_type", - last_modified: "2026-02-26T10:12:41.5176081Z", - }, - terms: [ - { - name: "Drama", - codename: "drama", - terms: [], - }, - { - name: "Comedy", - codename: "comedy", - terms: [ - { - name: "Sitcom", - codename: "sitcom", - terms: [], - }, - { - name: "Stand-up", - codename: "stand_up", - terms: [], - }, - ], - }, - { - name: "Action", - codename: "action", - terms: [], - }, - ], - }, + unitTestPayload, selectQuery: (client) => client.fetchTaxonomy({ codename: codename }), expectedSchema: taxonomyPayload(getIntegrationTestsSchema()), }); diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts new file mode 100644 index 00000000..23f55457 --- /dev/null +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts @@ -0,0 +1,49 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; + +export default { + taxonomies: [ + { + system: { + id: "b7f516a3-36b9-4108-919f-ed83ea91926e", + name: "Movie type", + codename: "movie_type", + last_modified: "2026-02-26T10:12:21.5095299Z", + }, + terms: [ + { + name: "Drama", + codename: "drama", + terms: [], + }, + { + name: "Comedy", + codename: "comedy", + terms: [ + { + name: "Sitcom", + codename: "sitcom", + terms: [], + }, + { + name: "Stand-up", + codename: "stand_up", + terms: [], + }, + ], + }, + { + name: "Action", + codename: "action", + terms: [], + }, + ], + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, +} satisfies ListTaxonomiesPayload; diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index c11eff75..f5233b08 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -2,56 +2,12 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./list-taxonomies-query.payload.js"; describe("List taxonomies query", async () => { await runQueryTestsAsync>({ endpoint: "taxonomies", - unitTestPayload: { - taxonomies: [ - { - system: { - id: "b7f516a3-36b9-4108-919f-ed83ea91926e", - name: "Movie type", - codename: "movie_type", - last_modified: "2026-02-26T10:12:21.5095299Z", - }, - terms: [ - { - name: "Drama", - codename: "drama", - terms: [], - }, - { - name: "Comedy", - codename: "comedy", - terms: [ - { - name: "Sitcom", - codename: "sitcom", - terms: [], - }, - { - name: "Stand-up", - codename: "stand_up", - terms: [], - }, - ], - }, - { - name: "Action", - codename: "action", - terms: [], - }, - ], - }, - ], - pagination: { - skip: 0, - limit: 0, - count: 1, - next_page: "", - }, - }, + unitTestPayload, selectQuery: (client) => client.listTaxonomies(), expectedSchema: listTaxonomiesPayload(getIntegrationTestsSchema()), }); From 378c14b1d2d360b2c2129b5b5451f564e97542ac Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 7 Apr 2026 09:12:29 +0200 Subject: [PATCH 080/221] update deps --- package.json | 4 +-- pnpm-lock.yaml | 98 +++++++++++++++++++++++++------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 470e2e00..5fa10f8c 100644 --- a/package.json +++ b/package.json @@ -48,9 +48,9 @@ "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.1.0", + "eslint": "10.2.0", "@biomejs/biome": "2.4.10", - "@types/node": "25.5.0", + "@types/node": "25.5.2", "typescript": "6.0.2", "vitest": "4.1.2", "@vitest/coverage-v8": "4.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a416c49..408a230c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,14 +25,14 @@ importers: specifier: 2.4.1 version: 2.4.1(typescript@6.0.2) '@types/node': - specifier: 25.5.0 - version: 25.5.0 + specifier: 25.5.2 + version: 25.5.2 '@vitest/coverage-v8': specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0))) + version: 4.1.2(vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0))) eslint: - specifier: 10.1.0 - version: 10.1.0 + specifier: 10.2.0 + version: 10.2.0 tsx: specifier: 4.21.0 version: 4.21.0 @@ -41,7 +41,7 @@ importers: version: 6.0.2 vitest: specifier: 4.1.2 - version: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + version: 4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) packages: @@ -298,24 +298,24 @@ packages: resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-array@0.23.3': - resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + '@eslint/config-array@0.23.4': + resolution: {integrity: sha512-lf19F24LSMfF8weXvW5QEtnLqW70u7kgit5e9PSx0MsHAFclGd1T9ynvWEMDT1w5J4Qt54tomGeAhdoAku1Xow==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/config-helpers@0.4.2': resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.3': - resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + '@eslint/config-helpers@0.5.4': + resolution: {integrity: sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.1.1': - resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + '@eslint/core@1.2.0': + resolution: {integrity: sha512-8FTGbNzTvmSlc4cZBaShkC6YvFMG0riksYWRFKXztqVdXaQbcZLXlFbSpC05s70sGEsXAw0qwhx69JiW7hQS7A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/eslintrc@3.3.5': @@ -330,16 +330,16 @@ packages: resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.3': - resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + '@eslint/object-schema@3.0.4': + resolution: {integrity: sha512-55lO/7+Yp0ISKRP0PsPtNTeNGapXaO085aELZmWCVc5SH3jfrqpuU6YgOdIxMS99ZHkQN1cXKE+cdIqwww9ptw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/plugin-kit@0.4.1': resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.6.1': - resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + '@eslint/plugin-kit@0.7.0': + resolution: {integrity: sha512-ejvBr8MQCbVsWNZnCwDXjUKq40MDmHalq7cJ6e9s/qzTUFIIo/afzt1Vui9T97FM/V/pN4YsFVoed5NIa96RDg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.1': @@ -505,8 +505,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@25.5.2': + resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} '@typescript-eslint/eslint-plugin@8.58.0': resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} @@ -837,8 +837,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.1.0: - resolution: {integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==} + eslint@10.2.0: + resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1842,9 +1842,9 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.1.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': dependencies: - eslint: 10.1.0 + eslint: 10.2.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -1862,9 +1862,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-array@0.23.3': + '@eslint/config-array@0.23.4': dependencies: - '@eslint/object-schema': 3.0.3 + '@eslint/object-schema': 3.0.4 debug: 4.4.3 minimatch: 10.2.5 transitivePeerDependencies: @@ -1874,15 +1874,15 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/config-helpers@0.5.3': + '@eslint/config-helpers@0.5.4': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.0 '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.1.1': + '@eslint/core@1.2.0': dependencies: '@types/json-schema': 7.0.15 @@ -1904,16 +1904,16 @@ snapshots: '@eslint/object-schema@2.1.7': {} - '@eslint/object-schema@3.0.3': {} + '@eslint/object-schema@3.0.4': {} '@eslint/plugin-kit@0.4.1': dependencies: '@eslint/core': 0.17.0 levn: 0.4.1 - '@eslint/plugin-kit@0.6.1': + '@eslint/plugin-kit@0.7.0': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -1947,7 +1947,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) @@ -2037,11 +2037,11 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.5.0': + '@types/node@25.5.2': dependencies: undici-types: 7.18.2 - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.1.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) @@ -2132,7 +2132,7 @@ snapshots: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)))': + '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -2144,7 +2144,7 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + vitest: 4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) '@vitest/expect@4.1.2': dependencies: @@ -2155,13 +2155,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0))': + '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0) '@vitest/pretty-format@4.1.2': dependencies: @@ -2555,14 +2555,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.1.0: + eslint@10.2.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.3 - '@eslint/config-helpers': 0.5.3 - '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/config-array': 0.23.4 + '@eslint/config-helpers': 0.5.4 + '@eslint/core': 1.2.0 + '@eslint/plugin-kit': 0.7.0 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -3424,7 +3424,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0): + vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3432,7 +3432,7 @@ snapshots: rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.2 esbuild: 0.27.4 fsevents: 2.3.3 tsx: 4.21.0 @@ -3440,10 +3440,10 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - vitest@4.1.2(@types/node@25.5.0)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)): + vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0)) + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -3460,10 +3460,10 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.2 transitivePeerDependencies: - msw From cff45a22399ae85a9664b965bd7761b35b730a53 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 7 Apr 2026 10:00:39 +0200 Subject: [PATCH 081/221] Extends content type element payload tests --- .../content-types/content-type.models.ts | 1 - ...etch-content-type-element-query.payload.ts | 64 +++++++++++++++++-- .../fetch-content-type-element-query.spec.ts | 18 +++--- 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index ed2c87ac..abbb60c9 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -81,7 +81,6 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ .object({ type: z.literal("custom"), name: z.string(), - value: z.string().or(z.null()), }) .catchall(jsonValueSchema) .readonly(), diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts index c4f58df8..fd1086d5 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts @@ -1,8 +1,62 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; -export default { - type: "text", - name: "Title", - codename: "title", -} satisfies ContentTypeElementPayload; +export default [ + { + type: "text", + name: "Title", + codename: "title", + }, + { + type: "custom", + name: "Custom", + codename: "custom", + }, + { + type: "number", + name: "Length in minutes", + codename: "length_in_minutes", + }, + { + type: "rich_text", + name: "Description", + codename: "description", + }, + { + type: "multiple_choice", + name: "Is blockbuster", + options: [ + { + name: "yes", + codename: "yes", + }, + ], + codename: "is_blockbuster", + }, + { + type: "date_time", + name: "Release date", + codename: "release_date", + }, + { + type: "asset", + name: "Cover", + codename: "cover", + }, + { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + codename: "category", + }, + { + type: "text", + name: "Metadata description", + codename: "metadata__metadata_description", + }, + { + type: "modular_content", + name: "Cast", + codename: "cast", + }, +] satisfies readonly ContentTypeElementPayload[]; diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 38d0d48a..0c6decd7 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -2,15 +2,17 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ContentTypeElementPayload, contentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./fetch-content-type-element-query.payload.js"; +import payloads from "./fetch-content-type-element-query.payload.js"; describe("Fetch content type element query", async () => { const typeCodename = "movie"; - const elementCodename = "title"; - await runQueryTestsAsync>({ - endpoint: `types/${typeCodename}/elements/${elementCodename}`, - unitTestPayload, - selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename }), - expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), - }); + + for (const payload of payloads) { + await runQueryTestsAsync>({ + endpoint: `types/${typeCodename}/elements/${payload.codename}`, + unitTestPayload: payload, + selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename: payload.codename }), + expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), + }); + } }); From 3958b026105e3419e4de98a40502de441323ce97 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 7 Apr 2026 10:22:27 +0200 Subject: [PATCH 082/221] Runs payloads tests in type/element in parallel, update star type --- .../fetch-content-type-element-query.spec.ts | 10 ++++++---- .../content-types/list-content-types-query.payload.ts | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 0c6decd7..27f3d1d4 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -7,12 +7,14 @@ import payloads from "./fetch-content-type-element-query.payload.js"; describe("Fetch content type element query", async () => { const typeCodename = "movie"; - for (const payload of payloads) { - await runQueryTestsAsync>({ + const tests: readonly Promise[] = payloads.map(async (payload) => + runQueryTestsAsync>({ endpoint: `types/${typeCodename}/elements/${payload.codename}`, unitTestPayload: payload, selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename: payload.codename }), expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), - }); - } + }), + ); + + await Promise.all(tests); }); diff --git a/tests/integration/queries/content-types/list-content-types-query.payload.ts b/tests/integration/queries/content-types/list-content-types-query.payload.ts index 98cf2f43..583f5eed 100644 --- a/tests/integration/queries/content-types/list-content-types-query.payload.ts +++ b/tests/integration/queries/content-types/list-content-types-query.payload.ts @@ -63,8 +63,8 @@ export default { { system: { id: "068c2ea7-144f-4472-ac0a-70e6f53034bf", - name: "Stars", - codename: "stars", + name: "Star", + codename: "star", last_modified: "2026-02-26T14:02:20.3307783Z", }, elements: { From 709d9ee585c253d7ad0938b893d8e483aa244b58 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 7 Apr 2026 14:24:37 +0200 Subject: [PATCH 083/221] adds content item models & fetch / list queries --- lib/client/delivery-client.ts | 4 + lib/models/core.models.ts | 10 + lib/models/pagination.models.ts | 21 +- lib/models/request.models.ts | 17 +- lib/public_api.ts | 9 + .../content-items/content-item.models.ts | 183 ++++++++++++++++++ .../content-items/fetch-content-item-query.ts | 50 +++++ .../content-items/list-content-items-query.ts | 60 ++++++ .../content-types/list-content-types-query.ts | 9 +- lib/queries/languages/list-languages-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 6 +- package.json | 2 +- pnpm-lock.yaml | 24 ++- .../fetch-content-item-query.payload.ts | 32 +++ .../fetch-content-item-query.spec.ts | 15 ++ .../list-content-items-query.payload.ts | 66 +++++++ .../list-content-items-query.spec.ts | 14 ++ tests/types/delivery-client-types.test.ts | 6 + tests/unit/errors/custom-errors.spec.ts | 3 + ...schema-validation-with-extra-props.spec.ts | 3 + ...hema-validation-with-missing-props.spec.ts | 3 + .../unit/validation/schema-validation.spec.ts | 26 ++- .../validation/validation-properties.spec.ts | 20 +- tests/utils/integration-test.utils.ts | 33 +++- 24 files changed, 592 insertions(+), 28 deletions(-) create mode 100644 lib/queries/content-items/content-item.models.ts create mode 100644 lib/queries/content-items/fetch-content-item-query.ts create mode 100644 lib/queries/content-items/list-content-items-query.ts create mode 100644 tests/integration/queries/content-items/fetch-content-item-query.payload.ts create mode 100644 tests/integration/queries/content-items/fetch-content-item-query.spec.ts create mode 100644 tests/integration/queries/content-items/list-content-items-query.payload.ts create mode 100644 tests/integration/queries/content-items/list-content-items-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index fb6f3ecc..7f58e00b 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,6 @@ import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientShema } from "../models/core.models.js"; +import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; +import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { type FetchContentTypeElementQueryRequest, fetchContentTypeElementQuery, @@ -46,5 +48,7 @@ export function createDeliveryClient) => fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), fetchContentTypeElement: (request: FetchContentTypeElementQueryRequest) => fetchContentTypeElementQuery(config, request), + fetchContentItem: (request: FetchContentItemQueryRequest) => fetchContentItemQuery(config, request), + listContentItems: (request?: ListContentItemsQueryRequest) => listContentItemsQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index b47c6aa5..b77a07c3 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,4 +1,6 @@ import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; +import type { FetchContentItemQuery, FetchContentItemQueryRequest } from "../queries/content-items/fetch-content-item-query.js"; +import type { ListContentItemsQuery, ListContentItemsQueryRequest } from "../queries/content-items/list-content-items-query.js"; import type { FetchContentTypeElementQuery, FetchContentTypeElementQueryRequest, @@ -15,6 +17,9 @@ export type FullDeliveryClientShema = { readonly taxonomyCodenames: readonly string[]; readonly contentTypeCodenames: readonly string[]; readonly elementCodenames: readonly string[]; + readonly collectionCodenames: readonly string[]; + readonly workflowCodenames: readonly string[]; + readonly workflowStepCodenames: readonly string[]; }; export type DeliveryClientSchema = { @@ -22,6 +27,9 @@ export type DeliveryClientSchema): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; + fetchContentItem(request: FetchContentItemQueryRequest): FetchContentItemQuery; + listContentItems(request?: ListContentItemsQueryRequest): ListContentItemsQuery; }; export type DeliveryFetchQuery = FetchQuery; diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index fdfda7d7..7664283f 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,14 +1,23 @@ import { z } from "zod"; +const paginationObjectSchema = z.object({ + skip: z.number(), + limit: z.number(), + count: z.number(), + next_page: z.string(), +}); + export const paginationSchema = z.object({ - pagination: z - .object({ - skip: z.number(), - limit: z.number(), - count: z.number(), - next_page: z.string(), + pagination: paginationObjectSchema.readonly(), +}); + +export const paginationSchemaWithTotalCount = z.object({ + pagination: paginationObjectSchema + .extend({ + total_count: z.number().optional().readonly(), }) .readonly(), }); export type PaginationSchema = Readonly>; +export type PaginationSchemaWithTotalCount = Readonly>; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 4be02549..f0cc6078 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -4,13 +4,13 @@ export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; }; -export type QueryParameterRecord = Record; +export type QueryParameterRecord = Record; export type PagingDeliveryRequest = DeliveryRequest & QueryParameters<{ readonly skip?: number; readonly limit?: number; - readonly order?: SystemOrderQueryParam; + readonly order?: TSortableProperties; }>; export type QueryRequestWithCodename = { @@ -45,10 +45,19 @@ export type OrderDirection = "asc" | "desc"; * ```ts * `order=system.name[asc]` * `order=system.name[desc]` - * `order=system.id[asc]` */ export type SystemOrderQueryParam = `system.${TSortableProperties}[${OrderDirection}]`; +/** + * Matches the format of the order parameter in the Delivery API. + * + * @example + * ```ts + * `order=elements.description[asc]` + * `order=elements.description[desc]` + */ +export type ElementOrderQueryParam = `elements.${TElementCodenames}[${OrderDirection}]`; + /** * Array of element codenames that will get transformed into a comma-separated list used in the elements parameter. * @@ -57,3 +66,5 @@ export type SystemOrderQueryParam = `system. * `elements=title,summary,related_articles` */ export type ElementSelectionQueryParam = readonly TElementCodenames[]; + +export type ExtractString = T extends string ? (string extends T ? never : T) : never; diff --git a/lib/public_api.ts b/lib/public_api.ts index 7a9d1ff9..b54c4b67 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -9,6 +9,15 @@ export type { FullDeliveryClientShema, } from "./models/core.models.js"; export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; +// Content Items +export type { + ContentItemElementPayload, + ContentItemPayload, + FetchContentItemPayload, + ListContentItemsPayload, +} from "./queries/content-items/content-item.models.js"; +export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; +export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; // Content Types export { ContentTypeElementPayload, diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts new file mode 100644 index 00000000..5eab3d8d --- /dev/null +++ b/lib/queries/content-items/content-item.models.ts @@ -0,0 +1,183 @@ +import { getCodenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchemaWithTotalCount } from "../../models/pagination.models.js"; + +const multipleChoiceOptionSchema = z + .object({ + name: z.string(), + codename: z.string(), + }) + .readonly(); + +const taxonomyTermValueSchema = z + .object({ + name: z.string(), + codename: z.string(), + }) + .readonly(); + +const assetValueSchema = z + .object({ + name: z.string(), + description: z.string().nullable(), + type: z.string(), + size: z.number(), + url: z.string(), + width: z.number().nullable(), + height: z.number().nullable(), + renditions: z.record(z.string(), jsonValueSchema), + }) + .catchall(jsonValueSchema) + .readonly(); + +const richTextImageSchema = z + .object({ + image_id: z.string(), + description: z.string().nullable(), + url: z.string(), + width: z.number().nullable(), + height: z.number().nullable(), + }) + .catchall(jsonValueSchema) + .readonly(); + +const richTextLinkSchema = z + .object({ + codename: z.string(), + type: z.string(), + url_slug: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(); + +const contentItemElementSchema = z.discriminatedUnion("type", [ + z + .object({ + type: z.literal("text"), + name: z.string(), + value: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("number"), + name: z.string(), + value: z.number().nullable(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("rich_text"), + name: z.string(), + value: z.string(), + images: z.record(z.string(), richTextImageSchema), + links: z.record(z.string(), richTextLinkSchema), + modular_content: z.array(z.string()).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("multiple_choice"), + name: z.string(), + value: z.array(multipleChoiceOptionSchema).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("date_time"), + name: z.string(), + value: z.string().nullable(), + display_timezone: z.string().nullable(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("asset"), + name: z.string(), + value: z.array(assetValueSchema).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + value: z.array(taxonomyTermValueSchema).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("url_slug"), + name: z.string(), + value: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("modular_content"), + name: z.string(), + value: z.array(z.string()).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("custom"), + name: z.string(), + value: z.string().nullable(), + }) + .catchall(jsonValueSchema) + .readonly(), +]); + +export const contentItemSchema = (schema: TSchema | undefined) => + z + .object({ + system: z + .object({ + id: kontentUuidSchema, + name: z.string(), + codename: getCodenameSchema(schema?.contentTypeCodenames), + language: getCodenameSchema(schema?.languageCodenames), + type: getCodenameSchema(schema?.contentTypeCodenames), + collection: getCodenameSchema(schema?.collectionCodenames), + sitemap_locations: z.array(z.string()).readonly(), + last_modified: z.iso.datetime(), + workflow: getCodenameSchema(schema?.workflowCodenames), + workflow_step: getCodenameSchema(schema?.workflowStepCodenames), + }) + .readonly(), + elements: z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema), + }) + .readonly(); + +export const listContentItemsPayload = (schema: TSchema | undefined) => + z + .object({ + items: z.array(contentItemSchema(schema)).readonly(), + modular_content: z.record(z.string(), contentItemSchema(schema)), + ...paginationSchemaWithTotalCount.shape, + }) + .readonly(); + +export const fetchContentItemPayload = (schema: TSchema | undefined) => + z + .object({ + item: contentItemSchema(schema), + modular_content: z.record(z.string(), contentItemSchema(schema)), + }) + .readonly(); + +export type ContentItemElementPayload = z.infer; +export type ContentItemPayload = z.infer>>; +export type ListContentItemsPayload = z.infer>>; +export type FetchContentItemPayload = z.infer>>; diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts new file mode 100644 index 00000000..643a608f --- /dev/null +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -0,0 +1,50 @@ +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { + DeliveryRequest, + ElementSelectionQueryParam, + QueryParameters, + QueryRequestWithCodename, +} from "../../models/request.models.js"; +import { createDeliveryFetchQuery } from "../delivery-queries.js"; +import { type FetchContentItemPayload, fetchContentItemPayload } from "./content-item.models.js"; + +export type FetchContentItemQuery = DeliveryFetchQuery>; + +export type FetchContentItemQueryRequest = DeliveryRequest & + QueryRequestWithCodename> & + QueryParameters<{ + /** + * Determines which language variant of content items to return. By default, the API returns content in the default language. + */ + readonly language?: NonNullable[number]; + + /** + * Specifies which elements to include in the response. By default, all elements are returned. + */ + readonly elements?: ElementSelectionQueryParam[number]>; + + /** + * Specifies which elements to exclude from the response. By default, no elements are excluded. + */ + readonly excludeElements?: ElementSelectionQueryParam[number]>; + + /** + * Determines the nesting level for linked content items that the API returns. + * By default, only the first level of linked items is returned, which is the same as setting depth=1. + * To include more than one level of linked items in the response, set depth to 2 or more. + * To exclude all linked items from the response, set depth to 0. + */ + readonly depth?: number; + }>; + +export function fetchContentItemQuery( + config: DeliveryClientConfig, + request: FetchContentItemQueryRequest, +): FetchContentItemQuery { + return createDeliveryFetchQuery({ + config, + request, + schema: fetchContentItemPayload(config.schema), + endpoint: `items/${request.codename}`, + }); +} diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts new file mode 100644 index 00000000..95ca0d94 --- /dev/null +++ b/lib/queries/content-items/list-content-items-query.ts @@ -0,0 +1,60 @@ +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { + ElementOrderQueryParam, + ElementSelectionQueryParam, + PagingDeliveryRequest, + QueryParameters, + SystemOrderQueryParam, +} from "../../models/request.models.js"; +import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; + +export type ListContentItemsQuery = DeliveryPagedFetchQuery>; + +export type ListContentItemsQueryRequest = PagingDeliveryRequest< + | SystemOrderQueryParam["system"]> + | ElementOrderQueryParam[number]> +> & + QueryParameters<{ + /** + * Determines which language variant of content items to return. By default, the API returns content in the default language. + */ + readonly language?: NonNullable[number]; + + /** + * Specifies which elements to include in the response. By default, all elements are returned. + */ + readonly elements?: ElementSelectionQueryParam[number]>; + + /** + * Specifies which elements to exclude from the response. By default, no elements are excluded. + */ + readonly excludeElements?: ElementSelectionQueryParam[number]>; + + /** + * Determines the nesting level for linked content items that the API returns. + * By default, only the first level of linked items is returned, which is the same as setting depth=1. + * To include more than one level of linked items in the response, set depth to 2 or more. + * To exclude all linked items from the response, set depth to 0. + */ + readonly depth?: number; + + /** + * Adds the information about the total number of content items matching your query. + * Only the content filtering parameters affect the resulting number. + * Other parameters in your query, such as limit, skip, or order, don't have an effect on it. + */ + readonly includeTotalCount?: boolean; + }>; + +export function listContentItemsQuery( + config: DeliveryClientConfig, + request?: ListContentItemsQueryRequest, +): ListContentItemsQuery { + return createDeliveryPagingQuery({ + config, + request, + schema: listContentItemsPayload(config.schema), + endpoint: "items", + }); +} diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 6b9335e5..320b4549 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,12 +1,17 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { ElementSelectionQueryParam, PagingDeliveryRequest, QueryParameters } from "../../models/request.models.js"; +import type { + ElementSelectionQueryParam, + PagingDeliveryRequest, + QueryParameters, + SystemOrderQueryParam, +} from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = DeliveryPagedFetchQuery>; export type ListContentTypesQueryRequest = PagingDeliveryRequest< - keyof ContentTypePayload["system"] + SystemOrderQueryParam["system"]> > & QueryParameters<{ readonly elements?: ElementSelectionQueryParam[number]>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index ca3b55a2..5f80a7b8 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,11 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; -export type ListLanguagesQueryRequest = PagingDeliveryRequest["system"]>; +export type ListLanguagesQueryRequest = PagingDeliveryRequest["system"]>>; export function listLanguagesQuery( config: DeliveryClientConfig, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 65c901ea..9c29cae9 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,11 +1,13 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; -export type ListTaxonomiesQueryRequest = PagingDeliveryRequest["system"]>; +export type ListTaxonomiesQueryRequest = PagingDeliveryRequest< + SystemOrderQueryParam["system"]> +>; export function listTaxonomiesQuery( config: DeliveryClientConfig, diff --git a/package.json b/package.json index 5fa10f8c..68178719 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.23", + "@kontent-ai/core-sdk": "^12.0.0-preview.24", "zod": "^4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 408a230c..6c1cebb6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.23 - version: 12.0.0-preview.23(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.24 + version: 12.0.0-preview.24(ts-pattern@5.9.0)(zod@4.3.6) zod: specifier: ^4 version: 4.3.6 @@ -88,24 +88,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@2.4.10': resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@2.4.10': resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@2.4.10': resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@2.4.10': resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} @@ -373,8 +377,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.23': - resolution: {integrity: sha512-nRiFrR+hnrCkGV3uqo7Czo6HrHDYItfSijxd5EHbF4VbXjHHz6BT+ql7AkXWf9iTolP6DcyBJiBwij3mxtM4WA==} + '@kontent-ai/core-sdk@12.0.0-preview.24': + resolution: {integrity: sha512-E3EfP/cMv2tnSrZeNwJItBjZp7J3q8SN6PrP/tnZlwOAzoJy2TdxTPkXx330kL2ccQdBMiUbDnI/WlEDNgbt2g==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -427,36 +431,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} @@ -1208,24 +1218,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -1940,7 +1954,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.10 - '@kontent-ai/core-sdk@12.0.0-preview.23(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.24(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 diff --git a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts new file mode 100644 index 00000000..69d1ded7 --- /dev/null +++ b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts @@ -0,0 +1,32 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; + +export default { + item: { + system: { + id: "d7862a9a-0333-491c-9db9-ee91a7828a84", + name: "Brad Pitt", + codename: "brad_pitt", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:15.7816154Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Brad", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pitt", + }, + }, + }, + modular_content: {}, +} satisfies FetchContentItemPayload; diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts new file mode 100644 index 00000000..4dad2121 --- /dev/null +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -0,0 +1,15 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type FetchContentItemPayload, fetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./fetch-content-item-query.payload.js"; + +describe("Fetch content item query", async () => { + const codename = "brad_pitt"; + await runQueryTestsAsync>({ + endpoint: `items/${codename}`, + unitTestPayload, + selectQuery: (client) => client.fetchContentItem({ codename }), + expectedSchema: fetchContentItemPayload(getIntegrationTestsSchema()), + }); +}); diff --git a/tests/integration/queries/content-items/list-content-items-query.payload.ts b/tests/integration/queries/content-items/list-content-items-query.payload.ts new file mode 100644 index 00000000..ba883da0 --- /dev/null +++ b/tests/integration/queries/content-items/list-content-items-query.payload.ts @@ -0,0 +1,66 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; + +export default { + items: [ + { + system: { + id: "d56bff34-5ce8-4ac1-9cb8-547848b3a22b", + name: "Al Pacino", + codename: "al_pacino", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:25.6499619Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Al", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pacino", + }, + }, + }, + { + system: { + id: "b25e6ed1-0a3f-4975-bb84-4c7efefa70d0", + name: "Amy Adams", + codename: "amy_adams", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:17.8650469Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Amy", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Adams", + }, + }, + }, + ], + modular_content: {}, + pagination: { + skip: 0, + limit: 2, + count: 2, + next_page: "", + }, +} satisfies ListContentItemsPayload; diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts new file mode 100644 index 00000000..5889fa46 --- /dev/null +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -0,0 +1,14 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ListContentItemsPayload, listContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./list-content-items-query.payload.js"; + +describe("List content items query", async () => { + await runQueryTestsAsync>({ + endpoint: "items", + unitTestPayload, + selectQuery: (client) => client.listContentItems(), + expectedSchema: listContentItemsPayload(getIntegrationTestsSchema()), + }); +}); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 00c1a9be..19828683 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -12,6 +12,9 @@ const client: DeliveryClient<{ taxonomyCodenames: typeof taxonomyCodenames; contentTypeCodenames: string[]; elementCodenames: string[]; + collectionCodenames: string[]; + workflowCodenames: string[]; + workflowStepCodenames: string[]; }> = createDeliveryClient({ apiMode: "public", environmentId: "x", @@ -20,6 +23,9 @@ const client: DeliveryClient<{ taxonomyCodenames, contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }, responseValidation: { enable: false, diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 4f9b8a5d..aebc89fa 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -14,6 +14,9 @@ describe("Handling of custom errors", async () => { taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }, httpService: getDefaultHttpService({ adapter: { diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index 0fde665d..cebfb504 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -34,6 +34,9 @@ describe("Valid schema validation with extra props", () => { taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index bfd951f9..14b2fc45 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -27,6 +27,9 @@ describe("Valid schema validation with missing props", () => { taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index bbd60629..c7eeba0f 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -11,6 +11,9 @@ describe("Schema validation", () => { readonly taxonomyCodenames: readonly []; readonly contentTypeCodenames: readonly []; readonly elementCodenames: readonly []; + readonly collectionCodenames: readonly []; + readonly workflowCodenames: readonly []; + readonly workflowStepCodenames: readonly []; }>; const mockPayload: ListLanguagesPayload = { @@ -35,7 +38,15 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: ["en-US", "cs-CZ"], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: ["en-US", "cs-CZ"], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, @@ -61,6 +72,9 @@ describe("Schema validation", () => { taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, @@ -78,7 +92,15 @@ describe("Schema validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: mockPayload, statusCode: 200, diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index f41f1b46..38a28709 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -10,7 +10,15 @@ describe("Response validation", () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: { result: "invalidValue", @@ -41,7 +49,15 @@ describe("Response validation", () => { const { success, error } = await createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: { value: "invalidValue", diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 1909b942..83dc0466 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -28,6 +28,9 @@ export function getIntegrationTestsSchema(): DeliveryClientSchema { taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], }; } @@ -105,7 +108,15 @@ function createFailingUnitTestClient(): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getDefaultHttpService({ adapter: { executeRequest: () => { @@ -120,7 +131,15 @@ function createUnitTestClient(unitTestPayloa return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: unitTestPayload, statusCode: 200, @@ -132,7 +151,15 @@ function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: str return createDeliveryClient({ apiMode: "public", environmentId, - schema: { languageCodenames: [], taxonomyCodenames: [], contentTypeCodenames: [], elementCodenames: [] }, + schema: { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), }); } From b4b59d1438beb8b77cbb8b08f3e1b1ed10722936 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 9 Apr 2026 11:44:58 +0200 Subject: [PATCH 084/221] make elements optional by default --- lib/queries/content-items/content-item.models.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 5eab3d8d..07bea353 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -156,7 +156,7 @@ export const contentItemSchema = (schema: workflow_step: getCodenameSchema(schema?.workflowStepCodenames), }) .readonly(), - elements: z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema), + elements: z.optional(z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema)), }) .readonly(); @@ -181,3 +181,4 @@ export type ContentItemElementPayload = z.infer export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; + From 5f35e7e55aed4108cff32cea121364487c6c89cd Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 9 Apr 2026 15:45:44 +0200 Subject: [PATCH 085/221] filters preparation --- lib/models/filter.models.ts | 43 +++++++++ lib/models/request.models.ts | 9 ++ lib/public_api.ts | 2 + .../content-items/content-item.models.ts | 93 +++++++++++++------ .../content-items/list-content-items-query.ts | 9 +- tests/utils/integration-test.utils.ts | 1 + 6 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 lib/models/filter.models.ts diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts new file mode 100644 index 00000000..4a8e5cba --- /dev/null +++ b/lib/models/filter.models.ts @@ -0,0 +1,43 @@ +import type { ContentItemSystemPayload } from "../queries/content-items/content-item.models.js"; +import type { DeliveryClientSchema } from "./core.models.js"; + +export type FilterOperators = + | "eq" + | "=" + | "neq" + | "empty" + | "nempty" + | "lt" + | "lte" + | "gt" + | "gte" + | "range" + | "in" + | "nin" + | "contains" + | "any" + | "all"; + +export type FilterQueryParam = + `${"elements" | "system"}.${keyof ContentItemSystemPayload}[${FilterOperators}]=${string}`; + +export type QueryFilterProperty = + | `system.${TSystemProperties}` + | `elements.${TElementProperties}`; + +export type ElementsFilterQueryParam = + `elements.${NonNullable[number]}[${FilterOperators}]=${string}`; + +export type QueryFilter = { + readonly property: QueryFilterProperty; + readonly value: string | number | null; + readonly operator: FilterOperators; +}; + +const filter: QueryFilter, "hello" | "world"> = { + property: "elements.hello", + operator: "gte", + value: "fe", +}; + +void filter; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index f0cc6078..bb9cadf1 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -1,4 +1,6 @@ import type { Header } from "@kontent-ai/core-sdk"; +import type { DeliveryClientSchema } from "./core.models.js"; +import type { FilterQueryParam, QueryFilter } from "./filter.models.js"; export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; @@ -21,6 +23,13 @@ export type QueryParameters = { readonly query?: TParameters; }; +export type QueryFilters = { + readonly filters?: readonly ( + | QueryFilter[number]> + | FilterQueryParam + )[]; +}; + export type DeliveryRequestConfig = { /** * When enabled, sets the `X-KC-Wait-For-Loading-New-Content` header so the Delivery API diff --git a/lib/public_api.ts b/lib/public_api.ts index b54c4b67..cd8172ea 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -13,6 +13,8 @@ export { PaginationSchema, paginationSchema } from "./models/pagination.models.j export type { ContentItemElementPayload, ContentItemPayload, + ContentItemSystemFilterableProperty, + ContentItemSystemSortableProperty, FetchContentItemPayload, ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 07bea353..b574a5e3 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -51,8 +51,8 @@ const richTextLinkSchema = z .catchall(jsonValueSchema) .readonly(); -const contentItemElementSchema = z.discriminatedUnion("type", [ - z +export const elementSchemas = { + text: z .object({ type: z.literal("text"), name: z.string(), @@ -60,7 +60,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + number: z .object({ type: z.literal("number"), name: z.string(), @@ -68,7 +68,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + richText: z .object({ type: z.literal("rich_text"), name: z.string(), @@ -79,7 +79,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + multipleChoice: z .object({ type: z.literal("multiple_choice"), name: z.string(), @@ -87,7 +87,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + dateTime: z .object({ type: z.literal("date_time"), name: z.string(), @@ -96,7 +96,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + asset: z .object({ type: z.literal("asset"), name: z.string(), @@ -104,7 +104,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + taxonomy: z .object({ type: z.literal("taxonomy"), name: z.string(), @@ -113,7 +113,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + urlSlug: z .object({ type: z.literal("url_slug"), name: z.string(), @@ -121,7 +121,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + linkedItems: z .object({ type: z.literal("modular_content"), name: z.string(), @@ -129,7 +129,7 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), - z + custom: z .object({ type: z.literal("custom"), name: z.string(), @@ -137,26 +137,50 @@ const contentItemElementSchema = z.discriminatedUnion("type", [ }) .catchall(jsonValueSchema) .readonly(), -]); +}; -export const contentItemSchema = (schema: TSchema | undefined) => +const contentItemElementSchema = z + .discriminatedUnion("type", [ + elementSchemas.text, + elementSchemas.number, + elementSchemas.richText, + elementSchemas.multipleChoice, + elementSchemas.dateTime, + elementSchemas.asset, + elementSchemas.taxonomy, + elementSchemas.urlSlug, + elementSchemas.linkedItems, + elementSchemas.custom, + ]) + .readonly(); + +export const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ - system: z - .object({ - id: kontentUuidSchema, - name: z.string(), - codename: getCodenameSchema(schema?.contentTypeCodenames), - language: getCodenameSchema(schema?.languageCodenames), - type: getCodenameSchema(schema?.contentTypeCodenames), - collection: getCodenameSchema(schema?.collectionCodenames), - sitemap_locations: z.array(z.string()).readonly(), - last_modified: z.iso.datetime(), - workflow: getCodenameSchema(schema?.workflowCodenames), - workflow_step: getCodenameSchema(schema?.workflowStepCodenames), - }) - .readonly(), - elements: z.optional(z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema)), + id: kontentUuidSchema, + name: z.string(), + codename: getCodenameSchema(schema?.contentTypeCodenames), + language: getCodenameSchema(schema?.languageCodenames), + type: getCodenameSchema(schema?.contentTypeCodenames), + collection: getCodenameSchema(schema?.collectionCodenames), + sitemap_locations: z.array(z.string()).readonly(), + last_modified: z.iso.datetime(), + workflow: getCodenameSchema(schema?.workflowCodenames), + workflow_step: getCodenameSchema(schema?.workflowStepCodenames), + }) + .readonly(); + +export const contentItemWithSystemSchema = (schema: TSchema | undefined) => + z.object({ + system: contentItemSystemSchema(schema), + }); + +export const contentItemSchema = (schema: TSchema | undefined) => + contentItemWithSystemSchema(schema) + .extend({ + elements: z.optional( + z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema), + ), }) .readonly(); @@ -177,8 +201,19 @@ export const fetchContentItemPayload = (sc }) .readonly(); +export type ContentItemSystemSortableProperty = + | "id" + | "name" + | "codename" + | "language" + | "type" + | "collection" + | "last_modified" + | "workflow" + | "workflow_step"; + +export type ContentItemSystemPayload = z.infer>>; export type ContentItemElementPayload = z.infer; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; - diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 95ca0d94..21db7f8c 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -3,11 +3,17 @@ import type { ElementOrderQueryParam, ElementSelectionQueryParam, PagingDeliveryRequest, + QueryFilters, QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; +import { + type ContentItemPayload, + type ContentItemSystemPayload, + type ListContentItemsPayload, + listContentItemsPayload, +} from "./content-item.models.js"; export type ListContentItemsQuery = DeliveryPagedFetchQuery>; @@ -15,6 +21,7 @@ export type ListContentItemsQueryRequest = | SystemOrderQueryParam["system"]> | ElementOrderQueryParam[number]> > & + QueryFilters> & QueryParameters<{ /** * Determines which language variant of content items to return. By default, the API returns content in the default language. diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 83dc0466..c6ea9830 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -46,6 +46,7 @@ export async function runQueryTestsAsync({ readonly selectQuery: SelectQuery; }): Promise { const integrationTestConfig = getIntegrationTestConfig(); + const clients = createTestClients({ unitTestPayload, environmentId: integrationTestConfig.env.id, From 6efc47c22e9e3dc00de86dd9b2a888652b32f9f3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 11:36:48 +0200 Subject: [PATCH 086/221] Adds filter support to list content items --- lib/models/filter.models.ts | 11 ++- lib/models/request.models.ts | 10 +-- lib/public_api.ts | 2 +- .../content-items/list-content-items-query.ts | 2 +- lib/queries/delivery-queries.ts | 17 ++++- lib/utils/url.utils.ts | 74 ++++++++++++++++--- tests/unit/filters/filters.spec.ts | 70 ++++++++++++++++++ tests/unit/utils/url-utils.spec.ts | 24 ++++-- 8 files changed, 181 insertions(+), 29 deletions(-) create mode 100644 tests/unit/filters/filters.spec.ts diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 4a8e5cba..96750999 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -18,8 +18,9 @@ export type FilterOperators = | "any" | "all"; -export type FilterQueryParam = - `${"elements" | "system"}.${keyof ContentItemSystemPayload}[${FilterOperators}]=${string}`; +export type FilterQueryParam = + | `system.${TSystemProperties}[${FilterOperators}]=${string}` + | `elements.${TElementProperties}[${FilterOperators}]=${string}`; export type QueryFilterProperty = | `system.${TSystemProperties}` @@ -30,10 +31,14 @@ export type ElementsFilterQueryParam = export type QueryFilter = { readonly property: QueryFilterProperty; - readonly value: string | number | null; + readonly value: string | number | boolean | undefined; readonly operator: FilterOperators; }; +export type CombinedFilter = + | QueryFilter + | FilterQueryParam; + const filter: QueryFilter, "hello" | "world"> = { property: "elements.hello", operator: "gte", diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index bb9cadf1..4e64d377 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -1,6 +1,5 @@ import type { Header } from "@kontent-ai/core-sdk"; -import type { DeliveryClientSchema } from "./core.models.js"; -import type { FilterQueryParam, QueryFilter } from "./filter.models.js"; +import type { CombinedFilter } from "./filter.models.js"; export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; @@ -23,11 +22,8 @@ export type QueryParameters = { readonly query?: TParameters; }; -export type QueryFilters = { - readonly filters?: readonly ( - | QueryFilter[number]> - | FilterQueryParam - )[]; +export type QueryFilters = { + readonly filters?: readonly CombinedFilter[]; }; export type DeliveryRequestConfig = { diff --git a/lib/public_api.ts b/lib/public_api.ts index cd8172ea..9bf0be8c 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -13,7 +13,7 @@ export { PaginationSchema, paginationSchema } from "./models/pagination.models.j export type { ContentItemElementPayload, ContentItemPayload, - ContentItemSystemFilterableProperty, + ContentItemSystemPayload, ContentItemSystemSortableProperty, FetchContentItemPayload, ListContentItemsPayload, diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 21db7f8c..bf4afb57 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -21,7 +21,7 @@ export type ListContentItemsQueryRequest = | SystemOrderQueryParam["system"]> | ElementOrderQueryParam[number]> > & - QueryFilters> & + QueryFilters, NonNullable[number]> & QueryParameters<{ /** * Determines which language variant of content items to return. By default, the API returns content in the default language. diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 2bf36b5e..e3e9c9bd 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -11,8 +11,9 @@ import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; +import type { CombinedFilter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { DeliveryRequest, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; +import type { DeliveryRequest, QueryFilters, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; @@ -88,11 +89,19 @@ function getRequestData({ }): FetchQueryRequest["request"] { return { requestHeaders: getHeaders(request), - url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request)), + url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request), getFilters(request)), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, }; } +function getFilters(request: DeliveryRequest | undefined): readonly CombinedFilter[] | undefined { + if (!request || !isQueryWithFilters(request)) { + return undefined; + } + + return request.filters; +} + function getQueryParameters(request: DeliveryRequest | undefined): QueryParameterRecord | undefined { if (!request || !isQueryWithParameters(request)) { return undefined; @@ -115,3 +124,7 @@ function getBypassCdnCacheHeader(): Header { function isQueryWithParameters(request: DeliveryRequest): request is DeliveryRequest & QueryParameters { return ("query" satisfies keyof QueryParameters) in request; } + +function isQueryWithFilters(request: DeliveryRequest): request is DeliveryRequest & QueryFilters { + return ("filters" satisfies keyof QueryFilters) in request; +} diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 7031936b..072f4a33 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,5 +1,6 @@ import { getEndpointUrl } from "@kontent-ai/core-sdk"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; +import type { CombinedFilter, QueryFilter } from "../models/filter.models.js"; import type { QueryParameterRecord } from "../models/request.models.js"; export function getDeliveryUrl({ @@ -15,11 +16,22 @@ export function getDeliveryUrl({ }); } -export function addQueryParametersToUrl(url: string, query: QueryParameterRecord | undefined): string { - if (!query) { +export function addQueryParametersToUrl( + url: string, + query: QueryParameterRecord | undefined, + filters: readonly CombinedFilter[] | undefined, +): string { + if (!query && !filters) { + return url; + } + + const searchParams = getUrlSearchParams(query, filters); + + if (searchParams.size === 0) { return url; } - return `${url}${url.includes("?") ? "&" : "?"}${getUrlSearchParams(query).toString()}`; + + return `${url}${url.includes("?") ? "&" : "?"}${searchParams.toString().replaceAll("%5B", "[").replaceAll("%5D", "]")}`; } function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { @@ -32,15 +44,57 @@ function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { return "https://deliver.kontent.ai"; } -function getUrlSearchParams(query: QueryParameterRecord): URLSearchParams { - return new URLSearchParams( - Object.entries(query) - .filter(hasDefinedQueryValue) - .map(([key, value]) => [key, value.toString()]), - ); +function getUrlSearchParams( + query: QueryParameterRecord | undefined, + filters: readonly CombinedFilter[] | undefined, +): URLSearchParams { + return new URLSearchParams(getQueryParams(query).concat(getFilterParams(filters))); } -function hasDefinedQueryValue(item: [Key, Value | undefined]): item is [Key, Value] { +function filterHasDefinedValue( + filter: QueryFilter, +): filter is QueryFilter & { readonly value: NonNullable } { + return filter.value !== undefined && filter.value !== null; +} + +function queryHasDefinedValue(item: [Key, Value | undefined]): item is [Key, Value] { const [, value] = item; return value !== undefined && value !== null; } + +function isQueryFilter(value: unknown): value is QueryFilter { + return typeof value === "object" && value !== null && "property" in value && "operator" in value && "value" in value; +} + +function getQueryParams(query: QueryParameterRecord | undefined): readonly string[][] { + if (!query) { + return []; + } + return Object.entries(query) + .filter(queryHasDefinedValue) + .map(([key, value]) => [key, value.toString()]); +} + +function getFilterParams(filters: readonly CombinedFilter[] | undefined): readonly string[][] { + if (!filters) { + return []; + } + return filters.flatMap((filter) => { + if (isQueryFilter(filter)) { + if (!filterHasDefinedValue(filter)) { + return []; + } + + // Special case for "=" operator which we can just omit from the property definition + if (filter.operator === "=") { + return [[filter.property, filter.value.toString()]]; + } + + return [[`${filter.property}[${filter.operator}]`, filter.value.toString()]]; + } + + // Split the filter string into property and value + const separatorIndex = filter.indexOf("="); + return [[filter.slice(0, separatorIndex), filter.slice(separatorIndex + 1)]]; + }); +} diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts new file mode 100644 index 00000000..83de6864 --- /dev/null +++ b/tests/unit/filters/filters.spec.ts @@ -0,0 +1,70 @@ +import { describe, expect, it } from "vitest"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +describe("Filters", () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + }); + + it("Filter defined as object should be added to the url", () => { + const url = client.listContentItems({ + filters: [ + { + property: "system.language", + operator: "eq", + value: "default", + }, + ], + }).url; + + expect(url).toContain("system.language[eq]=default"); + }); + + it("Filter defined as string should be added to the url", () => { + const url = client.listContentItems({ + filters: ["system.language[eq]=default"], + }).url; + + expect(url).toContain("system.language[eq]=default"); + }); + + it("Handle multiple equal signs in value", () => { + const url = client.listContentItems({ + filters: ["system.codename[eq]=abc=def"], + }).url; + + expect(url).toContain("system.codename[eq]=abc%3Ddef"); + }); + + it("Filter defined as string with value containing '=' should be added to the url correctly", () => { + const url = client.listContentItems({ + filters: [ + { + property: "system.language", + operator: "=", + value: "default", + }, + ], + }).url; + + expect(url).toContain("system.language=default"); + }); + + it("Filters defined as both object and string should all be added to the url", () => { + const url = client.listContentItems({ + filters: [ + { + property: "system.language", + operator: "eq", + value: "default", + }, + "system.type[eq]=movie", + ], + }).url; + + expect(url).toContain("system.language[eq]=default"); + expect(url).toContain("system.type[eq]=movie"); + }); +}); diff --git a/tests/unit/utils/url-utils.spec.ts b/tests/unit/utils/url-utils.spec.ts index 670a8df0..b509b612 100644 --- a/tests/unit/utils/url-utils.spec.ts +++ b/tests/unit/utils/url-utils.spec.ts @@ -5,24 +5,24 @@ describe("addQueryParametersToUrl", () => { const baseUrl = "https://deliver.kontent.ai/xyz/languages"; it("returns URL unchanged when query is undefined", () => { - expect(addQueryParametersToUrl(baseUrl, undefined)).toStrictEqual(baseUrl); + expect(addQueryParametersToUrl(baseUrl, undefined, undefined)).toStrictEqual(baseUrl); }); it("appends parameters with ? when URL has no existing query string", () => { - const result = addQueryParametersToUrl(baseUrl, { skip: "5" }); + const result = addQueryParametersToUrl(baseUrl, { skip: "5" }, undefined); expect(result).toStrictEqual(`${baseUrl}?skip=5`); }); it("appends parameters with & when URL already contains a query string", () => { const urlWithQuery = `${baseUrl}?existing=1`; - const result = addQueryParametersToUrl(urlWithQuery, { skip: "2" }); + const result = addQueryParametersToUrl(urlWithQuery, { skip: "2" }, undefined); expect(result).toStrictEqual(`${urlWithQuery}&skip=2`); }); it("converts number values to strings", () => { - const result = addQueryParametersToUrl(baseUrl, { skip: 3, limit: 7 }); + const result = addQueryParametersToUrl(baseUrl, { skip: 3, limit: 7 }, undefined); const params = new URL(result).searchParams; expect(params.get("skip")).toStrictEqual("3"); @@ -30,10 +30,24 @@ describe("addQueryParametersToUrl", () => { }); it("omits undefined query parameter values", () => { - const result = addQueryParametersToUrl(baseUrl, { skip: 1, limit: undefined }); + const result = addQueryParametersToUrl(baseUrl, { skip: 1, limit: undefined }, undefined); const params = new URL(result).searchParams; expect(params.get("skip")).toStrictEqual("1"); expect(params.has("limit")).toBe(false); }); + + it("omits undefined filter values", () => { + const result = addQueryParametersToUrl(baseUrl, undefined, [{ property: "system.language", operator: "eq", value: undefined }]); + const params = new URL(result).searchParams; + + expect(params.has("system.language")).toBe(false); + }); + + it("omits filter with undefined value", () => { + const result = addQueryParametersToUrl(baseUrl, undefined, [{ property: "system.language", operator: "eq", value: undefined }]); + const params = new URL(result).searchParams; + + expect(params.has("system.language")).toBe(false); + }); }); From 9211658678b11e7480453edd2a911364259afdce Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 11:42:22 +0200 Subject: [PATCH 087/221] Adds support for != operator alias --- lib/models/filter.models.ts | 5 +++-- lib/utils/url.utils.ts | 5 +++++ tests/unit/filters/filters.spec.ts | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 96750999..787c2602 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,9 +1,10 @@ import type { ContentItemSystemPayload } from "../queries/content-items/content-item.models.js"; import type { DeliveryClientSchema } from "./core.models.js"; +type SpecialFilterOperators = "=" | "!="; + export type FilterOperators = | "eq" - | "=" | "neq" | "empty" | "nempty" @@ -32,7 +33,7 @@ export type ElementsFilterQueryParam = export type QueryFilter = { readonly property: QueryFilterProperty; readonly value: string | number | boolean | undefined; - readonly operator: FilterOperators; + readonly operator: SpecialFilterOperators | FilterOperators; }; export type CombinedFilter = diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 072f4a33..c842b65a 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -90,6 +90,11 @@ function getFilterParams(filters: readonly CombinedFilter[] | un return [[filter.property, filter.value.toString()]]; } + // Special case for "!=" operator which we need to convert to "neq" + if (filter.operator === "!=") { + return [[`${filter.property}[neq]`, filter.value.toString()]]; + } + return [[`${filter.property}[${filter.operator}]`, filter.value.toString()]]; } diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts index 83de6864..e86ceab2 100644 --- a/tests/unit/filters/filters.spec.ts +++ b/tests/unit/filters/filters.spec.ts @@ -52,6 +52,20 @@ describe("Filters", () => { expect(url).toContain("system.language=default"); }); + it("Filter defined as string with value containing '!=' should be added to the url correctly", () => { + const url = client.listContentItems({ + filters: [ + { + property: "system.language", + operator: "!=", + value: "default", + }, + ], + }).url; + + expect(url).toContain("system.language[neq]=default"); + }); + it("Filters defined as both object and string should all be added to the url", () => { const url = client.listContentItems({ filters: [ From 68808e9cfe23ed59bd9e717473aa989fbb2f59b5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 12:53:32 +0200 Subject: [PATCH 088/221] Adds support for simple RTE empty / not empty checks --- lib/models/filter.models.ts | 21 ++++++++-------- lib/utils/url.utils.ts | 21 ++++++++++++++-- tests/unit/filters/filters.spec.ts | 40 ++++++++++++++++++++++++------ tests/unit/utils/url-utils.spec.ts | 28 ++++++++++++++++++++- 4 files changed, 90 insertions(+), 20 deletions(-) diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 787c2602..566f69ce 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,7 +1,9 @@ -import type { ContentItemSystemPayload } from "../queries/content-items/content-item.models.js"; import type { DeliveryClientSchema } from "./core.models.js"; -type SpecialFilterOperators = "=" | "!="; +export const emptyRichtextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; + +export type SpecialFilterOperators = "=" | "!="; +export type EmptyRichtextOperator = (typeof emptyRichtextOperators)[number]; export type FilterOperators = | "eq" @@ -36,14 +38,13 @@ export type QueryFilter = { + readonly property: `elements.${TElementProperties}`; + readonly operator: EmptyRichtextOperator; + readonly value?: never; +}; + export type CombinedFilter = | QueryFilter + | EmptyRichtextFilter | FilterQueryParam; - -const filter: QueryFilter, "hello" | "world"> = { - property: "elements.hello", - operator: "gte", - value: "fe", -}; - -void filter; diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index c842b65a..80520a7c 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,6 +1,6 @@ import { getEndpointUrl } from "@kontent-ai/core-sdk"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; -import type { CombinedFilter, QueryFilter } from "../models/filter.models.js"; +import { type CombinedFilter, type EmptyRichtextFilter, emptyRichtextOperators, type QueryFilter } from "../models/filter.models.js"; import type { QueryParameterRecord } from "../models/request.models.js"; export function getDeliveryUrl({ @@ -31,7 +31,19 @@ export function addQueryParametersToUrl( return url; } - return `${url}${url.includes("?") ? "&" : "?"}${searchParams.toString().replaceAll("%5B", "[").replaceAll("%5D", "]")}`; + return `${url}${url.includes("?") ? "&" : "?"}${searchParams.toString()}`; +} + +export function isEmptyRichtextFilter(value: unknown): value is EmptyRichtextFilter { + if (typeof value !== "object" || value === null || value === undefined) { + return false; + } + + if (!(("operator" satisfies keyof EmptyRichtextFilter) in value)) { + return false; + } + + return emptyRichtextOperators.some((operator) => operator === value.operator); } function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { @@ -80,6 +92,11 @@ function getFilterParams(filters: readonly CombinedFilter[] | un return []; } return filters.flatMap((filter) => { + // Special case for "isEmptyRichText" operator + if (isEmptyRichtextFilter(filter)) { + return [[`${filter.property}[${filter.operator === "isEmptyRichText" ? "eq" : "neq"}]`, "


"]]; + } + if (isQueryFilter(filter)) { if (!filterHasDefinedValue(filter)) { return []; diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts index e86ceab2..ce8a9c57 100644 --- a/tests/unit/filters/filters.spec.ts +++ b/tests/unit/filters/filters.spec.ts @@ -19,7 +19,7 @@ describe("Filters", () => { ], }).url; - expect(url).toContain("system.language[eq]=default"); + expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Filter defined as string should be added to the url", () => { @@ -27,7 +27,7 @@ describe("Filters", () => { filters: ["system.language[eq]=default"], }).url; - expect(url).toContain("system.language[eq]=default"); + expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Handle multiple equal signs in value", () => { @@ -35,7 +35,7 @@ describe("Filters", () => { filters: ["system.codename[eq]=abc=def"], }).url; - expect(url).toContain("system.codename[eq]=abc%3Ddef"); + expect(url).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); }); it("Filter defined as string with value containing '=' should be added to the url correctly", () => { @@ -49,7 +49,7 @@ describe("Filters", () => { ], }).url; - expect(url).toContain("system.language=default"); + expect(url).toContain(new URLSearchParams("system.language=default").toString()); }); it("Filter defined as string with value containing '!=' should be added to the url correctly", () => { @@ -63,7 +63,33 @@ describe("Filters", () => { ], }).url; - expect(url).toContain("system.language[neq]=default"); + expect(url).toContain(new URLSearchParams("system.language[neq]=default").toString()); + }); + + it("isEmptyRichText filter should produce [eq]=


in the url", () => { + const url = client.listContentItems({ + filters: [ + { + property: "elements.description", + operator: "isEmptyRichText", + }, + ], + }).url; + + expect(url).toContain(new URLSearchParams("elements.description[eq]=


").toString()); + }); + + it("isNotEmptyRichText filter should produce [neq]=


in the url", () => { + const url = client.listContentItems({ + filters: [ + { + property: "elements.description", + operator: "isNotEmptyRichText", + }, + ], + }).url; + + expect(url).toContain(new URLSearchParams("elements.description[neq]=


").toString()); }); it("Filters defined as both object and string should all be added to the url", () => { @@ -78,7 +104,7 @@ describe("Filters", () => { ], }).url; - expect(url).toContain("system.language[eq]=default"); - expect(url).toContain("system.type[eq]=movie"); + expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); }); }); diff --git a/tests/unit/utils/url-utils.spec.ts b/tests/unit/utils/url-utils.spec.ts index b509b612..33b7b987 100644 --- a/tests/unit/utils/url-utils.spec.ts +++ b/tests/unit/utils/url-utils.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { addQueryParametersToUrl } from "../../../lib/utils/url.utils.js"; +import { addQueryParametersToUrl, isEmptyRichtextFilter } from "../../../lib/utils/url.utils.js"; describe("addQueryParametersToUrl", () => { const baseUrl = "https://deliver.kontent.ai/xyz/languages"; @@ -51,3 +51,29 @@ describe("addQueryParametersToUrl", () => { expect(params.has("system.language")).toBe(false); }); }); + +describe("isEmptyRichtextFilter", () => { + it("returns true for object with isEmptyRichText operator", () => { + expect(isEmptyRichtextFilter({ property: "elements.description", operator: "isEmptyRichText" })).toBe(true); + }); + + it("returns true for object with isNotEmptyRichText operator", () => { + expect(isEmptyRichtextFilter({ property: "elements.description", operator: "isNotEmptyRichText" })).toBe(true); + }); + + it("returns false for object with a different operator", () => { + expect(isEmptyRichtextFilter({ property: "elements.description", operator: "eq", value: "test" })).toBe(false); + }); + + it("returns false for object missing operator", () => { + expect(isEmptyRichtextFilter({ property: "elements.description" })).toBe(false); + }); + + it("returns false for null", () => { + expect(isEmptyRichtextFilter(null)).toBe(false); + }); + + it("returns false for a string", () => { + expect(isEmptyRichtextFilter("elements.description[eq]=test")).toBe(false); + }); +}); From 00fe6aada942fe4e08f5374220b4384d5ee334ba Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 13:40:53 +0200 Subject: [PATCH 089/221] Code improvements --- lib/models/core.models.ts | 10 +++++----- lib/public_api.ts | 2 +- lib/queries/languages/list-languages-query.ts | 6 ++++-- lib/queries/taxonomies/list-taxonomies-query.ts | 6 +++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index b77a07c3..a2f36510 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -12,7 +12,7 @@ import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/t import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; import type { DeliverySdkError } from "./error.models.js"; -export type FullDeliveryClientShema = { +export type FullDeliveryClientSchema = { readonly languageCodenames: readonly string[]; readonly taxonomyCodenames: readonly string[]; readonly contentTypeCodenames: readonly string[]; @@ -22,7 +22,7 @@ export type FullDeliveryClientShema = { readonly workflowStepCodenames: readonly string[]; }; -export type DeliveryClientSchema = { +export type DeliveryClientSchema = { readonly languageCodenames: TSchema["languageCodenames"]; readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; @@ -34,7 +34,7 @@ export type DeliveryClientSchema = SdkConfig & +export type DeliveryClientConfig = SdkConfig & ApiDeliveryClientConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. @@ -62,8 +62,8 @@ export type DeliveryClientConfigWithSchema export type DeliveryClient = { readonly config: DeliveryClientConfig; - listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; - listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; + listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; + listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; listContentTypes(request?: ListContentTypesQueryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; diff --git a/lib/public_api.ts b/lib/public_api.ts index 9bf0be8c..ef87982d 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -6,7 +6,7 @@ export type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - FullDeliveryClientShema, + FullDeliveryClientSchema, } from "./models/core.models.js"; export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; // Content Items diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 5f80a7b8..e473fa91 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -5,11 +5,13 @@ import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } export type ListLanguagesQuery = DeliveryPagedFetchQuery>; -export type ListLanguagesQueryRequest = PagingDeliveryRequest["system"]>>; +export type ListLanguagesQueryRequest = PagingDeliveryRequest< + SystemOrderQueryParam["system"]> +>; export function listLanguagesQuery( config: DeliveryClientConfig, - request?: ListLanguagesQueryRequest, + request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { return createDeliveryPagingQuery({ config, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 9c29cae9..2841cd66 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -5,13 +5,13 @@ import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; -export type ListTaxonomiesQueryRequest = PagingDeliveryRequest< - SystemOrderQueryParam["system"]> +export type ListTaxonomiesQueryRequest = PagingDeliveryRequest< + SystemOrderQueryParam["system"]> >; export function listTaxonomiesQuery( config: DeliveryClientConfig, - request?: ListTaxonomiesQueryRequest, + request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { return createDeliveryPagingQuery({ config, From d450c70983cd8615ffa96f0bbafb79e2cc0f0b4a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 14:03:44 +0200 Subject: [PATCH 090/221] use ts-pattern in filters --- lib/utils/url.utils.ts | 57 +++++++++++++++++++++++------------------- package.json | 1 + pnpm-lock.yaml | 7 ++++-- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 80520a7c..75b7144f 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,4 +1,5 @@ import { getEndpointUrl } from "@kontent-ai/core-sdk"; +import { match } from "ts-pattern"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; import { type CombinedFilter, type EmptyRichtextFilter, emptyRichtextOperators, type QueryFilter } from "../models/filter.models.js"; import type { QueryParameterRecord } from "../models/request.models.js"; @@ -92,31 +93,35 @@ function getFilterParams(filters: readonly CombinedFilter[] | un return []; } return filters.flatMap((filter) => { - // Special case for "isEmptyRichText" operator - if (isEmptyRichtextFilter(filter)) { - return [[`${filter.property}[${filter.operator === "isEmptyRichText" ? "eq" : "neq"}]`, "


"]]; - } - - if (isQueryFilter(filter)) { - if (!filterHasDefinedValue(filter)) { - return []; - } - - // Special case for "=" operator which we can just omit from the property definition - if (filter.operator === "=") { - return [[filter.property, filter.value.toString()]]; - } - - // Special case for "!=" operator which we need to convert to "neq" - if (filter.operator === "!=") { - return [[`${filter.property}[neq]`, filter.value.toString()]]; - } - - return [[`${filter.property}[${filter.operator}]`, filter.value.toString()]]; - } - - // Split the filter string into property and value - const separatorIndex = filter.indexOf("="); - return [[filter.slice(0, separatorIndex), filter.slice(separatorIndex + 1)]]; + return ( + match(filter) + .returnType() + // Special case for "isEmptyRichText" operator + .when(isEmptyRichtextFilter, (filter) => [ + [`${filter.property}[${filter.operator === "isEmptyRichText" ? "eq" : "neq"}]`, "


"], + ]) + .when(isQueryFilter, (filter) => { + if (!filterHasDefinedValue(filter)) { + return []; + } + + // Special case for "=" operator which we can just omit from the property definition + if (filter.operator === "=") { + return [[filter.property, filter.value.toString()]]; + } + + // Special case for "!=" operator which we need to convert to "neq" + if (filter.operator === "!=") { + return [[`${filter.property}[neq]`, filter.value.toString()]]; + } + + return [[`${filter.property}[${filter.operator}]`, filter.value.toString()]]; + }) + .otherwise((stringFilter) => { + // Split the filter string into property and value + const separatorIndex = stringFilter.indexOf("="); + return [[stringFilter.slice(0, separatorIndex), stringFilter.slice(separatorIndex + 1)]]; + }) + ); }); } diff --git a/package.json b/package.json index 68178719..f04e39db 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ }, "peerDependencies": { "@kontent-ai/core-sdk": "^12.0.0-preview.24", + "ts-pattern": "^5", "zod": "^4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c1cebb6..87da92f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@kontent-ai/core-sdk': specifier: ^12.0.0-preview.24 version: 12.0.0-preview.24(ts-pattern@5.9.0)(zod@4.3.6) + ts-pattern: + specifier: ^5 + version: 5.9.0 zod: specifier: ^4 version: 4.3.6 @@ -1961,7 +1964,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) @@ -2055,7 +2058,7 @@ snapshots: dependencies: undici-types: 7.18.2 - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) From ca4c9fb15bb575725f3ff13a67c9b552ab91212e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 14:07:06 +0200 Subject: [PATCH 091/221] Use spread shape --- lib/models/pagination.models.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index 7664283f..ad042708 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -12,9 +12,10 @@ export const paginationSchema = z.object({ }); export const paginationSchemaWithTotalCount = z.object({ - pagination: paginationObjectSchema - .extend({ - total_count: z.number().optional().readonly(), + pagination: z + .object({ + ...paginationObjectSchema.shape, + total_count: z.number().optional(), }) .readonly(), }); From a5d5a30a104e8cb99cf94fedb276c909a8ab731e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 14:36:13 +0200 Subject: [PATCH 092/221] Code improvements --- lib/models/filter.models.ts | 53 ++++++++++++++++----------------- lib/models/request.models.ts | 4 +-- lib/public_api.ts | 21 ++++++++----- lib/queries/delivery-queries.ts | 4 +-- lib/utils/url.utils.ts | 24 ++++++++------- 5 files changed, 57 insertions(+), 49 deletions(-) diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 566f69ce..5e1df0b2 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,11 +1,30 @@ -import type { DeliveryClientSchema } from "./core.models.js"; - export const emptyRichtextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; +export const operatorToFilterOp: Record = { + isEmptyRichText: "eq", + isNotEmptyRichText: "neq", +}; + +export type ObjectFilter = { + readonly property: FilterProperty; + readonly value: string | number | boolean | undefined; + readonly operator: SpecialFilterOperators | FilterOperators; +}; + +export type EmptyRichtextFilter = { + readonly property: `elements.${TElementProperties}`; + readonly operator: EmptyRichtextOperator; + readonly value?: never; +}; + +export type Filter = + | ObjectFilter + | EmptyRichtextFilter + | FullFilterQuery; -export type SpecialFilterOperators = "=" | "!="; -export type EmptyRichtextOperator = (typeof emptyRichtextOperators)[number]; +type SpecialFilterOperators = "=" | "!="; +type EmptyRichtextOperator = (typeof emptyRichtextOperators)[number]; -export type FilterOperators = +type FilterOperators = | "eq" | "neq" | "empty" @@ -21,30 +40,10 @@ export type FilterOperators = | "any" | "all"; -export type FilterQueryParam = +type FullFilterQuery = | `system.${TSystemProperties}[${FilterOperators}]=${string}` | `elements.${TElementProperties}[${FilterOperators}]=${string}`; -export type QueryFilterProperty = +type FilterProperty = | `system.${TSystemProperties}` | `elements.${TElementProperties}`; - -export type ElementsFilterQueryParam = - `elements.${NonNullable[number]}[${FilterOperators}]=${string}`; - -export type QueryFilter = { - readonly property: QueryFilterProperty; - readonly value: string | number | boolean | undefined; - readonly operator: SpecialFilterOperators | FilterOperators; -}; - -export type EmptyRichtextFilter = { - readonly property: `elements.${TElementProperties}`; - readonly operator: EmptyRichtextOperator; - readonly value?: never; -}; - -export type CombinedFilter = - | QueryFilter - | EmptyRichtextFilter - | FilterQueryParam; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 4e64d377..dcf77000 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -1,5 +1,5 @@ import type { Header } from "@kontent-ai/core-sdk"; -import type { CombinedFilter } from "./filter.models.js"; +import type { Filter } from "./filter.models.js"; export type DeliveryRequest = { readonly config?: DeliveryRequestConfig; @@ -23,7 +23,7 @@ export type QueryParameters = { }; export type QueryFilters = { - readonly filters?: readonly CombinedFilter[]; + readonly filters?: readonly Filter[]; }; export type DeliveryRequestConfig = { diff --git a/lib/public_api.ts b/lib/public_api.ts index ef87982d..4dd7cce6 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -8,15 +8,20 @@ export type { DeliveryClientSchema, FullDeliveryClientSchema, } from "./models/core.models.js"; -export { PaginationSchema, paginationSchema } from "./models/pagination.models.js"; +// Filters +export type { EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; +// Pagination +export type { PaginationSchema, PaginationSchemaWithTotalCount } from "./models/pagination.models.js"; // Content Items -export type { - ContentItemElementPayload, - ContentItemPayload, - ContentItemSystemPayload, - ContentItemSystemSortableProperty, - FetchContentItemPayload, - ListContentItemsPayload, +export { + type ContentItemElementPayload, + type ContentItemPayload, + type ContentItemSystemPayload, + type ContentItemSystemSortableProperty, + contentItemWithSystemSchema, + elementSchemas, + type FetchContentItemPayload, + type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index e3e9c9bd..a0db54b3 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -11,7 +11,7 @@ import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; -import type { CombinedFilter } from "../models/filter.models.js"; +import type { Filter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; import type { DeliveryRequest, QueryFilters, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; @@ -94,7 +94,7 @@ function getRequestData({ }; } -function getFilters(request: DeliveryRequest | undefined): readonly CombinedFilter[] | undefined { +function getFilters(request: DeliveryRequest | undefined): readonly Filter[] | undefined { if (!request || !isQueryWithFilters(request)) { return undefined; } diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 75b7144f..f469a43c 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,7 +1,13 @@ import { getEndpointUrl } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; -import { type CombinedFilter, type EmptyRichtextFilter, emptyRichtextOperators, type QueryFilter } from "../models/filter.models.js"; +import { + type EmptyRichtextFilter, + emptyRichtextOperators, + type Filter, + type ObjectFilter, + operatorToFilterOp, +} from "../models/filter.models.js"; import type { QueryParameterRecord } from "../models/request.models.js"; export function getDeliveryUrl({ @@ -20,7 +26,7 @@ export function getDeliveryUrl({ export function addQueryParametersToUrl( url: string, query: QueryParameterRecord | undefined, - filters: readonly CombinedFilter[] | undefined, + filters: readonly Filter[] | undefined, ): string { if (!query && !filters) { return url; @@ -59,14 +65,14 @@ function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { function getUrlSearchParams( query: QueryParameterRecord | undefined, - filters: readonly CombinedFilter[] | undefined, + filters: readonly Filter[] | undefined, ): URLSearchParams { return new URLSearchParams(getQueryParams(query).concat(getFilterParams(filters))); } function filterHasDefinedValue( - filter: QueryFilter, -): filter is QueryFilter & { readonly value: NonNullable } { + filter: ObjectFilter, +): filter is ObjectFilter & { readonly value: NonNullable } { return filter.value !== undefined && filter.value !== null; } @@ -75,7 +81,7 @@ function queryHasDefinedValue(item: [Key, Value | undefined]): item return value !== undefined && value !== null; } -function isQueryFilter(value: unknown): value is QueryFilter { +function isQueryFilter(value: unknown): value is ObjectFilter { return typeof value === "object" && value !== null && "property" in value && "operator" in value && "value" in value; } @@ -88,7 +94,7 @@ function getQueryParams(query: QueryParameterRecord | undefined): readonly strin .map(([key, value]) => [key, value.toString()]); } -function getFilterParams(filters: readonly CombinedFilter[] | undefined): readonly string[][] { +function getFilterParams(filters: readonly Filter[] | undefined): readonly string[][] { if (!filters) { return []; } @@ -97,9 +103,7 @@ function getFilterParams(filters: readonly CombinedFilter[] | un match(filter) .returnType() // Special case for "isEmptyRichText" operator - .when(isEmptyRichtextFilter, (filter) => [ - [`${filter.property}[${filter.operator === "isEmptyRichText" ? "eq" : "neq"}]`, "


"], - ]) + .when(isEmptyRichtextFilter, (filter) => [[`${filter.property}[${operatorToFilterOp[filter.operator]}]`, "


"]]) .when(isQueryFilter, (filter) => { if (!filterHasDefinedValue(filter)) { return []; From f68294d3b6afa10c7c788c7036d067e26b170add Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Apr 2026 15:19:40 +0200 Subject: [PATCH 093/221] Adds filter support to remaining list queries --- lib/models/filter.models.ts | 2 +- lib/queries/content-types/list-content-types-query.ts | 2 ++ lib/queries/languages/list-languages-query.ts | 5 +++-- lib/queries/taxonomies/list-taxonomies-query.ts | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 5e1df0b2..61127edf 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -6,7 +6,7 @@ export const operatorToFilterOp: Record export type ObjectFilter = { readonly property: FilterProperty; - readonly value: string | number | boolean | undefined; + readonly value: string | number | boolean | undefined | string[]; readonly operator: SpecialFilterOperators | FilterOperators; }; diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 320b4549..e5207657 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -2,6 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { ElementSelectionQueryParam, PagingDeliveryRequest, + QueryFilters, QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; @@ -13,6 +14,7 @@ export type ListContentTypesQuery = Delive export type ListContentTypesQueryRequest = PagingDeliveryRequest< SystemOrderQueryParam["system"]> > & + QueryFilters["system"], never> & QueryParameters<{ readonly elements?: ElementSelectionQueryParam[number]>; }>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index e473fa91..a62bf5ce 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,5 +1,5 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; @@ -7,7 +7,8 @@ export type ListLanguagesQuery = DeliveryP export type ListLanguagesQueryRequest = PagingDeliveryRequest< SystemOrderQueryParam["system"]> ->; +> & + QueryFilters["system"], never>; export function listLanguagesQuery( config: DeliveryClientConfig, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 2841cd66..f9fa7b8a 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,5 +1,5 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; @@ -7,7 +7,8 @@ export type ListTaxonomiesQuery = Delivery export type ListTaxonomiesQueryRequest = PagingDeliveryRequest< SystemOrderQueryParam["system"]> ->; +> & + QueryFilters["system"], never>; export function listTaxonomiesQuery( config: DeliveryClientConfig, From 2f4ef237a992f96768e83b431346c6cb6115f289 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 13 Apr 2026 09:14:05 +0200 Subject: [PATCH 094/221] Updates client schemas --- lib/client/delivery-client.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 7f58e00b..955c9844 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,4 @@ -import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientShema } from "../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientSchema } from "../models/core.models.js"; import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { @@ -37,13 +37,13 @@ import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries * environmentId: "x", * }); */ -export function createDeliveryClient( +export function createDeliveryClient( config: DeliveryClientConfig, ): DeliveryClient { return { config, - listTaxonomies: (request?: ListTaxonomiesQueryRequest) => listTaxonomiesQuery(config, request), - listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), + listTaxonomies: (request?: ListTaxonomiesQueryRequest) => listTaxonomiesQuery(config, request), + listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), listContentTypes: (request?: ListContentTypesQueryRequest) => listContentTypes(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), From 525f7c9a3958375fc2118969aa808ad73121acdf Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 13 Apr 2026 10:55:22 +0200 Subject: [PATCH 095/221] Adds items-feed query --- lib/client/delivery-client.ts | 2 + lib/models/core.models.ts | 2 + .../content-items/content-item.models.ts | 9 + lib/queries/content-items/items-feed-query.ts | 62 + .../content-items/list-content-items-query.ts | 4 +- .../content-types/list-content-types-query.ts | 4 +- lib/queries/delivery-queries.ts | 21 +- lib/queries/languages/list-languages-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 4 +- lib/utils/paging.utils.ts | 11 +- .../content-items/items-feed-query.payload.ts | 3159 +++++++++++++++++ .../content-items/items-feed-query.spec.ts | 14 + 12 files changed, 3285 insertions(+), 11 deletions(-) create mode 100644 lib/queries/content-items/items-feed-query.ts create mode 100644 tests/integration/queries/content-items/items-feed-query.payload.ts create mode 100644 tests/integration/queries/content-items/items-feed-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 955c9844..5c357d69 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,5 +1,6 @@ import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientSchema } from "../models/core.models.js"; import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; +import { type ItemsFeedQueryRequest, itemsFeedQuery } from "../queries/content-items/items-feed-query.js"; import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { type FetchContentTypeElementQueryRequest, @@ -50,5 +51,6 @@ export function createDeliveryClient) => fetchContentTypeElementQuery(config, request), fetchContentItem: (request: FetchContentItemQueryRequest) => fetchContentItemQuery(config, request), listContentItems: (request?: ListContentItemsQueryRequest) => listContentItemsQuery(config, request), + itemsFeed: (request?: ItemsFeedQueryRequest) => itemsFeedQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index a2f36510..efcb9fd2 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,5 +1,6 @@ import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { FetchContentItemQuery, FetchContentItemQueryRequest } from "../queries/content-items/fetch-content-item-query.js"; +import type { ItemsFeedQuery, ItemsFeedQueryRequest } from "../queries/content-items/items-feed-query.js"; import type { ListContentItemsQuery, ListContentItemsQueryRequest } from "../queries/content-items/list-content-items-query.js"; import type { FetchContentTypeElementQuery, @@ -70,6 +71,7 @@ export type DeliveryClient): FetchContentTypeElementQuery; fetchContentItem(request: FetchContentItemQueryRequest): FetchContentItemQuery; listContentItems(request?: ListContentItemsQueryRequest): ListContentItemsQuery; + itemsFeed(request?: ItemsFeedQueryRequest): ItemsFeedQuery; }; export type DeliveryFetchQuery = FetchQuery; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index b574a5e3..9acd57e4 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -193,6 +193,14 @@ export const listContentItemsPayload = (sc }) .readonly(); +export const itemsFeedPayload = (schema: TSchema | undefined) => + z + .object({ + items: z.array(contentItemSchema(schema)).readonly(), + modular_content: z.record(z.string(), contentItemSchema(schema)), + }) + .readonly(); + export const fetchContentItemPayload = (schema: TSchema | undefined) => z .object({ @@ -217,3 +225,4 @@ export type ContentItemElementPayload = z.infer export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; +export type ItemsFeedPayload = z.infer>>; diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts new file mode 100644 index 00000000..d5e04b95 --- /dev/null +++ b/lib/queries/content-items/items-feed-query.ts @@ -0,0 +1,62 @@ +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { + ElementOrderQueryParam, + ElementSelectionQueryParam, + PagingDeliveryRequest, + QueryFilters, + QueryParameters, + SystemOrderQueryParam, +} from "../../models/request.models.js"; +import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; +import { type ContentItemPayload, type ContentItemSystemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; + +export type ItemsFeedQuery = DeliveryPagedFetchQuery>; + +export type ItemsFeedQueryRequest = PagingDeliveryRequest< + | SystemOrderQueryParam["system"]> + | ElementOrderQueryParam[number]> +> & + QueryFilters, NonNullable[number]> & + QueryParameters<{ + /** + * Determines which language variant of content items to return. By default, the API returns content in the default language. + */ + readonly language?: NonNullable[number]; + + /** + * Specifies which elements to include in the response. By default, all elements are returned. + */ + readonly elements?: ElementSelectionQueryParam[number]>; + + /** + * Specifies which elements to exclude from the response. By default, no elements are excluded. + */ + readonly excludeElements?: ElementSelectionQueryParam[number]>; + + /** + * Determines the nesting level for linked content items that the API returns. + * By default, only the first level of linked items is returned, which is the same as setting depth=1. + * To include more than one level of linked items in the response, set depth to 2 or more. + * To exclude all linked items from the response, set depth to 0. + */ + readonly depth?: number; + + /** + * Adds the information about the total number of content items matching your query. + * Only the content filtering parameters affect the resulting number. + * Other parameters in your query, such as limit, skip, or order, don't have an effect on it. + */ + readonly includeTotalCount?: boolean; + }>; + +export function itemsFeedQuery( + config: DeliveryClientConfig, + request?: ItemsFeedQueryRequest, +): ItemsFeedQuery { + return createDeliveryPagingByTokenQuery({ + config, + request, + schema: itemsFeedPayload(config.schema), + endpoint: "items-feed", + }); +} diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index bf4afb57..d0cd1c06 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -7,7 +7,7 @@ import type { QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ContentItemPayload, type ContentItemSystemPayload, @@ -58,7 +58,7 @@ export function listContentItemsQuery( config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { - return createDeliveryPagingQuery({ + return createDeliveryPagingByUrlQuery({ config, request, schema: listContentItemsPayload(config.schema), diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index e5207657..29fc0326 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -6,7 +6,7 @@ import type { QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; export type ListContentTypesQuery = DeliveryPagedFetchQuery>; @@ -23,7 +23,7 @@ export function listContentTypes( config: DeliveryClientConfig, request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { - return createDeliveryPagingQuery({ + return createDeliveryPagingByUrlQuery({ config, request, schema: listContentTypesPayload(config.schema), diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index a0db54b3..0703fd87 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -15,10 +15,10 @@ import type { Filter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; import type { DeliveryRequest, QueryFilters, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; -import { getNextPageByUrl } from "../utils/paging.utils.js"; +import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; -export function createDeliveryPagingQuery({ +export function createDeliveryPagingByUrlQuery({ config, schema, endpoint, @@ -35,6 +35,23 @@ export function createDeliveryPagingQuery({ }); } +export function createDeliveryPagingByTokenQuery({ + config, + schema, + endpoint, + request, +}: { + readonly request: DeliveryRequest | undefined; + readonly config: DeliveryClientConfig; + readonly schema: ZodType; + readonly endpoint: DeliveryEndpoints; +}): PagedFetchQuery { + return createPagedFetchQuery({ + ...getSharedRequestData({ config, endpoint, schema: schema, request }), + getNextPageData: getNextPageByContinuationToken(), + }); +} + export function createDeliveryFetchQuery({ config, schema, diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index a62bf5ce..5e660e2f 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,6 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; @@ -14,7 +14,7 @@ export function listLanguagesQuery( config: DeliveryClientConfig, request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { - return createDeliveryPagingQuery({ + return createDeliveryPagingByUrlQuery({ config, request, schema: listLanguagesPayload(config.schema), diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index f9fa7b8a..1275306e 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,6 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createDeliveryPagingQuery } from "../delivery-queries.js"; +import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; @@ -14,7 +14,7 @@ export function listTaxonomiesQuery( config: DeliveryClientConfig, request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { - return createDeliveryPagingQuery({ + return createDeliveryPagingByUrlQuery({ config, request, schema: listTaxonomiesPayload(config.schema), diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index 044b0587..36e1935b 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,4 +1,4 @@ -import type { GetNextPageData } from "@kontent-ai/core-sdk"; +import type { GetNextPageData, JsonValue } from "@kontent-ai/core-sdk"; import type { PaginationSchema } from "../models/pagination.models.js"; export function getNextPageByUrl(): GetNextPageData { @@ -9,3 +9,12 @@ export function getNextPageByUrl(): Ge }; }; } + +export function getNextPageByContinuationToken(): GetNextPageData { + return (response) => { + return { + continuationToken: response.meta.continuationToken, + nextPageUrl: undefined, + }; + }; +} diff --git a/tests/integration/queries/content-items/items-feed-query.payload.ts b/tests/integration/queries/content-items/items-feed-query.payload.ts new file mode 100644 index 00000000..e2852769 --- /dev/null +++ b/tests/integration/queries/content-items/items-feed-query.payload.ts @@ -0,0 +1,3159 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; + +export default { + items: [ + { + system: { + id: "d56bff34-5ce8-4ac1-9cb8-547848b3a22b", + name: "Al Pacino", + codename: "al_pacino", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:25.6499619Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Al", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pacino", + }, + }, + }, + { + system: { + id: "b25e6ed1-0a3f-4975-bb84-4c7efefa70d0", + name: "Amy Adams", + codename: "amy_adams", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:17.8650469Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Amy", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Adams", + }, + }, + }, + { + system: { + id: "114f4d17-936f-406d-8e59-e34c7eb5f200", + name: "Ana de Armas", + codename: "ana_de_armas", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:05.6615288Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Ana", + }, + lastname: { + type: "text", + name: "Lastname", + value: "de Armas", + }, + }, + }, + { + system: { + id: "19f8dbfa-46d8-4f0d-9afa-c88dc963ff96", + name: "Angelina Jolie", + codename: "angelina_jolie", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:16.1359703Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Angelina", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Jolie", + }, + }, + }, + { + system: { + id: "a0f01bd5-c1d1-4aad-92de-89e7835b561e", + name: "Anne Hathaway", + codename: "anne_hathaway", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:51.1280388Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Anne", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Hathaway", + }, + }, + }, + { + system: { + id: "68bc6cea-79ba-4748-92d8-fdbf33bd55ea", + name: "Anthony Hopkins", + codename: "anthony_hopkins", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:00.3600159Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Anthony", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Hopkins", + }, + }, + }, + { + system: { + id: "a7c0313e-0bb0-4dc3-9d5b-61f9f5757b5e", + name: "Antonio Banderas", + codename: "antonio_banderas", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:06.8102193Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Antonio", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Banderas", + }, + }, + }, + { + system: { + id: "f87989d8-ac15-4b87-b43a-37d85e0002f6", + name: "Avengers: Endgame", + codename: "avengers__endgame", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:39.8815857Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Avengers: Endgame", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 181, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

After the devastating events of Avengers: Infinity War, the remaining Avengers assemble one final time to undo Thanos' destruction and restore the universe. The epic conclusion to the Infinity Saga.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2019-04-26T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "avengers-endgame", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "The highest-grossing film of all time upon release, Avengers: Endgame is the culmination of 22 Marvel Cinematic Universe films.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["chris_evans", "scarlett_johansson", "robert_downey_jr_", "jeremy_renner"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "0f33b050-4cf3-41f4-9a9d-33bd1c7ba5ef", + name: "Benedict Cumberbatch", + codename: "benedict_cumberbatch", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:06.8688409Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Benedict", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Cumberbatch", + }, + }, + }, + { + system: { + id: "292468fe-ac5a-4505-b6f1-83cbbee89687", + name: "Black Panther", + codename: "black_panther", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:53.6784162Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Black Panther", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 134, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

T'Challa returns home to the African nation of Wakanda to take his rightful place as king. When a powerful enemy with ties to his past threatens to destroy the country, he must rally his allies and release the full power of the Black Panther.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2018-02-16T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "black-panther", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Marvel's Black Panther became a cultural phenomenon and was nominated for 7 Academy Awards including Best Picture.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["chadwick_boseman", "lupita_nyong_o"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "d7862a9a-0333-491c-9db9-ee91a7828a84", + name: "Brad Pitt", + codename: "brad_pitt", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:15.7816154Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Brad", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pitt", + }, + }, + }, + { + system: { + id: "5d096ac1-fc8c-4275-b411-11a1de4b1fbf", + name: "Brie Larson", + codename: "brie_larson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:15.552657Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Brie", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Larson", + }, + }, + }, + { + system: { + id: "863cf0b7-3ae8-4e77-8067-b9bd5b1f162e", + name: "Bryan Cranston", + codename: "bryan_cranston", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:11.6294243Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Bryan", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Cranston", + }, + }, + }, + { + system: { + id: "97468922-e32c-40ce-ad75-8ede3edd45d7", + name: "Cate Blanchett", + codename: "cate_blanchett", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:14.6089072Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Cate", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Blanchett", + }, + }, + }, + { + system: { + id: "831a6311-5e6a-40ee-bb2e-a1a51439b1e1", + name: "Chadwick Boseman", + codename: "chadwick_boseman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:12.1866334Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Chadwick", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Boseman", + }, + }, + }, + { + system: { + id: "8b6a70c2-cc79-40e1-a01a-fa5c6563d947", + name: "Charlize Theron", + codename: "charlize_theron", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:28.8990017Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Charlize", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Theron", + }, + }, + }, + { + system: { + id: "7a6f289c-3c2f-4b8d-a66e-f7361e8a2a6f", + name: "Chris Evans", + codename: "chris_evans", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:20.9296898Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Chris", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Evans", + }, + }, + }, + { + system: { + id: "921c1a57-2c05-4fa6-a876-7c3b799d3f1b", + name: "Chris Hemsworth", + codename: "chris_hemsworth", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:00.457889Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Chris", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Hemsworth", + }, + }, + }, + { + system: { + id: "2630c0c1-f25a-46df-9dd2-f258ff0d3c60", + name: "Christian Bale", + codename: "christian_bale", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:23.6060976Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Christian", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Bale", + }, + }, + }, + { + system: { + id: "1fcb9a45-ea77-47ed-9348-5bfba31e9278", + name: "Christoph Waltz", + codename: "christoph_waltz", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:57.7940706Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Christoph", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Waltz", + }, + }, + }, + { + system: { + id: "23c90ad1-6963-4c24-b7eb-6967967bd448", + name: "Cillian Murphy", + codename: "cillian_murphy", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:48.9787224Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Cillian", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Murphy", + }, + }, + }, + { + system: { + id: "7ea5e2a4-7715-47eb-9f54-55d3860289ed", + name: "Colin Firth", + codename: "colin_firth", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:52.3614325Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Colin", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Firth", + }, + }, + }, + { + system: { + id: "a8c19b2a-3f5c-4a1d-9cc8-1a06d83ab301", + name: "Daniel Craig", + codename: "daniel_craig", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:18.8005459Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Daniel", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Craig", + }, + }, + }, + { + system: { + id: "7f985920-fed5-4acc-98b2-044bae9bed69", + name: "Daniel Day-Lewis", + codename: "daniel_day_lewis", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:00.8239293Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Daniel", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Day-Lewis", + }, + }, + }, + { + system: { + id: "943f8fd8-91c2-4b87-8fec-98ad4e693697", + name: "Denzel Washington", + codename: "denzel_washington", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:17.4317276Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Denzel", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Washington", + }, + }, + }, + { + system: { + id: "41b167f9-79ef-4e48-ab01-8cd10f7303af", + name: "Dwayne Johnson", + codename: "dwayne_johnson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:42.3374184Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Dwayne", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Johnson", + }, + }, + }, + { + system: { + id: "ebc99a0d-d44b-4599-a01a-2dfba273a531", + name: "Eddie Redmayne", + codename: "eddie_redmayne", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:55.5692481Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Eddie", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Redmayne", + }, + }, + }, + { + system: { + id: "952090fe-5409-49ae-9f0d-238afecab0ab", + name: "Emily Blunt", + codename: "emily_blunt", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:49.7782012Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Emily", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Blunt", + }, + }, + }, + { + system: { + id: "1621e70c-99be-455c-b93c-46f68eab6158", + name: "Emma Stone", + codename: "emma_stone", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:01.4684966Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Emma", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Stone", + }, + }, + }, + { + system: { + id: "d19f1d6c-52b8-4bf3-8fbc-b019431d3eb1", + name: "Emma Thompson", + codename: "emma_thompson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:58.8051847Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Emma", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Thompson", + }, + }, + }, + { + system: { + id: "5db2ea89-5fb8-4187-9d7c-5389df88b248", + name: "Ethan Hawke", + codename: "ethan_hawke", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:08.7084469Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Ethan", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Hawke", + }, + }, + }, + { + system: { + id: "b5640463-7a4c-46c0-8b08-b3c2c0a3f90f", + name: "Felicity Jones", + codename: "felicity_jones", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:56.4897287Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Felicity", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Jones", + }, + }, + }, + { + system: { + id: "14622687-19bd-4362-90b3-de3898f7aa6d", + name: "Florence Pugh", + codename: "florence_pugh", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:03.2222014Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Florence", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pugh", + }, + }, + }, + { + system: { + id: "81b0c4cf-37dc-476a-ab0b-d4b2ed8ebbf2", + name: "Forrest Gump", + codename: "forrest_gump", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:22.6154672Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Forrest Gump", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 142, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

The story of Forrest Gump, a man with a low IQ but good heart, who unwittingly influences several historical events in 20th century America while longing for his childhood sweetheart Jenny.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "1994-07-06T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Drama", + codename: "drama", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "forrest-gump", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Winner of 6 Academy Awards including Best Picture, Forrest Gump is a beloved American classic starring Tom Hanks.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["tom_hanks"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "b5365930-21db-4440-abfe-65735f9dac2a", + name: "Gal Gadot", + codename: "gal_gadot", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:59.0827865Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Gal", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Gadot", + }, + }, + }, + { + system: { + id: "55b225d8-9d62-4306-9a8f-16feea53a3ac", + name: "Gary Oldman", + codename: "gary_oldman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:57.9327818Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Gary", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Oldman", + }, + }, + }, + { + system: { + id: "e777df88-4411-4831-b660-c8d40f776234", + name: "George Clooney", + codename: "george_clooney", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:41.4431549Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "George", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Clooney", + }, + }, + }, + { + system: { + id: "9540ec1a-8e48-4036-a435-41defd8589e7", + name: "Gladiator", + codename: "gladiator", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:35.2485442Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Gladiator", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 155, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

A former Roman general is betrayed by the emperor's corrupt son, loses everything dear to him, and is forced to become a gladiator. He must use his arena popularity to seek revenge against the tyrannical emperor.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2000-05-05T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "gladiator", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Ridley Scott's Gladiator won 5 Academy Awards including Best Picture, with Russell Crowe delivering an iconic performance.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["russell_crowe"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "c329dea2-e6e4-4985-9ab1-2ec2db8b021b", + name: "Halle Berry", + codename: "halle_berry", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:08.1011475Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Halle", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Berry", + }, + }, + }, + { + system: { + id: "af27004b-150d-44d5-992d-7f1200be93e9", + name: "Harrison Ford", + codename: "harrison_ford", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:44.5871489Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Harrison", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Ford", + }, + }, + }, + { + system: { + id: "dcc060dc-ce0e-4b1f-af45-c3ef82a90422", + name: "Helen Mirren", + codename: "helen_mirren", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:59.1375839Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Helen", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Mirren", + }, + }, + }, + { + system: { + id: "f8543414-e7c2-4598-944b-b80b4b663642", + name: "Hugh Jackman", + codename: "hugh_jackman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:11.3590593Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Hugh", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Jackman", + }, + }, + }, + { + system: { + id: "96c9d600-a2b3-4339-b792-112629276dba", + name: "Ian McKellen", + codename: "ian_mckellen", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:59.7130962Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Ian", + }, + lastname: { + type: "text", + name: "Lastname", + value: "McKellen", + }, + }, + }, + { + system: { + id: "ff4bd7e5-40a7-4a0d-bb25-769b414bfdec", + name: "Idris Elba", + codename: "idris_elba", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:51.9478946Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Idris", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Elba", + }, + }, + }, + { + system: { + id: "23b4a456-9d2a-4e47-915d-589e41b7329b", + name: "Inception", + codename: "inception", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:44.4838819Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Inception", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 148, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

A skilled thief who steals secrets from within people's dreams is given a chance to have his criminal record erased if he can plant an idea into a target's subconscious — a process known as inception.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2010-07-16T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "inception", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Christopher Nolan's mind-bending sci-fi thriller Inception won 4 Academy Awards and is celebrated for its innovative storytelling.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["leonardo_dicaprio", "marion_cotillard"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "e1c9dde8-97dd-4604-8acc-bca0421d8e04", + name: "Jake Gyllenhaal", + codename: "jake_gyllenhaal", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:14.2302861Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jake", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Gyllenhaal", + }, + }, + }, + { + system: { + id: "26ddb3e5-46d3-451f-9774-bd68fe604c12", + name: "James McAvoy", + codename: "james_mcavoy", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:46.328842Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "James", + }, + lastname: { + type: "text", + name: "Lastname", + value: "McAvoy", + }, + }, + }, + { + system: { + id: "7427309c-b84a-4c47-9a51-44b3e259b46d", + name: "Jamie Foxx", + codename: "jamie_foxx", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:53.2123098Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jamie", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Foxx", + }, + }, + }, + { + system: { + id: "2a5142ec-c56b-44d8-bb86-80553d05f53e", + name: "Javier Bardem", + codename: "javier_bardem", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:53.6413359Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Javier", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Bardem", + }, + }, + }, + { + system: { + id: "caad3465-f88c-43db-8d24-f32331c2ac8e", + name: "Jeff Bridges", + codename: "jeff_bridges", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:58.5625601Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jeff", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Bridges", + }, + }, + }, + { + system: { + id: "b96c6cbc-fd7d-4a13-9a9a-52fdd425a27a", + name: "Jennifer Aniston", + codename: "jennifer_aniston", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:40.2064454Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jennifer", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Aniston", + }, + }, + }, + { + system: { + id: "6a8461ab-6948-4f91-93d1-5b36aaebd3ee", + name: "Jennifer Lawrence", + codename: "jennifer_lawrence", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:22.8329501Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jennifer", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Lawrence", + }, + }, + }, + { + system: { + id: "d87ce611-4f91-451e-8fa2-24f0922ba71c", + name: "Jeremy Renner", + codename: "jeremy_renner", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:55.7508643Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jeremy", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Renner", + }, + }, + }, + { + system: { + id: "35aba8b4-289b-42aa-82fe-29842ebbfc88", + name: "Jessica Chastain", + codename: "jessica_chastain", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:19.9987106Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jessica", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Chastain", + }, + }, + }, + { + system: { + id: "90e414bd-16f4-4644-8fdd-0c8553396b72", + name: "Joaquin Phoenix", + codename: "joaquin_phoenix", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:29.7797132Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Joaquin", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Phoenix", + }, + }, + }, + { + system: { + id: "f52c5bb9-7078-44ee-9bcd-404b8df000a5", + name: "John David Washington", + codename: "john_david_washington", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:06.4726897Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "John David", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Washington", + }, + }, + }, + { + system: { + id: "423efdd9-8624-4be1-9fa8-072ff75fed62", + name: "Joker", + codename: "joker", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:48.5786297Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Joker", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 122, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

Arthur Fleck, a failed stand-up comedian and part-time clown, is disregarded and mistreated by society. As he descends into madness, he adopts the alter ego of the Joker and becomes the catalyst for chaos in Gotham City.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2019-10-04T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Drama", + codename: "drama", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "joker", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Joaquin Phoenix won the Academy Award for Best Actor for his transformative portrayal of Arthur Fleck in Todd Phillips' Joker.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["joaquin_phoenix"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "9430c217-39d8-4ad3-91aa-2674acd981a2", + name: "Judi Dench", + codename: "judi_dench", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:50.2320048Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Judi", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Dench", + }, + }, + }, + { + system: { + id: "d468218a-e7c8-44cc-84d3-acb37e9dc9ee", + name: "Julia Roberts", + codename: "julia_roberts", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:18.3193199Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Julia", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Roberts", + }, + }, + }, + { + system: { + id: "7296fa14-b4d8-4585-8347-ebfe70b798ec", + name: "Julianne Moore", + codename: "julianne_moore", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:02.956359Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Julianne", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Moore", + }, + }, + }, + { + system: { + id: "e90e44e2-91f0-4203-857f-fd3faafd025d", + name: "Kate Winslet", + codename: "kate_winslet", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:05.6830624Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Kate", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Winslet", + }, + }, + }, + { + system: { + id: "d92f4584-34e9-40c5-baba-ca5d0fdd0b9f", + name: "Keanu Reeves", + codename: "keanu_reeves", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:08.9297582Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Keanu", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Reeves", + }, + }, + }, + { + system: { + id: "d4e90b88-679d-4d99-8159-cc0f89228b59", + name: "Keira Knightley", + codename: "keira_knightley", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:53.277714Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Keira", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Knightley", + }, + }, + }, + { + system: { + id: "691f96df-d9c3-4d69-95d8-eeb0eb1c65f6", + name: "La La Land", + codename: "la_la_land", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:30.7299534Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "La La Land", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 128, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

A jazz musician and an aspiring actress fall in love while each pursuing their dreams in Los Angeles. A modern musical celebrating the timeless Hollywood tradition of dreamers and lovers.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2016-12-09T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Drama", + codename: "drama", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "la-la-land", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Damien Chazelle's La La Land won 6 Academy Awards and revived the Hollywood musical genre.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["ryan_gosling", "emma_stone"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "62de95fa-4468-405a-bf0b-b0b791bdf9ce", + name: "Leonardo DiCaprio", + codename: "leonardo_dicaprio", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:14.1998292Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Leonardo", + }, + lastname: { + type: "text", + name: "Lastname", + value: "DiCaprio", + }, + }, + }, + { + system: { + id: "2c71df49-6390-453f-b2dd-12467406b350", + name: "Lupita Nyong'o", + codename: "lupita_nyong_o", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:13.5243957Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Lupita", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Nyong'o", + }, + }, + }, + { + system: { + id: "1aaa04e0-c5e9-4295-bfba-5af17e3be575", + name: "Mads Mikkelsen", + codename: "mads_mikkelsen", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:09.6094973Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Mads", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Mikkelsen", + }, + }, + }, + { + system: { + id: "736bc909-0049-42d0-9c33-f272f1f15248", + name: "Mahershala Ali", + codename: "mahershala_ali", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:08.9792264Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Mahershala", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Ali", + }, + }, + }, + { + system: { + id: "9437d4dd-69d4-4ce3-a57f-64d8a4c1e1bb", + name: "Margot Robbie", + codename: "margot_robbie", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:52.4340963Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Margot", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Robbie", + }, + }, + }, + { + system: { + id: "fda6870f-c881-4271-ba2a-2cbf209573c4", + name: "Marion Cotillard", + codename: "marion_cotillard", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:54.4864003Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Marion", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Cotillard", + }, + }, + }, + { + system: { + id: "aee262cf-866c-4d5a-8eb3-889457b2151c", + name: "Matt Damon", + codename: "matt_damon", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:02.2760641Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Matt", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Damon", + }, + }, + }, + { + system: { + id: "1c8eba11-646b-4f80-bedf-e7d23a665966", + name: "Meryl Streep", + codename: "meryl_streep", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:13.7111314Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Meryl", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Streep", + }, + }, + }, + { + system: { + id: "973aa0fa-311a-45fd-9adf-0ffc3c7df75a", + name: "Michael B. Jordan", + codename: "michael_b__jordan", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:47.5846647Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Michael B.", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Jordan", + }, + }, + }, + { + system: { + id: "f801888e-147d-4509-ad86-252f7918ab7b", + name: "Michael Fassbender", + codename: "michael_fassbender", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:16.7654414Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Michael", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Fassbender", + }, + }, + }, + { + system: { + id: "71c28bd9-3fe4-47fb-af29-9c882fb0b623", + name: "Michelle Yeoh", + codename: "michelle_yeoh", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:51.6922888Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Michelle", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Yeoh", + }, + }, + }, + { + system: { + id: "6dddc4e0-1425-44b5-8b4c-00a9690a2f90", + name: "Morgan Freeman", + codename: "morgan_freeman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:21.5555586Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Morgan", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Freeman", + }, + }, + }, + { + system: { + id: "45d594c5-b251-4d3d-864d-c78a3d2c285b", + name: "Movie with empty rich text", + codename: "movie_with_empty_rich_text", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-10T10:23:44.1265574Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "Movie with empty rich text", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 0, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "


", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "no", + codename: "no", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2026-04-09T22:00:00Z", + display_timezone: "Europe/Budapest", + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Drama", + codename: "drama", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "movie-with-empty-rich-text", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["joker"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "218a80d2-6787-4086-9728-5c06170d92ef", + name: "Naomi Watts", + codename: "naomi_watts", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:55.0766398Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Naomi", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Watts", + }, + }, + }, + { + system: { + id: "090807a7-c5a1-4d42-8987-d820c06bb6a9", + name: "Natalie Portman", + codename: "natalie_portman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:26.8476502Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Natalie", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Portman", + }, + }, + }, + { + system: { + id: "08271858-e58e-401b-9aa9-c13a86a54fdb", + name: "Nicole Kidman", + codename: "nicole_kidman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:31.0302744Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Nicole", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Kidman", + }, + }, + }, + { + system: { + id: "0b83b3dc-1849-4a8b-8e7f-222b581a0fff", + name: "Nora Lum", + codename: "nora_lum", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:07.7026459Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Nora", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Lum", + }, + }, + }, + { + system: { + id: "f51a15db-f5f5-4c2c-98b3-1d3918bd672f", + name: "Oscar Isaac", + codename: "oscar_isaac", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:07.5328891Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Oscar", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Isaac", + }, + }, + }, + { + system: { + id: "e2bc46cd-a7ea-4cde-8d4e-b56e30708bca", + name: "Pedro Pascal", + codename: "pedro_pascal", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:04.4430733Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Pedro", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Pascal", + }, + }, + }, + { + system: { + id: "e285cba4-294f-44a5-b76e-088cf89371be", + name: "Penélope Cruz", + codename: "penelope_cruz", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:05.4809267Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Penélope", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Cruz", + }, + }, + }, + { + system: { + id: "76a5c1fc-46bc-4274-8a19-07e74a0c801e", + name: "Rachel McAdams", + codename: "rachel_mcadams", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:56.9474259Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Rachel", + }, + lastname: { + type: "text", + name: "Lastname", + value: "McAdams", + }, + }, + }, + { + system: { + id: "03ef6927-eb79-4be2-85fa-44a9f5d01ae8", + name: "Ralph Fiennes", + codename: "ralph_fiennes", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:50.9985727Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Ralph", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Fiennes", + }, + }, + }, + { + system: { + id: "e5b44b09-572e-4768-9856-9f44e5df70aa", + name: "Reese Witherspoon", + codename: "reese_witherspoon", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:10.1223156Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Reese", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Witherspoon", + }, + }, + }, + { + system: { + id: "fbb9eb43-1405-4884-94bb-6ef230b87a65", + name: "Regina King", + codename: "regina_king", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:09.8875628Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Regina", + }, + lastname: { + type: "text", + name: "Lastname", + value: "King", + }, + }, + }, + { + system: { + id: "46663b41-3619-484e-a1f9-6e4cc9ca3ab0", + name: "Robert De Niro", + codename: "robert_de_niro", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:19.593274Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Robert", + }, + lastname: { + type: "text", + name: "Lastname", + value: "De Niro", + }, + }, + }, + { + system: { + id: "bbc14c55-9d5b-4c75-a968-6e17799987a7", + name: "Robert Downey Jr.", + codename: "robert_downey_jr_", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:45.6740229Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Robert", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Downey Jr.", + }, + }, + }, + { + system: { + id: "4c0f7928-a8c1-4b70-b2bd-62dc85722570", + name: "Rooney Mara", + codename: "rooney_mara", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:54.64466Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Rooney", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Mara", + }, + }, + }, + { + system: { + id: "906326c7-9d66-432a-b49d-2728f48e3825", + name: "Russell Crowe", + codename: "russell_crowe", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:56.2128676Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Russell", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Crowe", + }, + }, + }, + { + system: { + id: "dee9a365-71ee-4f1f-a430-d98f93bfe817", + name: "Ryan Gosling", + codename: "ryan_gosling", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:04.4007354Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Ryan", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Gosling", + }, + }, + }, + { + system: { + id: "94baa269-30cd-42b0-b54b-7be65b61fe0c", + name: "Salma Hayek", + codename: "salma_hayek", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:24:04.2441153Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Salma", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Hayek", + }, + }, + }, + { + system: { + id: "4cc3ccd6-8fc4-403f-a816-9ed97d302f82", + name: "Samuel L. Jackson", + codename: "samuel_l__jackson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:53.7929068Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Samuel L.", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Jackson", + }, + }, + }, + { + system: { + id: "5409a321-144d-44b5-847e-4cfdab10a68b", + name: "Sandra Bullock", + codename: "sandra_bullock", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:24.8943758Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Sandra", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Bullock", + }, + }, + }, + { + system: { + id: "cb58900c-56fa-4331-a2d2-89d708c580ad", + name: "Saoirse Ronan", + codename: "saoirse_ronan", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:50.4309368Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Saoirse", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Ronan", + }, + }, + }, + { + system: { + id: "70c23859-845e-40d6-86f7-2c1865ff828d", + name: "Scarlett Johansson", + codename: "scarlett_johansson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:20.2541643Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Scarlett", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Johansson", + }, + }, + }, + { + system: { + id: "3b8c25d3-fabe-4451-b0c1-c5b95ba15579", + name: "Sigourney Weaver", + codename: "sigourney_weaver", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:57.743072Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Sigourney", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Weaver", + }, + }, + }, + { + system: { + id: "21586dc9-9c04-4c9e-a9e4-83b8cd65baef", + name: "The Dark Knight", + codename: "the_dark_knight", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:36:42.4587906Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + title: { + type: "text", + name: "Title", + value: "The Dark Knight", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 152, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, he sets out to dismantle the remaining criminal organizations that plague Gotham City. But the emergence of the Joker creates chaos.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2008-07-18T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [ + { + name: "The_Dark_Knight_(2008_film).jpg", + description: null, + type: "image/jpeg", + size: 52188, + url: "https://assets-eu-01.kc-usercontent.com:443/6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b/1ee1e759-4af3-4f0a-acfc-b61a88c1eafe/The_Dark_Knight_%282008_film%29.jpg", + width: 259, + height: 383, + renditions: {}, + }, + ], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "the-dark-knight", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Christopher Nolan's The Dark Knight is widely regarded as one of the greatest superhero films ever made.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["christian_bale", "gary_oldman"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + ], + modular_content: {}, +} satisfies ItemsFeedPayload; diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts new file mode 100644 index 00000000..4d3ed416 --- /dev/null +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -0,0 +1,14 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ItemsFeedPayload, itemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./items-feed-query.payload.js"; + +describe("Items feed query", async () => { + await runQueryTestsAsync>({ + endpoint: "items-feed", + unitTestPayload, + selectQuery: (client) => client.itemsFeed(), + expectedSchema: itemsFeedPayload(getIntegrationTestsSchema()), + }); +}); From ee2f3acb7fc3a80c74917027042e340d5b1e285a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 13 Apr 2026 12:09:09 +0200 Subject: [PATCH 096/221] Prepares items referencing asset query --- lib/client/delivery-client.ts | 5 ++ lib/models/core.models.ts | 5 ++ lib/models/request.models.ts | 12 +++- lib/public_api.ts | 7 ++- .../content-items/content-item.models.ts | 60 ++++++++++--------- lib/queries/content-items/items-feed-query.ts | 17 ++---- .../items-referencing-asset-query.ts | 27 +++++++++ .../content-items/list-content-items-query.ts | 4 +- .../content-types/list-content-types-query.ts | 4 +- lib/queries/languages/list-languages-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 4 +- .../items-referencing-asset-query.spec.ts | 18 ++++++ .../itesm-referencing-asset-query.payload.ts | 20 +++++++ 13 files changed, 137 insertions(+), 50 deletions(-) create mode 100644 lib/queries/content-items/items-referencing-asset-query.ts create mode 100644 tests/integration/queries/content-items/items-referencing-asset-query.spec.ts create mode 100644 tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 5c357d69..7003f7ef 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,6 +1,10 @@ import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientSchema } from "../models/core.models.js"; import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; import { type ItemsFeedQueryRequest, itemsFeedQuery } from "../queries/content-items/items-feed-query.js"; +import { + type ItemsReferencingAssetQueryRequest, + itemsReferencingAssetQuery, +} from "../queries/content-items/items-referencing-asset-query.js"; import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { type FetchContentTypeElementQueryRequest, @@ -52,5 +56,6 @@ export function createDeliveryClient) => fetchContentItemQuery(config, request), listContentItems: (request?: ListContentItemsQueryRequest) => listContentItemsQuery(config, request), itemsFeed: (request?: ItemsFeedQueryRequest) => itemsFeedQuery(config, request), + itemsReferencingAsset: (request: ItemsReferencingAssetQueryRequest) => itemsReferencingAssetQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index efcb9fd2..fed5e817 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -1,6 +1,10 @@ import type { FetchQuery, JsonValue, PagedFetchQuery, PickStringLiteral, SdkConfig } from "@kontent-ai/core-sdk"; import type { FetchContentItemQuery, FetchContentItemQueryRequest } from "../queries/content-items/fetch-content-item-query.js"; import type { ItemsFeedQuery, ItemsFeedQueryRequest } from "../queries/content-items/items-feed-query.js"; +import type { + ItemsReferencingAssetQuery, + ItemsReferencingAssetQueryRequest, +} from "../queries/content-items/items-referencing-asset-query.js"; import type { ListContentItemsQuery, ListContentItemsQueryRequest } from "../queries/content-items/list-content-items-query.js"; import type { FetchContentTypeElementQuery, @@ -72,6 +76,7 @@ export type DeliveryClient): FetchContentItemQuery; listContentItems(request?: ListContentItemsQueryRequest): ListContentItemsQuery; itemsFeed(request?: ItemsFeedQueryRequest): ItemsFeedQuery; + itemsReferencingAsset(request: ItemsReferencingAssetQueryRequest): ItemsReferencingAssetQuery; }; export type DeliveryFetchQuery = FetchQuery; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index dcf77000..5f06fa6d 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -6,18 +6,28 @@ export type DeliveryRequest = { }; export type QueryParameterRecord = Record; +export type HeaderParameterRecord = Record; -export type PagingDeliveryRequest = DeliveryRequest & +export type PagingByUrlDeliveryRequest = DeliveryRequest & QueryParameters<{ readonly skip?: number; readonly limit?: number; readonly order?: TSortableProperties; }>; +export type PagingByTokenDeliveryRequest = DeliveryRequest & + HeaderParameters<{ + readonly continuationToken?: string; + }>; + export type QueryRequestWithCodename = { readonly codename: TCodenames[number]; }; +export type HeaderParameters = { + readonly headers?: TParameters; +}; + export type QueryParameters = { readonly query?: TParameters; }; diff --git a/lib/public_api.ts b/lib/public_api.ts index 4dd7cce6..8fae4c8f 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -17,13 +17,16 @@ export { type ContentItemElementPayload, type ContentItemPayload, type ContentItemSystemPayload, - type ContentItemSystemSortableProperty, - contentItemWithSystemSchema, elementSchemas, type FetchContentItemPayload, + type ItemsReferencingAssetPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; +export type { + ItemsReferencingAssetQuery, + ItemsReferencingAssetQueryRequest, +} from "./queries/content-items/items-referencing-asset-query.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; // Content Types export { diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 9acd57e4..05f6cce3 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -154,30 +154,31 @@ const contentItemElementSchema = z ]) .readonly(); +const contentItemSystemSchemaBase = (schema: TSchema | undefined) => + z.object({ + id: kontentUuidSchema, + name: z.string(), + codename: getCodenameSchema(schema?.contentTypeCodenames), + language: getCodenameSchema(schema?.languageCodenames), + type: getCodenameSchema(schema?.contentTypeCodenames), + collection: getCodenameSchema(schema?.collectionCodenames), + last_modified: z.iso.datetime(), + workflow: getCodenameSchema(schema?.workflowCodenames), + workflow_step: getCodenameSchema(schema?.workflowStepCodenames), + }); + export const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ - id: kontentUuidSchema, - name: z.string(), - codename: getCodenameSchema(schema?.contentTypeCodenames), - language: getCodenameSchema(schema?.languageCodenames), - type: getCodenameSchema(schema?.contentTypeCodenames), - collection: getCodenameSchema(schema?.collectionCodenames), + ...contentItemSystemSchemaBase(schema).shape, sitemap_locations: z.array(z.string()).readonly(), - last_modified: z.iso.datetime(), - workflow: getCodenameSchema(schema?.workflowCodenames), - workflow_step: getCodenameSchema(schema?.workflowStepCodenames), }) .readonly(); -export const contentItemWithSystemSchema = (schema: TSchema | undefined) => - z.object({ - system: contentItemSystemSchema(schema), - }); - export const contentItemSchema = (schema: TSchema | undefined) => - contentItemWithSystemSchema(schema) - .extend({ + z + .object({ + system: contentItemSystemSchema(schema), elements: z.optional( z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema), ), @@ -201,6 +202,19 @@ export const itemsFeedPayload = (schema: T }) .readonly(); +export const itemsReferencingAssetPayload = (schema: TSchema | undefined) => + z + .object({ + items: z + .array( + z.object({ + system: contentItemSystemSchemaBase(schema), + }), + ) + .readonly(), + }) + .readonly(); + export const fetchContentItemPayload = (schema: TSchema | undefined) => z .object({ @@ -209,20 +223,12 @@ export const fetchContentItemPayload = (sc }) .readonly(); -export type ContentItemSystemSortableProperty = - | "id" - | "name" - | "codename" - | "language" - | "type" - | "collection" - | "last_modified" - | "workflow" - | "workflow_step"; - export type ContentItemSystemPayload = z.infer>>; export type ContentItemElementPayload = z.infer; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; export type ItemsFeedPayload = z.infer>>; +export type ItemsReferencingAssetPayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index d5e04b95..51045dec 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -1,8 +1,8 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { + DeliveryRequest, ElementOrderQueryParam, ElementSelectionQueryParam, - PagingDeliveryRequest, QueryFilters, QueryParameters, SystemOrderQueryParam, @@ -12,12 +12,12 @@ import { type ContentItemPayload, type ContentItemSystemPayload, type ItemsFeedP export type ItemsFeedQuery = DeliveryPagedFetchQuery>; -export type ItemsFeedQueryRequest = PagingDeliveryRequest< - | SystemOrderQueryParam["system"]> - | ElementOrderQueryParam[number]> -> & +export type ItemsFeedQueryRequest = DeliveryRequest & QueryFilters, NonNullable[number]> & QueryParameters<{ + readonly order?: + | SystemOrderQueryParam["system"]> + | ElementOrderQueryParam[number]>; /** * Determines which language variant of content items to return. By default, the API returns content in the default language. */ @@ -40,13 +40,6 @@ export type ItemsFeedQueryRequest = Paging * To exclude all linked items from the response, set depth to 0. */ readonly depth?: number; - - /** - * Adds the information about the total number of content items matching your query. - * Only the content filtering parameters affect the resulting number. - * Other parameters in your query, such as limit, skip, or order, don't have an effect on it. - */ - readonly includeTotalCount?: boolean; }>; export function itemsFeedQuery( diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts new file mode 100644 index 00000000..c18332ec --- /dev/null +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -0,0 +1,27 @@ +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { PagingByTokenDeliveryRequest, QueryFilters } from "../../models/request.models.js"; +import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; +import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetPayload } from "./content-item.models.js"; + +export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< + ItemsReferencingAssetPayload +>; + +export type ItemsReferencingAssetQueryRequest = PagingByTokenDeliveryRequest & { + /** + * Codename of the asset to retrieve referencing content items for. + */ + readonly codename: string; +} & QueryFilters, never>; + +export function itemsReferencingAssetQuery( + config: DeliveryClientConfig, + request: ItemsReferencingAssetQueryRequest, +): ItemsReferencingAssetQuery { + return createDeliveryPagingByTokenQuery({ + config, + request, + schema: itemsReferencingAssetPayload(config.schema), + endpoint: `assets/${request.codename}/used-in`, + }); +} diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index d0cd1c06..ab3b98f9 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { ElementOrderQueryParam, ElementSelectionQueryParam, - PagingDeliveryRequest, + PagingByUrlDeliveryRequest, QueryFilters, QueryParameters, SystemOrderQueryParam, @@ -17,7 +17,7 @@ import { export type ListContentItemsQuery = DeliveryPagedFetchQuery>; -export type ListContentItemsQueryRequest = PagingDeliveryRequest< +export type ListContentItemsQueryRequest = PagingByUrlDeliveryRequest< | SystemOrderQueryParam["system"]> | ElementOrderQueryParam[number]> > & diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 29fc0326..0c420d87 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { ElementSelectionQueryParam, - PagingDeliveryRequest, + PagingByUrlDeliveryRequest, QueryFilters, QueryParameters, SystemOrderQueryParam, @@ -11,7 +11,7 @@ import { type ContentTypePayload, type ListContentTypesPayload, listContentTypes export type ListContentTypesQuery = DeliveryPagedFetchQuery>; -export type ListContentTypesQueryRequest = PagingDeliveryRequest< +export type ListContentTypesQueryRequest = PagingByUrlDeliveryRequest< SystemOrderQueryParam["system"]> > & QueryFilters["system"], never> & diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 5e660e2f..38f72afd 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,11 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingByUrlDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; -export type ListLanguagesQueryRequest = PagingDeliveryRequest< +export type ListLanguagesQueryRequest = PagingByUrlDeliveryRequest< SystemOrderQueryParam["system"]> > & QueryFilters["system"], never>; diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 1275306e..67b89733 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,11 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { PagingByUrlDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; -export type ListTaxonomiesQueryRequest = PagingDeliveryRequest< +export type ListTaxonomiesQueryRequest = PagingByUrlDeliveryRequest< SystemOrderQueryParam["system"]> > & QueryFilters["system"], never>; diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts new file mode 100644 index 00000000..cabfb2e7 --- /dev/null +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -0,0 +1,18 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { + type ItemsReferencingAssetPayload, + itemsReferencingAssetPayload, +} from "../../../../lib/queries/content-items/content-item.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; + +describe("Items referencing asset query", async () => { + const assetCodename = "the_dark_knight__2008_film__jpg"; + await runQueryTestsAsync>({ + endpoint: `assets/${assetCodename}/used-in`, + unitTestPayload, + selectQuery: (client) => client.itemsReferencingAsset({ codename: assetCodename }), + expectedSchema: itemsReferencingAssetPayload(getIntegrationTestsSchema()), + }); +}); diff --git a/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts b/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts new file mode 100644 index 00000000..66481ae8 --- /dev/null +++ b/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts @@ -0,0 +1,20 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/content-item.models.js"; + +export default { + items: [ + { + system: { + id: "21586dc9-9c04-4c9e-a9e4-83b8cd65baef", + name: "The Dark Knight", + codename: "the_dark_knight", + language: "default", + type: "movie", + collection: "default", + workflow: "default", + workflow_step: "published", + last_modified: "2026-04-07T10:36:42.4587906Z", + }, + }, + ], +} satisfies ItemsReferencingAssetPayload; From f036786c3a4794668dfd5e90cb20617649bdaeb6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 21 Apr 2026 09:42:47 +0200 Subject: [PATCH 097/221] Updates deps --- lib/models/core.models.ts | 6 +- lib/queries/delivery-queries.ts | 58 ++- package.json | 14 +- pnpm-lock.yaml | 367 +++++++++--------- .../delivery-query/delivery-queries.spec.ts | 233 +++++++++++ tests/unit/queries/query-parameters.spec.ts | 48 ++- .../validation/validation-properties.spec.ts | 2 +- 7 files changed, 508 insertions(+), 220 deletions(-) create mode 100644 tests/unit/delivery-query/delivery-queries.spec.ts diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index fed5e817..c9eeb906 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -37,6 +37,8 @@ export type DeliveryClientSchema = SdkConfig & @@ -79,9 +81,9 @@ export type DeliveryClient): ItemsReferencingAssetQuery; }; -export type DeliveryFetchQuery = FetchQuery; +export type DeliveryFetchQuery = FetchQuery; -export type DeliveryPagedFetchQuery = PagedFetchQuery; +export type DeliveryPagedFetchQuery = PagedFetchQuery; export type DeliveryEndpoints = | "languages" diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 0703fd87..df6f1649 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -9,11 +9,18 @@ import { } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints } from "../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, DeliveryMetadata } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { DeliveryRequest, QueryFilters, QueryParameterRecord, QueryParameters } from "../models/request.models.js"; +import type { + DeliveryRequest, + HeaderParameterRecord, + HeaderParameters, + QueryFilters, + QueryParameterRecord, + QueryParameters, +} from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; @@ -28,8 +35,8 @@ export function createDeliveryPagingByUrlQuery; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), }); @@ -45,8 +52,8 @@ export function createDeliveryPagingByTokenQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByContinuationToken(), }); @@ -62,8 +69,8 @@ export function createDeliveryFetchQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; -}): FetchQuery { - return createFetchQuery( +}): FetchQuery { + return createFetchQuery( getSharedRequestData({ config, endpoint, schema: schema, request }), ); } @@ -79,23 +86,25 @@ function getSharedRequestData({ readonly endpoint: DeliveryEndpoints; readonly schema: ZodType; }): Pick< - FetchQueryRequest, - "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "request" | "zodSchema" | "mapError" + FetchQueryRequest, + "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "authorizationApiKey" | "url" | "requestHeaders" | "zodSchema" | "mapError" > { return { abortSignal: undefined, config, sdkInfo: deliverySdkInfo, mapMetadata: () => { - return null; + return {}; }, - request: getRequestData({ config, endpoint, request }), + requestHeaders: getHeaders(request), + url: getUrl({ request, config, endpoint }), + authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, zodSchema: schema, mapError: mapDeliveryError, }; } -function getRequestData({ +function getUrl({ request, config, endpoint, @@ -103,12 +112,8 @@ function getRequestData({ readonly request: DeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; -}): FetchQueryRequest["request"] { - return { - requestHeaders: getHeaders(request), - url: addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request), getFilters(request)), - authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, - }; +}): string { + return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request), getFilters(request)); } function getFilters(request: DeliveryRequest | undefined): readonly Filter[] | undefined { @@ -128,10 +133,17 @@ function getQueryParameters(request: DeliveryRequest | undefined): QueryParamete } function getHeaders(request?: DeliveryRequest): readonly Header[] { - if (!request?.config) { + if (!request || !isQueryWithHeaders(request)) { return []; } - return [...(request.config?.headers ?? []), ...(request.config.bypassCdnCache ? [getBypassCdnCacheHeader()] : [])]; + + const configHeaders: readonly Header[] = request.config?.headers ?? []; + const requestHeaders: readonly Header[] = Object.entries(request.headers ?? {}).map
(([name, value]) => ({ + name, + value: value.toString(), + })); + + return [...configHeaders, ...requestHeaders, ...(request.config?.bypassCdnCache ? [getBypassCdnCacheHeader()] : [])]; } function getBypassCdnCacheHeader(): Header { @@ -145,3 +157,7 @@ function isQueryWithParameters(request: DeliveryRequest): request is DeliveryReq function isQueryWithFilters(request: DeliveryRequest): request is DeliveryRequest & QueryFilters { return ("filters" satisfies keyof QueryFilters) in request; } + +function isQueryWithHeaders(request: DeliveryRequest): request is DeliveryRequest & HeaderParameters { + return ("headers" satisfies keyof HeaderParameters) in request; +} diff --git a/package.json b/package.json index f04e39db..f529bba8 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,19 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.24", + "@kontent-ai/core-sdk": "^12.0.0-preview.25", "ts-pattern": "^5", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.2.0", - "@biomejs/biome": "2.4.10", - "@types/node": "25.5.2", - "typescript": "6.0.2", - "vitest": "4.1.2", - "@vitest/coverage-v8": "4.1.2", + "eslint": "10.2.1", + "@biomejs/biome": "2.4.12", + "@types/node": "25.6.0", + "typescript": "6.0.3", + "vitest": "4.1.4", + "@vitest/coverage-v8": "4.1.4", "tsx": "4.21.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 87da92f8..9077b6f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.24 - version: 12.0.0-preview.24(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.25 + version: 12.0.0-preview.25(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -19,32 +19,32 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.4.10 - version: 2.4.10 + specifier: 2.4.12 + version: 2.4.12 '@kontent-ai/biome-config': specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.10) + version: 0.7.0(@biomejs/biome@2.4.12) '@kontent-ai/eslint-config': specifier: 2.4.1 - version: 2.4.1(typescript@6.0.2) + version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.5.2 - version: 25.5.2 + specifier: 25.6.0 + version: 25.6.0 '@vitest/coverage-v8': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0))) + specifier: 4.1.4 + version: 4.1.4(vitest@4.1.4) eslint: - specifier: 10.2.0 - version: 10.2.0 + specifier: 10.2.1 + version: 10.2.1 tsx: specifier: 4.21.0 version: 4.21.0 typescript: - specifier: 6.0.2 - version: 6.0.2 + specifier: 6.0.3 + version: 6.0.3 vitest: - specifier: 4.1.2 - version: 4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) + specifier: 4.1.4 + version: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) packages: @@ -69,59 +69,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.10': - resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} + '@biomejs/biome@2.4.12': + resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.10': - resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==} + '@biomejs/cli-darwin-arm64@2.4.12': + resolution: {integrity: sha512-BnMU4Pc3ciEVteVpZ0BK33MLr7X57F5w1dwDLDn+/iy/yTrA4Q/N2yftidFtsA4vrDh0FMXDpacNV/Tl3fbmng==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.10': - resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==} + '@biomejs/cli-darwin-x64@2.4.12': + resolution: {integrity: sha512-x9uJ0bI1rJsWICp3VH8w/5PnAVD3A7SqzDpbrfoUQX1QyWrK5jSU4fRLo/wSgGeplCivbxBRKmt5Xq4/nWvq8A==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.10': - resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==} + '@biomejs/cli-linux-arm64-musl@2.4.12': + resolution: {integrity: sha512-FhfpkAAlKL6kwvcVap0Hgp4AhZmtd3YImg0kK1jd7C/aSoh4SfsB2f++yG1rU0lr8Y5MCFJrcSkmssiL9Xnnig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.10': - resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} + '@biomejs/cli-linux-arm64@2.4.12': + resolution: {integrity: sha512-tOwuCuZZtKi1jVzbk/5nXmIsziOB6yqN8c9r9QM0EJYPU6DpQWf11uBOSCfFKKM4H3d9ZoarvlgMfbcuD051Pw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.10': - resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} + '@biomejs/cli-linux-x64-musl@2.4.12': + resolution: {integrity: sha512-dwTIgZrGutzhkQCuvHynCkyW6hJxUuyZqKKO0YNfaS2GUoRO+tOvxXZqZB6SkWAOdfZTzwaw8IEdUnIkHKHoew==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.10': - resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} + '@biomejs/cli-linux-x64@2.4.12': + resolution: {integrity: sha512-8pFeAnLU9QdW9jCIslB/v82bI0lhBmz2ZAKc8pVMFPO0t0wAHsoEkrUQUbMkIorTRIjbqyNZHA3lEXavsPWYSw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.10': - resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} + '@biomejs/cli-win32-arm64@2.4.12': + resolution: {integrity: sha512-B0DLnx0vA9ya/3v7XyCaP+/lCpnbWbMOfUFFve+xb5OxyYvdHaS55YsSddr228Y+JAFk58agCuZTsqNiw2a6ig==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.10': - resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==} + '@biomejs/cli-win32-x64@2.4.12': + resolution: {integrity: sha512-yMckRzTyZ83hkk8iDFWswqSdU8tvZxspJKnYNh7JZr/zhZNOlzH13k4ecboU6MurKExCe2HUkH75pGI/O2JwGA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -305,24 +305,24 @@ packages: resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-array@0.23.4': - resolution: {integrity: sha512-lf19F24LSMfF8weXvW5QEtnLqW70u7kgit5e9PSx0MsHAFclGd1T9ynvWEMDT1w5J4Qt54tomGeAhdoAku1Xow==} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/config-helpers@0.4.2': resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.4': - resolution: {integrity: sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.2.0': - resolution: {integrity: sha512-8FTGbNzTvmSlc4cZBaShkC6YvFMG0riksYWRFKXztqVdXaQbcZLXlFbSpC05s70sGEsXAw0qwhx69JiW7hQS7A==} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/eslintrc@3.3.5': @@ -337,16 +337,16 @@ packages: resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.4': - resolution: {integrity: sha512-55lO/7+Yp0ISKRP0PsPtNTeNGapXaO085aELZmWCVc5SH3jfrqpuU6YgOdIxMS99ZHkQN1cXKE+cdIqwww9ptw==} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/plugin-kit@0.4.1': resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.7.0': - resolution: {integrity: sha512-ejvBr8MQCbVsWNZnCwDXjUKq40MDmHalq7cJ6e9s/qzTUFIIo/afzt1Vui9T97FM/V/pN4YsFVoed5NIa96RDg==} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.1': @@ -380,8 +380,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.24': - resolution: {integrity: sha512-E3EfP/cMv2tnSrZeNwJItBjZp7J3q8SN6PrP/tnZlwOAzoJy2TdxTPkXx330kL2ccQdBMiUbDnI/WlEDNgbt2g==} + '@kontent-ai/core-sdk@12.0.0-preview.25': + resolution: {integrity: sha512-Ru1RrHZYmMwJCvK9Iz5Ccih/0ps0HSosFlEfzjG1sw8zgrr9wxMAp2HpvrD8R7aLTZehnIJdeLYONgSkl3RueQ==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -518,8 +518,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.5.2': - resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@typescript-eslint/eslint-plugin@8.58.0': resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} @@ -580,20 +580,20 @@ packages: resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.1.2': - resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} + '@vitest/coverage-v8@4.1.4': + resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} peerDependencies: - '@vitest/browser': 4.1.2 - vitest: 4.1.2 + '@vitest/browser': 4.1.4 + vitest: 4.1.4 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} + '@vitest/expect@4.1.4': + resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} + '@vitest/mocker@4.1.4': + resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -603,20 +603,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + '@vitest/pretty-format@4.1.4': + resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} + '@vitest/runner@4.1.4': + resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} + '@vitest/snapshot@4.1.4': + resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} + '@vitest/spy@4.1.4': + resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + '@vitest/utils@4.1.4': + resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -850,8 +850,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.2.1: + resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1583,8 +1583,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -1592,8 +1592,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1641,18 +1641,20 @@ packages: yaml: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} + vitest@4.1.4: + resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 + '@vitest/browser-playwright': 4.1.4 + '@vitest/browser-preview': 4.1.4 + '@vitest/browser-webdriverio': 4.1.4 + '@vitest/coverage-istanbul': 4.1.4 + '@vitest/coverage-v8': 4.1.4 + '@vitest/ui': 4.1.4 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1669,6 +1671,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -1730,39 +1736,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.10': + '@biomejs/biome@2.4.12': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.10 - '@biomejs/cli-darwin-x64': 2.4.10 - '@biomejs/cli-linux-arm64': 2.4.10 - '@biomejs/cli-linux-arm64-musl': 2.4.10 - '@biomejs/cli-linux-x64': 2.4.10 - '@biomejs/cli-linux-x64-musl': 2.4.10 - '@biomejs/cli-win32-arm64': 2.4.10 - '@biomejs/cli-win32-x64': 2.4.10 + '@biomejs/cli-darwin-arm64': 2.4.12 + '@biomejs/cli-darwin-x64': 2.4.12 + '@biomejs/cli-linux-arm64': 2.4.12 + '@biomejs/cli-linux-arm64-musl': 2.4.12 + '@biomejs/cli-linux-x64': 2.4.12 + '@biomejs/cli-linux-x64-musl': 2.4.12 + '@biomejs/cli-win32-arm64': 2.4.12 + '@biomejs/cli-win32-x64': 2.4.12 - '@biomejs/cli-darwin-arm64@2.4.10': + '@biomejs/cli-darwin-arm64@2.4.12': optional: true - '@biomejs/cli-darwin-x64@2.4.10': + '@biomejs/cli-darwin-x64@2.4.12': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.10': + '@biomejs/cli-linux-arm64-musl@2.4.12': optional: true - '@biomejs/cli-linux-arm64@2.4.10': + '@biomejs/cli-linux-arm64@2.4.12': optional: true - '@biomejs/cli-linux-x64-musl@2.4.10': + '@biomejs/cli-linux-x64-musl@2.4.12': optional: true - '@biomejs/cli-linux-x64@2.4.10': + '@biomejs/cli-linux-x64@2.4.12': optional: true - '@biomejs/cli-win32-arm64@2.4.10': + '@biomejs/cli-win32-arm64@2.4.12': optional: true - '@biomejs/cli-win32-x64@2.4.10': + '@biomejs/cli-win32-x64@2.4.12': optional: true '@emnapi/core@1.9.1': @@ -1859,9 +1865,9 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': dependencies: - eslint: 10.2.0 + eslint: 10.2.1 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -1879,9 +1885,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-array@0.23.4': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 3.0.4 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 minimatch: 10.2.5 transitivePeerDependencies: @@ -1891,15 +1897,15 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/config-helpers@0.5.4': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 1.2.0 + '@eslint/core': 1.2.1 '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@1.2.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 @@ -1921,16 +1927,16 @@ snapshots: '@eslint/object-schema@2.1.7': {} - '@eslint/object-schema@3.0.4': {} + '@eslint/object-schema@3.0.5': {} '@eslint/plugin-kit@0.4.1': dependencies: '@eslint/core': 0.17.0 levn: 0.4.1 - '@eslint/plugin-kit@0.7.0': + '@eslint/plugin-kit@0.7.1': dependencies: - '@eslint/core': 1.2.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -1953,19 +1959,19 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.10)': + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.12)': dependencies: - '@biomejs/biome': 2.4.10 + '@biomejs/biome': 2.4.12 - '@kontent-ai/core-sdk@12.0.0-preview.24(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.25(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 - '@kontent-ai/eslint-config@2.4.1(typescript@6.0.2)': + '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.1)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2054,44 +2060,44 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.5.2': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0)(typescript@6.0.2))(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.1)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.0 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.0 '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 eslint: 9.39.4 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.0(typescript@6.0.2)': + '@typescript-eslint/project-service@8.58.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.3) '@typescript-eslint/types': 8.58.0 debug: 4.4.3 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2100,47 +2106,47 @@ snapshots: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 - '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.58.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.0(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) + '@typescript-eslint/project-service': 8.58.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.3) '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.0(eslint@9.39.4)(typescript@6.0.2)': + '@typescript-eslint/utils@8.58.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.58.0 '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) eslint: 9.39.4 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2149,10 +2155,10 @@ snapshots: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)))': + '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.4 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2161,46 +2167,46 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) + vitest: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) - '@vitest/expect@4.1.2': + '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0))': + '@vitest/mocker@4.1.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0))': dependencies: - '@vitest/spy': 4.1.2 + '@vitest/spy': 4.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0) - '@vitest/pretty-format@4.1.2': + '@vitest/pretty-format@4.1.4': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.2': + '@vitest/runner@4.1.4': dependencies: - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.4 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': + '@vitest/snapshot@4.1.4': dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/pretty-format': 4.1.4 + '@vitest/utils': 4.1.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.2': {} + '@vitest/spy@4.1.4': {} - '@vitest/utils@4.1.2': + '@vitest/utils@4.1.4': dependencies: - '@vitest/pretty-format': 4.1.2 + '@vitest/pretty-format': 4.1.4 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2572,14 +2578,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0: + eslint@10.2.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.4 - '@eslint/config-helpers': 0.5.4 - '@eslint/core': 1.2.0 - '@eslint/plugin-kit': 0.7.0 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -3373,9 +3379,9 @@ snapshots: tinyrainbow@3.1.0: {} - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 ts-pattern@5.9.0: {} @@ -3426,7 +3432,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@6.0.2: {} + typescript@6.0.3: {} unbox-primitive@1.1.0: dependencies: @@ -3435,13 +3441,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.18.2: {} + undici-types@7.19.2: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0): + vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3449,7 +3455,7 @@ snapshots: rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 esbuild: 0.27.4 fsevents: 2.3.3 tsx: 4.21.0 @@ -3457,15 +3463,15 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)): + vitest@4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)): dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/expect': 4.1.4 + '@vitest/mocker': 4.1.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.4 + '@vitest/runner': 4.1.4 + '@vitest/snapshot': 4.1.4 + '@vitest/spy': 4.1.4 + '@vitest/utils': 4.1.4 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3477,10 +3483,11 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.2)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 + '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) transitivePeerDependencies: - msw diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts new file mode 100644 index 00000000..36165671 --- /dev/null +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -0,0 +1,233 @@ +import type { JsonValue } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import { type ZodType, z } from "zod"; +import type { DeliveryClientConfig, FullDeliveryClientSchema } from "../../../lib/models/core.models.js"; +import { paginationSchema } from "../../../lib/models/pagination.models.js"; +import type { DeliveryRequest, QueryFilters, QueryParameters } from "../../../lib/models/request.models.js"; +import { + createDeliveryFetchQuery, + createDeliveryPagingByTokenQuery, + createDeliveryPagingByUrlQuery, +} from "../../../lib/queries/delivery-queries.js"; +import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; +import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; + +const clientConfig: DeliveryClientConfig = { + apiMode: "public", + environmentId: unitEnvironmentId, +}; + +const testSchema: ZodType = z.object({}); + +describe("createDeliveryFetchQuery", () => { + it("returns a query with FetchQuery shape", () => { + const query = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items/my_item"; + const query = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint, + }); + expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + }); + + it("URL has no query string when request is undefined", () => { + const query = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const query = createDeliveryFetchQuery({ + config: clientConfig, + request: {}, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest & QueryParameters<{ readonly language: string; readonly depth: number }> = { + query: { language: "en-us", depth: 2 }, + }; + const query = createDeliveryFetchQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items/my_item", + }); + const params = new URL(query.url).searchParams; + expect(params.get("language")).toBe(request.query?.language); + expect(params.get("depth")).toBe(request.query?.depth.toString()); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest & QueryFilters = { + filters: [{ property: "system.type", operator: "eq", value: "article" }], + }; + const query = createDeliveryFetchQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(query.url).toContain(new URLSearchParams("system.type[eq]=article").toString()); + }); +}); + +describe("createDeliveryPagingByUrlQuery", () => { + it("returns a query with PagedFetchQuery shape", () => { + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }); + expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items" as const; + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint, + }); + expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + }); + + it("URL has no query string when request is undefined", () => { + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const request: DeliveryRequest = {}; + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest & QueryParameters<{ readonly skip: number; readonly limit: number }> = { + query: { skip: 10, limit: 5 }, + }; + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + const params = new URL(query.url).searchParams; + expect(params.get("skip")).toBe("10"); + expect(params.get("limit")).toBe("5"); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest & QueryFilters = { + filters: [{ property: "system.type", operator: "eq", value: "movie" }], + }; + const query = createDeliveryPagingByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + expect(query.url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); + }); +}); + +describe("createDeliveryPagingByTokenQuery", () => { + it("returns a query with PagedFetchQuery shape", () => { + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }); + expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items-feed" as const; + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint, + }); + expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + }); + + it("URL has no query string when request is undefined", () => { + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const request: DeliveryRequest = {}; + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(query.url).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest & QueryParameters<{ readonly language: string }> = { + query: { language: "en-us" }, + }; + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(new URL(query.url).searchParams.get("language")).toBe("en-us"); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest & QueryFilters = { + filters: [{ property: "system.type", operator: "eq", value: "blog" }], + }; + const query = createDeliveryPagingByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(query.url).toContain(new URLSearchParams("system.type[eq]=blog").toString()); + }); +}); diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 374b9ad5..34d3ef07 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -11,6 +11,17 @@ describe("Query parameters", () => { }); it("Paging parameters should be added to the url", () => { + const testQuery: DeliveryPagedFetchQuery = client.listLanguages({ + query: { + order: "system.name[asc]", + skip: 5, + limit: 10, + }, + }); + + void testQuery; + const fefefe: DeliveryPagedFetchQuery[] = [testQuery]; + const listingQueries: readonly DeliveryPagedFetchQuery[] = [ client.listLanguages({ query: { @@ -33,25 +44,44 @@ describe("Query parameters", () => { limit: 10, }, }), + client.listContentItems({ + query: { + order: "system.name[asc]", + skip: 5, + limit: 10, + }, + }), ]; - for (const query of listingQueries) { - const { url } = query; - const parsedUrl = new URL(url); - expect(parsedUrl.searchParams.get("skip")).toStrictEqual("5"); - expect(parsedUrl.searchParams.get("limit")).toStrictEqual("10"); - expect(parsedUrl.searchParams.get("order")).toStrictEqual("system.name[asc]"); + for (const { getQueryData } of listingQueries) { + const { success, data, error } = getQueryData(); + + if (!success) { + throw new Error(`Failed to get query data: ${error}`); + } + + const { url } = data; + expect(url.searchParams.get("skip")).toStrictEqual("5"); + expect(url.searchParams.get("limit")).toStrictEqual("10"); + expect(url.searchParams.get("order")).toStrictEqual("system.name[asc]"); } }); it("Elements query parameter should be added as a comma-separated list in the url", () => { - const { url } = client.listContentTypes({ + const { getQueryData } = client.listContentTypes({ query: { elements: ["x", "y", "z"], }, }); - const parsedUrl = new URL(url); - expect(parsedUrl.searchParams.get("elements")).toStrictEqual("x,y,z"); + const { success, data, error } = getQueryData(); + + if (!success) { + throw new Error(`Failed to get query data: ${error}`); + } + + const { url } = data; + + expect(url.searchParams.get("elements")).toStrictEqual("x,y,z"); }); }); diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index 38a28709..f73e411e 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -37,7 +37,7 @@ describe("Response validation", () => { expect(error?.details.reason).toStrictEqual("validationFailed"); if (error?.details.reason === "validationFailed") { - expect(error.details.url).toStrictEqual(query.url); + expect(error.details.url).toStrictEqual(query.getQueryData().data?.url); expect(error.details.zodError).toBeInstanceOf(ZodError); expect(error.details.response).toBeDefined(); } else { From 832ad54d7beefaa9062820ba74834102eb02935a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 22 Apr 2026 13:14:00 +0200 Subject: [PATCH 098/221] Request type refactoring, updates deps --- lib/client/delivery-client.ts | 36 +++- lib/delivery-sdk-info.ts | 4 +- lib/models/core.models.ts | 4 +- lib/models/request.models.ts | 58 ++++--- .../content-items/fetch-content-item-query.ts | 18 +- lib/queries/content-items/items-feed-query.ts | 28 +-- .../items-referencing-asset-query.ts | 11 +- .../content-items/list-content-items-query.ts | 29 ++-- .../fetch-content-type-element-query.ts | 2 +- .../content-types/fetch-content-type-query.ts | 22 +-- .../content-types/list-content-types-query.ts | 29 ++-- lib/queries/delivery-queries.ts | 49 ++---- lib/queries/languages/list-languages-query.ts | 17 +- .../taxonomies/fetch-taxonomy-query.ts | 10 +- .../taxonomies/list-taxonomies-query.ts | 17 +- lib/utils/paging.utils.ts | 6 +- lib/utils/url.utils.ts | 4 +- package.json | 6 +- pnpm-lock.yaml | 122 ++++++------- tests/integration-tests.config.ts | 10 +- tests/unit/api-mode/deliver-api.spec.ts | 4 +- tests/unit/api-mode/preview-api.spec.ts | 4 +- tests/unit/api-mode/secure-api.spec.ts | 4 +- .../delivery-query/delivery-queries.spec.ts | 70 ++++---- tests/unit/filters/filters.spec.ts | 164 ++++++++++-------- tests/unit/headers/headers.spec.ts | 2 +- tests/unit/paging/paging.utils.spec.ts | 2 +- tests/unit/queries/query-parameters.spec.ts | 27 +-- .../validation/validation-properties.spec.ts | 2 +- tests/utils/integration-test.utils.ts | 9 +- tests/utils/test.utils.ts | 25 ++- 31 files changed, 423 insertions(+), 372 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 7003f7ef..67ac6ec4 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -11,7 +11,7 @@ import { fetchContentTypeElementQuery, } from "../queries/content-types/fetch-content-type-element-query.js"; import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; -import { type ListContentTypesQueryRequest, listContentTypes } from "../queries/content-types/list-content-types-query.js"; +import { type ListContentTypesQueryRequest, listContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -47,9 +47,9 @@ export function createDeliveryClient { return { config, - listTaxonomies: (request?: ListTaxonomiesQueryRequest) => listTaxonomiesQuery(config, request), - listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), - listContentTypes: (request?: ListContentTypesQueryRequest) => listContentTypes(config, request), + listTaxonomies: (request?: ListTaxonomiesQueryRequest) => listTaxonomiesQuery(config, request), + listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), + listContentTypes: (request?: ListContentTypesQueryRequest) => listContentTypesQuery(config, request), fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), fetchContentTypeElement: (request: FetchContentTypeElementQueryRequest) => fetchContentTypeElementQuery(config, request), @@ -59,3 +59,31 @@ export function createDeliveryClient) => itemsReferencingAssetQuery(config, request), }; } + +// const testClient = createDeliveryClient({ +// apiMode: "public", +// environmentId: "x", +// schema: { +// languageCodenames: ["en-us", "es-es"], +// taxonomyCodenames: ["categories"], +// contentTypeCodenames: ["article"], +// elementCodenames: ["title", "content"], +// collectionCodenames: ["articles"], +// workflowCodenames: ["publish"], +// workflowStepCodenames: ["publish"], +// }, +// }); + +// testClient.listContentItems({ +// filters: [ +// { +// operator: "any", +// property: "system.language", +// value: "fe", +// }, +// ], +// query: { +// excludeElements: ["content"], +// elements: ["title", "content"], +// }, +// }); diff --git a/lib/delivery-sdk-info.ts b/lib/delivery-sdk-info.ts index 558d21ff..04008a85 100644 --- a/lib/delivery-sdk-info.ts +++ b/lib/delivery-sdk-info.ts @@ -1,6 +1,6 @@ -import type { SDKInfo } from "@kontent-ai/core-sdk"; +import type { SdkInfo } from "@kontent-ai/core-sdk"; -export const deliverySdkInfo: SDKInfo = { +export const deliverySdkInfo: SdkInfo = { version: "{{version}}", name: "@kontent-ai/delivery-sdk", host: "npmjs.com", diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index c9eeb906..6fd070fe 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -69,8 +69,8 @@ export type DeliveryClientConfigWithSchema export type DeliveryClient = { readonly config: DeliveryClientConfig; - listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; - listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; + listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; + listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; listContentTypes(request?: ListContentTypesQueryRequest): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 5f06fa6d..577d2f3a 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -1,40 +1,46 @@ import type { Header } from "@kontent-ai/core-sdk"; import type { Filter } from "./filter.models.js"; -export type DeliveryRequest = { +export type DeliveryRequest< + THeaders extends HeaderParameterRecord, + TQuery extends QueryParameterRecord, + TFilters extends readonly Filter[], +> = { readonly config?: DeliveryRequestConfig; -}; - -export type QueryParameterRecord = Record; -export type HeaderParameterRecord = Record; - -export type PagingByUrlDeliveryRequest = DeliveryRequest & - QueryParameters<{ - readonly skip?: number; - readonly limit?: number; - readonly order?: TSortableProperties; - }>; - -export type PagingByTokenDeliveryRequest = DeliveryRequest & - HeaderParameters<{ - readonly continuationToken?: string; - }>; +} & ([THeaders] extends [never] ? object : { readonly headers?: THeaders }) & + ([TQuery] extends [never] ? object : { readonly query?: TQuery }) & + ([TFilters] extends [never] ? object : { readonly filters?: TFilters }); -export type QueryRequestWithCodename = { - readonly codename: TCodenames[number]; +export type DeliveryRequestWithUrlPaging< + TSortableProperties extends string, + THeaders extends HeaderParameterRecord, + TQuery extends QueryParameterRecord, + TFilters extends readonly Filter[], +> = DeliveryRequest & { + readonly skip?: number; + readonly limit?: number; + readonly order?: TSortableProperties; }; -export type HeaderParameters = { - readonly headers?: TParameters; +export type DeliveryRequestWithTokenPaging< + THeaders extends HeaderParameterRecord, + TQuery extends QueryParameterRecord, + TFilters extends readonly Filter[], +> = DeliveryRequest & { + readonly continuationToken?: string; }; -export type QueryParameters = { - readonly query?: TParameters; +export type DeliveryRequestWithCodename< + TCodenames extends readonly string[], + THeaders extends HeaderParameterRecord, + TQuery extends QueryParameterRecord, + TFilters extends readonly Filter[], +> = DeliveryRequest & { + readonly codename: TCodenames[number]; }; -export type QueryFilters = { - readonly filters?: readonly Filter[]; -}; +export type QueryParameterRecord = Record; +export type HeaderParameterRecord = Record; export type DeliveryRequestConfig = { /** diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 643a608f..da9ba2c3 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,18 +1,14 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; -import type { - DeliveryRequest, - ElementSelectionQueryParam, - QueryParameters, - QueryRequestWithCodename, -} from "../../models/request.models.js"; +import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type FetchContentItemPayload, fetchContentItemPayload } from "./content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery>; -export type FetchContentItemQueryRequest = DeliveryRequest & - QueryRequestWithCodename> & - QueryParameters<{ +export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< + NonNullable, + never, + { /** * Determines which language variant of content items to return. By default, the API returns content in the default language. */ @@ -35,7 +31,9 @@ export type FetchContentItemQueryRequest = * To exclude all linked items from the response, set depth to 0. */ readonly depth?: number; - }>; + }, + never +>; export function fetchContentItemQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 51045dec..1a6d04ed 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -1,23 +1,23 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { Filter } from "../../models/filter.models.js"; import type { - DeliveryRequest, + DeliveryRequestWithTokenPaging, ElementOrderQueryParam, ElementSelectionQueryParam, - QueryFilters, - QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ContentItemSystemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; +import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; + +type SystemProperties = keyof ContentItemPayload["system"]; +type ElementProperties = NonNullable[number]; export type ItemsFeedQuery = DeliveryPagedFetchQuery>; -export type ItemsFeedQueryRequest = DeliveryRequest & - QueryFilters, NonNullable[number]> & - QueryParameters<{ - readonly order?: - | SystemOrderQueryParam["system"]> - | ElementOrderQueryParam[number]>; +export type ItemsFeedQueryRequest = DeliveryRequestWithTokenPaging< + never, + { + readonly order?: SystemOrderQueryParam | ElementOrderQueryParam>; /** * Determines which language variant of content items to return. By default, the API returns content in the default language. */ @@ -26,12 +26,12 @@ export type ItemsFeedQueryRequest = Delive /** * Specifies which elements to include in the response. By default, all elements are returned. */ - readonly elements?: ElementSelectionQueryParam[number]>; + readonly elements?: ElementSelectionQueryParam>; /** * Specifies which elements to exclude from the response. By default, no elements are excluded. */ - readonly excludeElements?: ElementSelectionQueryParam[number]>; + readonly excludeElements?: ElementSelectionQueryParam>; /** * Determines the nesting level for linked content items that the API returns. @@ -40,7 +40,9 @@ export type ItemsFeedQueryRequest = Delive * To exclude all linked items from the response, set depth to 0. */ readonly depth?: number; - }>; + }, + readonly Filter>[] +>; export function itemsFeedQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index c18332ec..793f7c4d 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -1,5 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingByTokenDeliveryRequest, QueryFilters } from "../../models/request.models.js"; +import type { Filter } from "../../models/filter.models.js"; +import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetPayload } from "./content-item.models.js"; @@ -7,12 +8,16 @@ export type ItemsReferencingAssetQuery = D ItemsReferencingAssetPayload >; -export type ItemsReferencingAssetQueryRequest = PagingByTokenDeliveryRequest & { +export type ItemsReferencingAssetQueryRequest = DeliveryRequestWithTokenPaging< + never, + never, + readonly Filter, never>[] +> & { /** * Codename of the asset to retrieve referencing content items for. */ readonly codename: string; -} & QueryFilters, never>; +}; export function itemsReferencingAssetQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index ab3b98f9..8864420d 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -1,28 +1,23 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { Filter } from "../../models/filter.models.js"; import type { + DeliveryRequestWithUrlPaging, ElementOrderQueryParam, ElementSelectionQueryParam, - PagingByUrlDeliveryRequest, - QueryFilters, - QueryParameters, SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; -import { - type ContentItemPayload, - type ContentItemSystemPayload, - type ListContentItemsPayload, - listContentItemsPayload, -} from "./content-item.models.js"; +import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; + +type SystemProperties = keyof ContentItemPayload["system"]; +type ElementProperties = NonNullable[number]; export type ListContentItemsQuery = DeliveryPagedFetchQuery>; -export type ListContentItemsQueryRequest = PagingByUrlDeliveryRequest< - | SystemOrderQueryParam["system"]> - | ElementOrderQueryParam[number]> -> & - QueryFilters, NonNullable[number]> & - QueryParameters<{ +export type ListContentItemsQueryRequest = DeliveryRequestWithUrlPaging< + SystemOrderQueryParam | ElementOrderQueryParam>, + never, + { /** * Determines which language variant of content items to return. By default, the API returns content in the default language. */ @@ -52,7 +47,9 @@ export type ListContentItemsQueryRequest = * Other parameters in your query, such as limit, skip, or order, don't have an effect on it. */ readonly includeTotalCount?: boolean; - }>; + }, + readonly Filter>[] +>; export function listContentItemsQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index cd4e77d0..bec85b08 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -5,7 +5,7 @@ import { type ContentTypeElementPayload, contentTypeElementPayload } from "./con export type FetchContentTypeElementQuery = DeliveryFetchQuery>; -export type FetchContentTypeElementQueryRequest = DeliveryRequest & { +export type FetchContentTypeElementQueryRequest = DeliveryRequest & { readonly elementCodename: NonNullable[number]; readonly typeCodename: NonNullable[number]; }; diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 2f225df4..1a2c1b5b 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,20 +1,20 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; -import type { - DeliveryRequest, - ElementSelectionQueryParam, - QueryParameters, - QueryRequestWithCodename, -} from "../../models/request.models.js"; +import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypePayload, contentTypePayload } from "./content-type.models.js"; +type ElementProperties = NonNullable[number]; + export type FetchContentTypeQuery = DeliveryFetchQuery>; -export type FetchContentTypeQueryRequest = DeliveryRequest & - QueryRequestWithCodename> & - QueryParameters<{ - readonly elements?: ElementSelectionQueryParam[number]>; - }>; +export type FetchContentTypeQueryRequest = DeliveryRequestWithCodename< + NonNullable, + never, + { + readonly elements?: ElementSelectionQueryParam>; + }, + never +>; export function fetchContentTypeQuery( config: DeliveryClientConfig, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 0c420d87..e26fb848 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,25 +1,24 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { - ElementSelectionQueryParam, - PagingByUrlDeliveryRequest, - QueryFilters, - QueryParameters, - SystemOrderQueryParam, -} from "../../models/request.models.js"; +import type { Filter } from "../../models/filter.models.js"; +import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; +type SystemProperties = keyof ContentTypePayload["system"]; +type ElementProperties = NonNullable[number]; + export type ListContentTypesQuery = DeliveryPagedFetchQuery>; -export type ListContentTypesQueryRequest = PagingByUrlDeliveryRequest< - SystemOrderQueryParam["system"]> -> & - QueryFilters["system"], never> & - QueryParameters<{ - readonly elements?: ElementSelectionQueryParam[number]>; - }>; +export type ListContentTypesQueryRequest = DeliveryRequestWithUrlPaging< + SystemOrderQueryParam, + never, + { + readonly elements?: ElementSelectionQueryParam>; + }, + readonly Filter[] +>; -export function listContentTypes( +export function listContentTypesQuery( config: DeliveryClientConfig, request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index df6f1649..3efbeec8 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -13,25 +13,20 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, Del import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { - DeliveryRequest, - HeaderParameterRecord, - HeaderParameters, - QueryFilters, - QueryParameterRecord, - QueryParameters, -} from "../models/request.models.js"; +import type { DeliveryRequest, HeaderParameterRecord, QueryParameterRecord } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; +type DefaultDeliveryRequest = DeliveryRequest[]>; + export function createDeliveryPagingByUrlQuery({ config, schema, endpoint, request, }: { - readonly request: DeliveryRequest | undefined; + readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; @@ -48,7 +43,7 @@ export function createDeliveryPagingByTokenQuery({ endpoint, request, }: { - readonly request: DeliveryRequest | undefined; + readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; @@ -65,7 +60,7 @@ export function createDeliveryFetchQuery({ endpoint, request, }: { - readonly request: DeliveryRequest | undefined; + readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoints; @@ -81,7 +76,7 @@ function getSharedRequestData({ schema, request, }: { - readonly request: DeliveryRequest | undefined; + readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; readonly schema: ZodType; @@ -109,31 +104,27 @@ function getUrl({ config, endpoint, }: { - readonly request: DeliveryRequest | undefined; + readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; }): string { return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request), getFilters(request)); } -function getFilters(request: DeliveryRequest | undefined): readonly Filter[] | undefined { - if (!request || !isQueryWithFilters(request)) { +function getFilters(request: DefaultDeliveryRequest | undefined): readonly Filter[] | undefined { + if (!request?.filters) { return undefined; } return request.filters; } -function getQueryParameters(request: DeliveryRequest | undefined): QueryParameterRecord | undefined { - if (!request || !isQueryWithParameters(request)) { - return undefined; - } - - return request.query; +function getQueryParameters(request: DefaultDeliveryRequest | undefined): QueryParameterRecord | undefined { + return request?.query; } -function getHeaders(request?: DeliveryRequest): readonly Header[] { - if (!request || !isQueryWithHeaders(request)) { +function getHeaders(request?: DefaultDeliveryRequest): readonly Header[] { + if (!request) { return []; } @@ -149,15 +140,3 @@ function getHeaders(request?: DeliveryRequest): readonly Header[] { function getBypassCdnCacheHeader(): Header { return { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; } - -function isQueryWithParameters(request: DeliveryRequest): request is DeliveryRequest & QueryParameters { - return ("query" satisfies keyof QueryParameters) in request; -} - -function isQueryWithFilters(request: DeliveryRequest): request is DeliveryRequest & QueryFilters { - return ("filters" satisfies keyof QueryFilters) in request; -} - -function isQueryWithHeaders(request: DeliveryRequest): request is DeliveryRequest & HeaderParameters { - return ("headers" satisfies keyof HeaderParameters) in request; -} diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 38f72afd..94c52608 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,18 +1,23 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingByUrlDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { Filter } from "../../models/filter.models.js"; +import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; -export type ListLanguagesQueryRequest = PagingByUrlDeliveryRequest< - SystemOrderQueryParam["system"]> -> & - QueryFilters["system"], never>; +type SystemProperties = keyof LanguagePayload["system"]; + +export type ListLanguagesQueryRequest = DeliveryRequestWithUrlPaging< + SystemOrderQueryParam, + never, + never, + readonly Filter[] +>; export function listLanguagesQuery( config: DeliveryClientConfig, - request?: ListLanguagesQueryRequest, + request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { return createDeliveryPagingByUrlQuery({ config, diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 103e66e2..6bcff4d6 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,12 +1,16 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; -import type { DeliveryRequest, QueryRequestWithCodename } from "../../models/request.models.js"; +import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; export type FetchTaxonomyQuery = DeliveryFetchQuery>; -export type FetchTaxonomyQueryRequest = DeliveryRequest & - QueryRequestWithCodename>; +export type FetchTaxonomyQueryRequest = DeliveryRequestWithCodename< + NonNullable, + never, + never, + never +>; export function fetchTaxonomyQuery( config: DeliveryClientConfig, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 67b89733..6cf626e4 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,18 +1,23 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; -import type { PagingByUrlDeliveryRequest, QueryFilters, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { Filter } from "../../models/filter.models.js"; +import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; -export type ListTaxonomiesQueryRequest = PagingByUrlDeliveryRequest< - SystemOrderQueryParam["system"]> -> & - QueryFilters["system"], never>; +type SystemProperties = keyof TaxonomyPayload["system"]; + +export type ListTaxonomiesQueryRequest = DeliveryRequestWithUrlPaging< + SystemOrderQueryParam, + never, + never, + readonly Filter[] +>; export function listTaxonomiesQuery( config: DeliveryClientConfig, - request?: ListTaxonomiesQueryRequest, + request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { return createDeliveryPagingByUrlQuery({ config, diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index 36e1935b..c7c4a6a1 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,7 +1,7 @@ -import type { GetNextPageData, JsonValue } from "@kontent-ai/core-sdk"; +import type { ExtractNextPageDataFn, JsonValue } from "@kontent-ai/core-sdk"; import type { PaginationSchema } from "../models/pagination.models.js"; -export function getNextPageByUrl(): GetNextPageData { +export function getNextPageByUrl(): ExtractNextPageDataFn { return (response) => { return { continuationToken: undefined, @@ -10,7 +10,7 @@ export function getNextPageByUrl(): Ge }; } -export function getNextPageByContinuationToken(): GetNextPageData { +export function getNextPageByContinuationToken(): ExtractNextPageDataFn { return (response) => { return { continuationToken: response.meta.continuationToken, diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index f469a43c..088c5c15 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,4 +1,4 @@ -import { getEndpointUrl } from "@kontent-ai/core-sdk"; +import { type BaseUrl, getEndpointUrl } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; import { @@ -53,7 +53,7 @@ export function isEmptyRichtextFilter(value: unknown): value is EmptyRichtextFil return emptyRichtextOperators.some((operator) => operator === value.operator); } -function getDefaultBaseUrlForApiMode(apiMode: ApiMode): string { +function getDefaultBaseUrlForApiMode(apiMode: ApiMode): BaseUrl { if (apiMode === "preview") { return "https://preview-deliver.kontent.ai"; } diff --git a/package.json b/package.json index f529bba8..9dce8879 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.25", + "@kontent-ai/core-sdk": "^12.0.0-preview.27", "ts-pattern": "^5", "zod": "^4" }, @@ -53,8 +53,8 @@ "@biomejs/biome": "2.4.12", "@types/node": "25.6.0", "typescript": "6.0.3", - "vitest": "4.1.4", - "@vitest/coverage-v8": "4.1.4", + "vitest": "4.1.5", + "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9077b6f9..7e45acc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.25 - version: 12.0.0-preview.25(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.27 + version: 12.0.0-preview.27(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -31,8 +31,8 @@ importers: specifier: 25.6.0 version: 25.6.0 '@vitest/coverage-v8': - specifier: 4.1.4 - version: 4.1.4(vitest@4.1.4) + specifier: 4.1.5 + version: 4.1.5(vitest@4.1.5) eslint: specifier: 10.2.1 version: 10.2.1 @@ -43,8 +43,8 @@ importers: specifier: 6.0.3 version: 6.0.3 vitest: - specifier: 4.1.4 - version: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + specifier: 4.1.5 + version: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) packages: @@ -380,8 +380,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.25': - resolution: {integrity: sha512-Ru1RrHZYmMwJCvK9Iz5Ccih/0ps0HSosFlEfzjG1sw8zgrr9wxMAp2HpvrD8R7aLTZehnIJdeLYONgSkl3RueQ==} + '@kontent-ai/core-sdk@12.0.0-preview.27': + resolution: {integrity: sha512-DvKLj2DZdiDpO7dmABPGYxV1aZ25MckxSvR0nTzPd0ul0MGaFq/u2sFTmp3VnPx/ZQvz1/IkiFVrKjoPUbQbkw==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -580,20 +580,20 @@ packages: resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.1.4': - resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==} + '@vitest/coverage-v8@4.1.5': + resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} peerDependencies: - '@vitest/browser': 4.1.4 - vitest: 4.1.4 + '@vitest/browser': 4.1.5 + vitest: 4.1.5 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.4': - resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} + '@vitest/expect@4.1.5': + resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} - '@vitest/mocker@4.1.4': - resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==} + '@vitest/mocker@4.1.5': + resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -603,20 +603,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.4': - resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==} + '@vitest/pretty-format@4.1.5': + resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} - '@vitest/runner@4.1.4': - resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==} + '@vitest/runner@4.1.5': + resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} - '@vitest/snapshot@4.1.4': - resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==} + '@vitest/snapshot@4.1.5': + resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} - '@vitest/spy@4.1.4': - resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==} + '@vitest/spy@4.1.5': + resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} - '@vitest/utils@4.1.4': - resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==} + '@vitest/utils@4.1.5': + resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1641,20 +1641,20 @@ packages: yaml: optional: true - vitest@4.1.4: - resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==} + vitest@4.1.5: + resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.4 - '@vitest/browser-preview': 4.1.4 - '@vitest/browser-webdriverio': 4.1.4 - '@vitest/coverage-istanbul': 4.1.4 - '@vitest/coverage-v8': 4.1.4 - '@vitest/ui': 4.1.4 + '@vitest/browser-playwright': 4.1.5 + '@vitest/browser-preview': 4.1.5 + '@vitest/browser-webdriverio': 4.1.5 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1963,7 +1963,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.12 - '@kontent-ai/core-sdk@12.0.0-preview.25(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.27(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2155,10 +2155,10 @@ snapshots: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.1.4(vitest@4.1.4)': + '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.4 + '@vitest/utils': 4.1.5 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2167,46 +2167,46 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + vitest: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) - '@vitest/expect@4.1.4': + '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0))': + '@vitest/mocker@4.1.5(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0))': dependencies: - '@vitest/spy': 4.1.4 + '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0) - '@vitest/pretty-format@4.1.4': + '@vitest/pretty-format@4.1.5': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.4': + '@vitest/runner@4.1.5': dependencies: - '@vitest/utils': 4.1.4 + '@vitest/utils': 4.1.5 pathe: 2.0.3 - '@vitest/snapshot@4.1.4': + '@vitest/snapshot@4.1.5': dependencies: - '@vitest/pretty-format': 4.1.4 - '@vitest/utils': 4.1.4 + '@vitest/pretty-format': 4.1.5 + '@vitest/utils': 4.1.5 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.4': {} + '@vitest/spy@4.1.5': {} - '@vitest/utils@4.1.4': + '@vitest/utils@4.1.5': dependencies: - '@vitest/pretty-format': 4.1.4 + '@vitest/pretty-format': 4.1.5 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -3463,15 +3463,15 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - vitest@4.1.4(@types/node@25.6.0)(@vitest/coverage-v8@4.1.4)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)): + vitest@4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)): dependencies: - '@vitest/expect': 4.1.4 - '@vitest/mocker': 4.1.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) - '@vitest/pretty-format': 4.1.4 - '@vitest/runner': 4.1.4 - '@vitest/snapshot': 4.1.4 - '@vitest/spy': 4.1.4 - '@vitest/utils': 4.1.4 + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3487,7 +3487,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.6.0 - '@vitest/coverage-v8': 4.1.4(vitest@4.1.4) + '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) transitivePeerDependencies: - msw diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts index 052087f2..d8504168 100644 --- a/tests/integration-tests.config.ts +++ b/tests/integration-tests.config.ts @@ -2,14 +2,20 @@ import { existsSync } from "node:fs"; import path from "node:path"; import { loadEnvFile } from "node:process"; import { fileURLToPath } from "node:url"; +import type { BaseUrl } from "@kontent-ai/core-sdk"; import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "@kontent-ai/core-sdk/devkit"; +import { isBaseUrl } from "./utils/test.utils.js"; export function getIntegrationTestConfig() { loadEnvironmentVariables(); + const baseUrl = getEnvironmentOptionalValue("INTEGRATION_DELIVERY_BASE_URL"); - const integrationEnv = { + const integrationEnv: { + readonly id: string; + readonly deliveryBaseUrl: BaseUrl | undefined; + } = { id: getEnvironmentRequiredValue("INTEGRATION_ENVIRONMENT_ID"), - deliveryBaseUrl: getEnvironmentOptionalValue("INTEGRATION_DELIVERY_BASE_URL"), + deliveryBaseUrl: isBaseUrl(baseUrl) ? baseUrl : undefined, } as const; return { diff --git a/tests/unit/api-mode/deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts index da64e283..739dd997 100644 --- a/tests/unit/api-mode/deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -1,4 +1,4 @@ -import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { getDefaultHttpAdapter, getDefaultHttpService, type Header, type KnownHeaderName } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; @@ -40,7 +40,7 @@ describe("Public deliver API", async () => { }); it("Request headers should NOT contain authorization header with delivery API key", () => { - const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader).toBeUndefined(); }); diff --git a/tests/unit/api-mode/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts index 81f1a2d1..890d0301 100644 --- a/tests/unit/api-mode/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -1,4 +1,4 @@ -import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { getDefaultHttpAdapter, getDefaultHttpService, type Header, type KnownHeaderName } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; @@ -42,7 +42,7 @@ describe("Preview API", async () => { }); it("Request headers should contain authorization header with delivery API key", () => { - const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader?.value).toEqual(`Bearer ${previewApiKey}`); }); diff --git a/tests/unit/api-mode/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts index 6e006bd4..2036117b 100644 --- a/tests/unit/api-mode/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -1,4 +1,4 @@ -import { type CommonHeaderNames, getDefaultHttpAdapter, getDefaultHttpService, type Header } from "@kontent-ai/core-sdk"; +import { getDefaultHttpAdapter, getDefaultHttpService, type Header, type KnownHeaderName } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; @@ -42,7 +42,7 @@ describe("Secure API", async () => { }); it("Request headers should contain authorization header with secure API key", () => { - const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies CommonHeaderNames)); + const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader?.value).toEqual(`Bearer ${secureApiKey}`); }); diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts index 36165671..49999bef 100644 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -32,61 +32,62 @@ describe("createDeliveryFetchQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items/my_item"; - const query = createDeliveryFetchQuery({ + const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint, }); - expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); it("URL has no query string when request is undefined", () => { - const query = createDeliveryFetchQuery({ + const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint: "items/my_item", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url?.toString()).not.toContain("?"); }); it("URL has no query string when request has neither query nor filters", () => { - const query = createDeliveryFetchQuery({ + const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request: {}, schema: testSchema, endpoint: "items/my_item", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url?.toString()).not.toContain("?"); }); it("URL includes query parameters when request.query is provided", () => { const request: DeliveryRequest & QueryParameters<{ readonly language: string; readonly depth: number }> = { query: { language: "en-us", depth: 2 }, }; - const query = createDeliveryFetchQuery({ + const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request, schema: testSchema, endpoint: "items/my_item", }); - const params = new URL(query.url).searchParams; - expect(params.get("language")).toBe(request.query?.language); - expect(params.get("depth")).toBe(request.query?.depth.toString()); + + const url = inspect().data?.url; + expect(url?.searchParams.get("language")).toBe(request.query?.language); + expect(url?.searchParams.get("depth")).toBe(request.query?.depth.toString()); }); it("URL includes filters when request.filters is provided", () => { const request: DeliveryRequest & QueryFilters = { filters: [{ property: "system.type", operator: "eq", value: "article" }], }; - const query = createDeliveryFetchQuery({ + const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request, schema: testSchema, endpoint: "items/my_item", }); - expect(query.url).toContain(new URLSearchParams("system.type[eq]=article").toString()); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=article").toString()); }); }); @@ -103,62 +104,63 @@ describe("createDeliveryPagingByUrlQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items" as const; - const query = createDeliveryPagingByUrlQuery({ + const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, endpoint, }); - expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); it("URL has no query string when request is undefined", () => { - const query = createDeliveryPagingByUrlQuery({ + const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, endpoint: "items", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url?.toString()).not.toContain("?"); }); it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const query = createDeliveryPagingByUrlQuery({ + const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request, schema: paginationSchema, endpoint: "items", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url?.toString()).not.toContain("?"); }); it("URL includes query parameters when request.query is provided", () => { const request: DeliveryRequest & QueryParameters<{ readonly skip: number; readonly limit: number }> = { query: { skip: 10, limit: 5 }, }; - const query = createDeliveryPagingByUrlQuery({ + const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request, schema: paginationSchema, endpoint: "items", }); - const params = new URL(query.url).searchParams; - expect(params.get("skip")).toBe("10"); - expect(params.get("limit")).toBe("5"); + + const url = inspect().data?.url; + expect(url?.searchParams.get("skip")).toBe("10"); + expect(url?.searchParams.get("limit")).toBe("5"); }); it("URL includes filters when request.filters is provided", () => { const request: DeliveryRequest & QueryFilters = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; - const query = createDeliveryPagingByUrlQuery({ + const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request, schema: paginationSchema, endpoint: "items", }); - expect(query.url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); }); }); @@ -175,59 +177,59 @@ describe("createDeliveryPagingByTokenQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items-feed" as const; - const query = createDeliveryPagingByTokenQuery({ + const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint, }); - expect(query.url).toBe(getDeliveryUrl({ ...clientConfig, path: endpoint })); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); it("URL has no query string when request is undefined", () => { - const query = createDeliveryPagingByTokenQuery({ + const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint: "items-feed", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url.toString()).not.toContain("?"); }); it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const query = createDeliveryPagingByTokenQuery({ + const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request, schema: testSchema, endpoint: "items-feed", }); - expect(query.url).not.toContain("?"); + expect(inspect().data?.url.toString()).not.toContain("?"); }); it("URL includes query parameters when request.query is provided", () => { const request: DeliveryRequest & QueryParameters<{ readonly language: string }> = { query: { language: "en-us" }, }; - const query = createDeliveryPagingByTokenQuery({ + const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request, schema: testSchema, endpoint: "items-feed", }); - expect(new URL(query.url).searchParams.get("language")).toBe("en-us"); + expect(inspect().data?.url?.searchParams.get("language")).toBe("en-us"); }); it("URL includes filters when request.filters is provided", () => { const request: DeliveryRequest & QueryFilters = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; - const query = createDeliveryPagingByTokenQuery({ + const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request, schema: testSchema, endpoint: "items-feed", }); - expect(query.url).toContain(new URLSearchParams("system.type[eq]=blog").toString()); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=blog").toString()); }); }); diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts index ce8a9c57..d4b2b06e 100644 --- a/tests/unit/filters/filters.spec.ts +++ b/tests/unit/filters/filters.spec.ts @@ -9,102 +9,118 @@ describe("Filters", () => { }); it("Filter defined as object should be added to the url", () => { - const url = client.listContentItems({ - filters: [ - { - property: "system.language", - operator: "eq", - value: "default", - }, - ], - }).url; - - expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "system.language", + operator: "eq", + value: "default", + }, + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Filter defined as string should be added to the url", () => { - const url = client.listContentItems({ - filters: ["system.language[eq]=default"], - }).url; + const { data } = client + .listContentItems({ + filters: ["system.language[eq]=default"], + }) + .inspect(); - expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Handle multiple equal signs in value", () => { - const url = client.listContentItems({ - filters: ["system.codename[eq]=abc=def"], - }).url; + const { data } = client + .listContentItems({ + filters: ["system.codename[eq]=abc=def"], + }) + .inspect(); - expect(url).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); + expect(data?.url).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); }); it("Filter defined as string with value containing '=' should be added to the url correctly", () => { - const url = client.listContentItems({ - filters: [ - { - property: "system.language", - operator: "=", - value: "default", - }, - ], - }).url; - - expect(url).toContain(new URLSearchParams("system.language=default").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "system.language", + operator: "=", + value: "default", + }, + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("system.language=default").toString()); }); it("Filter defined as string with value containing '!=' should be added to the url correctly", () => { - const url = client.listContentItems({ - filters: [ - { - property: "system.language", - operator: "!=", - value: "default", - }, - ], - }).url; - - expect(url).toContain(new URLSearchParams("system.language[neq]=default").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "system.language", + operator: "!=", + value: "default", + }, + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("system.language[neq]=default").toString()); }); it("isEmptyRichText filter should produce [eq]=


in the url", () => { - const url = client.listContentItems({ - filters: [ - { - property: "elements.description", - operator: "isEmptyRichText", - }, - ], - }).url; - - expect(url).toContain(new URLSearchParams("elements.description[eq]=


").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "elements.description", + operator: "isEmptyRichText", + }, + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("elements.description[eq]=


").toString()); }); it("isNotEmptyRichText filter should produce [neq]=


in the url", () => { - const url = client.listContentItems({ - filters: [ - { - property: "elements.description", - operator: "isNotEmptyRichText", - }, - ], - }).url; - - expect(url).toContain(new URLSearchParams("elements.description[neq]=


").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "elements.description", + operator: "isNotEmptyRichText", + }, + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("elements.description[neq]=


").toString()); }); it("Filters defined as both object and string should all be added to the url", () => { - const url = client.listContentItems({ - filters: [ - { - property: "system.language", - operator: "eq", - value: "default", - }, - "system.type[eq]=movie", - ], - }).url; - - expect(url).toContain(new URLSearchParams("system.language[eq]=default").toString()); - expect(url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); + const { data } = client + .listContentItems({ + filters: [ + { + property: "system.language", + operator: "eq", + value: "default", + }, + "system.type[eq]=movie", + ], + }) + .inspect(); + + expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(data?.url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); }); }); diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index ef9062a8..53537cb4 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -48,7 +48,7 @@ describe("Delivery tracking header", async () => { const requestHeaders = await captureRequestHeaders(); - it("Request headers should contain sync tracking header with current package info", () => { + it("Request headers should contain delivery tracking header with current package info", () => { const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); expect(syncTrackingHeader?.value).toEqual(expectedHeader.value); }); diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts index 07f967bf..e524a4b4 100644 --- a/tests/unit/paging/paging.utils.spec.ts +++ b/tests/unit/paging/paging.utils.spec.ts @@ -9,7 +9,7 @@ describe("Paging utils", () => { meta: { status: 200, responseHeaders: [], - url: "https://domain.com", + url: new URL("https://domain.com"), continuationToken: undefined, }, payload: { diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index 34d3ef07..cd6014d0 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -11,17 +11,6 @@ describe("Query parameters", () => { }); it("Paging parameters should be added to the url", () => { - const testQuery: DeliveryPagedFetchQuery = client.listLanguages({ - query: { - order: "system.name[asc]", - skip: 5, - limit: 10, - }, - }); - - void testQuery; - const fefefe: DeliveryPagedFetchQuery[] = [testQuery]; - const listingQueries: readonly DeliveryPagedFetchQuery[] = [ client.listLanguages({ query: { @@ -53,11 +42,11 @@ describe("Query parameters", () => { }), ]; - for (const { getQueryData } of listingQueries) { - const { success, data, error } = getQueryData(); + for (const { inspect } of listingQueries) { + const { success, data, error } = inspect(); if (!success) { - throw new Error(`Failed to get query data: ${error}`); + throw new Error(`Failed to inspect query: ${error}`); } const { url } = data; @@ -68,20 +57,18 @@ describe("Query parameters", () => { }); it("Elements query parameter should be added as a comma-separated list in the url", () => { - const { getQueryData } = client.listContentTypes({ + const { inspect } = client.listContentTypes({ query: { elements: ["x", "y", "z"], }, }); - const { success, data, error } = getQueryData(); + const { success, data, error } = inspect(); if (!success) { - throw new Error(`Failed to get query data: ${error}`); + throw new Error(`Failed to inspect query: ${error}`); } - const { url } = data; - - expect(url.searchParams.get("elements")).toStrictEqual("x,y,z"); + expect(data.url.searchParams.get("elements")).toStrictEqual("x,y,z"); }); }); diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index f73e411e..eb970d6c 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -37,7 +37,7 @@ describe("Response validation", () => { expect(error?.details.reason).toStrictEqual("validationFailed"); if (error?.details.reason === "validationFailed") { - expect(error.details.url).toStrictEqual(query.getQueryData().data?.url); + expect(error.details.url).toStrictEqual(query.inspect().data?.url); expect(error.details.zodError).toBeInstanceOf(ZodError); expect(error.details.response).toBeDefined(); } else { diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index c6ea9830..60f8c831 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -1,4 +1,5 @@ import { + type BaseUrl, type FetchQuery, getDefaultHttpService, isPagingQuery, @@ -148,7 +149,7 @@ function createUnitTestClient(unitTestPayloa }); } -function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: string | undefined): DeliveryClient { +function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: BaseUrl | undefined): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId, @@ -172,7 +173,7 @@ function createTestClients({ }: { readonly unitTestPayload: TResponsePayload; readonly environmentId: string; - readonly deliveryBaseUrl: string | undefined; + readonly deliveryBaseUrl: BaseUrl | undefined; }): readonly DeliveryClient[] { return [createUnitTestClient(unitTestPayload), createIntegrationTestClient(environmentId, deliveryBaseUrl)]; } @@ -235,7 +236,9 @@ function registerQueryStructureTests({ readonly client: DeliveryClient; }): void { it(`${testName} Expect url to be correct`, () => { - expect(query.url).toBe(`${getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })}`); + expect(query.inspect()?.data?.url).toEqual( + new URL(getDeliveryUrl({ apiMode: "public", environmentId: client.config.environmentId, path: endpoint })), + ); }); if (!isPagingQuery(query)) { it(`${testName} Query should be a fetch query with expected functions`, () => { diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 254f650c..aec94b96 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,14 +1,16 @@ import { - type ContinuationHeaderName, + type BaseUrl, + type ContinuationTokenHeaderName, type FetchQuery, type Header, + type JsonValue, type KontentSdkError, nilUuid, type PagedFetchQuery, } from "@kontent-ai/core-sdk"; export const fakeXContinuationTokenHeader: Header = { - name: "X-Continuation" satisfies ContinuationHeaderName, + name: "X-Continuation" satisfies ContinuationTokenHeaderName, value: "x", }; @@ -18,13 +20,20 @@ export function getFakeUuid(): string { return nilUuid; } -export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { - type ExpectedFunctions = keyof FetchQuery; +export function isBaseUrl(url: string | undefined): url is BaseUrl { + if (!url) { + return false; + } + return url.toLowerCase().startsWith("https://") || url.toLowerCase().startsWith("http://"); +} + +export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { + type ExpectedFunctions = keyof FetchQuery; if (!query || typeof query !== "object") { return false; } - const expectedFunctions: readonly ExpectedFunctions[] = ["fetchSafe", "fetch", "schema", "url"]; + const expectedFunctions: readonly ExpectedFunctions[] = ["fetchSafe", "fetch", "schema", "inspect"]; if (expectedFunctions.every((func) => func in query)) { return true; @@ -32,8 +41,8 @@ export function isFetchQueryWithExpectedFunctions(query: unknown): query is Fetc return false; } -export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is PagedFetchQuery { - type ExpectedFunctions = keyof PagedFetchQuery; +export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is PagedFetchQuery { + type ExpectedFunctions = keyof PagedFetchQuery; if (!query || typeof query !== "object") { return false; } @@ -43,7 +52,7 @@ export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is "fetchPageSafe", "pages", "schema", - "url", + "inspect", "fetchAllPages", "fetchPage", "pagesSafe", From 0b312bb4be66f582f74148399831eb16490f8801 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 22 Apr 2026 13:26:47 +0200 Subject: [PATCH 099/221] paging query fixes --- lib/models/request.models.ts | 10 ++++++---- lib/queries/delivery-queries.ts | 16 ++-------------- .../delivery-query/delivery-queries.spec.ts | 19 ++++++++++--------- tests/unit/filters/filters.spec.ts | 18 +++++++++--------- tests/unit/headers/headers.spec.ts | 2 +- tests/unit/queries/query-parameters.spec.ts | 1 + 6 files changed, 29 insertions(+), 37 deletions(-) diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 577d2f3a..4966efe7 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -17,9 +17,11 @@ export type DeliveryRequestWithUrlPaging< TQuery extends QueryParameterRecord, TFilters extends readonly Filter[], > = DeliveryRequest & { - readonly skip?: number; - readonly limit?: number; - readonly order?: TSortableProperties; + readonly query?: { + readonly skip?: number; + readonly limit?: number; + readonly order?: TSortableProperties; + }; }; export type DeliveryRequestWithTokenPaging< @@ -54,7 +56,7 @@ export type DeliveryRequestConfig = { /** * Additional headers to be added to the request. */ - readonly headers?: readonly Header[]; + readonly customHeaders?: readonly Header[]; }; export type OrderDirection = "asc" | "desc"; diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 3efbeec8..3e5437b7 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -108,19 +108,7 @@ function getUrl({ readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoints; }): string { - return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), getQueryParameters(request), getFilters(request)); -} - -function getFilters(request: DefaultDeliveryRequest | undefined): readonly Filter[] | undefined { - if (!request?.filters) { - return undefined; - } - - return request.filters; -} - -function getQueryParameters(request: DefaultDeliveryRequest | undefined): QueryParameterRecord | undefined { - return request?.query; + return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request?.query, request?.filters); } function getHeaders(request?: DefaultDeliveryRequest): readonly Header[] { @@ -128,7 +116,7 @@ function getHeaders(request?: DefaultDeliveryRequest): readonly Header[] { return []; } - const configHeaders: readonly Header[] = request.config?.headers ?? []; + const configHeaders: readonly Header[] = request.config?.customHeaders ?? []; const requestHeaders: readonly Header[] = Object.entries(request.headers ?? {}).map
(([name, value]) => ({ name, value: value.toString(), diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts index 49999bef..68d0443a 100644 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -2,8 +2,9 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; import { type ZodType, z } from "zod"; import type { DeliveryClientConfig, FullDeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.models.js"; -import type { DeliveryRequest, QueryFilters, QueryParameters } from "../../../lib/models/request.models.js"; +import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryFetchQuery, createDeliveryPagingByTokenQuery, @@ -62,7 +63,7 @@ describe("createDeliveryFetchQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest & QueryParameters<{ readonly language: string; readonly depth: number }> = { + const request: DeliveryRequest = { query: { language: "en-us", depth: 2 }, }; const { inspect } = createDeliveryFetchQuery({ @@ -78,7 +79,7 @@ describe("createDeliveryFetchQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest & QueryFilters = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "article" }], }; const { inspect } = createDeliveryFetchQuery({ @@ -124,7 +125,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; + const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request, @@ -135,7 +136,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest & QueryParameters<{ readonly skip: number; readonly limit: number }> = { + const request: DeliveryRequest = { query: { skip: 10, limit: 5 }, }; const { inspect } = createDeliveryPagingByUrlQuery({ @@ -151,7 +152,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest & QueryFilters = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; const { inspect } = createDeliveryPagingByUrlQuery({ @@ -197,7 +198,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; + const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request, @@ -208,7 +209,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest & QueryParameters<{ readonly language: string }> = { + const request: DeliveryRequest = { query: { language: "en-us" }, }; const { inspect } = createDeliveryPagingByTokenQuery({ @@ -221,7 +222,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest & QueryFilters = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; const { inspect } = createDeliveryPagingByTokenQuery({ diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts index d4b2b06e..57eb60bf 100644 --- a/tests/unit/filters/filters.spec.ts +++ b/tests/unit/filters/filters.spec.ts @@ -21,7 +21,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Filter defined as string should be added to the url", () => { @@ -31,7 +31,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); it("Handle multiple equal signs in value", () => { @@ -41,7 +41,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); }); it("Filter defined as string with value containing '=' should be added to the url correctly", () => { @@ -57,7 +57,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.language=default").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.language=default").toString()); }); it("Filter defined as string with value containing '!=' should be added to the url correctly", () => { @@ -73,7 +73,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.language[neq]=default").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.language[neq]=default").toString()); }); it("isEmptyRichText filter should produce [eq]=


in the url", () => { @@ -88,7 +88,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("elements.description[eq]=


").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("elements.description[eq]=


").toString()); }); it("isNotEmptyRichText filter should produce [neq]=


in the url", () => { @@ -103,7 +103,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("elements.description[neq]=


").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("elements.description[neq]=


").toString()); }); it("Filters defined as both object and string should all be added to the url", () => { @@ -120,7 +120,7 @@ describe("Filters", () => { }) .inspect(); - expect(data?.url).toContain(new URLSearchParams("system.language[eq]=default").toString()); - expect(data?.url).toContain(new URLSearchParams("system.type[eq]=movie").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.language[eq]=default").toString()); + expect(data?.url.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); }); }); diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 53537cb4..70e4aa54 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -105,7 +105,7 @@ describe("Extra headers should be present", async () => { continuationToken: "x", }); - const requestHeaders = await captureRequestHeaders({ config: { headers: [extraHeader] } }); + const requestHeaders = await captureRequestHeaders({ config: { customHeaders: [extraHeader] } }); it("Request headers should contain extra header", () => { const foundHeader = requestHeaders.find((header) => header.name === extraHeader.name); diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index cd6014d0..ba0ae3fb 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -38,6 +38,7 @@ describe("Query parameters", () => { order: "system.name[asc]", skip: 5, limit: 10, + depth: 4, }, }), ]; From 5db99474210f7c5316521bf0aeadd4e8b340bd9d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 22 Apr 2026 15:14:08 +0200 Subject: [PATCH 100/221] Refactors headers --- lib/client/delivery-client.ts | 28 -------- lib/models/core.models.ts | 2 + lib/models/request.models.ts | 35 ++++------ lib/public_api.ts | 1 + .../content-items/fetch-content-item-query.ts | 1 - lib/queries/content-items/items-feed-query.ts | 1 - .../items-referencing-asset-query.ts | 1 - .../content-items/list-content-items-query.ts | 5 +- .../fetch-content-type-element-query.ts | 2 +- .../content-types/fetch-content-type-query.ts | 1 - .../content-types/list-content-types-query.ts | 1 - lib/queries/delivery-queries.ts | 10 +-- lib/queries/languages/list-languages-query.ts | 1 - .../taxonomies/fetch-taxonomy-query.ts | 1 - .../taxonomies/list-taxonomies-query.ts | 1 - .../delivery-query/delivery-queries.spec.ts | 16 ++--- tests/unit/headers/headers.spec.ts | 66 ++++++++++--------- 17 files changed, 65 insertions(+), 108 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 67ac6ec4..7c75710a 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -59,31 +59,3 @@ export function createDeliveryClient) => itemsReferencingAssetQuery(config, request), }; } - -// const testClient = createDeliveryClient({ -// apiMode: "public", -// environmentId: "x", -// schema: { -// languageCodenames: ["en-us", "es-es"], -// taxonomyCodenames: ["categories"], -// contentTypeCodenames: ["article"], -// elementCodenames: ["title", "content"], -// collectionCodenames: ["articles"], -// workflowCodenames: ["publish"], -// workflowStepCodenames: ["publish"], -// }, -// }); - -// testClient.listContentItems({ -// filters: [ -// { -// operator: "any", -// property: "system.language", -// value: "fe", -// }, -// ], -// query: { -// excludeElements: ["content"], -// elements: ["title", "content"], -// }, -// }); diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 6fd070fe..26d43281 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -98,6 +98,8 @@ export type DeliveryEndpoints = | `types/${string}` | `types/${string}/elements/${string}`; +export type WaitForLoadingNewContentHeaderName = "X-KC-Wait-For-Loading-New-Content"; + type PublicDeliveryClientConfig = { /** * The API mode of the delivery client. Public access is the default mode. diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 4966efe7..9683f32c 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -1,22 +1,19 @@ import type { Header } from "@kontent-ai/core-sdk"; import type { Filter } from "./filter.models.js"; -export type DeliveryRequest< - THeaders extends HeaderParameterRecord, - TQuery extends QueryParameterRecord, - TFilters extends readonly Filter[], -> = { +export type DeliveryRequest[]> = { readonly config?: DeliveryRequestConfig; -} & ([THeaders] extends [never] ? object : { readonly headers?: THeaders }) & - ([TQuery] extends [never] ? object : { readonly query?: TQuery }) & + readonly headers?: { + readonly "X-KC-Wait-For-Loading-New-Content"?: boolean; + }; +} & ([TQuery] extends [never] ? object : { readonly query?: TQuery }) & ([TFilters] extends [never] ? object : { readonly filters?: TFilters }); export type DeliveryRequestWithUrlPaging< TSortableProperties extends string, - THeaders extends HeaderParameterRecord, TQuery extends QueryParameterRecord, TFilters extends readonly Filter[], -> = DeliveryRequest & { +> = DeliveryRequest & { readonly query?: { readonly skip?: number; readonly limit?: number; @@ -25,34 +22,26 @@ export type DeliveryRequestWithUrlPaging< }; export type DeliveryRequestWithTokenPaging< - THeaders extends HeaderParameterRecord, TQuery extends QueryParameterRecord, TFilters extends readonly Filter[], -> = DeliveryRequest & { - readonly continuationToken?: string; +> = DeliveryRequest & { + readonly headers?: { + readonly "X-KC-Wait-For-Loading-New-Content"?: boolean; + readonly "X-Continuation"?: string; + }; }; export type DeliveryRequestWithCodename< TCodenames extends readonly string[], - THeaders extends HeaderParameterRecord, TQuery extends QueryParameterRecord, TFilters extends readonly Filter[], -> = DeliveryRequest & { +> = DeliveryRequest & { readonly codename: TCodenames[number]; }; export type QueryParameterRecord = Record; -export type HeaderParameterRecord = Record; export type DeliveryRequestConfig = { - /** - * When enabled, sets the `X-KC-Wait-For-Loading-New-Content` header so the Delivery API - * waits for the latest content to be loaded before responding instead of serving - * a potentially stale response from the CDN cache. Useful when you know the - * requested content has just changed (for example, after handling a webhook). - */ - readonly bypassCdnCache?: boolean; - /** * Additional headers to be added to the request. */ diff --git a/lib/public_api.ts b/lib/public_api.ts index 8fae4c8f..6926878e 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -7,6 +7,7 @@ export type { DeliveryClientConfig, DeliveryClientSchema, FullDeliveryClientSchema, + WaitForLoadingNewContentHeaderName, } from "./models/core.models.js"; // Filters export type { EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index da9ba2c3..a6012243 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -7,7 +7,6 @@ export type FetchContentItemQuery = Delive export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< NonNullable, - never, { /** * Determines which language variant of content items to return. By default, the API returns content in the default language. diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 1a6d04ed..b754490c 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -15,7 +15,6 @@ type ElementProperties = NonNullable = DeliveryPagedFetchQuery>; export type ItemsFeedQueryRequest = DeliveryRequestWithTokenPaging< - never, { readonly order?: SystemOrderQueryParam | ElementOrderQueryParam>; /** diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index 793f7c4d..a756ff9b 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -9,7 +9,6 @@ export type ItemsReferencingAssetQuery = D >; export type ItemsReferencingAssetQueryRequest = DeliveryRequestWithTokenPaging< - never, never, readonly Filter, never>[] > & { diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 8864420d..9241f69a 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -16,7 +16,6 @@ export type ListContentItemsQuery = Delive export type ListContentItemsQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam | ElementOrderQueryParam>, - never, { /** * Determines which language variant of content items to return. By default, the API returns content in the default language. @@ -26,12 +25,12 @@ export type ListContentItemsQueryRequest = /** * Specifies which elements to include in the response. By default, all elements are returned. */ - readonly elements?: ElementSelectionQueryParam[number]>; + readonly elements?: ElementSelectionQueryParam>; /** * Specifies which elements to exclude from the response. By default, no elements are excluded. */ - readonly excludeElements?: ElementSelectionQueryParam[number]>; + readonly excludeElements?: ElementSelectionQueryParam>; /** * Determines the nesting level for linked content items that the API returns. diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index bec85b08..28207601 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -5,7 +5,7 @@ import { type ContentTypeElementPayload, contentTypeElementPayload } from "./con export type FetchContentTypeElementQuery = DeliveryFetchQuery>; -export type FetchContentTypeElementQueryRequest = DeliveryRequest & { +export type FetchContentTypeElementQueryRequest = DeliveryRequest & { readonly elementCodename: NonNullable[number]; readonly typeCodename: NonNullable[number]; }; diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 1a2c1b5b..bdafbe06 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -9,7 +9,6 @@ export type FetchContentTypeQuery = Delive export type FetchContentTypeQueryRequest = DeliveryRequestWithCodename< NonNullable, - never, { readonly elements?: ElementSelectionQueryParam>; }, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index e26fb848..5f4e868f 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -11,7 +11,6 @@ export type ListContentTypesQuery = Delive export type ListContentTypesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, - never, { readonly elements?: ElementSelectionQueryParam>; }, diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 3e5437b7..f43551ce 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -13,12 +13,12 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, Del import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; import type { PaginationSchema } from "../models/pagination.models.js"; -import type { DeliveryRequest, HeaderParameterRecord, QueryParameterRecord } from "../models/request.models.js"; +import type { DeliveryRequest, QueryParameterRecord } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; -type DefaultDeliveryRequest = DeliveryRequest[]>; +type DefaultDeliveryRequest = DeliveryRequest[]>; export function createDeliveryPagingByUrlQuery({ config, @@ -122,9 +122,5 @@ function getHeaders(request?: DefaultDeliveryRequest): readonly Header[] { value: value.toString(), })); - return [...configHeaders, ...requestHeaders, ...(request.config?.bypassCdnCache ? [getBypassCdnCacheHeader()] : [])]; -} - -function getBypassCdnCacheHeader(): Header { - return { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; + return [...configHeaders, ...requestHeaders]; } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 94c52608..fdaf0eb6 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -11,7 +11,6 @@ type SystemProperties = keyof LanguagePayload["system"]; export type ListLanguagesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, never, - never, readonly Filter[] >; diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 6bcff4d6..9ee0aec9 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -8,7 +8,6 @@ export type FetchTaxonomyQuery = DeliveryF export type FetchTaxonomyQueryRequest = DeliveryRequestWithCodename< NonNullable, never, - never, never >; diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 6cf626e4..34525880 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -11,7 +11,6 @@ type SystemProperties = keyof TaxonomyPayload["system"]; export type ListTaxonomiesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, never, - never, readonly Filter[] >; diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts index 68d0443a..a10122a7 100644 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -63,7 +63,7 @@ describe("createDeliveryFetchQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest = { + const request: DeliveryRequest<{ readonly language: string; readonly depth: number }, never> = { query: { language: "en-us", depth: 2 }, }; const { inspect } = createDeliveryFetchQuery({ @@ -79,7 +79,7 @@ describe("createDeliveryFetchQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "article" }], }; const { inspect } = createDeliveryFetchQuery({ @@ -125,7 +125,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; + const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagingByUrlQuery({ config: clientConfig, request, @@ -136,7 +136,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest = { + const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { query: { skip: 10, limit: 5 }, }; const { inspect } = createDeliveryPagingByUrlQuery({ @@ -152,7 +152,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; const { inspect } = createDeliveryPagingByUrlQuery({ @@ -198,7 +198,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; + const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagingByTokenQuery({ config: clientConfig, request, @@ -209,7 +209,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest = { + const request: DeliveryRequest<{ readonly language: string }, never> = { query: { language: "en-us" }, }; const { inspect } = createDeliveryPagingByTokenQuery({ @@ -222,7 +222,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { + const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; const { inspect } = createDeliveryPagingByTokenQuery({ diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 70e4aa54..3c96eedb 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -1,14 +1,18 @@ -import { getDefaultHttpAdapter, getDefaultHttpService, getSdkIdHeader, type Header } from "@kontent-ai/core-sdk"; +import { + type ContinuationTokenHeaderName, + getDefaultHttpAdapter, + getDefaultHttpService, + getSdkIdHeader, + type Header, +} from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { createDeliveryClient } from "../../../lib/public_api.js"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { FullDeliveryClientSchema, WaitForLoadingNewContentHeaderName } from "../../../lib/models/core.models.js"; +import type { ItemsFeedQueryRequest } from "../../../lib/queries/content-items/items-feed-query.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; -type ListLanguagesConfig = Parameters["listLanguages"]>[0]; - -const waitingForLoadingNewContentHeader: Header = { name: "X-KC-Wait-For-Loading-New-Content", value: "true" }; - -async function captureRequestHeaders(listLanguagesConfig?: ListLanguagesConfig): Promise { +async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest): Promise { let captured: readonly Header[] = []; const client = createDeliveryClient({ @@ -24,7 +28,7 @@ async function captureRequestHeaders(listLanguagesConfig?: ListLanguagesConfig): }), }); - await client.listLanguages(listLanguagesConfig).fetchPageSafe(); + await client.itemsFeed(listConfig).fetchPageSafe(); return captured; } @@ -32,7 +36,7 @@ async function captureRequestHeaders(listLanguagesConfig?: ListLanguagesConfig): describe("Delivery tracking header", async () => { const expectedHeader = getSdkIdHeader({ name: "@kontent-ai/delivery-sdk", - version: "{{version}}", // macro is replaced by the version from package.json during build + version: "{{version}}", host: "npmjs.com", }); @@ -54,25 +58,6 @@ describe("Delivery tracking header", async () => { }); }); -describe("Bypass CDN cache header should be present when bypassCdnCache is true", async () => { - afterEach(() => { - vi.resetAllMocks(); - }); - - mockGlobalFetchJsonResponse({ - jsonResponse: {}, - statusCode: 200, - continuationToken: "x", - }); - - const requestHeaders = await captureRequestHeaders({ config: { bypassCdnCache: true } }); - - it("Request headers should contain bypass CDN cache header", () => { - const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); - expect(bypassCdnCacheHeader?.value).toEqual(waitingForLoadingNewContentHeader.value); - }); -}); - describe("Bypass CDN cache header should be absent by default", async () => { afterEach(() => { vi.resetAllMocks(); @@ -87,7 +72,9 @@ describe("Bypass CDN cache header should be absent by default", async () => { const requestHeaders = await captureRequestHeaders(); it("Request headers should NOT contain bypass CDN cache header", () => { - const bypassCdnCacheHeader = requestHeaders.find((header) => header.name === waitingForLoadingNewContentHeader.name); + const bypassCdnCacheHeader = requestHeaders.find( + (header) => header.name === ("X-KC-Wait-For-Loading-New-Content" satisfies WaitForLoadingNewContentHeaderName), + ); expect(bypassCdnCacheHeader).toBeUndefined(); }); }); @@ -109,6 +96,25 @@ describe("Extra headers should be present", async () => { it("Request headers should contain extra header", () => { const foundHeader = requestHeaders.find((header) => header.name === extraHeader.name); - expect(foundHeader?.value).toEqual("extra"); + expect(foundHeader?.value).toEqual(extraHeader.value); + }); +}); + +describe("Continuation header token should be present", async () => { + const continuationTokenValue = "x"; + const requestHeaders = await captureRequestHeaders({ headers: { "X-Continuation": continuationTokenValue } }); + + it("Request headers should contain continuation token header", () => { + const foundHeader = requestHeaders.find((header) => header.name === ("X-Continuation" satisfies ContinuationTokenHeaderName)); + expect(foundHeader?.value).toEqual(continuationTokenValue); + }); +}); + +describe("Continuation header token should be absent by default", async () => { + const requestHeaders = await captureRequestHeaders(); + + it("Request headers should NOT contain continuation token header", () => { + const foundHeader = requestHeaders.find((header) => header.name === ("X-Continuation" satisfies ContinuationTokenHeaderName)); + expect(foundHeader).toBeUndefined(); }); }); From 4eb0aa71875062b346bf1ea2234832e240b83ee2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 22 Apr 2026 15:25:55 +0200 Subject: [PATCH 101/221] Remove deprecated header and export new types --- lib/models/request.models.ts | 1 - lib/public_api.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 9683f32c..09c275b7 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -26,7 +26,6 @@ export type DeliveryRequestWithTokenPaging< TFilters extends readonly Filter[], > = DeliveryRequest & { readonly headers?: { - readonly "X-KC-Wait-For-Loading-New-Content"?: boolean; readonly "X-Continuation"?: string; }; }; diff --git a/lib/public_api.ts b/lib/public_api.ts index 6926878e..8d3f3969 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -13,6 +13,8 @@ export type { export type { EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; // Pagination export type { PaginationSchema, PaginationSchemaWithTotalCount } from "./models/pagination.models.js"; +// Request config +export type { DeliveryRequestConfig } from "./models/request.models.js"; // Content Items export { type ContentItemElementPayload, @@ -20,10 +22,12 @@ export { type ContentItemSystemPayload, elementSchemas, type FetchContentItemPayload, + type ItemsFeedPayload, type ItemsReferencingAssetPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; +export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { ItemsReferencingAssetQuery, ItemsReferencingAssetQueryRequest, @@ -35,6 +39,10 @@ export { type ContentTypePayload, ListContentTypesPayload, } from "./queries/content-types/content-type.models.js"; +export type { + FetchContentTypeElementQuery, + FetchContentTypeElementQueryRequest, +} from "./queries/content-types/fetch-content-type-element-query.js"; export { type FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; // Languages From 51e39352dba14506ff9f331f66bbc8de43d8cc6a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 22 Apr 2026 15:46:59 +0200 Subject: [PATCH 102/221] Make schema helpers non-exported --- lib/queries/content-items/content-item.models.ts | 4 ++-- lib/queries/taxonomies/taxonomy.models.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 05f6cce3..d2cca4e3 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -167,7 +167,7 @@ const contentItemSystemSchemaBase = (schem workflow_step: getCodenameSchema(schema?.workflowStepCodenames), }); -export const contentItemSystemSchema = (schema: TSchema | undefined) => +const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ ...contentItemSystemSchemaBase(schema).shape, @@ -175,7 +175,7 @@ export const contentItemSystemSchema = (sc }) .readonly(); -export const contentItemSchema = (schema: TSchema | undefined) => +const contentItemSchema = (schema: TSchema | undefined) => z .object({ system: contentItemSystemSchema(schema), diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index fd29d1e9..b28d1364 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; -export const taxonomyTermPayload = (schema: TSchema | undefined) => +const taxonomyTermPayload = (schema: TSchema | undefined) => z.object({ name: z.string(), codename: getCodenameSchema(schema?.taxonomyCodenames), From b11194772eacbdf345d46be6ed070304f8bd4a79 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 11:21:47 +0200 Subject: [PATCH 103/221] updates deps, naming and refactors base url --- .env.template | 3 +- lib/models/filter.models.ts | 40 ++++++------------- lib/models/pagination.models.ts | 4 +- lib/models/request.models.ts | 2 - lib/public_api.ts | 7 +++- lib/queries/delivery-queries.ts | 4 +- lib/utils/paging.utils.ts | 4 +- lib/utils/url.utils.ts | 16 ++++---- package.json | 2 +- pnpm-lock.yaml | 10 ++--- tests/integration-tests.config.ts | 9 +++-- .../unit/api-mode/custom-base-url-api.spec.ts | 5 ++- tests/unit/paging/paging.utils.spec.ts | 6 +-- tests/unit/utils/url-utils.spec.ts | 14 +++---- tests/utils/test.utils.ts | 8 ---- 15 files changed, 59 insertions(+), 75 deletions(-) diff --git a/.env.template b/.env.template index 2b8f8e66..ae9a6dbe 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,5 @@ # Name of Kontent.ai project: SDK Integration tests INTEGRATION_ENVIRONMENT_ID=6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b -INTEGRATION_DELIVERY_BASE_URL=x +# INTEGRATION_DELIVERY_HOST=deliver.kontent.ai +# INTEGRATION_DELIVERY_PROTOCOL=https diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index 61127edf..f42df206 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,5 +1,5 @@ -export const emptyRichtextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; -export const operatorToFilterOp: Record = { +export const emptyRichTextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; +export const operatorToFilterOp: Record = { isEmptyRichText: "eq", isNotEmptyRichText: "neq", }; @@ -7,42 +7,28 @@ export const operatorToFilterOp: Record export type ObjectFilter = { readonly property: FilterProperty; readonly value: string | number | boolean | undefined | string[]; - readonly operator: SpecialFilterOperators | FilterOperators; + readonly operator: SpecialFilterOperator | FilterOperator; }; -export type EmptyRichtextFilter = { +export type EmptyRichTextFilter = { readonly property: `elements.${TElementProperties}`; - readonly operator: EmptyRichtextOperator; + readonly operator: EmptyRichTextOperator; readonly value?: never; }; export type Filter = | ObjectFilter - | EmptyRichtextFilter - | FullFilterQuery; + | EmptyRichTextFilter + | SystemOrElementsFilterQuery; -type SpecialFilterOperators = "=" | "!="; -type EmptyRichtextOperator = (typeof emptyRichtextOperators)[number]; +type SpecialFilterOperator = "=" | "!="; +type EmptyRichTextOperator = (typeof emptyRichTextOperators)[number]; -type FilterOperators = - | "eq" - | "neq" - | "empty" - | "nempty" - | "lt" - | "lte" - | "gt" - | "gte" - | "range" - | "in" - | "nin" - | "contains" - | "any" - | "all"; +type FilterOperator = "eq" | "neq" | "empty" | "nempty" | "lt" | "lte" | "gt" | "gte" | "range" | "in" | "nin" | "contains" | "any" | "all"; -type FullFilterQuery = - | `system.${TSystemProperties}[${FilterOperators}]=${string}` - | `elements.${TElementProperties}[${FilterOperators}]=${string}`; +type SystemOrElementsFilterQuery = + | `system.${TSystemProperties}[${FilterOperator}]=${string}` + | `elements.${TElementProperties}[${FilterOperator}]=${string}`; type FilterProperty = | `system.${TSystemProperties}` diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index ad042708..a2f439f3 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -20,5 +20,5 @@ export const paginationSchemaWithTotalCount = z.object({ .readonly(), }); -export type PaginationSchema = Readonly>; -export type PaginationSchemaWithTotalCount = Readonly>; +export type PaginationPayload = Readonly>; +export type PaginationWithTotalCountPayload = Readonly>; diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 09c275b7..79660d07 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -77,5 +77,3 @@ export type ElementOrderQueryParam = `elements * `elements=title,summary,related_articles` */ export type ElementSelectionQueryParam = readonly TElementCodenames[]; - -export type ExtractString = T extends string ? (string extends T ? never : T) : never; diff --git a/lib/public_api.ts b/lib/public_api.ts index 8d3f3969..b7885aee 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -10,9 +10,12 @@ export type { WaitForLoadingNewContentHeaderName, } from "./models/core.models.js"; // Filters -export type { EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; +export type { EmptyRichTextFilter as EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; // Pagination -export type { PaginationSchema, PaginationSchemaWithTotalCount } from "./models/pagination.models.js"; +export type { + PaginationPayload as PaginationSchema, + PaginationWithTotalCountPayload as PaginationSchemaWithTotalCount, +} from "./models/pagination.models.js"; // Request config export type { DeliveryRequestConfig } from "./models/request.models.js"; // Content Items diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index f43551ce..ae5fe8ad 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -12,7 +12,7 @@ import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, DeliveryMetadata } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; -import type { PaginationSchema } from "../models/pagination.models.js"; +import type { PaginationPayload } from "../models/pagination.models.js"; import type { DeliveryRequest, QueryParameterRecord } from "../models/request.models.js"; import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; @@ -20,7 +20,7 @@ import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; type DefaultDeliveryRequest = DeliveryRequest[]>; -export function createDeliveryPagingByUrlQuery({ +export function createDeliveryPagingByUrlQuery({ config, schema, endpoint, diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index c7c4a6a1..21fbe8e8 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,7 +1,7 @@ import type { ExtractNextPageDataFn, JsonValue } from "@kontent-ai/core-sdk"; -import type { PaginationSchema } from "../models/pagination.models.js"; +import type { PaginationPayload } from "../models/pagination.models.js"; -export function getNextPageByUrl(): ExtractNextPageDataFn { +export function getNextPageByUrl(): ExtractNextPageDataFn { return (response) => { return { continuationToken: undefined, diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 088c5c15..233c3fec 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -2,8 +2,8 @@ import { type BaseUrl, getEndpointUrl } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; import { - type EmptyRichtextFilter, - emptyRichtextOperators, + type EmptyRichTextFilter, + emptyRichTextOperators, type Filter, type ObjectFilter, operatorToFilterOp, @@ -41,26 +41,26 @@ export function addQueryParametersToUrl( return `${url}${url.includes("?") ? "&" : "?"}${searchParams.toString()}`; } -export function isEmptyRichtextFilter(value: unknown): value is EmptyRichtextFilter { +export function isEmptyRichTextFilter(value: unknown): value is EmptyRichTextFilter { if (typeof value !== "object" || value === null || value === undefined) { return false; } - if (!(("operator" satisfies keyof EmptyRichtextFilter) in value)) { + if (!(("operator" satisfies keyof EmptyRichTextFilter) in value)) { return false; } - return emptyRichtextOperators.some((operator) => operator === value.operator); + return emptyRichTextOperators.some((operator) => operator === value.operator); } function getDefaultBaseUrlForApiMode(apiMode: ApiMode): BaseUrl { if (apiMode === "preview") { - return "https://preview-deliver.kontent.ai"; + return { protocol: "https", host: "preview-deliver.kontent.ai" }; } // Both "public" and "secure" modes use the same base URL. // Secure mode is distinguished by the Authorization header, not a different endpoint. - return "https://deliver.kontent.ai"; + return { protocol: "https", host: "deliver.kontent.ai" }; } function getUrlSearchParams( @@ -103,7 +103,7 @@ function getFilterParams(filters: readonly Filter[] | undefined) match(filter) .returnType() // Special case for "isEmptyRichText" operator - .when(isEmptyRichtextFilter, (filter) => [[`${filter.property}[${operatorToFilterOp[filter.operator]}]`, "


"]]) + .when(isEmptyRichTextFilter, (filter) => [[`${filter.property}[${operatorToFilterOp[filter.operator]}]`, "


"]]) .when(isQueryFilter, (filter) => { if (!filterHasDefinedValue(filter)) { return []; diff --git a/package.json b/package.json index 9dce8879..40f1952e 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.27", + "@kontent-ai/core-sdk": "^12.0.0-preview.28", "ts-pattern": "^5", "zod": "^4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e45acc8..28a8f295 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.27 - version: 12.0.0-preview.27(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.28 + version: 12.0.0-preview.28(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -380,8 +380,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.27': - resolution: {integrity: sha512-DvKLj2DZdiDpO7dmABPGYxV1aZ25MckxSvR0nTzPd0ul0MGaFq/u2sFTmp3VnPx/ZQvz1/IkiFVrKjoPUbQbkw==} + '@kontent-ai/core-sdk@12.0.0-preview.28': + resolution: {integrity: sha512-JDFBcATBeLI/Tf4hTu+9APGSlLBOJVoGQPiIoc8mRksDb8Jj9sb63hxCZk8ryOOnVLvobmDgG0A+a1xPbF0vrg==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -1963,7 +1963,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.12 - '@kontent-ai/core-sdk@12.0.0-preview.27(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.28(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 diff --git a/tests/integration-tests.config.ts b/tests/integration-tests.config.ts index d8504168..db6f58e4 100644 --- a/tests/integration-tests.config.ts +++ b/tests/integration-tests.config.ts @@ -4,18 +4,21 @@ import { loadEnvFile } from "node:process"; import { fileURLToPath } from "node:url"; import type { BaseUrl } from "@kontent-ai/core-sdk"; import { getEnvironmentOptionalValue, getEnvironmentRequiredValue } from "@kontent-ai/core-sdk/devkit"; -import { isBaseUrl } from "./utils/test.utils.js"; export function getIntegrationTestConfig() { loadEnvironmentVariables(); - const baseUrl = getEnvironmentOptionalValue("INTEGRATION_DELIVERY_BASE_URL"); + + const host = getEnvironmentOptionalValue("INTEGRATION_DELIVERY_HOST"); + const protocol = getEnvironmentOptionalValue("INTEGRATION_DELIVERY_PROTOCOL"); + + const deliveryBaseUrl: BaseUrl | undefined = host ? { protocol: protocol === "http" ? "http" : "https", host } : undefined; const integrationEnv: { readonly id: string; readonly deliveryBaseUrl: BaseUrl | undefined; } = { id: getEnvironmentRequiredValue("INTEGRATION_ENVIRONMENT_ID"), - deliveryBaseUrl: isBaseUrl(baseUrl) ? baseUrl : undefined, + deliveryBaseUrl, } as const; return { diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts index 51b333ff..691c9291 100644 --- a/tests/unit/api-mode/custom-base-url-api.spec.ts +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -1,10 +1,11 @@ +import type { BaseUrl } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, it } from "vitest"; import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; describe("Custom base URL API", async () => { - const customBaseUrl = "https://domain.com"; + const customBaseUrl: BaseUrl = { protocol: "https", host: "domain.com" }; const query = createDeliveryClient({ apiMode: "public", @@ -21,6 +22,6 @@ describe("Custom base URL API", async () => { it("URL should point to custom base URL", () => { const { origin } = new URL(response?.meta?.url ?? "n/a"); - expect(origin).toEqual(customBaseUrl); + expect(origin).toEqual(`${customBaseUrl.protocol}://${customBaseUrl.host}`); }); }); diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts index e524a4b4..2e410d64 100644 --- a/tests/unit/paging/paging.utils.spec.ts +++ b/tests/unit/paging/paging.utils.spec.ts @@ -1,11 +1,11 @@ import type { QueryResponse } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; -import type { PaginationSchema } from "../../../lib/models/pagination.models.js"; +import type { PaginationPayload } from "../../../lib/models/pagination.models.js"; import { getNextPageByUrl } from "../../../lib/utils/paging.utils.js"; describe("Paging utils", () => { it("Next page URL should be returned", () => { - const response: QueryResponse = { + const response: QueryResponse = { meta: { status: 200, responseHeaders: [], @@ -22,7 +22,7 @@ describe("Paging utils", () => { }, }; - const result = getNextPageByUrl()(response); + const result = getNextPageByUrl()(response); expect(result).toEqual({ continuationToken: undefined, diff --git a/tests/unit/utils/url-utils.spec.ts b/tests/unit/utils/url-utils.spec.ts index 33b7b987..c2702711 100644 --- a/tests/unit/utils/url-utils.spec.ts +++ b/tests/unit/utils/url-utils.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { addQueryParametersToUrl, isEmptyRichtextFilter } from "../../../lib/utils/url.utils.js"; +import { addQueryParametersToUrl, isEmptyRichTextFilter } from "../../../lib/utils/url.utils.js"; describe("addQueryParametersToUrl", () => { const baseUrl = "https://deliver.kontent.ai/xyz/languages"; @@ -54,26 +54,26 @@ describe("addQueryParametersToUrl", () => { describe("isEmptyRichtextFilter", () => { it("returns true for object with isEmptyRichText operator", () => { - expect(isEmptyRichtextFilter({ property: "elements.description", operator: "isEmptyRichText" })).toBe(true); + expect(isEmptyRichTextFilter({ property: "elements.description", operator: "isEmptyRichText" })).toBe(true); }); it("returns true for object with isNotEmptyRichText operator", () => { - expect(isEmptyRichtextFilter({ property: "elements.description", operator: "isNotEmptyRichText" })).toBe(true); + expect(isEmptyRichTextFilter({ property: "elements.description", operator: "isNotEmptyRichText" })).toBe(true); }); it("returns false for object with a different operator", () => { - expect(isEmptyRichtextFilter({ property: "elements.description", operator: "eq", value: "test" })).toBe(false); + expect(isEmptyRichTextFilter({ property: "elements.description", operator: "eq", value: "test" })).toBe(false); }); it("returns false for object missing operator", () => { - expect(isEmptyRichtextFilter({ property: "elements.description" })).toBe(false); + expect(isEmptyRichTextFilter({ property: "elements.description" })).toBe(false); }); it("returns false for null", () => { - expect(isEmptyRichtextFilter(null)).toBe(false); + expect(isEmptyRichTextFilter(null)).toBe(false); }); it("returns false for a string", () => { - expect(isEmptyRichtextFilter("elements.description[eq]=test")).toBe(false); + expect(isEmptyRichTextFilter("elements.description[eq]=test")).toBe(false); }); }); diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index aec94b96..0cb4d56a 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -1,5 +1,4 @@ import { - type BaseUrl, type ContinuationTokenHeaderName, type FetchQuery, type Header, @@ -20,13 +19,6 @@ export function getFakeUuid(): string { return nilUuid; } -export function isBaseUrl(url: string | undefined): url is BaseUrl { - if (!url) { - return false; - } - return url.toLowerCase().startsWith("https://") || url.toLowerCase().startsWith("http://"); -} - export function isFetchQueryWithExpectedFunctions(query: unknown): query is FetchQuery { type ExpectedFunctions = keyof FetchQuery; if (!query || typeof query !== "object") { From 36c4d8f993526996c91c4f3c04bda3c3f740d6e0 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:16:29 +0200 Subject: [PATCH 104/221] Switch to tsgo for TypeScript builds and bump deps --- package.json | 12 +- pnpm-lock.yaml | 859 +++++++++++++++++++++++++++---------------------- 2 files changed, 475 insertions(+), 396 deletions(-) diff --git a/package.json b/package.json index 40f1952e..3e78d7fd 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,12 @@ "prepublishOnly": "pnpm run build", "eslint": "eslint -c eslint.config.mjs .", "lint": "pnpm run biome:check && pnpm run eslint", - "build": "pnpm run lint && pnpm run build:noemit && pnpm run clean && tsc --p tsconfig.build.json && pnpm run update:version", - "build:noemit": "tsc --p tsconfig.json", + "build": "pnpm run lint && pnpm run clean && pnpm run build:ts && pnpm run update:version", + "build:ts": "tsgo -p tsconfig.build.json", "test": "vitest run --config=vitest.config.ts --coverage", "test:unit": "vitest run --config=vitest-unit.config.ts", "test:integration": "vitest run --config=vitest-integration.config.ts", - "test:types": "tsc --p tests/types/tsconfig.json", + "test:types": "tsgo -p tests/types/tsconfig.json", "biome:check": "biome check", "biome:fix": "biome check --write", "biome:fix:unsafe": "biome check --write --unsafe", @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.28", + "@kontent-ai/core-sdk": "^12.0.0-preview.29", "ts-pattern": "^5", "zod": "^4" }, @@ -52,9 +52,9 @@ "eslint": "10.2.1", "@biomejs/biome": "2.4.12", "@types/node": "25.6.0", - "typescript": "6.0.3", "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", - "tsx": "4.21.0" + "tsx": "4.21.0", + "@typescript/native-preview": "7.0.0-dev.20260423.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28a8f295..7648505a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.28 - version: 12.0.0-preview.28(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.29 + version: 12.0.0-preview.29(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -30,6 +30,9 @@ importers: '@types/node': specifier: 25.6.0 version: 25.6.0 + '@typescript/native-preview': + specifier: 7.0.0-dev.20260423.1 + version: 7.0.0-dev.20260423.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) @@ -39,12 +42,9 @@ importers: tsx: specifier: 4.21.0 version: 4.21.0 - typescript: - specifier: 6.0.3 - version: 6.0.3 vitest: specifier: 4.1.5 - version: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + version: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) packages: @@ -126,167 +126,167 @@ packages: cpu: [x64] os: [win32] - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -349,12 +349,16 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -380,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.28': - resolution: {integrity: sha512-JDFBcATBeLI/Tf4hTu+9APGSlLBOJVoGQPiIoc8mRksDb8Jj9sb63hxCZk8ryOOnVLvobmDgG0A+a1xPbF0vrg==} + '@kontent-ai/core-sdk@12.0.0-preview.29': + resolution: {integrity: sha512-xckUbVQivtDYZ1bPmTsS6bLkrT9uyWZd5E+3e0iLDDMCGibBBW6oDsBdPZrmdnOoGieF61Z9eBZN3JObeQyI7Q==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -390,112 +394,112 @@ packages: '@kontent-ai/eslint-config@2.4.1': resolution: {integrity: sha512-4tIyNDDIxeYaPK17lMN00Ch1kqNbayLmrV+/tcia62XzCejR/cHcXcsWVGhmxS1RjyVpqhstnTWbUrcvmXge2Q==} - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - '@rolldown/binding-android-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.12': - resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': - resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} - engines: {node: '>=14.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -521,65 +525,112 @@ packages: '@types/node@25.6.0': resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} - '@typescript-eslint/eslint-plugin@8.58.0': - resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} + '@typescript-eslint/eslint-plugin@8.59.0': + resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.0 + '@typescript-eslint/parser': ^8.59.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.0': - resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} + '@typescript-eslint/parser@8.59.0': + resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.0': - resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} + '@typescript-eslint/project-service@8.59.0': + resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.0': - resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} + '@typescript-eslint/scope-manager@8.59.0': + resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.0': - resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} + '@typescript-eslint/tsconfig-utils@8.59.0': + resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.0': - resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} + '@typescript-eslint/type-utils@8.59.0': + resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.0': - resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} + '@typescript-eslint/types@8.59.0': + resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.0': - resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} + '@typescript-eslint/typescript-estree@8.59.0': + resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.0': - resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} + '@typescript-eslint/utils@8.59.0': + resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.0': - resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} + '@typescript-eslint/visitor-keys@8.59.0': + resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-wbLr6o5fROaCYt6cOpFhbe92FJAOdhAHwm/s8I/IyN5HbL1ULgel/wHaZiR+ws+27rgruNUiCENzTUg9vSz2bA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-13MpNT+4MgkgrfiW2u03rnER5aB3yz9fA0bWEYh6IH3rIqA2AR3Dntp3QXW4sQrZf0SriXqHe2R7X3HCT5xmqA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-ICIkJDTqmn0R4Vs811+Ht2RYTk1OCrAhHCu0JthmhR216T1Tqgi5DWRoCprp3RL1qU6fLnxxrIpEbNlNN7XFYA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-CxUA15qbPQRvz2nanBpiv1h4tgXTCJJwqOtgKMSdIuPkow8dyYW3ba5oLoH/jZhS4792XislX659hlFrfiU6CQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-cWLFS4R8dOU1YuUJ/2VLeGMVIjgI3GGb/f9rRY5MbWHq5l3NNZh8y1QwAOrTh3+g3q6+znArfxVnD2hZHUz8Mw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-OWaGUI4+dHqYZv+k6sITx9Y27FNy3XzNFk4OrOiYtBkIO/xrb9TPMP4A5XI4n5zwRLIv3xne9g039xgRbaeyoQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-5MQjO/qdLwXpjW7Dy/1lNv7Vtpvo6bhCkbjan4PoRN5/eeyqEqDWxdf8AGE4btLmHqyIjEHRuYf7kp2tlAr6lQ==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@typescript/native-preview@7.0.0-dev.20260423.1': + resolution: {integrity: sha512-9WD7TJJlGvt9PQqJI/+44dVP4oqGQFIkYrpXt7nlQ0WgNIErN52x/XhxmJ4nWft06qejgPiUbPo4aYRNOmIHXg==} + engines: {node: '>=16.20.0'} + hasBin: true + '@vitest/coverage-v8@4.1.5': resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} peerDependencies: @@ -688,8 +739,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} @@ -699,8 +750,8 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -780,8 +831,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - es-abstract@1.24.1: - resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -792,8 +843,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.1: - resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} + es-iterator-helpers@1.3.2: + resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} engines: {node: '>= 0.4'} es-module-lexer@2.0.0: @@ -815,8 +866,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -969,8 +1020,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -1011,8 +1062,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} html-escaper@2.0.2: @@ -1383,8 +1434,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1421,13 +1472,13 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-push-apply@1.0.0: @@ -1467,8 +1518,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -1493,8 +1544,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -1534,12 +1585,12 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} tinyrainbow@3.1.0: @@ -1598,14 +1649,14 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite@8.0.3: - resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==} + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 '@vitejs/devtools': ^0.1.0 - esbuild: ^0.27.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -1771,98 +1822,98 @@ snapshots: '@biomejs/cli-win32-x64@2.4.12': optional: true - '@emnapi/core@1.9.1': + '@emnapi/core@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.0 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.4': + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/android-arm64@0.27.4': + '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm@0.27.4': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-x64@0.27.4': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-x64@0.27.4': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/linux-arm64@0.27.4': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm@0.27.4': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-ia32@0.27.4': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-loong64@0.27.4': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.27.4': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-x64@0.27.4': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.27.4': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.27.4': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.27.4': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.27.4': + '@esbuild/win32-x64@0.27.7': optional: true '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': @@ -1939,13 +1990,18 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -1963,15 +2019,15 @@ snapshots: dependencies: '@biomejs/biome': 2.4.12 - '@kontent-ai/core-sdk@12.0.0-preview.28(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.29(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.1)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -1979,66 +2035,65 @@ snapshots: - supports-color - typescript - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.127.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.12': + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true - '@rolldown/pluginutils@1.0.0-rc.12': {} + '@rolldown/pluginutils@1.0.0-rc.17': {} '@standard-schema/spec@1.1.0': {} @@ -2064,14 +2119,14 @@ snapshots: dependencies: undici-types: 7.19.2 - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.1)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/parser': 8.59.0(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -2080,41 +2135,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.2.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 - eslint: 9.39.4 + eslint: 10.2.1 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.3) - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.0': + '@typescript-eslint/scope-manager@8.59.0': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 - '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.0(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.58.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -2122,39 +2177,70 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.0': {} + '@typescript-eslint/types@8.59.0': {} - '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.3) - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.0(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.0 + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) eslint: 9.39.4 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.0': + '@typescript-eslint/visitor-keys@8.59.0': dependencies: - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-linux-arm@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-linux-x64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview-win32-x64@7.0.0-dev.20260423.1': + optional: true + + '@typescript/native-preview@7.0.0-dev.20260423.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260423.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260423.1 + '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -2165,9 +2251,9 @@ snapshots: istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 4.0.0 + std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + vitest: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) '@vitest/expect@4.1.5': dependencies: @@ -2178,13 +2264,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0))': + '@vitest/mocker@4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0) '@vitest/pretty-format@4.1.5': dependencies: @@ -2236,10 +2322,10 @@ snapshots: array-includes@3.1.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -2247,41 +2333,41 @@ snapshots: array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -2304,7 +2390,7 @@ snapshots: balanced-match@4.0.4: {} - brace-expansion@1.1.13: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -2318,7 +2404,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -2403,12 +2489,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - es-abstract@1.24.1: + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 @@ -2427,7 +2513,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -2445,7 +2531,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -2464,12 +2550,12 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.3.1: + es-iterator-helpers@1.3.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -2482,7 +2568,6 @@ snapshots: internal-slot: 1.1.0 iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - safe-array-concat: 1.1.3 es-module-lexer@2.0.0: {} @@ -2495,11 +2580,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -2507,34 +2592,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.4: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 escape-string-regexp@4.0.0: {} @@ -2545,10 +2630,10 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.1 + es-iterator-helpers: 1.3.2 eslint: 9.39.4 estraverse: 5.3.0 - hasown: 2.0.2 + hasown: 2.0.3 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 @@ -2586,7 +2671,7 @@ snapshots: '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -2623,7 +2708,7 @@ snapshots: '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -2719,11 +2804,11 @@ snapshots: function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -2740,7 +2825,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -2754,7 +2839,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2789,7 +2874,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -2809,12 +2894,12 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 @@ -2839,7 +2924,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -2884,7 +2969,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} @@ -3055,7 +3140,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.13 + brace-expansion: 1.1.14 ms@2.1.3: {} @@ -3078,7 +3163,7 @@ snapshots: object.assign@4.1.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -3087,21 +3172,21 @@ snapshots: object.entries@1.1.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 object.values@1.2.1: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -3149,7 +3234,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.8: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -3169,9 +3254,9 @@ snapshots: reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -3180,7 +3265,7 @@ snapshots: regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-errors: 1.3.0 get-proto: 1.0.1 @@ -3200,33 +3285,30 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rolldown@1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1): + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 call-bound: 1.0.4 get-intrinsic: 1.3.0 has-symbols: 1.1.0 @@ -3275,7 +3357,7 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -3299,7 +3381,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -3309,7 +3391,7 @@ snapshots: stackback@0.0.2: {} - std-env@4.0.0: {} + std-env@4.1.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -3318,10 +3400,10 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -3335,28 +3417,28 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.1 + es-abstract: 1.24.2 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -3370,9 +3452,9 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.0.4: {} + tinyexec@1.1.1: {} - tinyglobby@0.2.15: + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -3390,8 +3472,8 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.4 - get-tsconfig: 4.13.7 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -3407,7 +3489,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -3416,7 +3498,7 @@ snapshots: typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 @@ -3425,7 +3507,7 @@ snapshots: typed-array-length@1.0.7: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 @@ -3447,26 +3529,23 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0): + vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.8 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - tinyglobby: 0.2.15 + postcss: 8.5.10 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.6.0 - esbuild: 0.27.4 + esbuild: 0.27.7 fsevents: 2.3.3 tsx: 4.21.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - vitest@4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)): + vitest@4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0)) + '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -3478,12 +3557,12 @@ snapshots: obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 4.0.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.6.0)(esbuild@0.27.4)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.6.0 @@ -3525,7 +3604,7 @@ snapshots: which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 From 33fdad0a5f59b6b5846843765e17dc2276cf69d3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:18:03 +0200 Subject: [PATCH 105/221] Updates sdk config --- lib/models/core.models.ts | 9 +++++---- lib/public_api.ts | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 26d43281..b566c1d3 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -41,8 +41,8 @@ export type DeliveryMetadata = unknown; export type ApiMode = "public" | "preview" | "secure"; -export type DeliveryClientConfig = SdkConfig & - ApiDeliveryClientConfig & { +export type DeliveryClientConfig = SdkConfig< + DeliveryApiConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. */ @@ -58,9 +58,10 @@ export type DeliveryClientConfig; -export type ApiDeliveryClientConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; +export type DeliveryApiConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; export type DeliveryClientConfigWithSchema = DeliveryClientConfig & { readonly schema: TSchema; diff --git a/lib/public_api.ts b/lib/public_api.ts index b7885aee..168f2ba7 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -1,8 +1,8 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the public API is fine export { createDeliveryClient } from "./client/delivery-client.js"; export type { - ApiDeliveryClientConfig, ApiMode, + DeliveryApiConfig as ApiDeliveryClientConfig, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, From 7253246f373dd25bc89f5fa5b39a86daed655c53 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:25:41 +0200 Subject: [PATCH 106/221] naming improvements --- lib/client/delivery-client.ts | 4 +-- lib/models/core.models.ts | 11 +++--- lib/models/filter.models.ts | 2 +- lib/models/pagination.models.ts | 4 +-- lib/public_api.ts | 2 +- .../content-items/content-item.models.ts | 4 +-- lib/queries/content-items/items-feed-query.ts | 4 +-- .../items-referencing-asset-query.ts | 4 +-- .../content-items/list-content-items-query.ts | 4 +-- .../content-types/list-content-types-query.ts | 4 +-- lib/queries/delivery-queries.ts | 16 ++++----- lib/queries/languages/list-languages-query.ts | 4 +-- .../taxonomies/list-taxonomies-query.ts | 4 +-- lib/utils/url.utils.ts | 10 +++--- .../delivery-query/delivery-queries.spec.ts | 34 ++++++++----------- tests/unit/headers/headers.spec.ts | 4 +-- tests/utils/integration-test.utils.ts | 14 ++++---- 17 files changed, 65 insertions(+), 64 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 7c75710a..a234a612 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,4 @@ -import type { DeliveryClient, DeliveryClientConfig, FullDeliveryClientSchema } from "../models/core.models.js"; +import type { DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig } from "../models/core.models.js"; import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; import { type ItemsFeedQueryRequest, itemsFeedQuery } from "../queries/content-items/items-feed-query.js"; import { @@ -42,7 +42,7 @@ import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries * environmentId: "x", * }); */ -export function createDeliveryClient( +export function createDeliveryClient( config: DeliveryClientConfig, ): DeliveryClient { return { diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index b566c1d3..ebe4476d 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -17,7 +17,7 @@ import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/t import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; import type { DeliverySdkError } from "./error.models.js"; -export type FullDeliveryClientSchema = { +export type DefaultDeliveryClientSchema = { readonly languageCodenames: readonly string[]; readonly taxonomyCodenames: readonly string[]; readonly contentTypeCodenames: readonly string[]; @@ -27,7 +27,7 @@ export type FullDeliveryClientSchema = { readonly workflowStepCodenames: readonly string[]; }; -export type DeliveryClientSchema = { +export type DeliveryClientSchema = { readonly languageCodenames: TSchema["languageCodenames"]; readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; @@ -37,11 +37,14 @@ export type DeliveryClientSchema = SdkConfig< +export type DeliveryClientConfig = SdkConfig< DeliveryApiConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. @@ -86,7 +89,7 @@ export type DeliveryFetchQuery = FetchQuery = PagedFetchQuery; -export type DeliveryEndpoints = +export type DeliveryEndpoint = | "languages" | "items" | `items/${string}` diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index f42df206..efe2bb89 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,5 +1,5 @@ export const emptyRichTextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; -export const operatorToFilterOp: Record = { +export const emptyRichTextToFilterOperator: Record = { isEmptyRichText: "eq", isNotEmptyRichText: "neq", }; diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index a2f439f3..01551e90 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -11,7 +11,7 @@ export const paginationSchema = z.object({ pagination: paginationObjectSchema.readonly(), }); -export const paginationSchemaWithTotalCount = z.object({ +export const paginationWithTotalCountSchema = z.object({ pagination: z .object({ ...paginationObjectSchema.shape, @@ -21,4 +21,4 @@ export const paginationSchemaWithTotalCount = z.object({ }); export type PaginationPayload = Readonly>; -export type PaginationWithTotalCountPayload = Readonly>; +export type PaginationWithTotalCountPayload = Readonly>; diff --git a/lib/public_api.ts b/lib/public_api.ts index 168f2ba7..b2ed2b76 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,11 +2,11 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, + DefaultDeliveryClientSchema as FullDeliveryClientSchema, DeliveryApiConfig as ApiDeliveryClientConfig, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, - FullDeliveryClientSchema, WaitForLoadingNewContentHeaderName, } from "./models/core.models.js"; // Filters diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index d2cca4e3..36bfd26f 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -1,7 +1,7 @@ import { getCodenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchemaWithTotalCount } from "../../models/pagination.models.js"; +import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; const multipleChoiceOptionSchema = z .object({ @@ -190,7 +190,7 @@ export const listContentItemsPayload = (sc .object({ items: z.array(contentItemSchema(schema)).readonly(), modular_content: z.record(z.string(), contentItemSchema(schema)), - ...paginationSchemaWithTotalCount.shape, + ...paginationWithTotalCountSchema.shape, }) .readonly(); diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index b754490c..ffcc2fd4 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -6,7 +6,7 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; +import { createPagedByTokenQuery } from "../delivery-queries.js"; import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; @@ -47,7 +47,7 @@ export function itemsFeedQuery( config: DeliveryClientConfig, request?: ItemsFeedQueryRequest, ): ItemsFeedQuery { - return createDeliveryPagingByTokenQuery({ + return createPagedByTokenQuery({ config, request, schema: itemsFeedPayload(config.schema), diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index a756ff9b..3e10ed5d 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; -import { createDeliveryPagingByTokenQuery } from "../delivery-queries.js"; +import { createPagedByTokenQuery } from "../delivery-queries.js"; import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetPayload } from "./content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< @@ -22,7 +22,7 @@ export function itemsReferencingAssetQuery config: DeliveryClientConfig, request: ItemsReferencingAssetQueryRequest, ): ItemsReferencingAssetQuery { - return createDeliveryPagingByTokenQuery({ + return createPagedByTokenQuery({ config, request, schema: itemsReferencingAssetPayload(config.schema), diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 9241f69a..adac77bc 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -6,7 +6,7 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; +import { createPagedByUrlQuery } from "../delivery-queries.js"; import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; @@ -54,7 +54,7 @@ export function listContentItemsQuery( config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { - return createDeliveryPagingByUrlQuery({ + return createPagedByUrlQuery({ config, request, schema: listContentItemsPayload(config.schema), diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 5f4e868f..51076597 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; +import { createPagedByUrlQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; @@ -21,7 +21,7 @@ export function listContentTypesQuery( config: DeliveryClientConfig, request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { - return createDeliveryPagingByUrlQuery({ + return createPagedByUrlQuery({ config, request, schema: listContentTypesPayload(config.schema), diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index ae5fe8ad..2e711cdf 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -9,7 +9,7 @@ import { } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoints, DeliveryMetadata } from "../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoint, DeliveryMetadata } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; import type { PaginationPayload } from "../models/pagination.models.js"; @@ -20,7 +20,7 @@ import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; type DefaultDeliveryRequest = DeliveryRequest[]>; -export function createDeliveryPagingByUrlQuery({ +export function createPagedByUrlQuery({ config, schema, endpoint, @@ -29,7 +29,7 @@ export function createDeliveryPagingByUrlQuery; readonly schema: ZodType; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), @@ -37,7 +37,7 @@ export function createDeliveryPagingByUrlQuery({ +export function createPagedByTokenQuery({ config, schema, endpoint, @@ -46,7 +46,7 @@ export function createDeliveryPagingByTokenQuery({ readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), @@ -63,7 +63,7 @@ export function createDeliveryFetchQuery({ readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; }): FetchQuery { return createFetchQuery( getSharedRequestData({ config, endpoint, schema: schema, request }), @@ -78,7 +78,7 @@ function getSharedRequestData({ }: { readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; readonly schema: ZodType; }): Pick< FetchQueryRequest, @@ -106,7 +106,7 @@ function getUrl({ }: { readonly request: DefaultDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; }): string { return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request?.query, request?.filters); } diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index fdaf0eb6..02ca5cbb 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; +import { createPagedByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; @@ -18,7 +18,7 @@ export function listLanguagesQuery( config: DeliveryClientConfig, request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { - return createDeliveryPagingByUrlQuery({ + return createPagedByUrlQuery({ config, request, schema: listLanguagesPayload(config.schema), diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 34525880..618616b3 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createDeliveryPagingByUrlQuery } from "../delivery-queries.js"; +import { createPagedByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; @@ -18,7 +18,7 @@ export function listTaxonomiesQuery( config: DeliveryClientConfig, request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { - return createDeliveryPagingByUrlQuery({ + return createPagedByUrlQuery({ config, request, schema: listTaxonomiesPayload(config.schema), diff --git a/lib/utils/url.utils.ts b/lib/utils/url.utils.ts index 233c3fec..711d6d28 100644 --- a/lib/utils/url.utils.ts +++ b/lib/utils/url.utils.ts @@ -1,12 +1,12 @@ import { type BaseUrl, getEndpointUrl } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; -import type { ApiMode, DeliveryClientConfig, DeliveryEndpoints } from "../models/core.models.js"; +import type { ApiMode, DeliveryClientConfig, DeliveryEndpoint } from "../models/core.models.js"; import { type EmptyRichTextFilter, emptyRichTextOperators, + emptyRichTextToFilterOperator, type Filter, type ObjectFilter, - operatorToFilterOp, } from "../models/filter.models.js"; import type { QueryParameterRecord } from "../models/request.models.js"; @@ -15,7 +15,7 @@ export function getDeliveryUrl({ path, baseUrl, apiMode, -}: { readonly path: DeliveryEndpoints } & Pick): string { +}: { readonly path: DeliveryEndpoint } & Pick): string { return getEndpointUrl({ environmentId, path, @@ -103,7 +103,9 @@ function getFilterParams(filters: readonly Filter[] | undefined) match(filter) .returnType() // Special case for "isEmptyRichText" operator - .when(isEmptyRichTextFilter, (filter) => [[`${filter.property}[${operatorToFilterOp[filter.operator]}]`, "


"]]) + .when(isEmptyRichTextFilter, (filter) => [ + [`${filter.property}[${emptyRichTextToFilterOperator[filter.operator]}]`, "


"], + ]) .when(isQueryFilter, (filter) => { if (!filterHasDefinedValue(filter)) { return []; diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts index a10122a7..89fb19d1 100644 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -1,19 +1,15 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; import { type ZodType, z } from "zod"; -import type { DeliveryClientConfig, FullDeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; -import { - createDeliveryFetchQuery, - createDeliveryPagingByTokenQuery, - createDeliveryPagingByUrlQuery, -} from "../../../lib/queries/delivery-queries.js"; +import { createDeliveryFetchQuery, createPagedByTokenQuery, createPagedByUrlQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; @@ -94,7 +90,7 @@ describe("createDeliveryFetchQuery", () => { describe("createDeliveryPagingByUrlQuery", () => { it("returns a query with PagedFetchQuery shape", () => { - const query = createDeliveryPagingByUrlQuery({ + const query = createPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -105,7 +101,7 @@ describe("createDeliveryPagingByUrlQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items" as const; - const { inspect } = createDeliveryPagingByUrlQuery({ + const { inspect } = createPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -115,7 +111,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL has no query string when request is undefined", () => { - const { inspect } = createDeliveryPagingByUrlQuery({ + const { inspect } = createPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -126,7 +122,7 @@ describe("createDeliveryPagingByUrlQuery", () => { it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const { inspect } = createDeliveryPagingByUrlQuery({ + const { inspect } = createPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -139,7 +135,7 @@ describe("createDeliveryPagingByUrlQuery", () => { const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { query: { skip: 10, limit: 5 }, }; - const { inspect } = createDeliveryPagingByUrlQuery({ + const { inspect } = createPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -155,7 +151,7 @@ describe("createDeliveryPagingByUrlQuery", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; - const { inspect } = createDeliveryPagingByUrlQuery({ + const { inspect } = createPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -167,7 +163,7 @@ describe("createDeliveryPagingByUrlQuery", () => { describe("createDeliveryPagingByTokenQuery", () => { it("returns a query with PagedFetchQuery shape", () => { - const query = createDeliveryPagingByTokenQuery({ + const query = createPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -178,7 +174,7 @@ describe("createDeliveryPagingByTokenQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items-feed" as const; - const { inspect } = createDeliveryPagingByTokenQuery({ + const { inspect } = createPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -188,7 +184,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL has no query string when request is undefined", () => { - const { inspect } = createDeliveryPagingByTokenQuery({ + const { inspect } = createPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -199,7 +195,7 @@ describe("createDeliveryPagingByTokenQuery", () => { it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const { inspect } = createDeliveryPagingByTokenQuery({ + const { inspect } = createPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, @@ -212,7 +208,7 @@ describe("createDeliveryPagingByTokenQuery", () => { const request: DeliveryRequest<{ readonly language: string }, never> = { query: { language: "en-us" }, }; - const { inspect } = createDeliveryPagingByTokenQuery({ + const { inspect } = createPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, @@ -225,7 +221,7 @@ describe("createDeliveryPagingByTokenQuery", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; - const { inspect } = createDeliveryPagingByTokenQuery({ + const { inspect } = createPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 3c96eedb..eedeb012 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -8,11 +8,11 @@ import { import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { FullDeliveryClientSchema, WaitForLoadingNewContentHeaderName } from "../../../lib/models/core.models.js"; +import type { DefaultDeliveryClientSchema, WaitForLoadingNewContentHeaderName } from "../../../lib/models/core.models.js"; import type { ItemsFeedQueryRequest } from "../../../lib/queries/content-items/items-feed-query.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; -async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest): Promise { +async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest): Promise { let captured: readonly Header[] = []; const client = createDeliveryClient({ diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 60f8c831..3463513f 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -10,7 +10,7 @@ import { import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; import type { ZodType } from "zod"; -import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoints } from "../../lib/models/core.models.js"; +import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoint } from "../../lib/models/core.models.js"; import { DeliverySdkError } from "../../lib/models/error.models.js"; import { createDeliveryClient } from "../../lib/public_api.js"; import { getDeliveryUrl } from "../../lib/utils/url.utils.js"; @@ -42,7 +42,7 @@ export async function runQueryTestsAsync({ expectedSchema, }: { readonly expectedSchema: ZodType; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; readonly unitTestPayload: TResponsePayload; readonly selectQuery: SelectQuery; }): Promise { @@ -78,7 +78,7 @@ async function runClientQueryTestsAsync({ }: { readonly client: DeliveryClient; readonly integrationEnvironmentId: string; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; readonly selectQuery: SelectQuery; readonly expectedSchema: ZodType; readonly unitTestPayload: TResponsePayload; @@ -185,7 +185,7 @@ function createTestMetadata({ }: { readonly clientEnvironmentId: string; readonly integrationEnvironmentId: string; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; }): { readonly isIntegrationTest: boolean; readonly testType: TestType; @@ -210,7 +210,7 @@ function registerBaseTests({ testType, }: { readonly testName: string; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; readonly client: DeliveryClient; readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; @@ -232,7 +232,7 @@ function registerQueryStructureTests({ }: { readonly testName: string; readonly query: ReturnType>; - readonly endpoint: DeliveryEndpoints; + readonly endpoint: DeliveryEndpoint; readonly client: DeliveryClient; }): void { it(`${testName} Expect url to be correct`, () => { @@ -387,7 +387,7 @@ async function runFailingClientQueryTestAsync; }): Promise { const client = createFailingUnitTestClient(); From 8894d29d5a1f25f3e9f1adb760b509b27c6bfe17 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:26:46 +0200 Subject: [PATCH 107/221] Update public_api.ts --- lib/public_api.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index b2ed2b76..5c28827f 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,19 +2,19 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, - DefaultDeliveryClientSchema as FullDeliveryClientSchema, - DeliveryApiConfig as ApiDeliveryClientConfig, + DefaultDeliveryClientSchema, + DeliveryApiConfig, DeliveryClient, DeliveryClientConfig, DeliveryClientSchema, WaitForLoadingNewContentHeaderName, } from "./models/core.models.js"; // Filters -export type { EmptyRichTextFilter as EmptyRichtextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; +export type { EmptyRichTextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; // Pagination export type { - PaginationPayload as PaginationSchema, - PaginationWithTotalCountPayload as PaginationSchemaWithTotalCount, + PaginationPayload, + PaginationWithTotalCountPayload, } from "./models/pagination.models.js"; // Request config export type { DeliveryRequestConfig } from "./models/request.models.js"; From e8958954bd4523245f75e018e0a0c03f42397316 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:39:40 +0200 Subject: [PATCH 108/221] updates types --- lib/public_api.ts | 23 +++++++------- lib/queries/content-items/items-feed-query.ts | 4 +-- .../items-referencing-asset-query.ts | 4 +-- .../content-items/list-content-items-query.ts | 4 +-- .../content-types/list-content-types-query.ts | 4 +-- lib/queries/delivery-queries.ts | 4 +-- lib/queries/languages/list-languages-query.ts | 4 +-- .../taxonomies/list-taxonomies-query.ts | 4 +-- .../delivery-query/delivery-queries.spec.ts | 30 +++++++++++-------- 9 files changed, 43 insertions(+), 38 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index 5c28827f..e06d5f9e 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -16,9 +16,13 @@ export type { PaginationPayload, PaginationWithTotalCountPayload, } from "./models/pagination.models.js"; -// Request config -export type { DeliveryRequestConfig } from "./models/request.models.js"; -// Content Items +export type { + DeliveryRequestConfig, + ElementOrderQueryParam, + ElementSelectionQueryParam, + OrderDirection, + SystemOrderQueryParam, +} from "./models/request.models.js"; export { type ContentItemElementPayload, type ContentItemPayload, @@ -36,22 +40,19 @@ export type { ItemsReferencingAssetQueryRequest, } from "./queries/content-items/items-referencing-asset-query.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; -// Content Types -export { +export type { ContentTypeElementPayload, - type ContentTypePayload, + ContentTypePayload, ListContentTypesPayload, } from "./queries/content-types/content-type.models.js"; export type { FetchContentTypeElementQuery, FetchContentTypeElementQueryRequest, } from "./queries/content-types/fetch-content-type-element-query.js"; -export { type FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; +export type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; -// Languages -export { type LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; +export type { LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; export type { ListLanguagesQuery, ListLanguagesQueryRequest } from "./queries/languages/list-languages-query.js"; -// Taxonomies -export { type FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; +export type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; export type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "./queries/taxonomies/list-taxonomies-query.js"; export type { ListTaxonomiesPayload, TaxonomyPayload, TaxonomyTermPayload } from "./queries/taxonomies/taxonomy.models.js"; diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index ffcc2fd4..0905dab2 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -6,7 +6,7 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createPagedByTokenQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; @@ -47,7 +47,7 @@ export function itemsFeedQuery( config: DeliveryClientConfig, request?: ItemsFeedQueryRequest, ): ItemsFeedQuery { - return createPagedByTokenQuery({ + return createDeliveryPagedByTokenQuery({ config, request, schema: itemsFeedPayload(config.schema), diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index 3e10ed5d..d7eae510 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; -import { createPagedByTokenQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetPayload } from "./content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< @@ -22,7 +22,7 @@ export function itemsReferencingAssetQuery config: DeliveryClientConfig, request: ItemsReferencingAssetQueryRequest, ): ItemsReferencingAssetQuery { - return createPagedByTokenQuery({ + return createDeliveryPagedByTokenQuery({ config, request, schema: itemsReferencingAssetPayload(config.schema), diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index adac77bc..7662f1c5 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -6,7 +6,7 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createPagedByUrlQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; @@ -54,7 +54,7 @@ export function listContentItemsQuery( config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { - return createPagedByUrlQuery({ + return createDeliveryPagedByUrlQuery({ config, request, schema: listContentItemsPayload(config.schema), diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 51076597..fbc24429 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createPagedByUrlQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; @@ -21,7 +21,7 @@ export function listContentTypesQuery( config: DeliveryClientConfig, request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { - return createPagedByUrlQuery({ + return createDeliveryPagedByUrlQuery({ config, request, schema: listContentTypesPayload(config.schema), diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 2e711cdf..84340803 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -20,7 +20,7 @@ import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; type DefaultDeliveryRequest = DeliveryRequest[]>; -export function createPagedByUrlQuery({ +export function createDeliveryPagedByUrlQuery({ config, schema, endpoint, @@ -37,7 +37,7 @@ export function createPagedByUrlQuery({ }); } -export function createPagedByTokenQuery({ +export function createDeliveryPagedByTokenQuery({ config, schema, endpoint, diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 02ca5cbb..ea5b3561 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createPagedByUrlQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; @@ -18,7 +18,7 @@ export function listLanguagesQuery( config: DeliveryClientConfig, request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { - return createPagedByUrlQuery({ + return createDeliveryPagedByUrlQuery({ config, request, schema: listLanguagesPayload(config.schema), diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 618616b3..24b2ed28 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; -import { createPagedByUrlQuery } from "../delivery-queries.js"; +import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; @@ -18,7 +18,7 @@ export function listTaxonomiesQuery( config: DeliveryClientConfig, request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { - return createPagedByUrlQuery({ + return createDeliveryPagedByUrlQuery({ config, request, schema: listTaxonomiesPayload(config.schema), diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts index 89fb19d1..b4e82183 100644 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ b/tests/unit/delivery-query/delivery-queries.spec.ts @@ -5,7 +5,11 @@ import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../.. import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; -import { createDeliveryFetchQuery, createPagedByTokenQuery, createPagedByUrlQuery } from "../../../lib/queries/delivery-queries.js"; +import { + createDeliveryFetchQuery, + createDeliveryPagedByTokenQuery, + createDeliveryPagedByUrlQuery, +} from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; @@ -90,7 +94,7 @@ describe("createDeliveryFetchQuery", () => { describe("createDeliveryPagingByUrlQuery", () => { it("returns a query with PagedFetchQuery shape", () => { - const query = createPagedByUrlQuery({ + const query = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -101,7 +105,7 @@ describe("createDeliveryPagingByUrlQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items" as const; - const { inspect } = createPagedByUrlQuery({ + const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -111,7 +115,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); it("URL has no query string when request is undefined", () => { - const { inspect } = createPagedByUrlQuery({ + const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -122,7 +126,7 @@ describe("createDeliveryPagingByUrlQuery", () => { it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const { inspect } = createPagedByUrlQuery({ + const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -135,7 +139,7 @@ describe("createDeliveryPagingByUrlQuery", () => { const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { query: { skip: 10, limit: 5 }, }; - const { inspect } = createPagedByUrlQuery({ + const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -151,7 +155,7 @@ describe("createDeliveryPagingByUrlQuery", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; - const { inspect } = createPagedByUrlQuery({ + const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, schema: paginationSchema, @@ -163,7 +167,7 @@ describe("createDeliveryPagingByUrlQuery", () => { describe("createDeliveryPagingByTokenQuery", () => { it("returns a query with PagedFetchQuery shape", () => { - const query = createPagedByTokenQuery({ + const query = createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -174,7 +178,7 @@ describe("createDeliveryPagingByTokenQuery", () => { it("URL matches the delivery URL for the configured endpoint", () => { const endpoint = "items-feed" as const; - const { inspect } = createPagedByTokenQuery({ + const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -184,7 +188,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); it("URL has no query string when request is undefined", () => { - const { inspect } = createPagedByTokenQuery({ + const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -195,7 +199,7 @@ describe("createDeliveryPagingByTokenQuery", () => { it("URL has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; - const { inspect } = createPagedByTokenQuery({ + const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, @@ -208,7 +212,7 @@ describe("createDeliveryPagingByTokenQuery", () => { const request: DeliveryRequest<{ readonly language: string }, never> = { query: { language: "en-us" }, }; - const { inspect } = createPagedByTokenQuery({ + const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, @@ -221,7 +225,7 @@ describe("createDeliveryPagingByTokenQuery", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; - const { inspect } = createPagedByTokenQuery({ + const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request, schema: testSchema, From 1cc0c72fa3fa1aadb4a6300f5a4ad91096e39aa8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 23 Apr 2026 12:48:10 +0200 Subject: [PATCH 109/221] Use *schema naming for all zod schemas --- lib/models/core.models.ts | 4 ---- .../content-items/content-item.models.ts | 22 +++++++++---------- .../content-items/fetch-content-item-query.ts | 4 ++-- lib/queries/content-items/items-feed-query.ts | 4 ++-- .../items-referencing-asset-query.ts | 4 ++-- .../content-items/list-content-items-query.ts | 4 ++-- .../content-types/content-type.models.ts | 22 +++++++++---------- .../fetch-content-type-element-query.ts | 4 ++-- .../content-types/fetch-content-type-query.ts | 4 ++-- .../content-types/list-content-types-query.ts | 4 ++-- lib/queries/languages/language.models.ts | 10 ++++----- lib/queries/languages/list-languages-query.ts | 4 ++-- .../taxonomies/list-taxonomies-query.ts | 4 ++-- lib/queries/taxonomies/taxonomy.models.ts | 12 +++++----- .../fetch-content-item-query.spec.ts | 4 ++-- .../content-items/items-feed-query.spec.ts | 4 ++-- .../items-referencing-asset-query.spec.ts | 4 ++-- .../list-content-items-query.spec.ts | 4 ++-- .../fetch-content-type-element-query.spec.ts | 4 ++-- .../fetch-content-type-query.spec.ts | 10 ++++----- .../list-content-types-query.spec.ts | 4 ++-- .../languages/list-languages-query.spec.ts | 4 ++-- .../taxonomies/list-taxonomies-query.spec.ts | 4 ++-- 23 files changed, 71 insertions(+), 77 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index ebe4476d..4a3362fb 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -66,10 +66,6 @@ export type DeliveryClientConfig = DeliveryClientConfig & { - readonly schema: TSchema; -}; - export type DeliveryClient = { readonly config: DeliveryClientConfig; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 36bfd26f..b72b81d1 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -154,7 +154,7 @@ const contentItemElementSchema = z ]) .readonly(); -const contentItemSystemSchemaBase = (schema: TSchema | undefined) => +const baseContentItemSystemSchema = (schema: TSchema | undefined) => z.object({ id: kontentUuidSchema, name: z.string(), @@ -170,7 +170,7 @@ const contentItemSystemSchemaBase = (schem const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ - ...contentItemSystemSchemaBase(schema).shape, + ...baseContentItemSystemSchema(schema).shape, sitemap_locations: z.array(z.string()).readonly(), }) .readonly(); @@ -185,7 +185,7 @@ const contentItemSchema = (schema: TSchema }) .readonly(); -export const listContentItemsPayload = (schema: TSchema | undefined) => +export const listContentItemsSchema = (schema: TSchema | undefined) => z .object({ items: z.array(contentItemSchema(schema)).readonly(), @@ -194,7 +194,7 @@ export const listContentItemsPayload = (sc }) .readonly(); -export const itemsFeedPayload = (schema: TSchema | undefined) => +export const itemsFeedSchema = (schema: TSchema | undefined) => z .object({ items: z.array(contentItemSchema(schema)).readonly(), @@ -202,20 +202,20 @@ export const itemsFeedPayload = (schema: T }) .readonly(); -export const itemsReferencingAssetPayload = (schema: TSchema | undefined) => +export const itemsReferencingAssetSchema = (schema: TSchema | undefined) => z .object({ items: z .array( z.object({ - system: contentItemSystemSchemaBase(schema), + system: baseContentItemSystemSchema(schema), }), ) .readonly(), }) .readonly(); -export const fetchContentItemPayload = (schema: TSchema | undefined) => +export const fetchContentItemSchema = (schema: TSchema | undefined) => z .object({ item: contentItemSchema(schema), @@ -226,9 +226,9 @@ export const fetchContentItemPayload = (sc export type ContentItemSystemPayload = z.infer>>; export type ContentItemElementPayload = z.infer; export type ContentItemPayload = z.infer>>; -export type ListContentItemsPayload = z.infer>>; -export type FetchContentItemPayload = z.infer>>; -export type ItemsFeedPayload = z.infer>>; +export type ListContentItemsPayload = z.infer>>; +export type FetchContentItemPayload = z.infer>>; +export type ItemsFeedPayload = z.infer>>; export type ItemsReferencingAssetPayload = z.infer< - ReturnType> + ReturnType> >; diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index a6012243..b9286533 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type FetchContentItemPayload, fetchContentItemPayload } from "./content-item.models.js"; +import { type FetchContentItemPayload, fetchContentItemSchema } from "./content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery>; @@ -41,7 +41,7 @@ export function fetchContentItemQuery( return createDeliveryFetchQuery({ config, request, - schema: fetchContentItemPayload(config.schema), + schema: fetchContentItemSchema(config.schema), endpoint: `items/${request.codename}`, }); } diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 0905dab2..c260dc2b 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -7,7 +7,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedPayload } from "./content-item.models.js"; +import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedSchema } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -50,7 +50,7 @@ export function itemsFeedQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsFeedPayload(config.schema), + schema: itemsFeedSchema(config.schema), endpoint: "items-feed", }); } diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index d7eae510..e80c2e6e 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetPayload } from "./content-item.models.js"; +import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetSchema } from "./content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< ItemsReferencingAssetPayload @@ -25,7 +25,7 @@ export function itemsReferencingAssetQuery return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsReferencingAssetPayload(config.schema), + schema: itemsReferencingAssetSchema(config.schema), endpoint: `assets/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 7662f1c5..6058d0cc 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -7,7 +7,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsPayload } from "./content-item.models.js"; +import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsSchema } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -57,7 +57,7 @@ export function listContentItemsQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentItemsPayload(config.schema), + schema: listContentItemsSchema(config.schema), endpoint: "items", }); } diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index abbb60c9..acb0a96e 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -10,7 +10,7 @@ const contentTypeElementOptionSchema = z }) .readonly(); -const contentTypeElementSchema = z.discriminatedUnion("type", [ +const contentTypeElementsSchema = z.discriminatedUnion("type", [ z .object({ type: z.literal("text"), @@ -86,7 +86,7 @@ const contentTypeElementSchema = z.discriminatedUnion("type", [ .readonly(), ]); -export const contentTypePayload = (schema: TSchema | undefined) => +export const contentTypeSchema = (schema: TSchema | undefined) => z .object({ system: z @@ -97,22 +97,22 @@ export const contentTypePayload = (schema: last_modified: z.iso.datetime(), }) .readonly(), - elements: z.record(getCodenameSchema(schema?.elementCodenames), contentTypeElementSchema), + elements: z.record(getCodenameSchema(schema?.elementCodenames), contentTypeElementsSchema), }) .readonly(); -export const listContentTypesPayload = (schema: TSchema | undefined) => +export const listContentTypesSchema = (schema: TSchema | undefined) => z .object({ - types: z.array(contentTypePayload(schema)).readonly(), + types: z.array(contentTypeSchema(schema)).readonly(), ...paginationSchema.shape, }) .readonly(); -export const contentTypeElementPayload = (schema: TSchema | undefined) => +export const contentTypeElementSchema = (schema: TSchema | undefined) => z .intersection( - contentTypeElementSchema, + contentTypeElementsSchema, z .object({ // Required only for the endpoint `types/{type}/elements/{element}` @@ -122,10 +122,8 @@ export const contentTypeElementPayload = ( ) .readonly(); -export type ContentTypePayload = z.infer>>; +export type ContentTypePayload = z.infer>>; -export type ContentTypeElementPayload = z.infer< - ReturnType> ->; +export type ContentTypeElementPayload = z.infer>>; -export type ListContentTypesPayload = z.infer>>; +export type ListContentTypesPayload = z.infer>>; diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 28207601..5cb80eb8 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type ContentTypeElementPayload, contentTypeElementPayload } from "./content-type.models.js"; +import { type ContentTypeElementPayload, contentTypeElementSchema } from "./content-type.models.js"; export type FetchContentTypeElementQuery = DeliveryFetchQuery>; @@ -17,7 +17,7 @@ export function fetchContentTypeElementQuery = NonNullable[number]; @@ -22,7 +22,7 @@ export function fetchContentTypeQuery( return createDeliveryFetchQuery({ config, request, - schema: contentTypePayload(config.schema), + schema: contentTypeSchema(config.schema), endpoint: `types/${request.codename}`, }); } diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index fbc24429..1c4a6322 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesPayload } from "./content-type.models.js"; +import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesSchema } from "./content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; type ElementProperties = NonNullable[number]; @@ -24,7 +24,7 @@ export function listContentTypesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentTypesPayload(config.schema), + schema: listContentTypesSchema(config.schema), endpoint: "types", }); } diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 1e989bb3..6e03c3f1 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -3,7 +3,7 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; -export const languagePayload = (schema: TSchema | undefined) => +export const languageSchema = (schema: TSchema | undefined) => z .object({ system: z @@ -16,14 +16,14 @@ export const languagePayload = (schema: TS }) .readonly(); -export const listLanguagesPayload = (schema: TSchema | undefined) => +export const listLanguagesSchema = (schema: TSchema | undefined) => z .object({ - languages: z.array(languagePayload(schema)).readonly(), + languages: z.array(languageSchema(schema)).readonly(), ...paginationSchema.shape, }) .readonly(); -export type LanguagePayload = z.infer>>; +export type LanguagePayload = z.infer>>; -export type ListLanguagesPayload = z.infer>>; +export type ListLanguagesPayload = z.infer>>; diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index ea5b3561..97c7d362 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type LanguagePayload, type ListLanguagesPayload, listLanguagesPayload } from "./language.models.js"; +import { type LanguagePayload, type ListLanguagesPayload, listLanguagesSchema } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery>; @@ -21,7 +21,7 @@ export function listLanguagesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listLanguagesPayload(config.schema), + schema: listLanguagesSchema(config.schema), endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 24b2ed28..9a5ff66d 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuer import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ListTaxonomiesPayload, listTaxonomiesPayload, type TaxonomyPayload } from "./taxonomy.models.js"; +import { type ListTaxonomiesPayload, listTaxonomiesSchema, type TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; @@ -21,7 +21,7 @@ export function listTaxonomiesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listTaxonomiesPayload(config.schema), + schema: listTaxonomiesSchema(config.schema), endpoint: "taxonomies", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index b28d1364..71d89465 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -3,12 +3,12 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; -const taxonomyTermPayload = (schema: TSchema | undefined) => +const taxonomyTermSchema = (schema: TSchema | undefined) => z.object({ name: z.string(), codename: getCodenameSchema(schema?.taxonomyCodenames), get terms() { - return z.array(taxonomyTermPayload(schema)).readonly(); + return z.array(taxonomyTermSchema(schema)).readonly(); }, }); @@ -23,11 +23,11 @@ export const taxonomyPayload = (schema: TS last_modified: z.iso.datetime(), }) .readonly(), - terms: z.array(taxonomyTermPayload(schema)).readonly(), + terms: z.array(taxonomyTermSchema(schema)).readonly(), }) .readonly(); -export const listTaxonomiesPayload = (schema: TSchema | undefined) => +export const listTaxonomiesSchema = (schema: TSchema | undefined) => z .object({ taxonomies: z.array(taxonomyPayload(schema)).readonly(), @@ -35,8 +35,8 @@ export const listTaxonomiesPayload = (sche }) .readonly(); -export type TaxonomyTermPayload = z.infer>>; +export type TaxonomyTermPayload = z.infer>>; export type TaxonomyPayload = z.infer>>; -export type ListTaxonomiesPayload = z.infer>>; +export type ListTaxonomiesPayload = z.infer>>; diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index 4dad2121..c68d2edf 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type FetchContentItemPayload, fetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { type FetchContentItemPayload, fetchContentItemSchema } from "../../../../lib/queries/content-items/content-item.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; @@ -10,6 +10,6 @@ describe("Fetch content item query", async () => { endpoint: `items/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchContentItem({ codename }), - expectedSchema: fetchContentItemPayload(getIntegrationTestsSchema()), + expectedSchema: fetchContentItemSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 4d3ed416..535eb17d 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ItemsFeedPayload, itemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { type ItemsFeedPayload, itemsFeedSchema } from "../../../../lib/queries/content-items/content-item.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; @@ -9,6 +9,6 @@ describe("Items feed query", async () => { endpoint: "items-feed", unitTestPayload, selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedPayload(getIntegrationTestsSchema()), + expectedSchema: itemsFeedSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index cabfb2e7..3fd07c76 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import { type ItemsReferencingAssetPayload, - itemsReferencingAssetPayload, + itemsReferencingAssetSchema, } from "../../../../lib/queries/content-items/content-item.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; @@ -13,6 +13,6 @@ describe("Items referencing asset query", async () => { endpoint: `assets/${assetCodename}/used-in`, unitTestPayload, selectQuery: (client) => client.itemsReferencingAsset({ codename: assetCodename }), - expectedSchema: itemsReferencingAssetPayload(getIntegrationTestsSchema()), + expectedSchema: itemsReferencingAssetSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 5889fa46..d2c34f9a 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListContentItemsPayload, listContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { type ListContentItemsPayload, listContentItemsSchema } from "../../../../lib/queries/content-items/content-item.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; @@ -9,6 +9,6 @@ describe("List content items query", async () => { endpoint: "items", unitTestPayload, selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsPayload(getIntegrationTestsSchema()), + expectedSchema: listContentItemsSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 27f3d1d4..9f60f622 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ContentTypeElementPayload, contentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { type ContentTypeElementPayload, contentTypeElementSchema } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import payloads from "./fetch-content-type-element-query.payload.js"; @@ -12,7 +12,7 @@ describe("Fetch content type element query", async () => { endpoint: `types/${typeCodename}/elements/${payload.codename}`, unitTestPayload: payload, selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename: payload.codename }), - expectedSchema: contentTypeElementPayload(getIntegrationTestsSchema()), + expectedSchema: contentTypeElementSchema(getIntegrationTestsSchema()), }), ); diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index a52a45de..a5a457a4 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ContentTypePayload, contentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { type ContentTypePayload, contentTypeSchema } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-type-query.payload.js"; @@ -10,7 +10,7 @@ describe("Fetch content type query", async () => { endpoint: `types/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchContentType({ codename: codename }), - expectedSchema: contentTypePayload(getIntegrationTestsSchema()), + expectedSchema: contentTypeSchema(getIntegrationTestsSchema()), }); }); @@ -31,7 +31,7 @@ describe("Fetch content type query with extra field in element", async () => { }, }; - const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); it("Parsing should be successful when extra field is present in element", () => { expect(success).toBeTruthy(); @@ -54,7 +54,7 @@ describe("Fetch content type query with invalid field type in element should fai }, }; - const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); it("Parsing should fail when invalid field type is present in element", () => { expect(success).toBeFalsy(); @@ -76,7 +76,7 @@ describe("Fetch query with missing system field should fail", async () => { }, }; - const { success } = await contentTypePayload(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); it("Parsing should fail when system field is missing", () => { expect(success).toBeFalsy(); diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index 3d2b9231..103e1dc1 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListContentTypesPayload, listContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { type ListContentTypesPayload, listContentTypesSchema } from "../../../../lib/queries/content-types/content-type.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-types-query.payload.js"; @@ -9,6 +9,6 @@ describe("List content types query", async () => { endpoint: "types", unitTestPayload, selectQuery: (client) => client.listContentTypes(), - expectedSchema: listContentTypesPayload(getIntegrationTestsSchema()), + expectedSchema: listContentTypesSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index be28eca2..337a40d1 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListLanguagesPayload, listLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; +import { type ListLanguagesPayload, listLanguagesSchema } from "../../../../lib/queries/languages/language.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-languages-query.payload.js"; @@ -9,6 +9,6 @@ describe("List languages query", async () => { endpoint: "languages", unitTestPayload, selectQuery: (client) => client.listLanguages(), - expectedSchema: listLanguagesPayload(getIntegrationTestsSchema()), + expectedSchema: listLanguagesSchema(getIntegrationTestsSchema()), }); }); diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index f5233b08..1cca046f 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListTaxonomiesPayload, listTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { type ListTaxonomiesPayload, listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-taxonomies-query.payload.js"; @@ -9,6 +9,6 @@ describe("List taxonomies query", async () => { endpoint: "taxonomies", unitTestPayload, selectQuery: (client) => client.listTaxonomies(), - expectedSchema: listTaxonomiesPayload(getIntegrationTestsSchema()), + expectedSchema: listTaxonomiesSchema(getIntegrationTestsSchema()), }); }); From 9340692d758829544fa4415c1de5ecb9d42129c8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 11:30:42 +0200 Subject: [PATCH 110/221] updates deps & related code --- lib/models/core.models.ts | 4 +- lib/queries/delivery-queries.ts | 28 +++-- lib/utils/paging.utils.ts | 8 +- package.json | 6 +- pnpm-lock.yaml | 156 ++++++++++++------------- tests/unit/headers/headers.spec.ts | 4 +- tests/unit/paging/paging.utils.spec.ts | 1 - 7 files changed, 109 insertions(+), 98 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 4a3362fb..242920e6 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -81,9 +81,9 @@ export type DeliveryClient): ItemsReferencingAssetQuery; }; -export type DeliveryFetchQuery = FetchQuery; +export type DeliveryFetchQuery = FetchQuery; -export type DeliveryPagedFetchQuery = PagedFetchQuery; +export type DeliveryPagedFetchQuery = PagedFetchQuery; export type DeliveryEndpoint = | "languages" diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 84340803..d4ba6cc4 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -30,10 +30,11 @@ export function createDeliveryPagedByUrlQuery; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), + mapPagingExtraResponseProps: () => {}, }); } @@ -47,10 +48,11 @@ export function createDeliveryPagedByTokenQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByContinuationToken(), + mapPagingExtraResponseProps: () => {}, }); } @@ -64,8 +66,8 @@ export function createDeliveryFetchQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): FetchQuery { - return createFetchQuery( +}): FetchQuery { + return createFetchQuery( getSharedRequestData({ config, endpoint, schema: schema, request }), ); } @@ -81,8 +83,17 @@ function getSharedRequestData({ readonly endpoint: DeliveryEndpoint; readonly schema: ZodType; }): Pick< - FetchQueryRequest, - "abortSignal" | "config" | "sdkInfo" | "mapMetadata" | "authorizationApiKey" | "url" | "requestHeaders" | "zodSchema" | "mapError" + FetchQueryRequest, + | "abortSignal" + | "config" + | "sdkInfo" + | "mapMetadata" + | "authorizationApiKey" + | "url" + | "requestHeaders" + | "zodSchema" + | "mapError" + | "mapExtraResponseProps" > { return { abortSignal: undefined, @@ -91,6 +102,7 @@ function getSharedRequestData({ mapMetadata: () => { return {}; }, + mapExtraResponseProps: () => {}, requestHeaders: getHeaders(request), url: getUrl({ request, config, endpoint }), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index 21fbe8e8..c0430c7a 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -1,7 +1,7 @@ -import type { ExtractNextPageDataFn, JsonValue } from "@kontent-ai/core-sdk"; +import { extractContinuationToken, type GetNextPageData, type JsonValue } from "@kontent-ai/core-sdk"; import type { PaginationPayload } from "../models/pagination.models.js"; -export function getNextPageByUrl(): ExtractNextPageDataFn { +export function getNextPageByUrl(): GetNextPageData { return (response) => { return { continuationToken: undefined, @@ -10,10 +10,10 @@ export function getNextPageByUrl(): E }; } -export function getNextPageByContinuationToken(): ExtractNextPageDataFn { +export function getNextPageByContinuationToken(): GetNextPageData { return (response) => { return { - continuationToken: response.meta.continuationToken, + continuationToken: extractContinuationToken(response.meta.responseHeaders), nextPageUrl: undefined, }; }; diff --git a/package.json b/package.json index 3e78d7fd..df4b2ef6 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.29", + "@kontent-ai/core-sdk": "^12.0.0-preview.30", "ts-pattern": "^5", "zod": "^4" }, @@ -50,11 +50,11 @@ "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.2.1", - "@biomejs/biome": "2.4.12", + "@biomejs/biome": "2.4.13", "@types/node": "25.6.0", "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260423.1" + "@typescript/native-preview": "7.0.0-dev.20260428.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7648505a..76ef75a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.29 - version: 12.0.0-preview.29(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.30 + version: 12.0.0-preview.30(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -19,11 +19,11 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.4.12 - version: 2.4.12 + specifier: 2.4.13 + version: 2.4.13 '@kontent-ai/biome-config': specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.12) + version: 0.7.0(@biomejs/biome@2.4.13) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) @@ -31,8 +31,8 @@ importers: specifier: 25.6.0 version: 25.6.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260423.1 - version: 7.0.0-dev.20260423.1 + specifier: 7.0.0-dev.20260428.1 + version: 7.0.0-dev.20260428.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) @@ -69,59 +69,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.12': - resolution: {integrity: sha512-Rro7adQl3NLq/zJCIL98eElXKI8eEiBtoeu5TbXF/U3qbjuSc7Jb5rjUbeHHcquDWeSf3HnGP7XI5qGrlRk/pA==} + '@biomejs/biome@2.4.13': + resolution: {integrity: sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.12': - resolution: {integrity: sha512-BnMU4Pc3ciEVteVpZ0BK33MLr7X57F5w1dwDLDn+/iy/yTrA4Q/N2yftidFtsA4vrDh0FMXDpacNV/Tl3fbmng==} + '@biomejs/cli-darwin-arm64@2.4.13': + resolution: {integrity: sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.12': - resolution: {integrity: sha512-x9uJ0bI1rJsWICp3VH8w/5PnAVD3A7SqzDpbrfoUQX1QyWrK5jSU4fRLo/wSgGeplCivbxBRKmt5Xq4/nWvq8A==} + '@biomejs/cli-darwin-x64@2.4.13': + resolution: {integrity: sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.12': - resolution: {integrity: sha512-FhfpkAAlKL6kwvcVap0Hgp4AhZmtd3YImg0kK1jd7C/aSoh4SfsB2f++yG1rU0lr8Y5MCFJrcSkmssiL9Xnnig==} + '@biomejs/cli-linux-arm64-musl@2.4.13': + resolution: {integrity: sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.12': - resolution: {integrity: sha512-tOwuCuZZtKi1jVzbk/5nXmIsziOB6yqN8c9r9QM0EJYPU6DpQWf11uBOSCfFKKM4H3d9ZoarvlgMfbcuD051Pw==} + '@biomejs/cli-linux-arm64@2.4.13': + resolution: {integrity: sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.12': - resolution: {integrity: sha512-dwTIgZrGutzhkQCuvHynCkyW6hJxUuyZqKKO0YNfaS2GUoRO+tOvxXZqZB6SkWAOdfZTzwaw8IEdUnIkHKHoew==} + '@biomejs/cli-linux-x64-musl@2.4.13': + resolution: {integrity: sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.12': - resolution: {integrity: sha512-8pFeAnLU9QdW9jCIslB/v82bI0lhBmz2ZAKc8pVMFPO0t0wAHsoEkrUQUbMkIorTRIjbqyNZHA3lEXavsPWYSw==} + '@biomejs/cli-linux-x64@2.4.13': + resolution: {integrity: sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.12': - resolution: {integrity: sha512-B0DLnx0vA9ya/3v7XyCaP+/lCpnbWbMOfUFFve+xb5OxyYvdHaS55YsSddr228Y+JAFk58agCuZTsqNiw2a6ig==} + '@biomejs/cli-win32-arm64@2.4.13': + resolution: {integrity: sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.12': - resolution: {integrity: sha512-yMckRzTyZ83hkk8iDFWswqSdU8tvZxspJKnYNh7JZr/zhZNOlzH13k4ecboU6MurKExCe2HUkH75pGI/O2JwGA==} + '@biomejs/cli-win32-x64@2.4.13': + resolution: {integrity: sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.29': - resolution: {integrity: sha512-xckUbVQivtDYZ1bPmTsS6bLkrT9uyWZd5E+3e0iLDDMCGibBBW6oDsBdPZrmdnOoGieF61Z9eBZN3JObeQyI7Q==} + '@kontent-ai/core-sdk@12.0.0-preview.30': + resolution: {integrity: sha512-ejqV82j2dZ2+DXsUsdd9Jjsb2NMmasg/VOmPp4stXwIopPbZZ0MlrBlVlaBJ2CzzX+EMX0QRZtFNHZAN+djcwg==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -584,50 +584,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-wbLr6o5fROaCYt6cOpFhbe92FJAOdhAHwm/s8I/IyN5HbL1ULgel/wHaZiR+ws+27rgruNUiCENzTUg9vSz2bA==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-Lll6WmXfgTEj1G3QBIoHlabQwUtJiyhlRgSLksa06QFL5BoA7V+Lu1waa9PtPNZbGsXLDMHodtk/bRQABKuPiw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-13MpNT+4MgkgrfiW2u03rnER5aB3yz9fA0bWEYh6IH3rIqA2AR3Dntp3QXW4sQrZf0SriXqHe2R7X3HCT5xmqA==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-WbsBNSHlo+4sGrTxDWdmI7r8x48tCtSCuKdmK62FvVOq58UWAs6sL13Z4Rev4ohLcGHdXC5E/8AIdpLPqDYQpw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-ICIkJDTqmn0R4Vs811+Ht2RYTk1OCrAhHCu0JthmhR216T1Tqgi5DWRoCprp3RL1qU6fLnxxrIpEbNlNN7XFYA==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-cgcBX/ZBMdepkamLT8g8jQdHe7DZS/s6zTZRof6mvcrnJHlMeUnKoC9UO8/c22IrUMV3n0XPh7R8FYjUP0ll+Q==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-CxUA15qbPQRvz2nanBpiv1h4tgXTCJJwqOtgKMSdIuPkow8dyYW3ba5oLoH/jZhS4792XislX659hlFrfiU6CQ==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-/d/NnZFvEJU67L5mHh+cO3gsfwNCvJ9HGtxGq1KGz1VwTabOIcwLdpTpfsAR39WXzzfh9GJHL28n6GSGZInPow==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-cWLFS4R8dOU1YuUJ/2VLeGMVIjgI3GGb/f9rRY5MbWHq5l3NNZh8y1QwAOrTh3+g3q6+znArfxVnD2hZHUz8Mw==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-4gJCE7wzenx1BH2Vtx2uKWUo8rFxnhGkxNEH1zxbYy/6ASwo+PnOPYmKHAzNE1C3yB5lzw71/vR5p5zyO57Y4A==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-OWaGUI4+dHqYZv+k6sITx9Y27FNy3XzNFk4OrOiYtBkIO/xrb9TPMP4A5XI4n5zwRLIv3xne9g039xgRbaeyoQ==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-yn6Rzbn62L4QTWrp0QgG8al6l/VG7PCPRdbE0vuGDSlKhInlC+Flo4QSc1qA8KHTbpHgl+nEsq9DymiitI4G4g==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-5MQjO/qdLwXpjW7Dy/1lNv7Vtpvo6bhCkbjan4PoRN5/eeyqEqDWxdf8AGE4btLmHqyIjEHRuYf7kp2tlAr6lQ==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-T9z13mcMowXmwGjprA2FIR2EEdYZxgqH8+qk7dFZVBlo5vfk41AN/qJfAdN7IsAhEb640MJ8cMN/aiczweZKmA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260423.1': - resolution: {integrity: sha512-9WD7TJJlGvt9PQqJI/+44dVP4oqGQFIkYrpXt7nlQ0WgNIErN52x/XhxmJ4nWft06qejgPiUbPo4aYRNOmIHXg==} + '@typescript/native-preview@7.0.0-dev.20260428.1': + resolution: {integrity: sha512-JiM4PYWDGs57TT0mV2KArmaW7BnTkk3XRid79NdG17tfvDbRyg4hBCpKI7vARiQPtxjKrHlxyzxOGDpv5W5T7Q==} engines: {node: '>=16.20.0'} hasBin: true @@ -1787,39 +1787,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.12': + '@biomejs/biome@2.4.13': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.12 - '@biomejs/cli-darwin-x64': 2.4.12 - '@biomejs/cli-linux-arm64': 2.4.12 - '@biomejs/cli-linux-arm64-musl': 2.4.12 - '@biomejs/cli-linux-x64': 2.4.12 - '@biomejs/cli-linux-x64-musl': 2.4.12 - '@biomejs/cli-win32-arm64': 2.4.12 - '@biomejs/cli-win32-x64': 2.4.12 + '@biomejs/cli-darwin-arm64': 2.4.13 + '@biomejs/cli-darwin-x64': 2.4.13 + '@biomejs/cli-linux-arm64': 2.4.13 + '@biomejs/cli-linux-arm64-musl': 2.4.13 + '@biomejs/cli-linux-x64': 2.4.13 + '@biomejs/cli-linux-x64-musl': 2.4.13 + '@biomejs/cli-win32-arm64': 2.4.13 + '@biomejs/cli-win32-x64': 2.4.13 - '@biomejs/cli-darwin-arm64@2.4.12': + '@biomejs/cli-darwin-arm64@2.4.13': optional: true - '@biomejs/cli-darwin-x64@2.4.12': + '@biomejs/cli-darwin-x64@2.4.13': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.12': + '@biomejs/cli-linux-arm64-musl@2.4.13': optional: true - '@biomejs/cli-linux-arm64@2.4.12': + '@biomejs/cli-linux-arm64@2.4.13': optional: true - '@biomejs/cli-linux-x64-musl@2.4.12': + '@biomejs/cli-linux-x64-musl@2.4.13': optional: true - '@biomejs/cli-linux-x64@2.4.12': + '@biomejs/cli-linux-x64@2.4.13': optional: true - '@biomejs/cli-win32-arm64@2.4.12': + '@biomejs/cli-win32-arm64@2.4.13': optional: true - '@biomejs/cli-win32-x64@2.4.12': + '@biomejs/cli-win32-x64@2.4.13': optional: true '@emnapi/core@1.10.0': @@ -2015,11 +2015,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.12)': + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.13)': dependencies: - '@biomejs/biome': 2.4.12 + '@biomejs/biome': 2.4.13 - '@kontent-ai/core-sdk@12.0.0-preview.29(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.30(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2210,36 +2210,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260423.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260423.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260423.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260423.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260423.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260423.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260423.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260428.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260423.1': + '@typescript/native-preview@7.0.0-dev.20260428.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260423.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260423.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260423.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260423.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260423.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260423.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260423.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260428.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260428.1 '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index eedeb012..68cb7bc5 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -1,8 +1,8 @@ import { type ContinuationTokenHeaderName, + createSdkIdHeader, getDefaultHttpAdapter, getDefaultHttpService, - getSdkIdHeader, type Header, } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; @@ -34,7 +34,7 @@ async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest { - const expectedHeader = getSdkIdHeader({ + const expectedHeader = createSdkIdHeader({ name: "@kontent-ai/delivery-sdk", version: "{{version}}", host: "npmjs.com", diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts index 2e410d64..aec5d6b1 100644 --- a/tests/unit/paging/paging.utils.spec.ts +++ b/tests/unit/paging/paging.utils.spec.ts @@ -10,7 +10,6 @@ describe("Paging utils", () => { status: 200, responseHeaders: [], url: new URL("https://domain.com"), - continuationToken: undefined, }, payload: { pagination: { From 2d4e47a8a7f4c4a7bdad9a45506e5888d4661b4f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 11:49:56 +0200 Subject: [PATCH 111/221] Separates Metadata for queries w/o token --- lib/models/core.models.ts | 17 +++++-- .../content-items/fetch-content-item-query.ts | 7 ++- lib/queries/content-items/items-feed-query.ts | 12 ++++- .../items-referencing-asset-query.ts | 10 +++- .../content-items/list-content-items-query.ts | 7 ++- .../fetch-content-type-element-query.ts | 7 ++- .../content-types/fetch-content-type-query.ts | 4 +- .../content-types/list-content-types-query.ts | 7 ++- lib/queries/delivery-queries.ts | 48 ++++++++++++++----- lib/queries/languages/list-languages-query.ts | 7 ++- .../taxonomies/fetch-taxonomy-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 7 ++- tests/unit/queries/query-parameters.spec.ts | 4 +- 13 files changed, 105 insertions(+), 36 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 242920e6..374a86c5 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -40,7 +40,11 @@ export type DeliveryClientSchema; + +export type DeliveryMetadataWithToken = { + readonly continuationToken: string | undefined; +}; export type ApiMode = "public" | "preview" | "secure"; @@ -81,9 +85,16 @@ export type DeliveryClient): ItemsReferencingAssetQuery; }; -export type DeliveryFetchQuery = FetchQuery; +export type DeliveryFetchQuery = FetchQuery< + TPayload, + DeliverySdkError, + TMeta +>; -export type DeliveryPagedFetchQuery = PagedFetchQuery; +export type DeliveryPagedFetchQuery< + TPayload extends JsonValue, + TMeta extends DeliveryMetadata | DeliveryMetadataWithToken, +> = PagedFetchQuery; export type DeliveryEndpoint = | "languages" diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index b9286533..f1533dc0 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,9 +1,12 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type FetchContentItemPayload, fetchContentItemSchema } from "./content-item.models.js"; -export type FetchContentItemQuery = DeliveryFetchQuery>; +export type FetchContentItemQuery = DeliveryFetchQuery< + FetchContentItemPayload, + DeliveryMetadata +>; export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< NonNullable, diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index c260dc2b..dacd5bc2 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -1,4 +1,9 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryMetadataWithToken, + DeliveryPagedFetchQuery, +} from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging, @@ -12,7 +17,10 @@ import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedSchema } from type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; -export type ItemsFeedQuery = DeliveryPagedFetchQuery>; +export type ItemsFeedQuery = DeliveryPagedFetchQuery< + ItemsFeedPayload, + DeliveryMetadataWithToken +>; export type ItemsFeedQueryRequest = DeliveryRequestWithTokenPaging< { diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index e80c2e6e..fa75de4d 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -1,11 +1,17 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryMetadataWithToken, + DeliveryPagedFetchQuery, +} from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetSchema } from "./content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< - ItemsReferencingAssetPayload + ItemsReferencingAssetPayload, + DeliveryMetadataWithToken >; export type ItemsReferencingAssetQueryRequest = DeliveryRequestWithTokenPaging< diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 6058d0cc..d4697a5a 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -1,4 +1,4 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, @@ -12,7 +12,10 @@ import { type ContentItemPayload, type ListContentItemsPayload, listContentItems type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; -export type ListContentItemsQuery = DeliveryPagedFetchQuery>; +export type ListContentItemsQuery = DeliveryPagedFetchQuery< + ListContentItemsPayload, + DeliveryMetadata +>; export type ListContentItemsQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam | ElementOrderQueryParam>, diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 5cb80eb8..67a2bf54 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,9 +1,12 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypeElementPayload, contentTypeElementSchema } from "./content-type.models.js"; -export type FetchContentTypeElementQuery = DeliveryFetchQuery>; +export type FetchContentTypeElementQuery = DeliveryFetchQuery< + ContentTypeElementPayload, + DeliveryMetadata +>; export type FetchContentTypeElementQueryRequest = DeliveryRequest & { readonly elementCodename: NonNullable[number]; diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index f49e2846..f79f7b31 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,11 +1,11 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypePayload, contentTypeSchema } from "./content-type.models.js"; type ElementProperties = NonNullable[number]; -export type FetchContentTypeQuery = DeliveryFetchQuery>; +export type FetchContentTypeQuery = DeliveryFetchQuery, DeliveryMetadata>; export type FetchContentTypeQueryRequest = DeliveryRequestWithCodename< NonNullable, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 1c4a6322..5aa97e1c 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,4 +1,4 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; @@ -7,7 +7,10 @@ import { type ContentTypePayload, type ListContentTypesPayload, listContentTypes type SystemProperties = keyof ContentTypePayload["system"]; type ElementProperties = NonNullable[number]; -export type ListContentTypesQuery = DeliveryPagedFetchQuery>; +export type ListContentTypesQuery = DeliveryPagedFetchQuery< + ListContentTypesPayload, + DeliveryMetadata +>; export type ListContentTypesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index d4ba6cc4..3582cc03 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -9,7 +9,13 @@ import { } from "@kontent-ai/core-sdk"; import type { ZodType } from "zod"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryEndpoint, DeliveryMetadata } from "../models/core.models.js"; +import type { + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryEndpoint, + DeliveryMetadata, + DeliveryMetadataWithToken, +} from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; import type { PaginationPayload } from "../models/pagination.models.js"; @@ -35,6 +41,7 @@ export function createDeliveryPagedByUrlQuery({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), mapPagingExtraResponseProps: () => {}, + mapMetadata: () => ({}), }); } @@ -48,11 +55,14 @@ export function createDeliveryPagedByTokenQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByContinuationToken(), mapPagingExtraResponseProps: () => {}, + mapMetadata: (_, data) => ({ + continuationToken: data.continuationToken, + }), }); } @@ -67,9 +77,29 @@ export function createDeliveryFetchQuery({ readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; }): FetchQuery { - return createFetchQuery( - getSharedRequestData({ config, endpoint, schema: schema, request }), - ); + return createFetchQuery({ + ...getSharedRequestData({ config, endpoint, schema: schema, request }), + mapMetadata: () => ({}), + }); +} + +export function createDeliveryFetchWithTokenQuery({ + config, + schema, + endpoint, + request, +}: { + readonly request: DefaultDeliveryRequest | undefined; + readonly config: DeliveryClientConfig; + readonly schema: ZodType; + readonly endpoint: DeliveryEndpoint; +}): FetchQuery { + return createFetchQuery({ + ...getSharedRequestData({ config, endpoint, schema: schema, request }), + mapMetadata: (_, data) => ({ + continuationToken: data.continuationToken, + }), + }); } function getSharedRequestData({ @@ -83,11 +113,10 @@ function getSharedRequestData({ readonly endpoint: DeliveryEndpoint; readonly schema: ZodType; }): Pick< - FetchQueryRequest, + FetchQueryRequest, | "abortSignal" | "config" | "sdkInfo" - | "mapMetadata" | "authorizationApiKey" | "url" | "requestHeaders" @@ -99,9 +128,6 @@ function getSharedRequestData({ abortSignal: undefined, config, sdkInfo: deliverySdkInfo, - mapMetadata: () => { - return {}; - }, mapExtraResponseProps: () => {}, requestHeaders: getHeaders(request), url: getUrl({ request, config, endpoint }), diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 97c7d362..4e494626 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,10 +1,13 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type LanguagePayload, type ListLanguagesPayload, listLanguagesSchema } from "./language.models.js"; -export type ListLanguagesQuery = DeliveryPagedFetchQuery>; +export type ListLanguagesQuery = DeliveryPagedFetchQuery< + ListLanguagesPayload, + DeliveryMetadata +>; type SystemProperties = keyof LanguagePayload["system"]; diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 9ee0aec9..41d232fd 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,9 +1,9 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; -export type FetchTaxonomyQuery = DeliveryFetchQuery>; +export type FetchTaxonomyQuery = DeliveryFetchQuery, DeliveryMetadata>; export type FetchTaxonomyQueryRequest = DeliveryRequestWithCodename< NonNullable, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 9a5ff66d..8924be30 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,10 +1,13 @@ -import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryPagedFetchQuery } from "../../models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import { type ListTaxonomiesPayload, listTaxonomiesSchema, type TaxonomyPayload } from "./taxonomy.models.js"; -export type ListTaxonomiesQuery = DeliveryPagedFetchQuery>; +export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< + ListTaxonomiesPayload, + DeliveryMetadata +>; type SystemProperties = keyof TaxonomyPayload["system"]; diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index ba0ae3fb..ec97535c 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -1,6 +1,6 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; -import type { DeliveryPagedFetchQuery } from "../../../lib/models/core.models.js"; +import type { DeliveryMetadata, DeliveryPagedFetchQuery } from "../../../lib/models/core.models.js"; import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; @@ -11,7 +11,7 @@ describe("Query parameters", () => { }); it("Paging parameters should be added to the url", () => { - const listingQueries: readonly DeliveryPagedFetchQuery[] = [ + const listingQueries: readonly DeliveryPagedFetchQuery[] = [ client.listLanguages({ query: { order: "system.name[asc]", From 7cbbafc3df55021386d5f17c3f3c6ca0674dfc25 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 12:06:11 +0200 Subject: [PATCH 112/221] splits tests, adds test covering continuation token --- .../create-delivery-fetch-query.spec.ts | 88 +++++++ ...eate-delivery-paged-by-token-query.spec.ts | 120 +++++++++ ...create-delivery-paged-by-url-query.spec.ts | 86 +++++++ .../delivery-query/delivery-queries.spec.ts | 236 ------------------ 4 files changed, 294 insertions(+), 236 deletions(-) create mode 100644 tests/unit/delivery-query/create-delivery-fetch-query.spec.ts create mode 100644 tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts create mode 100644 tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts delete mode 100644 tests/unit/delivery-query/delivery-queries.spec.ts diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts new file mode 100644 index 00000000..0c766ca9 --- /dev/null +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -0,0 +1,88 @@ +import type { JsonValue } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import { type ZodType, z } from "zod"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { Filter } from "../../../lib/models/filter.models.js"; +import type { DeliveryRequest } from "../../../lib/models/request.models.js"; +import { createDeliveryFetchQuery } from "../../../lib/queries/delivery-queries.js"; +import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; +import { isFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; + +const clientConfig: DeliveryClientConfig = { + apiMode: "public", + environmentId: unitEnvironmentId, +}; + +const testSchema: ZodType = z.object({}); + +describe("createDeliveryFetchQuery", () => { + it("returns a query with FetchQuery shape", () => { + const query = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items/my_item"; + const { inspect } = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint, + }); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); + }); + + it("URL has no query string when request is undefined", () => { + const { inspect } = createDeliveryFetchQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(inspect().data?.url?.toString()).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const { inspect } = createDeliveryFetchQuery({ + config: clientConfig, + request: {}, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(inspect().data?.url?.toString()).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest<{ readonly language: string; readonly depth: number }, never> = { + query: { language: "en-us", depth: 2 }, + }; + const { inspect } = createDeliveryFetchQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items/my_item", + }); + + const url = inspect().data?.url; + expect(url?.searchParams.get("language")).toBe(request.query?.language); + expect(url?.searchParams.get("depth")).toBe(request.query?.depth.toString()); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest[]> = { + filters: [{ property: "system.type", operator: "eq", value: "article" }], + }; + const { inspect } = createDeliveryFetchQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items/my_item", + }); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=article").toString()); + }); +}); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts new file mode 100644 index 00000000..2fe64694 --- /dev/null +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -0,0 +1,120 @@ +import type { JsonValue } from "@kontent-ai/core-sdk"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { type ZodType, z } from "zod"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { Filter } from "../../../lib/models/filter.models.js"; +import type { DeliveryRequest } from "../../../lib/models/request.models.js"; +import { createDeliveryPagedByTokenQuery } from "../../../lib/queries/delivery-queries.js"; +import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; +import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; + +const clientConfig: DeliveryClientConfig = { + apiMode: "public", + environmentId: unitEnvironmentId, +}; + +const testSchema: ZodType = z.object({}); + +describe("createDeliveryPagingByTokenQuery", () => { + it("returns a query with PagedFetchQuery shape", () => { + const query = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }); + expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items-feed" as const; + const { inspect } = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint, + }); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); + }); + + it("URL has no query string when request is undefined", () => { + const { inspect } = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }); + expect(inspect().data?.url.toString()).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const request: DeliveryRequest = {}; + const { inspect } = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(inspect().data?.url.toString()).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest<{ readonly language: string }, never> = { + query: { language: "en-us" }, + }; + const { inspect } = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(inspect().data?.url?.searchParams.get("language")).toBe("en-us"); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest[]> = { + filters: [{ property: "system.type", operator: "eq", value: "blog" }], + }; + const { inspect } = createDeliveryPagedByTokenQuery({ + config: clientConfig, + request, + schema: testSchema, + endpoint: "items-feed", + }); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=blog").toString()); + }); +}); + +describe("createDeliveryPagingByTokenQuery - continuationToken in meta", () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("meta.continuationToken equals the X-Continuation response header value", async () => { + const token = "abc-continuation-token"; + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200, continuationToken: token }); + + const { response } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchPageSafe(); + + expect(response?.meta.continuationToken).toBe(token); + }); + + it("meta.continuationToken is undefined when the X-Continuation response header is absent", async () => { + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200 }); + + const { response } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchPageSafe(); + + expect(response?.meta.continuationToken).toBeUndefined(); + }); +}); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts new file mode 100644 index 00000000..a8d5c1b9 --- /dev/null +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -0,0 +1,86 @@ +import { describe, expect, it } from "vitest"; +import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { Filter } from "../../../lib/models/filter.models.js"; +import { paginationSchema } from "../../../lib/models/pagination.models.js"; +import type { DeliveryRequest } from "../../../lib/models/request.models.js"; +import { createDeliveryPagedByUrlQuery } from "../../../lib/queries/delivery-queries.js"; +import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; +import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; + +const clientConfig: DeliveryClientConfig = { + apiMode: "public", + environmentId: unitEnvironmentId, +}; + +describe("createDeliveryPagingByUrlQuery", () => { + it("returns a query with PagedFetchQuery shape", () => { + const query = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }); + expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); + }); + + it("URL matches the delivery URL for the configured endpoint", () => { + const endpoint = "items" as const; + const { inspect } = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint, + }); + expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); + }); + + it("URL has no query string when request is undefined", () => { + const { inspect } = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }); + expect(inspect().data?.url?.toString()).not.toContain("?"); + }); + + it("URL has no query string when request has neither query nor filters", () => { + const request: DeliveryRequest = {}; + const { inspect } = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + expect(inspect().data?.url?.toString()).not.toContain("?"); + }); + + it("URL includes query parameters when request.query is provided", () => { + const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { + query: { skip: 10, limit: 5 }, + }; + const { inspect } = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + + const url = inspect().data?.url; + expect(url?.searchParams.get("skip")).toBe("10"); + expect(url?.searchParams.get("limit")).toBe("5"); + }); + + it("URL includes filters when request.filters is provided", () => { + const request: DeliveryRequest[]> = { + filters: [{ property: "system.type", operator: "eq", value: "movie" }], + }; + const { inspect } = createDeliveryPagedByUrlQuery({ + config: clientConfig, + request, + schema: paginationSchema, + endpoint: "items", + }); + expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); + }); +}); diff --git a/tests/unit/delivery-query/delivery-queries.spec.ts b/tests/unit/delivery-query/delivery-queries.spec.ts deleted file mode 100644 index b4e82183..00000000 --- a/tests/unit/delivery-query/delivery-queries.spec.ts +++ /dev/null @@ -1,236 +0,0 @@ -import type { JsonValue } from "@kontent-ai/core-sdk"; -import { describe, expect, it } from "vitest"; -import { type ZodType, z } from "zod"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; -import type { Filter } from "../../../lib/models/filter.models.js"; -import { paginationSchema } from "../../../lib/models/pagination.models.js"; -import type { DeliveryRequest } from "../../../lib/models/request.models.js"; -import { - createDeliveryFetchQuery, - createDeliveryPagedByTokenQuery, - createDeliveryPagedByUrlQuery, -} from "../../../lib/queries/delivery-queries.js"; -import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; -import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; - -const clientConfig: DeliveryClientConfig = { - apiMode: "public", - environmentId: unitEnvironmentId, -}; - -const testSchema: ZodType = z.object({}); - -describe("createDeliveryFetchQuery", () => { - it("returns a query with FetchQuery shape", () => { - const query = createDeliveryFetchQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint: "items/my_item", - }); - expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); - }); - - it("URL matches the delivery URL for the configured endpoint", () => { - const endpoint = "items/my_item"; - const { inspect } = createDeliveryFetchQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint, - }); - expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); - }); - - it("URL has no query string when request is undefined", () => { - const { inspect } = createDeliveryFetchQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint: "items/my_item", - }); - expect(inspect().data?.url?.toString()).not.toContain("?"); - }); - - it("URL has no query string when request has neither query nor filters", () => { - const { inspect } = createDeliveryFetchQuery({ - config: clientConfig, - request: {}, - schema: testSchema, - endpoint: "items/my_item", - }); - expect(inspect().data?.url?.toString()).not.toContain("?"); - }); - - it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest<{ readonly language: string; readonly depth: number }, never> = { - query: { language: "en-us", depth: 2 }, - }; - const { inspect } = createDeliveryFetchQuery({ - config: clientConfig, - request, - schema: testSchema, - endpoint: "items/my_item", - }); - - const url = inspect().data?.url; - expect(url?.searchParams.get("language")).toBe(request.query?.language); - expect(url?.searchParams.get("depth")).toBe(request.query?.depth.toString()); - }); - - it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { - filters: [{ property: "system.type", operator: "eq", value: "article" }], - }; - const { inspect } = createDeliveryFetchQuery({ - config: clientConfig, - request, - schema: testSchema, - endpoint: "items/my_item", - }); - expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=article").toString()); - }); -}); - -describe("createDeliveryPagingByUrlQuery", () => { - it("returns a query with PagedFetchQuery shape", () => { - const query = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request: undefined, - schema: paginationSchema, - endpoint: "items", - }); - expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); - }); - - it("URL matches the delivery URL for the configured endpoint", () => { - const endpoint = "items" as const; - const { inspect } = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request: undefined, - schema: paginationSchema, - endpoint, - }); - expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); - }); - - it("URL has no query string when request is undefined", () => { - const { inspect } = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request: undefined, - schema: paginationSchema, - endpoint: "items", - }); - expect(inspect().data?.url?.toString()).not.toContain("?"); - }); - - it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; - const { inspect } = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request, - schema: paginationSchema, - endpoint: "items", - }); - expect(inspect().data?.url?.toString()).not.toContain("?"); - }); - - it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { - query: { skip: 10, limit: 5 }, - }; - const { inspect } = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request, - schema: paginationSchema, - endpoint: "items", - }); - - const url = inspect().data?.url; - expect(url?.searchParams.get("skip")).toBe("10"); - expect(url?.searchParams.get("limit")).toBe("5"); - }); - - it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { - filters: [{ property: "system.type", operator: "eq", value: "movie" }], - }; - const { inspect } = createDeliveryPagedByUrlQuery({ - config: clientConfig, - request, - schema: paginationSchema, - endpoint: "items", - }); - expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); - }); -}); - -describe("createDeliveryPagingByTokenQuery", () => { - it("returns a query with PagedFetchQuery shape", () => { - const query = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint: "items-feed", - }); - expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); - }); - - it("URL matches the delivery URL for the configured endpoint", () => { - const endpoint = "items-feed" as const; - const { inspect } = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint, - }); - expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); - }); - - it("URL has no query string when request is undefined", () => { - const { inspect } = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request: undefined, - schema: testSchema, - endpoint: "items-feed", - }); - expect(inspect().data?.url.toString()).not.toContain("?"); - }); - - it("URL has no query string when request has neither query nor filters", () => { - const request: DeliveryRequest = {}; - const { inspect } = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request, - schema: testSchema, - endpoint: "items-feed", - }); - expect(inspect().data?.url.toString()).not.toContain("?"); - }); - - it("URL includes query parameters when request.query is provided", () => { - const request: DeliveryRequest<{ readonly language: string }, never> = { - query: { language: "en-us" }, - }; - const { inspect } = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request, - schema: testSchema, - endpoint: "items-feed", - }); - expect(inspect().data?.url?.searchParams.get("language")).toBe("en-us"); - }); - - it("URL includes filters when request.filters is provided", () => { - const request: DeliveryRequest[]> = { - filters: [{ property: "system.type", operator: "eq", value: "blog" }], - }; - const { inspect } = createDeliveryPagedByTokenQuery({ - config: clientConfig, - request, - schema: testSchema, - endpoint: "items-feed", - }); - expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=blog").toString()); - }); -}); From 3956836fe087d75d05f933e24e6475908c821a67 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 12:24:16 +0200 Subject: [PATCH 113/221] Removes unused query --- lib/queries/delivery-queries.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 3582cc03..8f77168b 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -83,25 +83,6 @@ export function createDeliveryFetchQuery({ }); } -export function createDeliveryFetchWithTokenQuery({ - config, - schema, - endpoint, - request, -}: { - readonly request: DefaultDeliveryRequest | undefined; - readonly config: DeliveryClientConfig; - readonly schema: ZodType; - readonly endpoint: DeliveryEndpoint; -}): FetchQuery { - return createFetchQuery({ - ...getSharedRequestData({ config, endpoint, schema: schema, request }), - mapMetadata: (_, data) => ({ - continuationToken: data.continuationToken, - }), - }); -} - function getSharedRequestData({ config, endpoint, From 1e8f2ae98b8fdf7eaf2c0a76a9a214a0c292f2e7 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 12:35:04 +0200 Subject: [PATCH 114/221] Naming updates --- lib/queries/content-types/content-type.models.ts | 9 ++++++--- lib/queries/delivery-queries.ts | 14 +++++++------- lib/queries/taxonomies/fetch-taxonomy-query.ts | 4 ++-- lib/queries/taxonomies/taxonomy.models.ts | 6 +++--- .../taxonomies/fetch-taxonomy-query.spec.ts | 4 ++-- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index acb0a96e..a8174f8f 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -10,7 +10,7 @@ const contentTypeElementOptionSchema = z }) .readonly(); -const contentTypeElementsSchema = z.discriminatedUnion("type", [ +const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ z .object({ type: z.literal("text"), @@ -97,7 +97,10 @@ export const contentTypeSchema = (schema: last_modified: z.iso.datetime(), }) .readonly(), - elements: z.record(getCodenameSchema(schema?.elementCodenames), contentTypeElementsSchema), + elements: z.record( + getCodenameSchema(schema?.elementCodenames), + contentTypeAnyElementSchema, + ), }) .readonly(); @@ -112,7 +115,7 @@ export const listContentTypesSchema = (sch export const contentTypeElementSchema = (schema: TSchema | undefined) => z .intersection( - contentTypeElementsSchema, + contentTypeAnyElementSchema, z .object({ // Required only for the endpoint `types/{type}/elements/{element}` diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 8f77168b..b536d5b6 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -24,7 +24,7 @@ import { mapDeliveryError } from "../utils/error.utils.js"; import { getNextPageByContinuationToken, getNextPageByUrl } from "../utils/paging.utils.js"; import { addQueryParametersToUrl, getDeliveryUrl } from "../utils/url.utils.js"; -type DefaultDeliveryRequest = DeliveryRequest[]>; +type AnyDeliveryRequest = DeliveryRequest[]>; export function createDeliveryPagedByUrlQuery({ config, @@ -32,7 +32,7 @@ export function createDeliveryPagedByUrlQuery; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; @@ -51,7 +51,7 @@ export function createDeliveryPagedByTokenQuery({ endpoint, request, }: { - readonly request: DefaultDeliveryRequest | undefined; + readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; @@ -72,7 +72,7 @@ export function createDeliveryFetchQuery({ endpoint, request, }: { - readonly request: DefaultDeliveryRequest | undefined; + readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; @@ -89,7 +89,7 @@ function getSharedRequestData({ schema, request, }: { - readonly request: DefaultDeliveryRequest | undefined; + readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; readonly schema: ZodType; @@ -123,14 +123,14 @@ function getUrl({ config, endpoint, }: { - readonly request: DefaultDeliveryRequest | undefined; + readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; }): string { return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request?.query, request?.filters); } -function getHeaders(request?: DefaultDeliveryRequest): readonly Header[] { +function getHeaders(request?: AnyDeliveryRequest): readonly Header[] { if (!request) { return []; } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 41d232fd..b1f70a13 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type TaxonomyPayload, taxonomyPayload } from "./taxonomy.models.js"; +import { type TaxonomyPayload, taxonomySchema } from "./taxonomy.models.js"; export type FetchTaxonomyQuery = DeliveryFetchQuery, DeliveryMetadata>; @@ -18,7 +18,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - schema: taxonomyPayload(config.schema), + schema: taxonomySchema(config.schema), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 71d89465..d0a7dbb9 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -12,7 +12,7 @@ const taxonomyTermSchema = (schema: TSchem }, }); -export const taxonomyPayload = (schema: TSchema | undefined) => +export const taxonomySchema = (schema: TSchema | undefined) => z .object({ system: z @@ -30,13 +30,13 @@ export const taxonomyPayload = (schema: TS export const listTaxonomiesSchema = (schema: TSchema | undefined) => z .object({ - taxonomies: z.array(taxonomyPayload(schema)).readonly(), + taxonomies: z.array(taxonomySchema(schema)).readonly(), ...paginationSchema.shape, }) .readonly(); export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer>>; +export type TaxonomyPayload = z.infer>>; export type ListTaxonomiesPayload = z.infer>>; diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index 49cec32d..b2f2886a 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -1,6 +1,6 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type TaxonomyPayload, taxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { type TaxonomyPayload, taxonomySchema } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-taxonomy-query.payload.js"; @@ -10,6 +10,6 @@ describe("Fetch taxonomy query", async () => { endpoint: `taxonomies/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchTaxonomy({ codename: codename }), - expectedSchema: taxonomyPayload(getIntegrationTestsSchema()), + expectedSchema: taxonomySchema(getIntegrationTestsSchema()), }); }); From 8ae53549e169fcd98b7ac16a2fee959ac2886d8f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 12:52:49 +0200 Subject: [PATCH 115/221] Adds support for lastNextPageUrl --- lib/models/core.models.ts | 8 ++ lib/queries/delivery-queries.ts | 18 +++-- ...eate-delivery-paged-by-token-query.spec.ts | 68 +++++++++++++++++ ...create-delivery-paged-by-url-query.spec.ts | 75 ++++++++++++++++++- 4 files changed, 162 insertions(+), 7 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 374a86c5..c812d47e 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -46,6 +46,14 @@ export type DeliveryMetadataWithToken = { readonly continuationToken: string | undefined; }; +export type TokenPagingDeliveryExtraResponseProps = { + readonly lastContinuationToken: string | undefined; +}; + +export type UrlPagingDeliveryExtraResponseProps = { + readonly lastNextPageUrl: string | undefined; +}; + export type ApiMode = "public" | "preview" | "secure"; export type DeliveryClientConfig = SdkConfig< diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index b536d5b6..61228c5f 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -15,6 +15,8 @@ import type { DeliveryEndpoint, DeliveryMetadata, DeliveryMetadataWithToken, + TokenPagingDeliveryExtraResponseProps, + UrlPagingDeliveryExtraResponseProps, } from "../models/core.models.js"; import type { DeliverySdkError } from "../models/error.models.js"; import type { Filter } from "../models/filter.models.js"; @@ -36,11 +38,13 @@ export function createDeliveryPagedByUrlQuery; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), - mapPagingExtraResponseProps: () => {}, + mapPagingExtraResponseProps: (responses) => ({ + lastNextPageUrl: responses.at(-1)?.payload?.pagination?.next_page, + }), mapMetadata: () => ({}), }); } @@ -55,11 +59,13 @@ export function createDeliveryPagedByTokenQuery({ readonly config: DeliveryClientConfig; readonly schema: ZodType; readonly endpoint: DeliveryEndpoint; -}): PagedFetchQuery { - return createPagedFetchQuery({ +}): PagedFetchQuery { + return createPagedFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByContinuationToken(), - mapPagingExtraResponseProps: () => {}, + mapPagingExtraResponseProps: (responses) => ({ + lastContinuationToken: responses.at(-1)?.meta?.continuationToken, + }), mapMetadata: (_, data) => ({ continuationToken: data.continuationToken, }), diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index 2fe64694..7551781a 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -118,3 +118,71 @@ describe("createDeliveryPagingByTokenQuery - continuationToken in meta", () => { expect(response?.meta.continuationToken).toBeUndefined(); }); }); + +describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPagesSafe result", () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("lastContinuationToken equals the X-Continuation token of the last fetched page", async () => { + const token = "last-page-token"; + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200, continuationToken: token }); + + const { success, lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchAllPagesSafe({ maxPagesCount: 1 }); + + expect(success).toBeTruthy(); + expect(lastContinuationToken).toBe(token); + }); + + it("lastContinuationToken is undefined when the last page has no X-Continuation header", async () => { + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200 }); + + const { success, lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchAllPagesSafe(); + + expect(success).toBeTruthy(); + expect(lastContinuationToken).toBeUndefined(); + }); +}); + +describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPages result", () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("lastContinuationToken equals the X-Continuation token of the last fetched page", async () => { + const token = "last-page-token"; + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200, continuationToken: token }); + + const { lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchAllPages({ maxPagesCount: 1 }); + + expect(lastContinuationToken).toBe(token); + }); + + it("lastContinuationToken is undefined when the last page has no X-Continuation header", async () => { + mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200 }); + + const { lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + config: clientConfig, + request: undefined, + schema: testSchema, + endpoint: "items-feed", + }).fetchAllPages(); + + expect(lastContinuationToken).toBeUndefined(); + }); +}); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index a8d5c1b9..faa09d06 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -1,4 +1,5 @@ -import { describe, expect, it } from "vitest"; +import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { afterEach, describe, expect, it, vi } from "vitest"; import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.models.js"; @@ -12,6 +13,10 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; +const paginationPayload = (nextPageUrl: string | undefined) => ({ + pagination: { skip: 0, limit: 10, count: 100, next_page: nextPageUrl }, +}); + describe("createDeliveryPagingByUrlQuery", () => { it("returns a query with PagedFetchQuery shape", () => { const query = createDeliveryPagedByUrlQuery({ @@ -84,3 +89,71 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); }); }); + +describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPagesSafe result", () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("lastNextPageUrl equals the next_page value of the last fetched page", async () => { + const nextPageUrl = "https://deliver.kontent.ai/next-page"; + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(nextPageUrl), statusCode: 200 }); + + const { success, lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }).fetchAllPagesSafe({ maxPagesCount: 1 }); + + expect(success).toBeTruthy(); + expect(lastNextPageUrl).toBe(nextPageUrl); + }); + + it("lastNextPageUrl is an empty string when the last page has no next page", async () => { + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(""), statusCode: 200 }); + + const { success, lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }).fetchAllPagesSafe(); + + expect(success).toBeTruthy(); + expect(lastNextPageUrl).toBe(""); + }); +}); + +describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPages result", () => { + afterEach(() => { + vi.resetAllMocks(); + }); + + it("lastNextPageUrl equals the next_page value of the last fetched page", async () => { + const nextPageUrl = "https://deliver.kontent.ai/next-page"; + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(nextPageUrl), statusCode: 200 }); + + const { lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }).fetchAllPages({ maxPagesCount: 1 }); + + expect(lastNextPageUrl).toBe(nextPageUrl); + }); + + it("lastNextPageUrl is an empty string when the last page has no next page", async () => { + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(undefined), statusCode: 200 }); + + const { lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + config: clientConfig, + request: undefined, + schema: paginationSchema, + endpoint: "items", + }).fetchAllPages(); + + expect(lastNextPageUrl).toBe(undefined); + }); +}); From bb7c96f122021be97c1cbf2a3a74bf7ea322fff3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 12:58:32 +0200 Subject: [PATCH 116/221] Updates naming for next continuation token / url --- lib/models/core.models.ts | 4 +-- lib/queries/delivery-queries.ts | 4 +-- ...eate-delivery-paged-by-token-query.spec.ts | 28 +++++++-------- ...create-delivery-paged-by-url-query.spec.ts | 36 +++++++++---------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index c812d47e..6838bc8f 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -47,11 +47,11 @@ export type DeliveryMetadataWithToken = { }; export type TokenPagingDeliveryExtraResponseProps = { - readonly lastContinuationToken: string | undefined; + readonly nextContinuationToken: string | undefined; }; export type UrlPagingDeliveryExtraResponseProps = { - readonly lastNextPageUrl: string | undefined; + readonly nextPageUrl: string | undefined; }; export type ApiMode = "public" | "preview" | "secure"; diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 61228c5f..bde92b48 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -43,7 +43,7 @@ export function createDeliveryPagedByUrlQuery({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByUrl(), mapPagingExtraResponseProps: (responses) => ({ - lastNextPageUrl: responses.at(-1)?.payload?.pagination?.next_page, + nextPageUrl: responses.at(-1)?.payload?.pagination?.next_page, }), mapMetadata: () => ({}), }); @@ -64,7 +64,7 @@ export function createDeliveryPagedByTokenQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), getNextPageData: getNextPageByContinuationToken(), mapPagingExtraResponseProps: (responses) => ({ - lastContinuationToken: responses.at(-1)?.meta?.continuationToken, + nextContinuationToken: responses.at(-1)?.meta?.continuationToken, }), mapMetadata: (_, data) => ({ continuationToken: data.continuationToken, diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index 7551781a..f5005465 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -119,16 +119,16 @@ describe("createDeliveryPagingByTokenQuery - continuationToken in meta", () => { }); }); -describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPagesSafe result", () => { +describe("createDeliveryPagingByTokenQuery - nextContinuationToken in fetchAllPagesSafe result", () => { afterEach(() => { vi.resetAllMocks(); }); - it("lastContinuationToken equals the X-Continuation token of the last fetched page", async () => { + it("nextContinuationToken equals the X-Continuation token of the last fetched page", async () => { const token = "last-page-token"; mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200, continuationToken: token }); - const { success, lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + const { success, nextContinuationToken } = await createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -136,13 +136,13 @@ describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPa }).fetchAllPagesSafe({ maxPagesCount: 1 }); expect(success).toBeTruthy(); - expect(lastContinuationToken).toBe(token); + expect(nextContinuationToken).toBe(token); }); - it("lastContinuationToken is undefined when the last page has no X-Continuation header", async () => { + it("nextContinuationToken is undefined when the last page has no X-Continuation header", async () => { mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200 }); - const { success, lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + const { success, nextContinuationToken } = await createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, @@ -150,39 +150,39 @@ describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPa }).fetchAllPagesSafe(); expect(success).toBeTruthy(); - expect(lastContinuationToken).toBeUndefined(); + expect(nextContinuationToken).toBeUndefined(); }); }); -describe("createDeliveryPagingByTokenQuery - lastContinuationToken in fetchAllPages result", () => { +describe("createDeliveryPagingByTokenQuery - nextContinuationToken in fetchAllPages result", () => { afterEach(() => { vi.resetAllMocks(); }); - it("lastContinuationToken equals the X-Continuation token of the last fetched page", async () => { + it("nextContinuationToken equals the X-Continuation token of the last fetched page", async () => { const token = "last-page-token"; mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200, continuationToken: token }); - const { lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + const { nextContinuationToken } = await createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint: "items-feed", }).fetchAllPages({ maxPagesCount: 1 }); - expect(lastContinuationToken).toBe(token); + expect(nextContinuationToken).toBe(token); }); - it("lastContinuationToken is undefined when the last page has no X-Continuation header", async () => { + it("nextContinuationToken is undefined when the last page has no X-Continuation header", async () => { mockGlobalFetchJsonResponse({ jsonResponse: {}, statusCode: 200 }); - const { lastContinuationToken } = await createDeliveryPagedByTokenQuery({ + const { nextContinuationToken } = await createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, schema: testSchema, endpoint: "items-feed", }).fetchAllPages(); - expect(lastContinuationToken).toBeUndefined(); + expect(nextContinuationToken).toBeUndefined(); }); }); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index faa09d06..55030525 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -90,16 +90,16 @@ describe("createDeliveryPagingByUrlQuery", () => { }); }); -describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPagesSafe result", () => { +describe("createDeliveryPagingByUrlQuery - nextPageUrl in fetchAllPagesSafe result", () => { afterEach(() => { vi.resetAllMocks(); }); - it("lastNextPageUrl equals the next_page value of the last fetched page", async () => { - const nextPageUrl = "https://deliver.kontent.ai/next-page"; - mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(nextPageUrl), statusCode: 200 }); + it("nextPageUrl equals the next_page value of the last fetched page", async () => { + const expectedUrl = "https://deliver.kontent.ai/next-page"; + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(expectedUrl), statusCode: 200 }); - const { success, lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + const { success, nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -107,13 +107,13 @@ describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPagesSafe }).fetchAllPagesSafe({ maxPagesCount: 1 }); expect(success).toBeTruthy(); - expect(lastNextPageUrl).toBe(nextPageUrl); + expect(nextPageUrl).toBe(expectedUrl); }); - it("lastNextPageUrl is an empty string when the last page has no next page", async () => { + it("nextPageUrl is an empty string when the last page has no next page", async () => { mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(""), statusCode: 200 }); - const { success, lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + const { success, nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, @@ -121,39 +121,39 @@ describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPagesSafe }).fetchAllPagesSafe(); expect(success).toBeTruthy(); - expect(lastNextPageUrl).toBe(""); + expect(nextPageUrl).toBe(""); }); }); -describe("createDeliveryPagingByUrlQuery - lastNextPageUrl in fetchAllPages result", () => { +describe("createDeliveryPagingByUrlQuery - nextPageUrl in fetchAllPages result", () => { afterEach(() => { vi.resetAllMocks(); }); - it("lastNextPageUrl equals the next_page value of the last fetched page", async () => { - const nextPageUrl = "https://deliver.kontent.ai/next-page"; - mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(nextPageUrl), statusCode: 200 }); + it("nextPageUrl equals the next_page value of the last fetched page", async () => { + const expectedUrl = "https://deliver.kontent.ai/next-page"; + mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(expectedUrl), statusCode: 200 }); - const { lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + const { nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, endpoint: "items", }).fetchAllPages({ maxPagesCount: 1 }); - expect(lastNextPageUrl).toBe(nextPageUrl); + expect(nextPageUrl).toBe(expectedUrl); }); - it("lastNextPageUrl is an empty string when the last page has no next page", async () => { + it("nextPageUrl is an empty string when the last page has no next page", async () => { mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(undefined), statusCode: 200 }); - const { lastNextPageUrl } = await createDeliveryPagedByUrlQuery({ + const { nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, schema: paginationSchema, endpoint: "items", }).fetchAllPages(); - expect(lastNextPageUrl).toBe(undefined); + expect(nextPageUrl).toBe(undefined); }); }); From 9b7f759a2359e191ec504e75fb2f98074527d81e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 13:16:00 +0200 Subject: [PATCH 117/221] test naming update --- .../fetch-content-type-query.spec.ts | 12 ++++++------ .../unit/api-mode/custom-base-url-api.spec.ts | 2 +- tests/unit/api-mode/deliver-api.spec.ts | 6 +++--- tests/unit/api-mode/preview-api.spec.ts | 6 +++--- tests/unit/api-mode/secure-api.spec.ts | 6 +++--- .../create-delivery-fetch-query.spec.ts | 10 +++++----- ...reate-delivery-paged-by-token-query.spec.ts | 18 +++++++++--------- .../create-delivery-paged-by-url-query.spec.ts | 16 ++++++++-------- tests/unit/errors/custom-errors.spec.ts | 8 ++++---- tests/unit/errors/delivery-sdk-error.spec.ts | 2 +- tests/unit/filters/filters.spec.ts | 16 ++++++++-------- tests/unit/headers/headers.spec.ts | 18 +++++++++--------- tests/unit/paging/paging.utils.spec.ts | 4 ++-- tests/unit/queries/query-parameters.spec.ts | 6 +++--- tests/unit/utils/url-utils.spec.ts | 2 +- .../schema-validation-with-extra-props.spec.ts | 4 ++-- ...chema-validation-with-missing-props.spec.ts | 4 ++-- .../unit/validation/schema-validation.spec.ts | 8 ++++---- .../validation/validation-properties.spec.ts | 6 +++--- 19 files changed, 77 insertions(+), 77 deletions(-) diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index a5a457a4..86325608 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -14,7 +14,7 @@ describe("Fetch content type query", async () => { }); }); -describe("Fetch content type query with extra field in element", async () => { +describe("Fetch Content Type Query — Extra Field in Element", async () => { const payload = { system: { id: "445da25c-d991-4b0e-bece-c572124d91f5", @@ -33,12 +33,12 @@ describe("Fetch content type query with extra field in element", async () => { const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); - it("Parsing should be successful when extra field is present in element", () => { + it("parses successfully when extra fields are present in an element", () => { expect(success).toBeTruthy(); }); }); -describe("Fetch content type query with invalid field type in element should fail", async () => { +describe("Fetch Content Type Query — Invalid Field Type in Element", async () => { const payload = { system: { id: "445da25c-d991-4b0e-bece-c572124d91f5", @@ -56,12 +56,12 @@ describe("Fetch content type query with invalid field type in element should fai const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); - it("Parsing should fail when invalid field type is present in element", () => { + it("fails to parse when an invalid field type is present in element", () => { expect(success).toBeFalsy(); }); }); -describe("Fetch query with missing system field should fail", async () => { +describe("Fetch Content Type Query — Missing System Field", async () => { const payload = { system: { id: "445da25c-d991-4b0e-bece-c572124d91f5", @@ -78,7 +78,7 @@ describe("Fetch query with missing system field should fail", async () => { const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); - it("Parsing should fail when system field is missing", () => { + it("fails to parse when the system field is missing", () => { expect(success).toBeFalsy(); }); }); diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts index 691c9291..78edd755 100644 --- a/tests/unit/api-mode/custom-base-url-api.spec.ts +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -20,7 +20,7 @@ describe("Custom base URL API", async () => { // execute query so that http service is called and request headers are captured const { response } = await query.fetchPageSafe(); - it("URL should point to custom base URL", () => { + it("uses the custom base URL", () => { const { origin } = new URL(response?.meta?.url ?? "n/a"); expect(origin).toEqual(`${customBaseUrl.protocol}://${customBaseUrl.host}`); }); diff --git a/tests/unit/api-mode/deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts index 739dd997..7a4dda15 100644 --- a/tests/unit/api-mode/deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -34,17 +34,17 @@ describe("Public deliver API", async () => { // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); - it("Response should be successful", () => { + it("returns a successful response", () => { expect(success).toBeTruthy(); expect(error).toBeUndefined(); }); - it("Request headers should NOT contain authorization header with delivery API key", () => { + it("does not include an authorization header", () => { const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader).toBeUndefined(); }); - it("URL should point to public deliver API", () => { + it("uses the public deliver API URL", () => { const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("deliver.kontent.ai"); }); diff --git a/tests/unit/api-mode/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts index 890d0301..b3e7ca7e 100644 --- a/tests/unit/api-mode/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -36,17 +36,17 @@ describe("Preview API", async () => { // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); - it("Response should be successful", () => { + it("returns a successful response", () => { expect(success).toBeTruthy(); expect(error).toBeUndefined(); }); - it("Request headers should contain authorization header with delivery API key", () => { + it("includes an authorization header with the delivery API key", () => { const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader?.value).toEqual(`Bearer ${previewApiKey}`); }); - it("URL should point to preview API", () => { + it("uses the preview API URL", () => { const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("preview-deliver.kontent.ai"); }); diff --git a/tests/unit/api-mode/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts index 2036117b..f67c4863 100644 --- a/tests/unit/api-mode/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -36,17 +36,17 @@ describe("Secure API", async () => { // execute query so that http service is called and request headers are captured const { success, error, response } = await query.fetchPageSafe(); - it("Response should be successful", () => { + it("returns a successful response", () => { expect(success).toBeTruthy(); expect(error).toBeUndefined(); }); - it("Request headers should contain authorization header with secure API key", () => { + it("includes an authorization header with the secure API key", () => { const authorizationHeader = requestHeaders.find((header) => header.name === ("Authorization" satisfies KnownHeaderName)); expect(authorizationHeader?.value).toEqual(`Bearer ${secureApiKey}`); }); - it("URL should point to secure API", () => { + it("uses the secure API URL", () => { const { host } = new URL(response?.meta?.url ?? "n/a"); expect(host).toEqual("deliver.kontent.ai"); }); diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts index 0c766ca9..349fb5b4 100644 --- a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -26,7 +26,7 @@ describe("createDeliveryFetchQuery", () => { expect(isFetchQueryWithExpectedFunctions(query)).toBeTruthy(); }); - it("URL matches the delivery URL for the configured endpoint", () => { + it("resolves to the delivery URL for the configured endpoint", () => { const endpoint = "items/my_item"; const { inspect } = createDeliveryFetchQuery({ config: clientConfig, @@ -37,7 +37,7 @@ describe("createDeliveryFetchQuery", () => { expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); - it("URL has no query string when request is undefined", () => { + it("has no query string when request is undefined", () => { const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request: undefined, @@ -47,7 +47,7 @@ describe("createDeliveryFetchQuery", () => { expect(inspect().data?.url?.toString()).not.toContain("?"); }); - it("URL has no query string when request has neither query nor filters", () => { + it("has no query string when request has neither query nor filters", () => { const { inspect } = createDeliveryFetchQuery({ config: clientConfig, request: {}, @@ -57,7 +57,7 @@ describe("createDeliveryFetchQuery", () => { expect(inspect().data?.url?.toString()).not.toContain("?"); }); - it("URL includes query parameters when request.query is provided", () => { + it("includes query parameters when request.query is provided", () => { const request: DeliveryRequest<{ readonly language: string; readonly depth: number }, never> = { query: { language: "en-us", depth: 2 }, }; @@ -73,7 +73,7 @@ describe("createDeliveryFetchQuery", () => { expect(url?.searchParams.get("depth")).toBe(request.query?.depth.toString()); }); - it("URL includes filters when request.filters is provided", () => { + it("includes filters when request.filters is provided", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "article" }], }; diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index f5005465..ceb0ef81 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -16,7 +16,7 @@ const clientConfig: DeliveryClientConfig = { const testSchema: ZodType = z.object({}); -describe("createDeliveryPagingByTokenQuery", () => { +describe("createDeliveryPagedByTokenQuery", () => { it("returns a query with PagedFetchQuery shape", () => { const query = createDeliveryPagedByTokenQuery({ config: clientConfig, @@ -27,7 +27,7 @@ describe("createDeliveryPagingByTokenQuery", () => { expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); }); - it("URL matches the delivery URL for the configured endpoint", () => { + it("resolves to the delivery URL for the configured endpoint", () => { const endpoint = "items-feed" as const; const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, @@ -38,7 +38,7 @@ describe("createDeliveryPagingByTokenQuery", () => { expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); - it("URL has no query string when request is undefined", () => { + it("has no query string when request is undefined", () => { const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, request: undefined, @@ -48,7 +48,7 @@ describe("createDeliveryPagingByTokenQuery", () => { expect(inspect().data?.url.toString()).not.toContain("?"); }); - it("URL has no query string when request has neither query nor filters", () => { + it("has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagedByTokenQuery({ config: clientConfig, @@ -59,7 +59,7 @@ describe("createDeliveryPagingByTokenQuery", () => { expect(inspect().data?.url.toString()).not.toContain("?"); }); - it("URL includes query parameters when request.query is provided", () => { + it("includes query parameters when request.query is provided", () => { const request: DeliveryRequest<{ readonly language: string }, never> = { query: { language: "en-us" }, }; @@ -72,7 +72,7 @@ describe("createDeliveryPagingByTokenQuery", () => { expect(inspect().data?.url?.searchParams.get("language")).toBe("en-us"); }); - it("URL includes filters when request.filters is provided", () => { + it("includes filters when request.filters is provided", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "blog" }], }; @@ -86,7 +86,7 @@ describe("createDeliveryPagingByTokenQuery", () => { }); }); -describe("createDeliveryPagingByTokenQuery - continuationToken in meta", () => { +describe("createDeliveryPagedByTokenQuery — continuationToken in meta", () => { afterEach(() => { vi.resetAllMocks(); }); @@ -119,7 +119,7 @@ describe("createDeliveryPagingByTokenQuery - continuationToken in meta", () => { }); }); -describe("createDeliveryPagingByTokenQuery - nextContinuationToken in fetchAllPagesSafe result", () => { +describe("createDeliveryPagedByTokenQuery — nextContinuationToken in fetchAllPagesSafe result", () => { afterEach(() => { vi.resetAllMocks(); }); @@ -154,7 +154,7 @@ describe("createDeliveryPagingByTokenQuery - nextContinuationToken in fetchAllPa }); }); -describe("createDeliveryPagingByTokenQuery - nextContinuationToken in fetchAllPages result", () => { +describe("createDeliveryPagedByTokenQuery — nextContinuationToken in fetchAllPages result", () => { afterEach(() => { vi.resetAllMocks(); }); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index 55030525..0764bcf8 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -17,7 +17,7 @@ const paginationPayload = (nextPageUrl: string | undefined) => ({ pagination: { skip: 0, limit: 10, count: 100, next_page: nextPageUrl }, }); -describe("createDeliveryPagingByUrlQuery", () => { +describe("createDeliveryPagedByUrlQuery", () => { it("returns a query with PagedFetchQuery shape", () => { const query = createDeliveryPagedByUrlQuery({ config: clientConfig, @@ -28,7 +28,7 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); }); - it("URL matches the delivery URL for the configured endpoint", () => { + it("resolves to the delivery URL for the configured endpoint", () => { const endpoint = "items" as const; const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, @@ -39,7 +39,7 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); }); - it("URL has no query string when request is undefined", () => { + it("has no query string when request is undefined", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, @@ -49,7 +49,7 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(inspect().data?.url?.toString()).not.toContain("?"); }); - it("URL has no query string when request has neither query nor filters", () => { + it("has no query string when request has neither query nor filters", () => { const request: DeliveryRequest = {}; const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, @@ -60,7 +60,7 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(inspect().data?.url?.toString()).not.toContain("?"); }); - it("URL includes query parameters when request.query is provided", () => { + it("includes query parameters when request.query is provided", () => { const request: DeliveryRequest<{ readonly skip: number; readonly limit: number }, never> = { query: { skip: 10, limit: 5 }, }; @@ -76,7 +76,7 @@ describe("createDeliveryPagingByUrlQuery", () => { expect(url?.searchParams.get("limit")).toBe("5"); }); - it("URL includes filters when request.filters is provided", () => { + it("includes filters when request.filters is provided", () => { const request: DeliveryRequest[]> = { filters: [{ property: "system.type", operator: "eq", value: "movie" }], }; @@ -90,7 +90,7 @@ describe("createDeliveryPagingByUrlQuery", () => { }); }); -describe("createDeliveryPagingByUrlQuery - nextPageUrl in fetchAllPagesSafe result", () => { +describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPagesSafe result", () => { afterEach(() => { vi.resetAllMocks(); }); @@ -125,7 +125,7 @@ describe("createDeliveryPagingByUrlQuery - nextPageUrl in fetchAllPagesSafe resu }); }); -describe("createDeliveryPagingByUrlQuery - nextPageUrl in fetchAllPages result", () => { +describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPages result", () => { afterEach(() => { vi.resetAllMocks(); }); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index aebc89fa..5f9f4764 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -5,7 +5,7 @@ import { unitEnvironmentId } from "../../utils/test.utils.js"; class CustomError extends Error {} -describe("Handling of custom errors", async () => { +describe("Custom Error Handling", async () => { const { success, error } = await createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -32,15 +32,15 @@ describe("Handling of custom errors", async () => { .listLanguages() .fetchPageSafe(); - it("Success should be false", () => { + it("returns a failed response", () => { expect(success).toBe(false); }); - it("Error should be adapterError", () => { + it("sets the error reason to adapterError", () => { expect(error?.details.reason).toBe("adapterError"); }); - it("Original error should be propagated and be of proper type", () => { + it("propagates the original error as a CustomError instance", () => { if (error?.details.reason === "adapterError") { expect(error.details.originalError).toBeInstanceOf(CustomError); } else { diff --git a/tests/unit/errors/delivery-sdk-error.spec.ts b/tests/unit/errors/delivery-sdk-error.spec.ts index 64be917f..e3a8c2d1 100644 --- a/tests/unit/errors/delivery-sdk-error.spec.ts +++ b/tests/unit/errors/delivery-sdk-error.spec.ts @@ -19,7 +19,7 @@ describe("DeliverySdkError", async () => { .listLanguages() .fetchPageSafe(); - it("error returned from a failed query should be an instance of DeliverySdkError", () => { + it("returns a DeliverySdkError on failure", () => { expect(error).toBeInstanceOf(DeliverySdkError); }); }); diff --git a/tests/unit/filters/filters.spec.ts b/tests/unit/filters/filters.spec.ts index 57eb60bf..6a4aefa7 100644 --- a/tests/unit/filters/filters.spec.ts +++ b/tests/unit/filters/filters.spec.ts @@ -8,7 +8,7 @@ describe("Filters", () => { environmentId: unitEnvironmentId, }); - it("Filter defined as object should be added to the url", () => { + it("adds an object filter to the URL", () => { const { data } = client .listContentItems({ filters: [ @@ -24,7 +24,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); - it("Filter defined as string should be added to the url", () => { + it("adds a string filter to the URL", () => { const { data } = client .listContentItems({ filters: ["system.language[eq]=default"], @@ -34,7 +34,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("system.language[eq]=default").toString()); }); - it("Handle multiple equal signs in value", () => { + it("handles multiple equal signs in the filter value", () => { const { data } = client .listContentItems({ filters: ["system.codename[eq]=abc=def"], @@ -44,7 +44,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("system.codename[eq]=abc=def").toString()); }); - it("Filter defined as string with value containing '=' should be added to the url correctly", () => { + it("handles the '=' operator", () => { const { data } = client .listContentItems({ filters: [ @@ -60,7 +60,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("system.language=default").toString()); }); - it("Filter defined as string with value containing '!=' should be added to the url correctly", () => { + it("handles the '!=' operator", () => { const { data } = client .listContentItems({ filters: [ @@ -76,7 +76,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("system.language[neq]=default").toString()); }); - it("isEmptyRichText filter should produce [eq]=


in the url", () => { + it("adds [eq]=


for isEmptyRichText operator", () => { const { data } = client .listContentItems({ filters: [ @@ -91,7 +91,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("elements.description[eq]=


").toString()); }); - it("isNotEmptyRichText filter should produce [neq]=


in the url", () => { + it("adds [neq]=


for isNotEmptyRichText operator", () => { const { data } = client .listContentItems({ filters: [ @@ -106,7 +106,7 @@ describe("Filters", () => { expect(data?.url.toString()).toContain(new URLSearchParams("elements.description[neq]=


").toString()); }); - it("Filters defined as both object and string should all be added to the url", () => { + it("adds both object and string filters to the URL", () => { const { data } = client .listContentItems({ filters: [ diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 68cb7bc5..962f118b 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -52,13 +52,13 @@ describe("Delivery tracking header", async () => { const requestHeaders = await captureRequestHeaders(); - it("Request headers should contain delivery tracking header with current package info", () => { + it("includes the delivery tracking header with current package info", () => { const syncTrackingHeader = requestHeaders.find((header) => header.name === expectedHeader.name); expect(syncTrackingHeader?.value).toEqual(expectedHeader.value); }); }); -describe("Bypass CDN cache header should be absent by default", async () => { +describe("Bypass CDN Cache Header", async () => { afterEach(() => { vi.resetAllMocks(); }); @@ -71,7 +71,7 @@ describe("Bypass CDN cache header should be absent by default", async () => { const requestHeaders = await captureRequestHeaders(); - it("Request headers should NOT contain bypass CDN cache header", () => { + it("is absent by default", () => { const bypassCdnCacheHeader = requestHeaders.find( (header) => header.name === ("X-KC-Wait-For-Loading-New-Content" satisfies WaitForLoadingNewContentHeaderName), ); @@ -79,7 +79,7 @@ describe("Bypass CDN cache header should be absent by default", async () => { }); }); -describe("Extra headers should be present", async () => { +describe("Extra Request Headers", async () => { const extraHeader: Header = { name: "X-Extra-Header", value: "extra" }; afterEach(() => { @@ -94,26 +94,26 @@ describe("Extra headers should be present", async () => { const requestHeaders = await captureRequestHeaders({ config: { customHeaders: [extraHeader] } }); - it("Request headers should contain extra header", () => { + it("are forwarded from the request config", () => { const foundHeader = requestHeaders.find((header) => header.name === extraHeader.name); expect(foundHeader?.value).toEqual(extraHeader.value); }); }); -describe("Continuation header token should be present", async () => { +describe("Continuation Token Header — when provided in the request", async () => { const continuationTokenValue = "x"; const requestHeaders = await captureRequestHeaders({ headers: { "X-Continuation": continuationTokenValue } }); - it("Request headers should contain continuation token header", () => { + it("is sent to the API", () => { const foundHeader = requestHeaders.find((header) => header.name === ("X-Continuation" satisfies ContinuationTokenHeaderName)); expect(foundHeader?.value).toEqual(continuationTokenValue); }); }); -describe("Continuation header token should be absent by default", async () => { +describe("Continuation Token Header — when not provided", async () => { const requestHeaders = await captureRequestHeaders(); - it("Request headers should NOT contain continuation token header", () => { + it("is not sent to the API", () => { const foundHeader = requestHeaders.find((header) => header.name === ("X-Continuation" satisfies ContinuationTokenHeaderName)); expect(foundHeader).toBeUndefined(); }); diff --git a/tests/unit/paging/paging.utils.spec.ts b/tests/unit/paging/paging.utils.spec.ts index aec5d6b1..2808941a 100644 --- a/tests/unit/paging/paging.utils.spec.ts +++ b/tests/unit/paging/paging.utils.spec.ts @@ -3,8 +3,8 @@ import { describe, expect, it } from "vitest"; import type { PaginationPayload } from "../../../lib/models/pagination.models.js"; import { getNextPageByUrl } from "../../../lib/utils/paging.utils.js"; -describe("Paging utils", () => { - it("Next page URL should be returned", () => { +describe("Paging Utils", () => { + it("returns the next page URL", () => { const response: QueryResponse = { meta: { status: 200, diff --git a/tests/unit/queries/query-parameters.spec.ts b/tests/unit/queries/query-parameters.spec.ts index ec97535c..5d584212 100644 --- a/tests/unit/queries/query-parameters.spec.ts +++ b/tests/unit/queries/query-parameters.spec.ts @@ -4,13 +4,13 @@ import type { DeliveryMetadata, DeliveryPagedFetchQuery } from "../../../lib/mod import { createDeliveryClient } from "../../../lib/public_api.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; -describe("Query parameters", () => { +describe("Query Parameters", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, }); - it("Paging parameters should be added to the url", () => { + it("adds paging parameters to the URL", () => { const listingQueries: readonly DeliveryPagedFetchQuery[] = [ client.listLanguages({ query: { @@ -57,7 +57,7 @@ describe("Query parameters", () => { } }); - it("Elements query parameter should be added as a comma-separated list in the url", () => { + it("adds the elements parameter as a comma-separated list", () => { const { inspect } = client.listContentTypes({ query: { elements: ["x", "y", "z"], diff --git a/tests/unit/utils/url-utils.spec.ts b/tests/unit/utils/url-utils.spec.ts index c2702711..4fa480d4 100644 --- a/tests/unit/utils/url-utils.spec.ts +++ b/tests/unit/utils/url-utils.spec.ts @@ -52,7 +52,7 @@ describe("addQueryParametersToUrl", () => { }); }); -describe("isEmptyRichtextFilter", () => { +describe("isEmptyRichTextFilter", () => { it("returns true for object with isEmptyRichText operator", () => { expect(isEmptyRichTextFilter({ property: "elements.description", operator: "isEmptyRichText" })).toBe(true); }); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts index cebfb504..625050bd 100644 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-extra-props.spec.ts @@ -5,7 +5,7 @@ import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -describe("Valid schema validation with extra props", () => { +describe("Schema Validation — Extra Properties", () => { const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { languages: [ { @@ -25,7 +25,7 @@ describe("Valid schema validation with extra props", () => { }, }; - test("Validation should be successful when response includes additional properties", async () => { + test("succeeds when the response includes additional properties", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts index 14b2fc45..c8745eb4 100644 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ b/tests/unit/validation/schema-validation-with-missing-props.spec.ts @@ -5,7 +5,7 @@ import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -describe("Valid schema validation with missing props", () => { +describe("Schema Validation — Missing Properties", () => { const mockPayload: Omit, "pagination"> = { languages: [ { @@ -18,7 +18,7 @@ describe("Valid schema validation with missing props", () => { ], }; - test("Validation should fail when response is missing schema properties", async () => { + test("fails when the response is missing required schema properties", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts index c7eeba0f..b4d94356 100644 --- a/tests/unit/validation/schema-validation.spec.ts +++ b/tests/unit/validation/schema-validation.spec.ts @@ -5,7 +5,7 @@ import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -describe("Schema validation", () => { +describe("Schema Validation", () => { type TestDeliveryClientTypes = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; readonly taxonomyCodenames: readonly []; @@ -34,7 +34,7 @@ describe("Schema validation", () => { }, }; - test("Response should NOT be successful when response does not match defined language codenames schema", async () => { + test("fails when the response does not match the defined language codename schema", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -63,7 +63,7 @@ describe("Schema validation", () => { expect(error?.details.reason).toBe("validationFailed"); }); - test("Response should be successful when response matches defines language codenames schema", async () => { + test("succeeds when the response matches the defined language codename schema", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -88,7 +88,7 @@ describe("Schema validation", () => { expect(success).toBeTruthy(); }); - test("Response should be successful when response matches general string codename schema", async () => { + test("succeeds when the response matches the general string codename schema", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts index eb970d6c..bf855e65 100644 --- a/tests/unit/validation/validation-properties.spec.ts +++ b/tests/unit/validation/validation-properties.spec.ts @@ -5,8 +5,8 @@ import { ZodError } from "zod"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; -describe("Response validation", () => { - test("Error should be returned when response does not match schema and validation is enabled", async ({ expect }) => { +describe("Response Validation", () => { + test("returns an error when the response does not match the schema and validation is enabled", async ({ expect }) => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -45,7 +45,7 @@ describe("Response validation", () => { } }); - test("Error should not be returned when response does not match schema but validation is disabled", async ({ expect }) => { + test("returns no error when the response does not match the schema but validation is disabled", async ({ expect }) => { const { success, error } = await createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, From 37a67af4f6158ecaf2a6ddd30e9936e1ab3c2e6e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 13:24:30 +0200 Subject: [PATCH 118/221] Update delivery-client-types.test.ts --- tests/types/delivery-client-types.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 19828683..582ff713 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -10,11 +10,11 @@ type ValidLanguageCodename = (typeof languageCodenames)[number]; const client: DeliveryClient<{ languageCodenames: typeof languageCodenames; taxonomyCodenames: typeof taxonomyCodenames; - contentTypeCodenames: string[]; - elementCodenames: string[]; - collectionCodenames: string[]; - workflowCodenames: string[]; - workflowStepCodenames: string[]; + contentTypeCodenames: readonly string[]; + elementCodenames: readonly string[]; + collectionCodenames: readonly string[]; + workflowCodenames: readonly string[]; + workflowStepCodenames: readonly string[]; }> = createDeliveryClient({ apiMode: "public", environmentId: "x", From e67e43e5ce06e369513ad5ac87ed5ae40715bef1 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 14:48:54 +0200 Subject: [PATCH 119/221] Adds support for items referencing items query --- lib/client/delivery-client.ts | 2 + lib/models/core.models.ts | 2 + lib/public_api.ts | 7 +++- .../content-items/content-item.models.ts | 16 ++++++++ .../content-items/items-referencing-item.ts | 37 +++++++++++++++++++ .../items-referencing-item-query.payload.ts | 20 ++++++++++ .../items-referencing-item-query.spec.ts | 15 ++++++++ 7 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 lib/queries/content-items/items-referencing-item.ts create mode 100644 tests/integration/queries/content-items/items-referencing-item-query.payload.ts create mode 100644 tests/integration/queries/content-items/items-referencing-item-query.spec.ts diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index a234a612..3e4c737a 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -5,6 +5,7 @@ import { type ItemsReferencingAssetQueryRequest, itemsReferencingAssetQuery, } from "../queries/content-items/items-referencing-asset-query.js"; +import { type ItemsReferencingItemQueryRequest, itemsReferencingItemQuery } from "../queries/content-items/items-referencing-item.js"; import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { type FetchContentTypeElementQueryRequest, @@ -57,5 +58,6 @@ export function createDeliveryClient) => listContentItemsQuery(config, request), itemsFeed: (request?: ItemsFeedQueryRequest) => itemsFeedQuery(config, request), itemsReferencingAsset: (request: ItemsReferencingAssetQueryRequest) => itemsReferencingAssetQuery(config, request), + itemsReferencingItem: (request: ItemsReferencingItemQueryRequest) => itemsReferencingItemQuery(config, request), }; } diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 6838bc8f..cfadea94 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -5,6 +5,7 @@ import type { ItemsReferencingAssetQuery, ItemsReferencingAssetQueryRequest, } from "../queries/content-items/items-referencing-asset-query.js"; +import type { ItemsReferencingItemQuery, ItemsReferencingItemQueryRequest } from "../queries/content-items/items-referencing-item.js"; import type { ListContentItemsQuery, ListContentItemsQueryRequest } from "../queries/content-items/list-content-items-query.js"; import type { FetchContentTypeElementQuery, @@ -91,6 +92,7 @@ export type DeliveryClient): ListContentItemsQuery; itemsFeed(request?: ItemsFeedQueryRequest): ItemsFeedQuery; itemsReferencingAsset(request: ItemsReferencingAssetQueryRequest): ItemsReferencingAssetQuery; + itemsReferencingItem(request: ItemsReferencingItemQueryRequest): ItemsReferencingItemQuery; }; export type DeliveryFetchQuery = FetchQuery< diff --git a/lib/public_api.ts b/lib/public_api.ts index e06d5f9e..c3fbca08 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -9,9 +9,7 @@ export type { DeliveryClientSchema, WaitForLoadingNewContentHeaderName, } from "./models/core.models.js"; -// Filters export type { EmptyRichTextFilter, Filter, ObjectFilter } from "./models/filter.models.js"; -// Pagination export type { PaginationPayload, PaginationWithTotalCountPayload, @@ -31,6 +29,7 @@ export { type FetchContentItemPayload, type ItemsFeedPayload, type ItemsReferencingAssetPayload, + type ItemsReferencingItemPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; @@ -39,6 +38,10 @@ export type { ItemsReferencingAssetQuery, ItemsReferencingAssetQueryRequest, } from "./queries/content-items/items-referencing-asset-query.js"; +export type { + ItemsReferencingItemQuery, + ItemsReferencingItemQueryRequest, +} from "./queries/content-items/items-referencing-item.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; export type { ContentTypeElementPayload, diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index b72b81d1..00d7cf35 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -215,6 +215,19 @@ export const itemsReferencingAssetSchema = (schema: TSchema | undefined) => + z + .object({ + items: z + .array( + z.object({ + system: baseContentItemSystemSchema(schema), + }), + ) + .readonly(), + }) + .readonly(); + export const fetchContentItemSchema = (schema: TSchema | undefined) => z .object({ @@ -232,3 +245,6 @@ export type ItemsFeedPayload = z.infer = z.infer< ReturnType> >; +export type ItemsReferencingItemPayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/content-items/items-referencing-item.ts b/lib/queries/content-items/items-referencing-item.ts new file mode 100644 index 00000000..8e8a4454 --- /dev/null +++ b/lib/queries/content-items/items-referencing-item.ts @@ -0,0 +1,37 @@ +import type { + DeliveryClientConfig, + DeliveryClientSchema, + DeliveryMetadataWithToken, + DeliveryPagedFetchQuery, +} from "../../models/core.models.js"; +import type { Filter } from "../../models/filter.models.js"; +import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; +import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; +import { type ContentItemSystemPayload, type ItemsReferencingItemPayload, itemsReferencingItemSchema } from "./content-item.models.js"; + +export type ItemsReferencingItemQuery = DeliveryPagedFetchQuery< + ItemsReferencingItemPayload, + DeliveryMetadataWithToken +>; + +export type ItemsReferencingItemQueryRequest = DeliveryRequestWithTokenPaging< + never, + readonly Filter, never>[] +> & { + /** + * Codename of the content item to retrieve referencing content items for. + */ + readonly codename: string; +}; + +export function itemsReferencingItemQuery( + config: DeliveryClientConfig, + request: ItemsReferencingItemQueryRequest, +): ItemsReferencingItemQuery { + return createDeliveryPagedByTokenQuery({ + config, + request, + schema: itemsReferencingItemSchema(config.schema), + endpoint: `items/${request.codename}/used-in`, + }); +} diff --git a/tests/integration/queries/content-items/items-referencing-item-query.payload.ts b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts new file mode 100644 index 00000000..44a7f4c8 --- /dev/null +++ b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts @@ -0,0 +1,20 @@ +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; + +export default { + items: [ + { + system: { + id: "21586dc9-9c04-4c9e-a9e4-83b8cd65baef", + name: "The Dark Knight", + codename: "the_dark_knight", + language: "default", + type: "movie", + collection: "default", + workflow: "default", + workflow_step: "published", + last_modified: "2026-04-07T10:36:42.4587906Z", + }, + }, + ], +} satisfies ItemsReferencingItemPayload; diff --git a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts new file mode 100644 index 00000000..b9845df7 --- /dev/null +++ b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts @@ -0,0 +1,15 @@ +import { describe } from "vitest"; +import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { type ItemsReferencingItemPayload, itemsReferencingItemSchema } from "../../../../lib/queries/content-items/content-item.models.js"; +import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import unitTestPayload from "./items-referencing-item-query.payload.js"; + +describe("Items referencing item query", async () => { + const itemCodename = "the_dark_knight"; + await runQueryTestsAsync>({ + endpoint: `items/${itemCodename}/used-in`, + unitTestPayload, + selectQuery: (client) => client.itemsReferencingItem({ codename: itemCodename }), + expectedSchema: itemsReferencingItemSchema(getIntegrationTestsSchema()), + }); +}); From 77787c0fec385b8cfc14874b3da9ecaaa6147747 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 28 Apr 2026 15:04:23 +0200 Subject: [PATCH 120/221] fixes selectQuery types --- tests/utils/integration-test.utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 3463513f..5bcfe403 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -21,7 +21,7 @@ type TestType = "Integration" | "Unit"; type SelectQuery = ( client: DeliveryClient, -) => FetchQuery | PagedFetchQuery; +) => FetchQuery | PagedFetchQuery; export function getIntegrationTestsSchema(): DeliveryClientSchema { return { @@ -293,7 +293,7 @@ function registerPagingTests({ iteratorPayloads, maxPagesCount, }: { - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; readonly testName: string; readonly testType: TestType; readonly unitTestPayload: TResponsePayload; @@ -363,7 +363,7 @@ function registerPagingIteratorTests({ unitTestPayload, }: { readonly testName: string; - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; readonly iteratorPayloads: readonly TResponsePayload[]; readonly maxPagesCount: number; readonly testType: TestType; @@ -424,7 +424,7 @@ async function executeDefaultQueryAsync({ async function executePagingQueryAsync({ query, }: { - readonly query: PagedFetchQuery; + readonly query: PagedFetchQuery; }): Promise<{ readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; readonly pagingSuccess: boolean; From d05e7aaa2ea54180b6be268c93d72a75f531aee4 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 29 Apr 2026 12:53:21 +0200 Subject: [PATCH 121/221] first draft of migration.md --- migration.md | 538 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 538 insertions(+) create mode 100644 migration.md diff --git a/migration.md b/migration.md new file mode 100644 index 00000000..d43884f5 --- /dev/null +++ b/migration.md @@ -0,0 +1,538 @@ +# Migration Guide: v16 → v17 + +This guide covers all breaking changes when upgrading from `@kontent-ai/delivery-sdk` v16 to v17. + +--- + +## Installation + +v17 requires Node.js ≥ 22 and three peer dependencies that were previously bundled: + +```bash +npm install @kontent-ai/delivery-sdk @kontent-ai/core-sdk zod ts-pattern +``` + +--- + +## Client creation + +The config object has been redesigned. API access mode is now an explicit `apiMode` discriminant instead of optional API key fields, and several options have been removed. + +**v16** +```typescript +import { createDeliveryClient } from "@kontent-ai/delivery-sdk"; + +const client = createDeliveryClient({ + environmentId: "your-environment-id", + previewApiKey: "your-preview-key", // preview mode + // secureApiKey: "your-secure-key", // OR secure mode +}); +``` + +**v17** +```typescript +import { createDeliveryClient } from "@kontent-ai/delivery-sdk"; + +// Public +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "your-environment-id", +}); + +// Preview +const client = createDeliveryClient({ + apiMode: "preview", + environmentId: "your-environment-id", + deliveryApiKey: "your-preview-key", +}); + +// Secure +const client = createDeliveryClient({ + apiMode: "secure", + environmentId: "your-environment-id", + deliveryApiKey: "your-secure-key", +}); +``` + +### Removed config options + +The following v16 config properties have no v17 equivalent and should be removed: + +| Removed property | Notes | +|---|---| +| `previewApiKey` / `secureApiKey` | Replaced by `apiMode` + `deliveryApiKey` | +| `elementResolver` | Elements are no longer auto-mapped | +| `linkedItemsReferenceHandler` | `modular_content` is now a plain record | +| `proxy` / `basePreviewUrl` | Use `baseUrl` from `@kontent-ai/core-sdk` config | +| `globalHeaders` | Pass headers per-request via `config.customHeaders` | +| `defaultLanguage` | Pass `query.language` per-request | +| `defaultQueryConfig` | No equivalent | +| `retryStrategy` | Configured in `@kontent-ai/core-sdk` | +| `assetsDomain` / `defaultRenditionPreset` | No equivalent | +| `excludeArchivedItems` | No equivalent | + +--- + +## TypeScript schema (replaces `ClientTypes` generic) + +v16 used a generic type parameter to narrow codenames. v17 passes a `schema` object in the config instead. + +**v16** +```typescript +import type { ClientTypes } from "@kontent-ai/delivery-sdk"; + +type MyClientTypes = ClientTypes & { + languageCodenames: "en-US" | "cs-CZ"; + contentTypeCodenames: "article" | "movie"; + collectionCodenames: "default"; + workflowCodenames: "default"; + workflowStepCodenames: "published" | "draft"; + taxonomyCodenames: "genre"; + elementCodenames: "title" | "summary"; +}; + +const client = createDeliveryClient({ environmentId: "..." }); +``` + +**v17** +```typescript +import { createDeliveryClient, type DeliveryClientSchema } from "@kontent-ai/delivery-sdk"; + +type MySchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-US", "cs-CZ"]; + readonly contentTypeCodenames: readonly ["article", "movie"]; + readonly collectionCodenames: readonly ["default"]; + readonly workflowCodenames: readonly ["default"]; + readonly workflowStepCodenames: readonly ["published", "draft"]; + readonly taxonomyCodenames: readonly ["genre"]; + readonly elementCodenames: readonly ["title", "summary"]; +}>; + +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "...", + schema: { + languageCodenames: ["en-US", "cs-CZ"], + contentTypeCodenames: ["article", "movie"], + collectionCodenames: ["default"], + workflowCodenames: ["default"], + workflowStepCodenames: ["published", "draft"], + taxonomyCodenames: ["genre"], + elementCodenames: ["title", "summary"], + }, +}); +``` + +--- + +## Query API + +### Method names + +| v16 | v17 | +|---|---| +| `client.items()` | `client.listContentItems()` | +| `client.item(codename)` | `client.fetchContentItem({ codename })` | +| `client.itemsFeed()` | `client.itemsFeed()` | +| `client.types()` | `client.listContentTypes()` | +| `client.type(codename)` | `client.fetchContentType({ codename })` | +| `client.taxonomies()` | `client.listTaxonomies()` | +| `client.taxonomy(codename)` | `client.fetchTaxonomy({ codename })` | +| `client.languages()` | `client.listLanguages()` | +| `client.element(type, element)` | `client.fetchContentTypeElement({ typeCodename, elementCodename })` | +| `client.assetUsedIn(codename)` | `client.itemsReferencingAsset({ codename })` | +| `client.itemUsedIn(codename)` | `client.itemsReferencingItem({ codename })` | + +### Method chaining → request objects + +v16 built queries with a fluent builder. v17 passes a single request object when constructing the query. + +**v16** +```typescript +const response = await client + .items() + .type("movie") + .languageParameter("en-US") + .limitParameter(10) + .skipParameter(20) + .orderByAscending("system.name") + .toPromise(); + +console.log(response.items); +``` + +**v17** +```typescript +const { response } = await client + .listContentItems({ + query: { + language: "en-US", + limit: 10, + skip: 20, + order: "system.name[asc]", + }, + filters: [{ property: "system.type", operator: "eq", value: "movie" }], + }) + .fetchPageSafe(); + +console.log(response?.payload.items); +``` + +### Execution methods + +| v16 | v17 | Behaviour | +|---|---|---| +| `.toPromise()` | `.fetchSafe()` (fetch query) or `.fetchPageSafe()` (paged query) | Returns `{ success, response, error }`, never throws | +| `.toPromise()` | `.fetch()` / `.fetchPage()` | Throws on error | +| `.toAllPromise()` | `.fetchAllPagesSafe()` | Fetches all pages, returns `{ success, responses, error }` | +| `.toAllPromise()` | `.fetchAllPages()` | Throws on error | + +--- + +## Error handling + +v16 queries always throw. v17 provides safe variants that return a result object instead. + +**v16** +```typescript +try { + const response = await client.items().toPromise(); + console.log(response.items); +} catch (error) { + console.error(error); // DeliveryError +} +``` + +**v17** +```typescript +const { success, response, error } = await client.listContentItems().fetchPageSafe(); + +if (!success) { + console.error(error.details.reason); // DeliverySdkError + return; +} + +console.log(response.payload.items); +``` + +--- + +## Response shape + +v16 resolved linked items automatically and exposed them alongside the main payload. v17 returns the raw API payload — `modular_content` is a plain record keyed by codename. + +**v16** +```typescript +const response = await client.items().toPromise(); + +for (const item of response.items) { + console.log(item.system.name); + console.log(item.elements.title.value); +} + +// Automatically resolved linked items +for (const linked of response.linkedItems) { ... } +``` + +**v17** +```typescript +const { response } = await client.listContentItems().fetchPageSafe(); +const { items, modular_content, pagination } = response!.payload; + +for (const item of items) { + console.log(item.system.name); + + const title = item.elements?.["title"]; + if (title?.type === "text") { + console.log(title.value); + } +} + +// Linked items are a plain record — resolve manually +const linked = modular_content["some_codename"]; +``` + +### Fetch single item + +**v16** +```typescript +const response = await client.item("my_article").toPromise(); +console.log(response.item.elements.title.value); +``` + +**v17** +```typescript +const { response } = await client.fetchContentItem({ codename: "my_article" }).fetchSafe(); +const item = response?.payload.item; + +if (item?.elements?.["title"]?.type === "text") { + console.log(item.elements["title"].value); +} +``` + +--- + +## System property names + +Several system properties are now snake_case to match the raw API: + +| v16 | v17 | +|---|---| +| `system.lastModified` | `system.last_modified` | +| `system.workflowStep` | `system.workflow_step` | +| `system.sitemapLocations` | `system.sitemap_locations` | +| `system.id` | `system.id` (unchanged) | +| `system.name` | `system.name` (unchanged) | +| `system.codename` | `system.codename` (unchanged) | +| `system.type` | `system.type` (unchanged) | +| `system.language` | `system.language` (unchanged) | +| `system.collection` | `system.collection` (unchanged) | +| `system.workflow` | `system.workflow` (unchanged) | + +--- + +## Filters + +v16 exposed filters as builder methods. v17 uses an explicit `filters` array on the request object. + +**v16** +```typescript +const response = await client + .items() + .equalsFilter("system.type", "movie") + .allFilter("elements.genre", ["action", "drama"]) + .greaterThanOrEqualFilter("elements.release_date", "2020-01-01") + .toPromise(); +``` + +**v17** +```typescript +const { response } = await client + .listContentItems({ + filters: [ + { property: "system.type", operator: "eq", value: "movie" }, + { property: "elements.genre", operator: "all", value: ["action", "drama"] }, + { property: "elements.release_date", operator: "gte", value: "2020-01-01" }, + ], + }) + .fetchPageSafe(); +``` + +Filters can also be passed as raw query strings: +```typescript +filters: ["system.type[eq]=movie", "elements.genre[all]=action,drama"] +``` + +### Filter operator mapping + +| v16 method | v17 operator | +|---|---| +| `equalsFilter` | `"eq"` | +| `notEqualsFilter` | `"neq"` | +| `emptyFilter` | `"empty"` | +| `notEmptyFilter` | `"nempty"` | +| `greaterThanFilter` | `"gt"` | +| `greaterThanOrEqualFilter` | `"gte"` | +| `lessThanFilter` | `"lt"` | +| `lessThanOrEqualFilter` | `"lte"` | +| `rangeFilter` | `"range"` | +| `anyFilter` | `"any"` | +| `allFilter` | `"all"` | +| `containsFilter` | `"contains"` | +| `inFilter` | `"in"` | +| `notInFilter` | `"nin"` | + +--- + +## Ordering + +**v16** +```typescript +client.items().orderByAscending("system.name").toPromise(); +client.items().orderByDescending("elements.release_date").toPromise(); +``` + +**v17** +```typescript +// System property +client.listContentItems({ query: { order: "system.name[asc]" } }).fetchPageSafe(); + +// Element property +client.listContentItems({ query: { order: "elements.release_date[desc]" } }).fetchPageSafe(); +``` + +--- + +## Paging + +### URL-based paging (skip/limit) + +**v16** +```typescript +const response = await client + .items() + .limitParameter(10) + .skipParameter(20) + .includeTotalCountParameter() + .toPromise(); + +console.log(response.pagination.skip); +console.log(response.pagination.total_count); +``` + +**v17** +```typescript +const { response } = await client + .listContentItems({ + query: { limit: 10, skip: 20 }, + }) + .fetchPageSafe(); + +console.log(response?.payload.pagination.skip); +``` + +### Continuation token paging (items feed) + +**v16** +```typescript +const response = await client + .itemsFeed() + .withContinuationToken("token-from-previous-response") + .toPromise(); +``` + +**v17** +```typescript +const { response } = await client + .itemsFeed({ + headers: { "X-Continuation": "token-from-previous-response" }, + }) + .fetchPageSafe(); + +// The next token is available on the page response meta +console.log(response?.meta.continuationToken); +``` + +### Fetching all pages + +**v16** +```typescript +const response = await client + .items() + .toAllPromise({ + responseFetched: (res, nextUrl, token) => { + console.log(`Fetched page, next: ${nextUrl}`); + }, + }); + +console.log(response.responses.flatMap((r) => r.data.items)); +``` + +**v17** +```typescript +const { success, responses, nextContinuationToken } = await client + .itemsFeed() + .fetchAllPagesSafe(); + +if (success) { + const allItems = responses.flatMap((r) => r.payload.items); + // Resume later using nextContinuationToken +} +``` + +--- + +## Content item elements + +v16 automatically mapped elements to typed wrappers (`Elements.TextElement`, etc.). v17 returns raw discriminated-union values — check `element.type` before accessing `element.value`. + +**v16** +```typescript +import type { Elements } from "@kontent-ai/delivery-sdk"; + +interface ArticleElements { + title: Elements.TextElement; + body: Elements.RichTextElement; + thumbnail: Elements.AssetsElement; + tags: Elements.TaxonomyElement<"tag_1" | "tag_2", "tags">; +} + +const article = response.item as IContentItem; + +console.log(article.elements.title.value); +console.log(article.elements.body.linkedItems); // auto-resolved +console.log(article.elements.thumbnail.value[0].url); +console.log(article.elements.tags.value.map((t) => t.codename)); +``` + +**v17** +```typescript +const item = response?.payload.item; +const elements = item?.elements ?? {}; + +const title = elements["title"]; +if (title?.type === "text") console.log(title.value); + +const body = elements["body"]; +if (body?.type === "rich_text") { + console.log(body.value); // HTML string + console.log(body.modular_content); // string[] of linked item codenames + // Resolve from modular_content record manually +} + +const thumbnail = elements["thumbnail"]; +if (thumbnail?.type === "asset") { + console.log(thumbnail.value[0]?.url); +} + +const tags = elements["tags"]; +if (tags?.type === "taxonomy") { + console.log(tags.value.map((t) => t.codename)); +} +``` + +--- + +## Runtime validation (new in v17) + +v17 can validate API responses against Zod schemas at runtime, catching unexpected payload shapes immediately. + +```typescript +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "...", + responseValidation: { enable: true }, +}); +``` + +When enabled, a failed validation returns a `validationFailed` error reason with the underlying `ZodError`: + +```typescript +const { success, error } = await client.listLanguages().fetchPageSafe(); + +if (!success && error?.details.reason === "validationFailed") { + console.error(error.details.zodError); +} +``` + +--- + +## Removed APIs + +### `mappingService` + +The `client.mappingService` property for remapping stored JSON responses has been removed. Parse responses using the exported Zod schemas directly: + +```typescript +import { listContentItemsSchema } from "@kontent-ai/delivery-sdk"; + +const result = await listContentItemsSchema(schema).safeParseAsync(storedJson); +``` + +### `transformImageUrl` + +The image transformation builder has been removed. Use the [Kontent.ai Image Transformation API](https://kontent.ai/learn/docs/apis/image-transformation) URL parameters directly or a third-party image URL builder. + +### Sync API + +`client.initializeSync()` and `client.syncChanges()` have been removed. Use the [Sync API](https://kontent.ai/learn/docs/apis/sync-api) directly via the REST API or a dedicated SDK. From 231ed53b9cf9a8e8fe3c52131a2705af10e8c00e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 29 Apr 2026 13:23:31 +0200 Subject: [PATCH 122/221] Fix invalid codename type for item request --- lib/queries/content-items/fetch-content-item-query.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index f1533dc0..2a98758d 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -9,7 +9,7 @@ export type FetchContentItemQuery = Delive >; export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< - NonNullable, + readonly string[], { /** * Determines which language variant of content items to return. By default, the API returns content in the default language. From f237d2e4793ccd4de566cdeaa8553df7324372a4 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 29 Apr 2026 13:58:14 +0200 Subject: [PATCH 123/221] Use string record for elements --- lib/queries/content-items/content-item.models.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 00d7cf35..fe4e914c 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -167,7 +167,7 @@ const baseContentItemSystemSchema = (schem workflow_step: getCodenameSchema(schema?.workflowStepCodenames), }); -const contentItemSystemSchema = (schema: TSchema | undefined) => +export const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ ...baseContentItemSystemSchema(schema).shape, @@ -179,9 +179,7 @@ const contentItemSchema = (schema: TSchema z .object({ system: contentItemSystemSchema(schema), - elements: z.optional( - z.record(getCodenameSchema(schema?.elementCodenames), contentItemElementSchema), - ), + elements: z.record(z.string(), contentItemElementSchema), }) .readonly(); From 5250907567214c63df9088586507b6e793ba818d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 29 Apr 2026 13:58:19 +0200 Subject: [PATCH 124/221] Update delivery-client-types.test.ts --- tests/types/delivery-client-types.test.ts | 71 ++++++++++++++++------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 582ff713..f26d918b 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,32 +1,41 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; import type { DeliveryClient } from "../../lib/models/core.models.js"; +import { type ContentItemPayload, contentItemSystemSchema, elementSchemas } from "../../lib/queries/content-items/content-item.models.js"; -const languageCodenames = ["en-US", "cs-CZ"] as const; -const taxonomyCodenames = ["categories"] as const; +const schema = { + languageCodenames: ["en-us", "es-es"], + taxonomyCodenames: ["category", "tag"], + contentTypeCodenames: ["movie", "actor"], + elementCodenames: ["title", "first_name", "last_name"], + collectionCodenames: ["movies", "tv-shows"], + workflowCodenames: ["published", "draft"], + workflowStepCodenames: ["published", "draft"], +} as const; -type ValidLanguageCodename = (typeof languageCodenames)[number]; +type DeliverySchema = typeof schema; -const client: DeliveryClient<{ - languageCodenames: typeof languageCodenames; - taxonomyCodenames: typeof taxonomyCodenames; - contentTypeCodenames: readonly string[]; - elementCodenames: readonly string[]; - collectionCodenames: readonly string[]; - workflowCodenames: readonly string[]; - workflowStepCodenames: readonly string[]; -}> = createDeliveryClient({ +type TypedDeliveryClient = DeliveryClient; + +const actorSchema = z + .object({ + system: contentItemSystemSchema(schema), + elements: z + .object({ + first_name: elementSchemas.text, + last_name: elementSchemas.text, + }) + .readonly(), + }) + .readonly(); + +type Actor = z.infer; + +const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", environmentId: "x", - schema: { - languageCodenames, - taxonomyCodenames, - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, + schema, responseValidation: { enable: false, }, @@ -39,8 +48,26 @@ const client: DeliveryClient<{ const languageResponse = await client.listLanguages().fetchPage(); // Verifies that the language codenames are assignable from the response schema -const responseLanguageCodenames: readonly ValidLanguageCodename[] = languageResponse.payload.languages.map( +const responseLanguageCodenames: readonly (typeof schema.languageCodenames)[number][] = languageResponse.payload.languages.map( (language) => language.system.codename, ); +const { payload } = await client + .fetchContentItem({ + codename: "itemCodename", + }) + .fetch(); + +function isActor(item: ContentItemPayload): item is Actor { + return actorSchema.safeParse(item).success; +} + +if (isActor(payload.item)) { + const firstName: string = payload.item.elements.first_name.value; + const lastName: string = payload.item.elements.last_name.value; + + void firstName; + void lastName; +} + void responseLanguageCodenames; From aa4f5f7e821c05941d4e5484d878a6da9389fc45 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 29 Apr 2026 14:04:05 +0200 Subject: [PATCH 125/221] Update delivery-client-types.test.ts --- tests/types/delivery-client-types.test.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index f26d918b..883effb4 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -25,6 +25,7 @@ const actorSchema = z .object({ first_name: elementSchemas.text, last_name: elementSchemas.text, + taxonomy: elementSchemas.taxonomy, }) .readonly(), }) @@ -32,6 +33,10 @@ const actorSchema = z type Actor = z.infer; +function isActor(item: ContentItemPayload): item is Actor { + return actorSchema.safeParse(item).success; +} + const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", environmentId: "x", @@ -58,10 +63,6 @@ const { payload } = await client }) .fetch(); -function isActor(item: ContentItemPayload): item is Actor { - return actorSchema.safeParse(item).success; -} - if (isActor(payload.item)) { const firstName: string = payload.item.elements.first_name.value; const lastName: string = payload.item.elements.last_name.value; From 7518f9f12852bfefc3c8a49764f401610e00a583 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 30 Apr 2026 10:30:30 +0200 Subject: [PATCH 126/221] Use typed taxonomy element --- .../content-items/content-item.models.ts | 36 ++++++++++--------- tests/types/delivery-client-types.test.ts | 4 ++- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index fe4e914c..1c962b45 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -10,12 +10,13 @@ const multipleChoiceOptionSchema = z }) .readonly(); -const taxonomyTermValueSchema = z - .object({ - name: z.string(), - codename: z.string(), - }) - .readonly(); +const taxonomyTermValueSchema = (codenames?: readonly TCodename[]) => + z + .object({ + name: z.string(), + codename: getCodenameSchema(codenames), + }) + .readonly(); const assetValueSchema = z .object({ @@ -51,6 +52,17 @@ const richTextLinkSchema = z .catchall(jsonValueSchema) .readonly(); +const taxonomySchema = (codenames?: readonly TCodename[]) => + z + .object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + value: z.array(taxonomyTermValueSchema(codenames)).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(); + export const elementSchemas = { text: z .object({ @@ -104,15 +116,7 @@ export const elementSchemas = { }) .catchall(jsonValueSchema) .readonly(), - taxonomy: z - .object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - value: z.array(taxonomyTermValueSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), + taxonomy: taxonomySchema, urlSlug: z .object({ type: z.literal("url_slug"), @@ -147,7 +151,7 @@ const contentItemElementSchema = z elementSchemas.multipleChoice, elementSchemas.dateTime, elementSchemas.asset, - elementSchemas.taxonomy, + elementSchemas.taxonomy(), elementSchemas.urlSlug, elementSchemas.linkedItems, elementSchemas.custom, diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 883effb4..488d5648 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -25,7 +25,7 @@ const actorSchema = z .object({ first_name: elementSchemas.text, last_name: elementSchemas.text, - taxonomy: elementSchemas.taxonomy, + category: elementSchemas.taxonomy(["action_film", "drama", "comedy"]), }) .readonly(), }) @@ -66,9 +66,11 @@ const { payload } = await client if (isActor(payload.item)) { const firstName: string = payload.item.elements.first_name.value; const lastName: string = payload.item.elements.last_name.value; + const categoryCodename: undefined | "action_film" | "drama" | "comedy" = payload.item.elements.category.value[0]?.codename; void firstName; void lastName; + void categoryCodename; } void responseLanguageCodenames; From 63f64fe35b7e9c78119a76379a8a24b539c8e7aa Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 30 Apr 2026 10:45:03 +0200 Subject: [PATCH 127/221] Adds typed support for multipleChoice elem --- .../content-items/content-item.models.ts | 34 +++++++++++-------- tests/types/delivery-client-types.test.ts | 3 ++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 1c962b45..636b59c3 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -3,12 +3,13 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; -const multipleChoiceOptionSchema = z - .object({ - name: z.string(), - codename: z.string(), - }) - .readonly(); +const multipleChoiceOptionSchema = (codenames?: readonly TCodename[]) => + z + .object({ + name: z.string(), + codename: getCodenameSchema(codenames), + }) + .readonly(); const taxonomyTermValueSchema = (codenames?: readonly TCodename[]) => z @@ -52,6 +53,16 @@ const richTextLinkSchema = z .catchall(jsonValueSchema) .readonly(); +const multipleChoiceSchema = (codenames?: readonly TCodename[]) => + z + .object({ + type: z.literal("multiple_choice"), + name: z.string(), + value: z.array(multipleChoiceOptionSchema(codenames)).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(); + const taxonomySchema = (codenames?: readonly TCodename[]) => z .object({ @@ -91,14 +102,7 @@ export const elementSchemas = { }) .catchall(jsonValueSchema) .readonly(), - multipleChoice: z - .object({ - type: z.literal("multiple_choice"), - name: z.string(), - value: z.array(multipleChoiceOptionSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), + multipleChoice: multipleChoiceSchema, dateTime: z .object({ type: z.literal("date_time"), @@ -148,7 +152,7 @@ const contentItemElementSchema = z elementSchemas.text, elementSchemas.number, elementSchemas.richText, - elementSchemas.multipleChoice, + elementSchemas.multipleChoice(), elementSchemas.dateTime, elementSchemas.asset, elementSchemas.taxonomy(), diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 488d5648..4186f478 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -25,6 +25,7 @@ const actorSchema = z .object({ first_name: elementSchemas.text, last_name: elementSchemas.text, + role: elementSchemas.multipleChoice(["hero", "villain", "sidekick"]), category: elementSchemas.taxonomy(["action_film", "drama", "comedy"]), }) .readonly(), @@ -66,10 +67,12 @@ const { payload } = await client if (isActor(payload.item)) { const firstName: string = payload.item.elements.first_name.value; const lastName: string = payload.item.elements.last_name.value; + const roleCodename: undefined | "hero" | "villain" | "sidekick" = payload.item.elements.role.value[0]?.codename; const categoryCodename: undefined | "action_film" | "drama" | "comedy" = payload.item.elements.category.value[0]?.codename; void firstName; void lastName; + void roleCodename; void categoryCodename; } From 4495e8fd3fd14eb5056dd7982308ca9ee9f99379 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 30 Apr 2026 12:11:01 +0200 Subject: [PATCH 128/221] updates deps & improves codename schemas --- .../content-items/content-item.models.ts | 24 +++--- .../content-types/content-type.models.ts | 17 ++--- lib/queries/languages/language.models.ts | 4 +- lib/queries/taxonomies/taxonomy.models.ts | 6 +- package.json | 4 +- pnpm-lock.yaml | 76 +++++++++---------- .../fetch-content-type-query.payload.ts | 10 ++- 7 files changed, 71 insertions(+), 70 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 636b59c3..1a87e9b7 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -1,4 +1,4 @@ -import { getCodenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, codenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; @@ -7,7 +7,7 @@ const multipleChoiceOptionSchema = (codenames z .object({ name: z.string(), - codename: getCodenameSchema(codenames), + codename: codenameOf(codenames), }) .readonly(); @@ -15,7 +15,7 @@ const taxonomyTermValueSchema = (codenames?: z .object({ name: z.string(), - codename: getCodenameSchema(codenames), + codename: codenameOf(codenames), }) .readonly(); @@ -46,7 +46,7 @@ const richTextImageSchema = z const richTextLinkSchema = z .object({ - codename: z.string(), + codename: codenameSchema, type: z.string(), url_slug: z.string(), }) @@ -98,7 +98,7 @@ export const elementSchemas = { value: z.string(), images: z.record(z.string(), richTextImageSchema), links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(z.string()).readonly(), + modular_content: z.array(codenameSchema).readonly(), }) .catchall(jsonValueSchema) .readonly(), @@ -133,7 +133,7 @@ export const elementSchemas = { .object({ type: z.literal("modular_content"), name: z.string(), - value: z.array(z.string()).readonly(), + value: z.array(codenameSchema).readonly(), }) .catchall(jsonValueSchema) .readonly(), @@ -166,13 +166,13 @@ const baseContentItemSystemSchema = (schem z.object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema?.contentTypeCodenames), - language: getCodenameSchema(schema?.languageCodenames), - type: getCodenameSchema(schema?.contentTypeCodenames), - collection: getCodenameSchema(schema?.collectionCodenames), + codename: codenameOf(schema?.contentTypeCodenames), + language: codenameOf(schema?.languageCodenames), + type: codenameOf(schema?.contentTypeCodenames), + collection: codenameOf(schema?.collectionCodenames), last_modified: z.iso.datetime(), - workflow: getCodenameSchema(schema?.workflowCodenames), - workflow_step: getCodenameSchema(schema?.workflowStepCodenames), + workflow: codenameOf(schema?.workflowCodenames), + workflow_step: codenameOf(schema?.workflowStepCodenames), }); export const contentItemSystemSchema = (schema: TSchema | undefined) => diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index a8174f8f..ecedb838 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,4 +1,4 @@ -import { getCodenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, codenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; @@ -6,7 +6,7 @@ import { paginationSchema } from "../../models/pagination.models.js"; const contentTypeElementOptionSchema = z .object({ name: z.string(), - codename: z.string(), + codename: codenameSchema, }) .readonly(); @@ -93,14 +93,11 @@ export const contentTypeSchema = (schema: .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema?.contentTypeCodenames), + codename: codenameOf(schema?.contentTypeCodenames), last_modified: z.iso.datetime(), }) .readonly(), - elements: z.record( - getCodenameSchema(schema?.elementCodenames), - contentTypeAnyElementSchema, - ), + elements: z.record(codenameOf(schema?.elementCodenames), contentTypeAnyElementSchema), }) .readonly(); @@ -112,14 +109,14 @@ export const listContentTypesSchema = (sch }) .readonly(); -export const contentTypeElementSchema = (schema: TSchema | undefined) => +export const contentTypeElementSchema = () => z .intersection( contentTypeAnyElementSchema, z .object({ // Required only for the endpoint `types/{type}/elements/{element}` - codename: getCodenameSchema(schema?.elementCodenames), + codename: codenameSchema, }) .readonly(), ) @@ -127,6 +124,6 @@ export const contentTypeElementSchema = (s export type ContentTypePayload = z.infer>>; -export type ContentTypeElementPayload = z.infer>>; +export type ContentTypeElementPayload = z.infer>; export type ListContentTypesPayload = z.infer>>; diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 6e03c3f1..6f77f7a3 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,4 +1,4 @@ -import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOfWithStringFallback, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; @@ -10,7 +10,7 @@ export const languageSchema = (schema: TSc .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema?.languageCodenames), + codename: codenameOfWithStringFallback(schema?.languageCodenames), }) .readonly(), }) diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index d0a7dbb9..d2f31c7b 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,4 +1,4 @@ -import { getCodenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; @@ -6,7 +6,7 @@ import { paginationSchema } from "../../models/pagination.models.js"; const taxonomyTermSchema = (schema: TSchema | undefined) => z.object({ name: z.string(), - codename: getCodenameSchema(schema?.taxonomyCodenames), + codename: codenameOf(schema?.taxonomyCodenames), get terms() { return z.array(taxonomyTermSchema(schema)).readonly(); }, @@ -19,7 +19,7 @@ export const taxonomySchema = (schema: TSc .object({ id: kontentUuidSchema, name: z.string(), - codename: getCodenameSchema(schema?.taxonomyCodenames), + codename: codenameOf(schema?.taxonomyCodenames), last_modified: z.iso.datetime(), }) .readonly(), diff --git a/package.json b/package.json index df4b2ef6..2c2de060 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.30", + "@kontent-ai/core-sdk": "^12.0.0-preview.32", "ts-pattern": "^5", "zod": "^4" }, @@ -55,6 +55,6 @@ "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260428.1" + "@typescript/native-preview": "7.0.0-dev.20260430.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76ef75a4..044224c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.30 - version: 12.0.0-preview.30(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.32 + version: 12.0.0-preview.32(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -31,8 +31,8 @@ importers: specifier: 25.6.0 version: 25.6.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260428.1 - version: 7.0.0-dev.20260428.1 + specifier: 7.0.0-dev.20260430.1 + version: 7.0.0-dev.20260430.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.30': - resolution: {integrity: sha512-ejqV82j2dZ2+DXsUsdd9Jjsb2NMmasg/VOmPp4stXwIopPbZZ0MlrBlVlaBJ2CzzX+EMX0QRZtFNHZAN+djcwg==} + '@kontent-ai/core-sdk@12.0.0-preview.32': + resolution: {integrity: sha512-NkL7tAIeGDa55ga2hThbJyyC90RIpNgjU2hwpmY3gTgqjzzagTTFfbhfoT03rkAfDBEdhK1R1ZvNKESv8K4nsA==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -584,50 +584,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-Lll6WmXfgTEj1G3QBIoHlabQwUtJiyhlRgSLksa06QFL5BoA7V+Lu1waa9PtPNZbGsXLDMHodtk/bRQABKuPiw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-1Rk5JoMlmlF4GzeNxQmpaZSSPFa056DCrGLjhXwVIqRf8+pGNKKxyD2ugGSyOeLShqYb1XUoE9LhsAhdh1xgSA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-WbsBNSHlo+4sGrTxDWdmI7r8x48tCtSCuKdmK62FvVOq58UWAs6sL13Z4Rev4ohLcGHdXC5E/8AIdpLPqDYQpw==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-wjXJtELfI0QIYxGCqqKMR3DonPUlMP4aWOYRPiN5ylDtdV+OqCC16zvH7C+No7xvlf8dDxlV1ZTyuRCWL6CQmw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-cgcBX/ZBMdepkamLT8g8jQdHe7DZS/s6zTZRof6mvcrnJHlMeUnKoC9UO8/c22IrUMV3n0XPh7R8FYjUP0ll+Q==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-PeCFDB1glivpkqqKsQJ1RrM4f5B1yXzXFF+eKwgEZ+evcQ3N+BgeR7BpuRhOpHU9ixJchKjU1bXgcHOAaM+Rkw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-/d/NnZFvEJU67L5mHh+cO3gsfwNCvJ9HGtxGq1KGz1VwTabOIcwLdpTpfsAR39WXzzfh9GJHL28n6GSGZInPow==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-3eqYkqy1XpbIJC1XkGbkwAvTtSCw6dSjYzJaw9bvow4fS1totTFZP/2K9ecXQ3gIZaPS4Ome/SpkZHl1cy9eZA==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-4gJCE7wzenx1BH2Vtx2uKWUo8rFxnhGkxNEH1zxbYy/6ASwo+PnOPYmKHAzNE1C3yB5lzw71/vR5p5zyO57Y4A==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-Eg7nbRV57ayq0Pjuott/36UbQlVlpz2YRVLM5h8RyXx6SwvgrdYxNv/1zULLB0UlWdyKkK3bXILmR8YmNvbl+g==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-yn6Rzbn62L4QTWrp0QgG8al6l/VG7PCPRdbE0vuGDSlKhInlC+Flo4QSc1qA8KHTbpHgl+nEsq9DymiitI4G4g==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-0LAjufJKUZnHmp0bxlndjphDQlIeUXA0czZCrKENtKySeGMXrM9PAFtSx94ldWVXDTZ9ZP1r+FxbIvP9pRORzA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-T9z13mcMowXmwGjprA2FIR2EEdYZxgqH8+qk7dFZVBlo5vfk41AN/qJfAdN7IsAhEb640MJ8cMN/aiczweZKmA==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-FvLWX7d3b/IhL0656tnjep7dOMnI7CPrg+5oI1MKIY74qgvR+8VRo6aGj0IRCwtAJeklpxBpljEcIGuS5Yc/pQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260428.1': - resolution: {integrity: sha512-JiM4PYWDGs57TT0mV2KArmaW7BnTkk3XRid79NdG17tfvDbRyg4hBCpKI7vARiQPtxjKrHlxyzxOGDpv5W5T7Q==} + '@typescript/native-preview@7.0.0-dev.20260430.1': + resolution: {integrity: sha512-HHk3tPpzPKqHY4AHMxGK6i960Dd1kIvnSnT3mzD1hNO/sUVG2YdWvWBIActGkRnKS94AZBpekOr1bQP7O2OwIg==} engines: {node: '>=16.20.0'} hasBin: true @@ -2019,7 +2019,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.13 - '@kontent-ai/core-sdk@12.0.0-preview.30(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.32(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2210,36 +2210,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260428.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260428.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260428.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260428.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260428.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260428.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260428.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260430.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260428.1': + '@typescript/native-preview@7.0.0-dev.20260430.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260428.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260428.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260428.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260428.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260428.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260428.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260428.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260430.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260430.1 '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: diff --git a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts index 9611014e..a3e15c87 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts @@ -6,7 +6,7 @@ export default { id: "445da25c-d991-4b0e-bece-c572124d91f5", name: "Movie", codename: "movie", - last_modified: "2026-02-26T14:02:39.320664Z", + last_modified: "2026-04-10T10:23:30.2425214Z", }, elements: { title: { @@ -29,6 +29,10 @@ export default { name: "yes", codename: "yes", }, + { + name: "no", + codename: "no", + }, ], }, release_date: { @@ -56,9 +60,9 @@ export default { type: "modular_content", name: "Cast", }, - customElem: { + custom: { type: "custom", - name: "Custom element", + name: "Custom", value: null, }, }, From e38c13e2fd475856ad1a61383f54d6bdf382cb7f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 4 May 2026 12:11:44 +0200 Subject: [PATCH 129/221] updates deps, improves schema validation tests --- lib/models/core.models.ts | 2 +- lib/models/pagination.models.ts | 4 +- .../fetch-content-type-element-query.ts | 9 +- migration.md | 5 +- package.json | 8 +- pnpm-lock.yaml | 180 +++++++++--------- tests/types/delivery-client-types.test.ts | 3 - .../unit/api-mode/custom-base-url-api.spec.ts | 3 + tests/unit/api-mode/deliver-api.spec.ts | 3 + tests/unit/api-mode/preview-api.spec.ts | 3 + tests/unit/api-mode/secure-api.spec.ts | 6 +- ...create-delivery-paged-by-url-query.spec.ts | 15 +- tests/unit/errors/custom-errors.spec.ts | 3 - ...schema-validation-with-extra-props.spec.ts | 55 ------ ...hema-validation-with-missing-props.spec.ts | 49 ----- .../unit/validation/schema-validation.spec.ts | 115 ----------- .../validation/validation-properties.spec.ts | 77 -------- 17 files changed, 117 insertions(+), 423 deletions(-) delete mode 100644 tests/unit/validation/schema-validation-with-extra-props.spec.ts delete mode 100644 tests/unit/validation/schema-validation-with-missing-props.spec.ts delete mode 100644 tests/unit/validation/schema-validation.spec.ts delete mode 100644 tests/unit/validation/validation-properties.spec.ts diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index cfadea94..572856cf 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -87,7 +87,7 @@ export type DeliveryClient): ListContentTypesQuery; fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; - fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; + fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; fetchContentItem(request: FetchContentItemQueryRequest): FetchContentItemQuery; listContentItems(request?: ListContentItemsQueryRequest): ListContentItemsQuery; itemsFeed(request?: ItemsFeedQueryRequest): ItemsFeedQuery; diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index 01551e90..db453cb9 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,10 +1,12 @@ import { z } from "zod"; +const nextPageSchema = z.url().nullable().or(z.literal("")); + const paginationObjectSchema = z.object({ skip: z.number(), limit: z.number(), count: z.number(), - next_page: z.string(), + next_page: nextPageSchema, }); export const paginationSchema = z.object({ diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 67a2bf54..08cb2d9f 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -3,10 +3,7 @@ import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import { type ContentTypeElementPayload, contentTypeElementSchema } from "./content-type.models.js"; -export type FetchContentTypeElementQuery = DeliveryFetchQuery< - ContentTypeElementPayload, - DeliveryMetadata ->; +export type FetchContentTypeElementQuery = DeliveryFetchQuery; export type FetchContentTypeElementQueryRequest = DeliveryRequest & { readonly elementCodename: NonNullable[number]; @@ -16,11 +13,11 @@ export type FetchContentTypeElementQueryRequest( config: DeliveryClientConfig, request: FetchContentTypeElementQueryRequest, -): FetchContentTypeElementQuery { +): FetchContentTypeElementQuery { return createDeliveryFetchQuery({ config, request, - schema: contentTypeElementSchema(config.schema), + schema: contentTypeElementSchema(), endpoint: `types/${request.typeCodename}/elements/${request.elementCodename}`, }); } diff --git a/migration.md b/migration.md index d43884f5..7dd6f1be 100644 --- a/migration.md +++ b/migration.md @@ -501,16 +501,15 @@ v17 can validate API responses against Zod schemas at runtime, catching unexpect const client = createDeliveryClient({ apiMode: "public", environmentId: "...", - responseValidation: { enable: true }, }); ``` -When enabled, a failed validation returns a `validationFailed` error reason with the underlying `ZodError`: +When parsing fails, it returns a `parsingFailed` error reason with the underlying `ZodError`: ```typescript const { success, error } = await client.listLanguages().fetchPageSafe(); -if (!success && error?.details.reason === "validationFailed") { +if (!success && error?.details.reason === "parsingFailed") { console.error(error.details.zodError); } ``` diff --git a/package.json b/package.json index 2c2de060..301fa3dc 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,19 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.32", + "@kontent-ai/core-sdk": "^12.0.0-preview.34", "ts-pattern": "^5", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.2.1", - "@biomejs/biome": "2.4.13", + "eslint": "10.3.0", + "@biomejs/biome": "2.4.14", "@types/node": "25.6.0", "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260430.1" + "@typescript/native-preview": "7.0.0-dev.20260503.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 044224c8..a9038f61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.32 - version: 12.0.0-preview.32(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.34 + version: 12.0.0-preview.34(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -19,11 +19,11 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.4.13 - version: 2.4.13 + specifier: 2.4.14 + version: 2.4.14 '@kontent-ai/biome-config': specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.13) + version: 0.7.0(@biomejs/biome@2.4.14) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) @@ -31,14 +31,14 @@ importers: specifier: 25.6.0 version: 25.6.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260430.1 - version: 7.0.0-dev.20260430.1 + specifier: 7.0.0-dev.20260503.1 + version: 7.0.0-dev.20260503.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) eslint: - specifier: 10.2.1 - version: 10.2.1 + specifier: 10.3.0 + version: 10.3.0 tsx: specifier: 4.21.0 version: 4.21.0 @@ -69,59 +69,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.13': - resolution: {integrity: sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA==} + '@biomejs/biome@2.4.14': + resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.13': - resolution: {integrity: sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==} + '@biomejs/cli-darwin-arm64@2.4.14': + resolution: {integrity: sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.13': - resolution: {integrity: sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg==} + '@biomejs/cli-darwin-x64@2.4.14': + resolution: {integrity: sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.13': - resolution: {integrity: sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg==} + '@biomejs/cli-linux-arm64-musl@2.4.14': + resolution: {integrity: sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.13': - resolution: {integrity: sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ==} + '@biomejs/cli-linux-arm64@2.4.14': + resolution: {integrity: sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.13': - resolution: {integrity: sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ==} + '@biomejs/cli-linux-x64-musl@2.4.14': + resolution: {integrity: sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.13': - resolution: {integrity: sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ==} + '@biomejs/cli-linux-x64@2.4.14': + resolution: {integrity: sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.13': - resolution: {integrity: sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A==} + '@biomejs/cli-win32-arm64@2.4.14': + resolution: {integrity: sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.13': - resolution: {integrity: sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ==} + '@biomejs/cli-win32-x64@2.4.14': + resolution: {integrity: sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.32': - resolution: {integrity: sha512-NkL7tAIeGDa55ga2hThbJyyC90RIpNgjU2hwpmY3gTgqjzzagTTFfbhfoT03rkAfDBEdhK1R1ZvNKESv8K4nsA==} + '@kontent-ai/core-sdk@12.0.0-preview.34': + resolution: {integrity: sha512-kvBJYeVzGAcNls3Ieo2uvWnpFfgyMNR3NUfcMyElFGgp2eU6KTaIc1jTC8w7fyPfWR0dHR7E75d0p2ev5vL2Vw==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -584,50 +584,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-1Rk5JoMlmlF4GzeNxQmpaZSSPFa056DCrGLjhXwVIqRf8+pGNKKxyD2ugGSyOeLShqYb1XUoE9LhsAhdh1xgSA==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-rUZQVuBcZlxADagx+pnhDHqjX2Ewh+KWave6vtilRWR5vsGyR3FaCzPFqXteiwPg6XRijEMnMaXg60t5itm8EA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-wjXJtELfI0QIYxGCqqKMR3DonPUlMP4aWOYRPiN5ylDtdV+OqCC16zvH7C+No7xvlf8dDxlV1ZTyuRCWL6CQmw==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-YtK8ac8RCkRh7jwoP8Wt4LaBhpGK8cOVMi3e0cvF/8Xn5XV1ewJK3/HdNBnlDhCib3j0eVRxK/Pg9GIq/hFUxQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-PeCFDB1glivpkqqKsQJ1RrM4f5B1yXzXFF+eKwgEZ+evcQ3N+BgeR7BpuRhOpHU9ixJchKjU1bXgcHOAaM+Rkw==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-c5yM3Ea2WZSLKmscMxUhEDdaR2Ugp7P9CX6osciIPgZIF9c4LDiuKQohjQAyidx9JZKCsSXnfS88QssWH/+ONQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-3eqYkqy1XpbIJC1XkGbkwAvTtSCw6dSjYzJaw9bvow4fS1totTFZP/2K9ecXQ3gIZaPS4Ome/SpkZHl1cy9eZA==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-28vAomYeU8hpz1f0dDoWz6PYehz0ffEfkJhFq4tqXzUM/QY1I15u5y03EJQ5UcP4LRwrdJe22J5LdrYpM2Lr3w==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-Eg7nbRV57ayq0Pjuott/36UbQlVlpz2YRVLM5h8RyXx6SwvgrdYxNv/1zULLB0UlWdyKkK3bXILmR8YmNvbl+g==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-M64z7LwpqNfOXYCBKmD/ObwyxYOobUk4tDv0ECNLit7pDER1sswNZjJGjgRYjQsKokmydy6p3FqtJ1uUPUP/sw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-0LAjufJKUZnHmp0bxlndjphDQlIeUXA0czZCrKENtKySeGMXrM9PAFtSx94ldWVXDTZ9ZP1r+FxbIvP9pRORzA==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-QHy3R1VBb8MYszjpz0IyuDjKaW6JUHg8hYEqzhZIxvrydKLF3gyDeKohnmWSFTS/oII0GvUmYM3h83fbanBvcQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-FvLWX7d3b/IhL0656tnjep7dOMnI7CPrg+5oI1MKIY74qgvR+8VRo6aGj0IRCwtAJeklpxBpljEcIGuS5Yc/pQ==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-nrapqpVONrg0IZjKp3AzV9M+jxPwKGTQZEOxuKh6WHMhy/UElN8RnOFlfetA8ZMtKvPkmjgjqw0qoAa5QMwhPA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260430.1': - resolution: {integrity: sha512-HHk3tPpzPKqHY4AHMxGK6i960Dd1kIvnSnT3mzD1hNO/sUVG2YdWvWBIActGkRnKS94AZBpekOr1bQP7O2OwIg==} + '@typescript/native-preview@7.0.0-dev.20260503.1': + resolution: {integrity: sha512-gDro38CPFiBUGbaFGNt+ufOsEd1OrZrfrOPxsLSfBcvvoGaqAxV++ul/BHTOShoEkIYHiFsoDX2az1IPCDV2jQ==} engines: {node: '>=16.20.0'} hasBin: true @@ -901,8 +901,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1787,39 +1787,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.13': + '@biomejs/biome@2.4.14': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.13 - '@biomejs/cli-darwin-x64': 2.4.13 - '@biomejs/cli-linux-arm64': 2.4.13 - '@biomejs/cli-linux-arm64-musl': 2.4.13 - '@biomejs/cli-linux-x64': 2.4.13 - '@biomejs/cli-linux-x64-musl': 2.4.13 - '@biomejs/cli-win32-arm64': 2.4.13 - '@biomejs/cli-win32-x64': 2.4.13 + '@biomejs/cli-darwin-arm64': 2.4.14 + '@biomejs/cli-darwin-x64': 2.4.14 + '@biomejs/cli-linux-arm64': 2.4.14 + '@biomejs/cli-linux-arm64-musl': 2.4.14 + '@biomejs/cli-linux-x64': 2.4.14 + '@biomejs/cli-linux-x64-musl': 2.4.14 + '@biomejs/cli-win32-arm64': 2.4.14 + '@biomejs/cli-win32-x64': 2.4.14 - '@biomejs/cli-darwin-arm64@2.4.13': + '@biomejs/cli-darwin-arm64@2.4.14': optional: true - '@biomejs/cli-darwin-x64@2.4.13': + '@biomejs/cli-darwin-x64@2.4.14': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.13': + '@biomejs/cli-linux-arm64-musl@2.4.14': optional: true - '@biomejs/cli-linux-arm64@2.4.13': + '@biomejs/cli-linux-arm64@2.4.14': optional: true - '@biomejs/cli-linux-x64-musl@2.4.13': + '@biomejs/cli-linux-x64-musl@2.4.14': optional: true - '@biomejs/cli-linux-x64@2.4.13': + '@biomejs/cli-linux-x64@2.4.14': optional: true - '@biomejs/cli-win32-arm64@2.4.13': + '@biomejs/cli-win32-arm64@2.4.14': optional: true - '@biomejs/cli-win32-x64@2.4.13': + '@biomejs/cli-win32-x64@2.4.14': optional: true '@emnapi/core@1.10.0': @@ -1916,9 +1916,9 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.1 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -2015,11 +2015,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.13)': + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.14)': dependencies: - '@biomejs/biome': 2.4.13 + '@biomejs/biome': 2.4.14 - '@kontent-ai/core-sdk@12.0.0-preview.32(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.34(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2027,7 +2027,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.0(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.3.0)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2122,7 +2122,7 @@ snapshots: '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@10.2.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) @@ -2135,14 +2135,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@10.2.1)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/types': 8.59.0 '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.3.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2210,36 +2210,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260430.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260430.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260430.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260430.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260430.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260430.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260430.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260503.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260430.1': + '@typescript/native-preview@7.0.0-dev.20260503.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260430.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260430.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260430.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260430.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260430.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260430.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260430.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260503.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260503.1 '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: @@ -2663,9 +2663,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.1: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 4186f478..e461795a 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -42,9 +42,6 @@ const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", environmentId: "x", schema, - responseValidation: { - enable: false, - }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: {}, statusCode: 200, diff --git a/tests/unit/api-mode/custom-base-url-api.spec.ts b/tests/unit/api-mode/custom-base-url-api.spec.ts index 78edd755..a1afa283 100644 --- a/tests/unit/api-mode/custom-base-url-api.spec.ts +++ b/tests/unit/api-mode/custom-base-url-api.spec.ts @@ -14,6 +14,9 @@ describe("Custom base URL API", async () => { jsonResponse: {}, statusCode: 200, }), + runtimeValidation: { + validateResponses: false, + }, baseUrl: customBaseUrl, }).listLanguages(); diff --git a/tests/unit/api-mode/deliver-api.spec.ts b/tests/unit/api-mode/deliver-api.spec.ts index 7a4dda15..cace86e2 100644 --- a/tests/unit/api-mode/deliver-api.spec.ts +++ b/tests/unit/api-mode/deliver-api.spec.ts @@ -20,6 +20,9 @@ describe("Public deliver API", async () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, + runtimeValidation: { + validateResponses: false, + }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { diff --git a/tests/unit/api-mode/preview-api.spec.ts b/tests/unit/api-mode/preview-api.spec.ts index b3e7ca7e..ead46530 100644 --- a/tests/unit/api-mode/preview-api.spec.ts +++ b/tests/unit/api-mode/preview-api.spec.ts @@ -22,6 +22,9 @@ describe("Preview API", async () => { apiMode: "preview", environmentId: unitEnvironmentId, deliveryApiKey: previewApiKey, + runtimeValidation: { + validateResponses: false, + }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { diff --git a/tests/unit/api-mode/secure-api.spec.ts b/tests/unit/api-mode/secure-api.spec.ts index f67c4863..21d20b18 100644 --- a/tests/unit/api-mode/secure-api.spec.ts +++ b/tests/unit/api-mode/secure-api.spec.ts @@ -22,6 +22,9 @@ describe("Secure API", async () => { apiMode: "secure", environmentId: unitEnvironmentId, deliveryApiKey: secureApiKey, + runtimeValidation: { + validateResponses: false, + }, httpService: getDefaultHttpService({ adapter: { executeRequest: async (options) => { @@ -34,10 +37,9 @@ describe("Secure API", async () => { }).listLanguages(); // execute query so that http service is called and request headers are captured - const { success, error, response } = await query.fetchPageSafe(); + const { error, response } = await query.fetchPageSafe(); it("returns a successful response", () => { - expect(success).toBeTruthy(); expect(error).toBeUndefined(); }); diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index 0764bcf8..68a5ab05 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -13,7 +13,7 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; -const paginationPayload = (nextPageUrl: string | undefined) => ({ +const paginationPayload = (nextPageUrl: string) => ({ pagination: { skip: 0, limit: 10, count: 100, next_page: nextPageUrl }, }); @@ -143,17 +143,4 @@ describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPages result" expect(nextPageUrl).toBe(expectedUrl); }); - - it("nextPageUrl is an empty string when the last page has no next page", async () => { - mockGlobalFetchJsonResponse({ jsonResponse: paginationPayload(undefined), statusCode: 200 }); - - const { nextPageUrl } = await createDeliveryPagedByUrlQuery({ - config: clientConfig, - request: undefined, - schema: paginationSchema, - endpoint: "items", - }).fetchAllPages(); - - expect(nextPageUrl).toBe(undefined); - }); }); diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index 5f9f4764..fdafc307 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -25,9 +25,6 @@ describe("Custom Error Handling", async () => { }, }, }), - responseValidation: { - enable: true, - }, }) .listLanguages() .fetchPageSafe(); diff --git a/tests/unit/validation/schema-validation-with-extra-props.spec.ts b/tests/unit/validation/schema-validation-with-extra-props.spec.ts deleted file mode 100644 index 625050bd..00000000 --- a/tests/unit/validation/schema-validation-with-extra-props.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { describe, expect, test } from "vitest"; -import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; - -describe("Schema Validation — Extra Properties", () => { - const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { - languages: [ - { - system: { - id: getFakeUuid(), - codename: "de-DE", - name: "German", - }, - }, - ], - extraProperty: "extra", - pagination: { - skip: 0, - limit: 0, - count: 1, - next_page: "", - }, - }; - - test("succeeds when the response includes additional properties", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - responseValidation: { - enable: true, - }, - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeUndefined(); - expect(success).toBeTruthy(); - }); -}); diff --git a/tests/unit/validation/schema-validation-with-missing-props.spec.ts b/tests/unit/validation/schema-validation-with-missing-props.spec.ts deleted file mode 100644 index c8745eb4..00000000 --- a/tests/unit/validation/schema-validation-with-missing-props.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { describe, expect, test } from "vitest"; -import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; - -describe("Schema Validation — Missing Properties", () => { - const mockPayload: Omit, "pagination"> = { - languages: [ - { - system: { - id: getFakeUuid(), - codename: "de-DE", - name: "German", - }, - }, - ], - }; - - test("fails when the response is missing required schema properties", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - responseValidation: { - enable: true, - }, - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeDefined(); - expect(success).toBeFalsy(); - expect(error?.details.reason).toBe("validationFailed"); - }); -}); diff --git a/tests/unit/validation/schema-validation.spec.ts b/tests/unit/validation/schema-validation.spec.ts deleted file mode 100644 index b4d94356..00000000 --- a/tests/unit/validation/schema-validation.spec.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { describe, expect, test } from "vitest"; -import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; -import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; -import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; - -describe("Schema Validation", () => { - type TestDeliveryClientTypes = DeliveryClientSchema<{ - readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; - readonly taxonomyCodenames: readonly []; - readonly contentTypeCodenames: readonly []; - readonly elementCodenames: readonly []; - readonly collectionCodenames: readonly []; - readonly workflowCodenames: readonly []; - readonly workflowStepCodenames: readonly []; - }>; - - const mockPayload: ListLanguagesPayload = { - languages: [ - { - system: { - id: getFakeUuid(), - codename: "de-DE", - name: "German", - }, - }, - ], - pagination: { - skip: 0, - limit: 0, - count: 1, - next_page: "", - }, - }; - - test("fails when the response does not match the defined language codename schema", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: ["en-US", "cs-CZ"], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - responseValidation: { - enable: true, - }, - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeDefined(); - expect(success).toBeFalsy(); - expect(error?.details.reason).toBe("validationFailed"); - }); - - test("succeeds when the response matches the defined language codename schema", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: ["en-US", "cs-CZ", "de-DE"], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeUndefined(); - expect(success).toBeTruthy(); - }); - - test("succeeds when the response matches the general string codename schema", async () => { - const client = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: mockPayload, - statusCode: 200, - }), - }); - - const { success, error } = await client.listLanguages().fetchPageSafe(); - - expect(error).toBeUndefined(); - expect(success).toBeTruthy(); - }); -}); diff --git a/tests/unit/validation/validation-properties.spec.ts b/tests/unit/validation/validation-properties.spec.ts deleted file mode 100644 index bf855e65..00000000 --- a/tests/unit/validation/validation-properties.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import type { ErrorReason } from "@kontent-ai/core-sdk"; -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import { describe, test } from "vitest"; -import { ZodError } from "zod"; -import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import { unitEnvironmentId } from "../../utils/test.utils.js"; - -describe("Response Validation", () => { - test("returns an error when the response does not match the schema and validation is enabled", async ({ expect }) => { - const query = createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: { - result: "invalidValue", - }, - statusCode: 200, - }), - responseValidation: { - enable: true, - }, - }).listLanguages(); - - const { success, error } = await query.fetchPageSafe(); - - expect(success).toBe(false); - expect(error).toBeDefined(); - expect(error?.details.reason).toStrictEqual("validationFailed"); - - if (error?.details.reason === "validationFailed") { - expect(error.details.url).toStrictEqual(query.inspect().data?.url); - expect(error.details.zodError).toBeInstanceOf(ZodError); - expect(error.details.response).toBeDefined(); - } else { - throw new Error(`Unexpected error reason '${error?.details.reason}'`); - } - }); - - test("returns no error when the response does not match the schema but validation is disabled", async ({ expect }) => { - const { success, error } = await createDeliveryClient({ - apiMode: "public", - environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: { - value: "invalidValue", - }, - statusCode: 200, - }), - responseValidation: { - enable: false, - }, - }) - .listLanguages() - .fetchPageSafe(); - - expect(success).toBe(true); - expect(error).toBeUndefined(); - }); -}); From a094471b6f0839f39e1f55a2b655836de1b54da1 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 4 May 2026 12:15:50 +0200 Subject: [PATCH 130/221] Extends tests validating extra props --- .../content-items/content-item.models.ts | 4 +- .../validation/response-validation.spec.ts | 239 ++++++++++++++++++ 2 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 tests/unit/validation/response-validation.spec.ts diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 1a87e9b7..f12ac8b9 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -25,7 +25,7 @@ const assetValueSchema = z description: z.string().nullable(), type: z.string(), size: z.number(), - url: z.string(), + url: z.url(), width: z.number().nullable(), height: z.number().nullable(), renditions: z.record(z.string(), jsonValueSchema), @@ -37,7 +37,7 @@ const richTextImageSchema = z .object({ image_id: z.string(), description: z.string().nullable(), - url: z.string(), + url: z.url(), width: z.number().nullable(), height: z.number().nullable(), }) diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts new file mode 100644 index 00000000..dd70a57d --- /dev/null +++ b/tests/unit/validation/response-validation.spec.ts @@ -0,0 +1,239 @@ +import type { ErrorReason } from "@kontent-ai/core-sdk"; +import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; +import { describe, expect, test } from "vitest"; +import { ZodError } from "zod"; +import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { PaginationPayload } from "../../../lib/public_api.js"; +import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; + +const baseSchema = { + languageCodenames: [], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], +} as const satisfies DeliveryClientSchema; + +describe("Response validation", () => { + describe("Codename narrowing", () => { + type TestSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly []; + readonly elementCodenames: readonly []; + readonly collectionCodenames: readonly []; + readonly workflowCodenames: readonly []; + readonly workflowStepCodenames: readonly []; + }>; + + const mockPayload: ListLanguagesPayload = { + languages: [ + { + system: { + id: getFakeUuid(), + codename: "de-DE", + name: "German", + }, + }, + ], + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + }, + }; + + test("fails when the response contains a codename outside the defined schema", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: ["en-US", "cs-CZ"], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().fetchPageSafe(); + + expect(error).toBeDefined(); + expect(success).toBeFalsy(); + expect(error?.details.reason).toBe("parsingFailed"); + }); + + test("succeeds when the response contains only codenames within the defined schema", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: { + languageCodenames: ["en-US", "cs-CZ", "de-DE"], + taxonomyCodenames: [], + contentTypeCodenames: [], + elementCodenames: [], + collectionCodenames: [], + workflowCodenames: [], + workflowStepCodenames: [], + }, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().fetchPageSafe(); + + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); + }); + + test("succeeds when the schema has no codename constraints", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: baseSchema, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().fetchPageSafe(); + + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); + }); + }); + + describe("Extra properties", () => { + const mockPayload: ListLanguagesPayload & { readonly extraProperty: string } = { + languages: [ + { + system: { + id: getFakeUuid(), + codename: "de-DE", + name: "German", + extraSystemProperty: "extra", + } as ListLanguagesPayload["languages"][0]["system"] & { readonly extraSystemProperty: string }, + }, + ], + extraProperty: "extra", + pagination: { + skip: 0, + limit: 0, + count: 1, + next_page: "", + extraPaginationProperty: "extra", + } as PaginationPayload["pagination"] & { readonly extraPaginationProperty: string }, + }; + + test("succeeds when the response includes unrecognised properties", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: baseSchema, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().fetchPageSafe(); + + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); + }); + }); + + describe("Missing required properties", () => { + const mockPayload: Omit, "pagination"> = { + languages: [ + { + system: { + id: getFakeUuid(), + codename: "de-DE", + name: "German", + }, + }, + ], + }; + + test("fails when the response is missing a required property", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: baseSchema, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: mockPayload, + statusCode: 200, + }), + }); + + const { success, error } = await client.listLanguages().fetchPageSafe(); + + expect(error).toBeDefined(); + expect(success).toBeFalsy(); + expect(error?.details.reason).toBe("parsingFailed"); + }); + }); + + describe("Error details", () => { + test("populates url, zodError and response on a parsing failure", async ({ expect }) => { + const query = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + schema: baseSchema, + runtimeValidation: { + validateResponses: true, + }, + httpService: getTestHttpServiceWithJsonResponse({ + jsonResponse: { + result: "invalidValue", + }, + statusCode: 200, + }), + }).listLanguages(); + + const { success, error } = await query.fetchPageSafe(); + + expect(success).toBe(false); + expect(error).toBeDefined(); + expect(error?.details.reason).toStrictEqual("parsingFailed"); + + if (error?.details.reason === "parsingFailed") { + expect(error.details.url).toStrictEqual(query.inspect().data?.url); + expect(error.details.zodError).toBeInstanceOf(ZodError); + expect(error.details.response).toBeDefined(); + } else { + throw new Error(`Unexpected error reason '${error?.details.reason}'`); + } + }); + }); +}); From 9912b792fa58eda0bc1e3d68cd788b46775847c8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 4 May 2026 12:43:00 +0200 Subject: [PATCH 131/221] Adds renditions schema --- lib/queries/content-items/content-item.models.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index f12ac8b9..572a7008 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -19,6 +19,17 @@ const taxonomyTermValueSchema = (codenames?: }) .readonly(); +const renditionSchema = z + .object({ + rendition_id: kontentUuidSchema, + preset_id: kontentUuidSchema, + width: z.number(), + height: z.number(), + query: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(); + const assetValueSchema = z .object({ name: z.string(), @@ -28,7 +39,7 @@ const assetValueSchema = z url: z.url(), width: z.number().nullable(), height: z.number().nullable(), - renditions: z.record(z.string(), jsonValueSchema), + renditions: z.object({ default: renditionSchema.optional() }).readonly(), }) .catchall(jsonValueSchema) .readonly(); From 88b56d64f332a353172046c8cd91d24025e35932 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 4 May 2026 12:49:09 +0200 Subject: [PATCH 132/221] fix next_page pagingtype --- lib/models/pagination.models.ts | 2 +- lib/utils/paging.utils.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index db453cb9..1c0c7392 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -const nextPageSchema = z.url().nullable().or(z.literal("")); +const nextPageSchema = z.url().or(z.literal("")); const paginationObjectSchema = z.object({ skip: z.number(), diff --git a/lib/utils/paging.utils.ts b/lib/utils/paging.utils.ts index c0430c7a..4ab85c7f 100644 --- a/lib/utils/paging.utils.ts +++ b/lib/utils/paging.utils.ts @@ -3,9 +3,10 @@ import type { PaginationPayload } from "../models/pagination.models.js"; export function getNextPageByUrl(): GetNextPageData { return (response) => { + const nextPageUrl = response.payload.pagination.next_page; return { continuationToken: undefined, - nextPageUrl: response.payload.pagination.next_page, + nextPageUrl: nextPageUrl.length ? nextPageUrl : undefined, }; }; } From 80278f1d8bb32de78ece4fc152731ad85dd28c81 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 11:40:14 +0200 Subject: [PATCH 133/221] element typings wip --- lib/public_api.ts | 2 +- .../content-items/content-item.models.ts | 189 ++++++++++-------- tests/types/delivery-client-types.test.ts | 129 +++++++++--- tests/unit/queries/element-def.spec.ts | 70 +++++++ 4 files changed, 271 insertions(+), 119 deletions(-) create mode 100644 tests/unit/queries/element-def.spec.ts diff --git a/lib/public_api.ts b/lib/public_api.ts index c3fbca08..dc4720c8 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -25,7 +25,7 @@ export { type ContentItemElementPayload, type ContentItemPayload, type ContentItemSystemPayload, - elementSchemas, + elementDef, type FetchContentItemPayload, type ItemsFeedPayload, type ItemsReferencingAssetPayload, diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 572a7008..01e52c44 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -64,99 +64,103 @@ const richTextLinkSchema = z .catchall(jsonValueSchema) .readonly(); -const multipleChoiceSchema = (codenames?: readonly TCodename[]) => - z - .object({ +// Shared concrete element schemas — base shapes only, no catchall or readonly. +// catchall and readonly are applied in elementSchemas and elementDef. +const baseElementSchemas = { + text: z.object({ + type: z.literal("text"), + name: z.string(), + value: z.string(), + }), + number: z.object({ + type: z.literal("number"), + name: z.string(), + value: z.number().nullable(), + }), + richText: z.object({ + type: z.literal("rich_text"), + name: z.string(), + value: z.string(), + images: z.record(z.string(), richTextImageSchema), + links: z.record(z.string(), richTextLinkSchema), + modular_content: z.array(codenameSchema).readonly(), + }), + multipleChoice: (codenames?: readonly TCodename[]) => + z.object({ type: z.literal("multiple_choice"), name: z.string(), value: z.array(multipleChoiceOptionSchema(codenames)).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(); - -const taxonomySchema = (codenames?: readonly TCodename[]) => - z - .object({ + }), + dateTime: z.object({ + type: z.literal("date_time"), + name: z.string(), + value: z.string().nullable(), + display_timezone: z.string().nullable(), + }), + asset: z.object({ + type: z.literal("asset"), + name: z.string(), + value: z.array(assetValueSchema).readonly(), + }), + taxonomy: (codenames?: readonly TCodename[]) => + z.object({ type: z.literal("taxonomy"), name: z.string(), taxonomy_group: z.string(), value: z.array(taxonomyTermValueSchema(codenames)).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(); + }), + urlSlug: z.object({ + type: z.literal("url_slug"), + name: z.string(), + value: z.string(), + }), + custom: z.object({ + type: z.literal("custom"), + name: z.string(), + value: z.string().nullable(), + }), + linkedItems: z.object({ + type: z.literal("modular_content"), + name: z.string(), + value: z.array(codenameSchema).readonly(), + }), +} as const; +// elementSchemas — public schemas for working with standard content item elements. +// linkedItems here is the plain API-response shape without the resolved items property. export const elementSchemas = { - text: z - .object({ - type: z.literal("text"), - name: z.string(), - value: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - number: z - .object({ - type: z.literal("number"), - name: z.string(), - value: z.number().nullable(), - }) - .catchall(jsonValueSchema) - .readonly(), - richText: z - .object({ - type: z.literal("rich_text"), - name: z.string(), - value: z.string(), - images: z.record(z.string(), richTextImageSchema), - links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(codenameSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), - multipleChoice: multipleChoiceSchema, - dateTime: z - .object({ - type: z.literal("date_time"), - name: z.string(), - value: z.string().nullable(), - display_timezone: z.string().nullable(), - }) - .catchall(jsonValueSchema) - .readonly(), - asset: z - .object({ - type: z.literal("asset"), - name: z.string(), - value: z.array(assetValueSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), - taxonomy: taxonomySchema, - urlSlug: z - .object({ - type: z.literal("url_slug"), - name: z.string(), - value: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - linkedItems: z - .object({ - type: z.literal("modular_content"), - name: z.string(), - value: z.array(codenameSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), - custom: z - .object({ - type: z.literal("custom"), - name: z.string(), - value: z.string().nullable(), - }) - .catchall(jsonValueSchema) - .readonly(), -}; + text: baseElementSchemas.text.catchall(jsonValueSchema).readonly(), + number: baseElementSchemas.number.catchall(jsonValueSchema).readonly(), + richText: baseElementSchemas.richText.catchall(jsonValueSchema).readonly(), + multipleChoice: (codenames?: readonly TCodename[]) => + baseElementSchemas.multipleChoice(codenames).catchall(jsonValueSchema).readonly(), + dateTime: baseElementSchemas.dateTime.catchall(jsonValueSchema).readonly(), + asset: baseElementSchemas.asset.catchall(jsonValueSchema).readonly(), + taxonomy: (codenames?: readonly TCodename[]) => + baseElementSchemas.taxonomy(codenames).catchall(jsonValueSchema).readonly(), + urlSlug: baseElementSchemas.urlSlug.catchall(jsonValueSchema).readonly(), + custom: baseElementSchemas.custom.catchall(jsonValueSchema).readonly(), + linkedItems: baseElementSchemas.linkedItems.catchall(jsonValueSchema).readonly(), +} as const; + +// elementDef — public building blocks for constructing typed content item schemas. +// linkedItems accepts an array of content item Zod schemas; items will be typed as the union of those types. +export const elementDef = { + ...elementSchemas, + linkedItems: < + TSchema extends DeliveryClientSchema = DeliveryClientSchema, + const TAllowedItemTypes extends z.ZodType, "system">> = z.ZodType< + Pick, "system"> + >, + >( + schemas: readonly TAllowedItemTypes[], + ) => + baseElementSchemas.linkedItems + .extend({ + items: z.array(z.union(schemas)).readonly(), + }) + .readonly(), +} as const; const contentItemElementSchema = z .discriminatedUnion("type", [ @@ -177,7 +181,7 @@ const baseContentItemSystemSchema = (schem z.object({ id: kontentUuidSchema, name: z.string(), - codename: codenameOf(schema?.contentTypeCodenames), + codename: codenameSchema, language: codenameOf(schema?.languageCodenames), type: codenameOf(schema?.contentTypeCodenames), collection: codenameOf(schema?.collectionCodenames), @@ -186,6 +190,21 @@ const baseContentItemSystemSchema = (schem workflow_step: codenameOf(schema?.workflowStepCodenames), }); +export const specificContentItemSystemSchema = < + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], +>( + schema: TSchema | undefined, + type: TTypeCodename, +) => + z + .object({ + ...baseContentItemSystemSchema(schema).shape, + sitemap_locations: z.array(z.string()).readonly(), + type: z.literal(type), + }) + .readonly(); + export const contentItemSystemSchema = (schema: TSchema | undefined) => z .object({ diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index e461795a..8817adbe 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,8 +1,8 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; -import type { DeliveryClient } from "../../lib/models/core.models.js"; -import { type ContentItemPayload, contentItemSystemSchema, elementSchemas } from "../../lib/queries/content-items/content-item.models.js"; +import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core.models.js"; +import { elementDef, specificContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; const schema = { languageCodenames: ["en-us", "es-es"], @@ -12,31 +12,73 @@ const schema = { collectionCodenames: ["movies", "tv-shows"], workflowCodenames: ["published", "draft"], workflowStepCodenames: ["published", "draft"], -} as const; +} as const satisfies DeliveryClientSchema; type DeliverySchema = typeof schema; type TypedDeliveryClient = DeliveryClient; -const actorSchema = z +type ActorPayload = { + readonly system: z.infer>>; + readonly elements: { + readonly first_name: z.infer; + readonly last_name: z.infer; + readonly role: z.infer>>; + // circular reference + readonly relatedActors: z.infer>>>; + }; +}; + +// Covers every element type in elementDef +type MoviePayload = { + readonly system: z.infer>>; + readonly elements: { + readonly title: z.infer; + readonly rating: z.infer; + readonly synopsis: z.infer; + readonly genre: z.infer>>; + readonly release_date: z.infer; + readonly poster: z.infer; + readonly categories: z.infer>>; + readonly url_slug: z.infer; + readonly custom_id: z.infer; + readonly actors: z.infer>>>; + }; +}; + +const actorSchema: z.ZodType = z .object({ - system: contentItemSystemSchema(schema), - elements: z - .object({ - first_name: elementSchemas.text, - last_name: elementSchemas.text, - role: elementSchemas.multipleChoice(["hero", "villain", "sidekick"]), - category: elementSchemas.taxonomy(["action_film", "drama", "comedy"]), - }) - .readonly(), + system: specificContentItemSystemSchema(schema, "actor"), + elements: z.object({ + first_name: elementDef.text, + last_name: elementDef.text, + role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), + get relatedActors() { + return elementDef.linkedItems([actorSchema]); + }, + }), }) .readonly(); -type Actor = z.infer; +const movieSchema: z.ZodType = z + .object({ + system: specificContentItemSystemSchema(schema, "movie"), + elements: z.object({ + title: elementDef.text, + rating: elementDef.number, + synopsis: elementDef.richText, + genre: elementDef.multipleChoice(["genre1", "genre2"]), + release_date: elementDef.dateTime, + poster: elementDef.asset, + categories: elementDef.taxonomy(["term1", "term2"]), + url_slug: elementDef.urlSlug, + custom_id: elementDef.custom, + actors: elementDef.linkedItems([actorSchema]), + }), + }) + .readonly(); -function isActor(item: ContentItemPayload): item is Actor { - return actorSchema.safeParse(item).success; -} +void movieSchema; const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", @@ -55,22 +97,43 @@ const responseLanguageCodenames: readonly (typeof schema.languageCodenames)[numb (language) => language.system.codename, ); -const { payload } = await client - .fetchContentItem({ - codename: "itemCodename", - }) - .fetch(); +void responseLanguageCodenames; -if (isActor(payload.item)) { - const firstName: string = payload.item.elements.first_name.value; - const lastName: string = payload.item.elements.last_name.value; - const roleCodename: undefined | "hero" | "villain" | "sidekick" = payload.item.elements.role.value[0]?.codename; - const categoryCodename: undefined | "action_film" | "drama" | "comedy" = payload.item.elements.category.value[0]?.codename; +await client.fetchContentItem({ codename: "itemCodename" }).fetch(); - void firstName; - void lastName; - void roleCodename; - void categoryCodename; -} +// Type showcase — compile-time verification of typed element access +declare const actor: ActorPayload; -void responseLanguageCodenames; +const firstName: string = actor.elements.first_name.value; +const roleCodename: "opt1" | "opt2" | "opt3" | undefined = actor.elements.role.value[0]?.codename; +const firstRelatedActor: ActorPayload | undefined = actor.elements.relatedActors.items[0]; + +void firstName; +void roleCodename; +void firstRelatedActor; + +declare const movie: MoviePayload; + +const title: string = movie.elements.title.value; +const rating: number | null = movie.elements.rating.value; +const synopsis: string = movie.elements.synopsis.value; +const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; +const releaseDate: string | null = movie.elements.release_date.value; +const displayTimezone: string | null = movie.elements.release_date.display_timezone; +const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; +const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; +const urlSlug: string = movie.elements.url_slug.value; +const customId: string | null = movie.elements.custom_id.value; +const movieActor: ActorPayload | undefined = movie.elements.actors.items[0]; + +void title; +void rating; +void synopsis; +void genreCodename; +void releaseDate; +void displayTimezone; +void posterUrl; +void categoryCodename; +void urlSlug; +void customId; +void movieActor; diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts new file mode 100644 index 00000000..64340ab5 --- /dev/null +++ b/tests/unit/queries/element-def.spec.ts @@ -0,0 +1,70 @@ +import { describe, expect, test } from "vitest"; +import z from "zod"; +import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; +import { elementDef, specificContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; +import { getFakeUuid } from "../../utils/test.utils.js"; + +const schemaInput = { + languageCodenames: ["en"], + contentTypeCodenames: ["actor", "movie"], + taxonomyCodenames: [], + elementCodenames: [], + collectionCodenames: ["default"], + workflowCodenames: ["published"], + workflowStepCodenames: ["published"], +} as const satisfies DeliveryClientSchema; + +const makeSystem = (): ContentItemSystemPayload => ({ + id: getFakeUuid(), + name: "Test Item", + codename: "x", + language: "en", + type: "actor", + collection: "default", + last_modified: "2024-01-01T00:00:00.000Z", + workflow: "published", + workflow_step: "published", + sitemap_locations: [], +}); + +describe("elementDef.linkedItems", () => { + test("items are validated against the union when multiple schemas provided", () => { + const actorSchema = z + .object({ + system: specificContentItemSystemSchema(schemaInput, "actor"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const movieSchema = z + .object({ + system: specificContentItemSystemSchema(schemaInput, "movie"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const schema = elementDef.linkedItems([actorSchema, movieSchema]); + const system = makeSystem(); + + const validActor = schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ system, elements: {} }], + }); + const validMovie = schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ system: { ...system, type: "movie", codename: "movie" }, elements: {} }], + }); + const invalid = schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ noSystemOrElements: true }], + }); + + expect(validActor.success).toBe(true); + expect(validMovie.success).toBe(true); + expect(invalid.success).toBe(false); + }); +}); From 61e8200202db952e1021f34492a53cea7adccab2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 11:42:06 +0200 Subject: [PATCH 134/221] removes unnecessary catchall --- .../content-items/content-item.models.ts | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 01e52c44..8d4c9b32 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -1,4 +1,4 @@ -import { codenameOf, codenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; @@ -27,7 +27,6 @@ const renditionSchema = z height: z.number(), query: z.string(), }) - .catchall(jsonValueSchema) .readonly(); const assetValueSchema = z @@ -41,7 +40,6 @@ const assetValueSchema = z height: z.number().nullable(), renditions: z.object({ default: renditionSchema.optional() }).readonly(), }) - .catchall(jsonValueSchema) .readonly(); const richTextImageSchema = z @@ -52,7 +50,6 @@ const richTextImageSchema = z width: z.number().nullable(), height: z.number().nullable(), }) - .catchall(jsonValueSchema) .readonly(); const richTextLinkSchema = z @@ -61,11 +58,8 @@ const richTextLinkSchema = z type: z.string(), url_slug: z.string(), }) - .catchall(jsonValueSchema) .readonly(); -// Shared concrete element schemas — base shapes only, no catchall or readonly. -// catchall and readonly are applied in elementSchemas and elementDef. const baseElementSchemas = { text: z.object({ type: z.literal("text"), @@ -129,18 +123,17 @@ const baseElementSchemas = { // elementSchemas — public schemas for working with standard content item elements. // linkedItems here is the plain API-response shape without the resolved items property. export const elementSchemas = { - text: baseElementSchemas.text.catchall(jsonValueSchema).readonly(), - number: baseElementSchemas.number.catchall(jsonValueSchema).readonly(), - richText: baseElementSchemas.richText.catchall(jsonValueSchema).readonly(), + text: baseElementSchemas.text.readonly(), + number: baseElementSchemas.number.readonly(), + richText: baseElementSchemas.richText.readonly(), multipleChoice: (codenames?: readonly TCodename[]) => - baseElementSchemas.multipleChoice(codenames).catchall(jsonValueSchema).readonly(), - dateTime: baseElementSchemas.dateTime.catchall(jsonValueSchema).readonly(), - asset: baseElementSchemas.asset.catchall(jsonValueSchema).readonly(), - taxonomy: (codenames?: readonly TCodename[]) => - baseElementSchemas.taxonomy(codenames).catchall(jsonValueSchema).readonly(), - urlSlug: baseElementSchemas.urlSlug.catchall(jsonValueSchema).readonly(), - custom: baseElementSchemas.custom.catchall(jsonValueSchema).readonly(), - linkedItems: baseElementSchemas.linkedItems.catchall(jsonValueSchema).readonly(), + baseElementSchemas.multipleChoice(codenames).readonly(), + dateTime: baseElementSchemas.dateTime.readonly(), + asset: baseElementSchemas.asset.readonly(), + taxonomy: (codenames?: readonly TCodename[]) => baseElementSchemas.taxonomy(codenames).readonly(), + urlSlug: baseElementSchemas.urlSlug.readonly(), + custom: baseElementSchemas.custom.readonly(), + linkedItems: baseElementSchemas.linkedItems.readonly(), } as const; // elementDef — public building blocks for constructing typed content item schemas. @@ -162,7 +155,7 @@ export const elementDef = { .readonly(), } as const; -const contentItemElementSchema = z +const defaultElementSchema = z .discriminatedUnion("type", [ elementSchemas.text, elementSchemas.number, @@ -217,7 +210,7 @@ const contentItemSchema = (schema: TSchema z .object({ system: contentItemSystemSchema(schema), - elements: z.record(z.string(), contentItemElementSchema), + elements: z.record(z.string(), defaultElementSchema), }) .readonly(); @@ -273,7 +266,7 @@ export const fetchContentItemSchema = (sch .readonly(); export type ContentItemSystemPayload = z.infer>>; -export type ContentItemElementPayload = z.infer; +export type ContentItemElementPayload = z.infer; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; From a003d0b010c649057d375f86bff5214f46d4471b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 12:10:47 +0200 Subject: [PATCH 135/221] separates element models --- lib/public_api.ts | 19 +- .../content-items/content-item.models.ts | 171 +----------------- lib/queries/content-items/element.models.ts | 166 +++++++++++++++++ tests/types/delivery-client-types.test.ts | 7 +- tests/unit/queries/element-def.spec.ts | 3 +- 5 files changed, 183 insertions(+), 183 deletions(-) create mode 100644 lib/queries/content-items/element.models.ts diff --git a/lib/public_api.ts b/lib/public_api.ts index dc4720c8..7bd1f8dd 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -21,17 +21,16 @@ export type { OrderDirection, SystemOrderQueryParam, } from "./models/request.models.js"; -export { - type ContentItemElementPayload, - type ContentItemPayload, - type ContentItemSystemPayload, - elementDef, - type FetchContentItemPayload, - type ItemsFeedPayload, - type ItemsReferencingAssetPayload, - type ItemsReferencingItemPayload, - type ListContentItemsPayload, +export type { + ContentItemPayload, + ContentItemSystemPayload, + FetchContentItemPayload, + ItemsFeedPayload, + ItemsReferencingAssetPayload, + ItemsReferencingItemPayload, + ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; +export { type ContentItemElementPayload, elementDef } from "./queries/content-items/element.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 8d4c9b32..7e4db42a 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -2,173 +2,7 @@ import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core- import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; - -const multipleChoiceOptionSchema = (codenames?: readonly TCodename[]) => - z - .object({ - name: z.string(), - codename: codenameOf(codenames), - }) - .readonly(); - -const taxonomyTermValueSchema = (codenames?: readonly TCodename[]) => - z - .object({ - name: z.string(), - codename: codenameOf(codenames), - }) - .readonly(); - -const renditionSchema = z - .object({ - rendition_id: kontentUuidSchema, - preset_id: kontentUuidSchema, - width: z.number(), - height: z.number(), - query: z.string(), - }) - .readonly(); - -const assetValueSchema = z - .object({ - name: z.string(), - description: z.string().nullable(), - type: z.string(), - size: z.number(), - url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - renditions: z.object({ default: renditionSchema.optional() }).readonly(), - }) - .readonly(); - -const richTextImageSchema = z - .object({ - image_id: z.string(), - description: z.string().nullable(), - url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - }) - .readonly(); - -const richTextLinkSchema = z - .object({ - codename: codenameSchema, - type: z.string(), - url_slug: z.string(), - }) - .readonly(); - -const baseElementSchemas = { - text: z.object({ - type: z.literal("text"), - name: z.string(), - value: z.string(), - }), - number: z.object({ - type: z.literal("number"), - name: z.string(), - value: z.number().nullable(), - }), - richText: z.object({ - type: z.literal("rich_text"), - name: z.string(), - value: z.string(), - images: z.record(z.string(), richTextImageSchema), - links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(codenameSchema).readonly(), - }), - multipleChoice: (codenames?: readonly TCodename[]) => - z.object({ - type: z.literal("multiple_choice"), - name: z.string(), - value: z.array(multipleChoiceOptionSchema(codenames)).readonly(), - }), - dateTime: z.object({ - type: z.literal("date_time"), - name: z.string(), - value: z.string().nullable(), - display_timezone: z.string().nullable(), - }), - asset: z.object({ - type: z.literal("asset"), - name: z.string(), - value: z.array(assetValueSchema).readonly(), - }), - taxonomy: (codenames?: readonly TCodename[]) => - z.object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - value: z.array(taxonomyTermValueSchema(codenames)).readonly(), - }), - urlSlug: z.object({ - type: z.literal("url_slug"), - name: z.string(), - value: z.string(), - }), - custom: z.object({ - type: z.literal("custom"), - name: z.string(), - value: z.string().nullable(), - }), - linkedItems: z.object({ - type: z.literal("modular_content"), - name: z.string(), - value: z.array(codenameSchema).readonly(), - }), -} as const; - -// elementSchemas — public schemas for working with standard content item elements. -// linkedItems here is the plain API-response shape without the resolved items property. -export const elementSchemas = { - text: baseElementSchemas.text.readonly(), - number: baseElementSchemas.number.readonly(), - richText: baseElementSchemas.richText.readonly(), - multipleChoice: (codenames?: readonly TCodename[]) => - baseElementSchemas.multipleChoice(codenames).readonly(), - dateTime: baseElementSchemas.dateTime.readonly(), - asset: baseElementSchemas.asset.readonly(), - taxonomy: (codenames?: readonly TCodename[]) => baseElementSchemas.taxonomy(codenames).readonly(), - urlSlug: baseElementSchemas.urlSlug.readonly(), - custom: baseElementSchemas.custom.readonly(), - linkedItems: baseElementSchemas.linkedItems.readonly(), -} as const; - -// elementDef — public building blocks for constructing typed content item schemas. -// linkedItems accepts an array of content item Zod schemas; items will be typed as the union of those types. -export const elementDef = { - ...elementSchemas, - linkedItems: < - TSchema extends DeliveryClientSchema = DeliveryClientSchema, - const TAllowedItemTypes extends z.ZodType, "system">> = z.ZodType< - Pick, "system"> - >, - >( - schemas: readonly TAllowedItemTypes[], - ) => - baseElementSchemas.linkedItems - .extend({ - items: z.array(z.union(schemas)).readonly(), - }) - .readonly(), -} as const; - -const defaultElementSchema = z - .discriminatedUnion("type", [ - elementSchemas.text, - elementSchemas.number, - elementSchemas.richText, - elementSchemas.multipleChoice(), - elementSchemas.dateTime, - elementSchemas.asset, - elementSchemas.taxonomy(), - elementSchemas.urlSlug, - elementSchemas.linkedItems, - elementSchemas.custom, - ]) - .readonly(); +import { contentItemElementSchema } from "./element.models.js"; const baseContentItemSystemSchema = (schema: TSchema | undefined) => z.object({ @@ -210,7 +44,7 @@ const contentItemSchema = (schema: TSchema z .object({ system: contentItemSystemSchema(schema), - elements: z.record(z.string(), defaultElementSchema), + elements: z.record(z.string(), contentItemElementSchema), }) .readonly(); @@ -266,7 +100,6 @@ export const fetchContentItemSchema = (sch .readonly(); export type ContentItemSystemPayload = z.infer>>; -export type ContentItemElementPayload = z.infer; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; export type FetchContentItemPayload = z.infer>>; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts new file mode 100644 index 00000000..c729c733 --- /dev/null +++ b/lib/queries/content-items/element.models.ts @@ -0,0 +1,166 @@ +import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; + +const multipleChoiceOptionSchema = (codenames?: readonly TCodename[]) => + z + .object({ + name: z.string(), + codename: codenameOf(codenames), + }) + .readonly(); + +const taxonomyTermValueSchema = (codenames?: readonly TCodename[]) => + z + .object({ + name: z.string(), + codename: codenameOf(codenames), + }) + .readonly(); + +const renditionSchema = z + .object({ + rendition_id: kontentUuidSchema, + preset_id: kontentUuidSchema, + width: z.number(), + height: z.number(), + query: z.string(), + }) + .readonly(); + +const assetValueSchema = z + .object({ + name: z.string(), + description: z.string().nullable(), + type: z.string(), + size: z.number(), + url: z.url(), + width: z.number().nullable(), + height: z.number().nullable(), + renditions: z.object({ default: renditionSchema.optional() }).readonly(), + }) + .readonly(); + +const richTextImageSchema = z + .object({ + image_id: z.string(), + description: z.string().nullable(), + url: z.url(), + width: z.number().nullable(), + height: z.number().nullable(), + }) + .readonly(); + +const richTextLinkSchema = z + .object({ + codename: codenameSchema, + type: z.string(), + url_slug: z.string(), + }) + .readonly(); + +// Shared concrete element schemas — base shapes only, no readonly. +// readonly is applied in elementSchemas and elementDef. +const baseElementSchemas = { + text: z.object({ + type: z.literal("text"), + name: z.string(), + value: z.string(), + }), + number: z.object({ + type: z.literal("number"), + name: z.string(), + value: z.number().nullable(), + }), + richText: z.object({ + type: z.literal("rich_text"), + name: z.string(), + value: z.string(), + images: z.record(z.string(), richTextImageSchema), + links: z.record(z.string(), richTextLinkSchema), + modular_content: z.array(codenameSchema).readonly(), + }), + multipleChoice: (codenames?: readonly TCodename[]) => + z.object({ + type: z.literal("multiple_choice"), + name: z.string(), + value: z.array(multipleChoiceOptionSchema(codenames)).readonly(), + }), + dateTime: z.object({ + type: z.literal("date_time"), + name: z.string(), + value: z.string().nullable(), + display_timezone: z.string().nullable(), + }), + asset: z.object({ + type: z.literal("asset"), + name: z.string(), + value: z.array(assetValueSchema).readonly(), + }), + taxonomy: (codenames?: readonly TCodename[]) => + z.object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + value: z.array(taxonomyTermValueSchema(codenames)).readonly(), + }), + urlSlug: z.object({ + type: z.literal("url_slug"), + name: z.string(), + value: z.string(), + }), + custom: z.object({ + type: z.literal("custom"), + name: z.string(), + value: z.string().nullable(), + }), + linkedItems: z.object({ + type: z.literal("modular_content"), + name: z.string(), + value: z.array(codenameSchema).readonly(), + }), +} as const; + +// elementSchemas — public schemas for working with standard content item elements. +// linkedItems here is the plain API-response shape without the resolved items property. +export const elementSchemas = { + text: baseElementSchemas.text.readonly(), + number: baseElementSchemas.number.readonly(), + richText: baseElementSchemas.richText.readonly(), + multipleChoice: (codenames?: readonly TCodename[]) => + baseElementSchemas.multipleChoice(codenames).readonly(), + dateTime: baseElementSchemas.dateTime.readonly(), + asset: baseElementSchemas.asset.readonly(), + taxonomy: (codenames?: readonly TCodename[]) => baseElementSchemas.taxonomy(codenames).readonly(), + urlSlug: baseElementSchemas.urlSlug.readonly(), + custom: baseElementSchemas.custom.readonly(), + linkedItems: baseElementSchemas.linkedItems.readonly(), +} as const; + +// elementDef — public building blocks for constructing typed content item schemas. +// linkedItems accepts an array of content item Zod schemas; items will be typed as the union of those types. +export const elementDef = { + ...elementSchemas, + linkedItems: (schemas: readonly TAllowedItemTypes[]) => + baseElementSchemas.linkedItems + .extend({ + items: z.array(z.union(schemas)).readonly(), + }) + .readonly(), +} as const; + +export const contentItemElementSchema = z + .discriminatedUnion("type", [ + elementSchemas.text, + elementSchemas.number, + elementSchemas.richText, + elementSchemas.multipleChoice(), + elementSchemas.dateTime, + elementSchemas.asset, + elementSchemas.taxonomy(), + elementSchemas.urlSlug, + elementSchemas.linkedItems, + elementSchemas.custom, + ]) + .readonly(); + +export type ContentItemElementPayload = z.infer; diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 8817adbe..166c61f0 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -2,7 +2,8 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit import z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core.models.js"; -import { elementDef, specificContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; +import { specificContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; +import { elementDef } from "../../lib/queries/content-items/element.models.js"; const schema = { languageCodenames: ["en-us", "es-es"], @@ -25,7 +26,7 @@ type ActorPayload = { readonly last_name: z.infer; readonly role: z.infer>>; // circular reference - readonly relatedActors: z.infer>>>; + readonly relatedActors: z.infer>>>; }; }; @@ -42,7 +43,7 @@ type MoviePayload = { readonly categories: z.infer>>; readonly url_slug: z.infer; readonly custom_id: z.infer; - readonly actors: z.infer>>>; + readonly actors: z.infer>>>; }; }; diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 64340ab5..76f59a76 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -1,7 +1,8 @@ import { describe, expect, test } from "vitest"; import z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; -import { elementDef, specificContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; +import { specificContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; +import { elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; const schemaInput = { From df0fe91a79681a8a00e280243be73e6f552afae6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 12:24:28 +0200 Subject: [PATCH 136/221] Use defineContentItem for simpler schema definition --- lib/public_api.ts | 17 +++--- .../content-items/content-item.models.ts | 18 +++++- tests/types/delivery-client-types.test.ts | 60 ++++++++----------- tests/unit/queries/element-def.spec.ts | 6 +- 4 files changed, 54 insertions(+), 47 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index 7bd1f8dd..b7f0dc50 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -21,14 +21,15 @@ export type { OrderDirection, SystemOrderQueryParam, } from "./models/request.models.js"; -export type { - ContentItemPayload, - ContentItemSystemPayload, - FetchContentItemPayload, - ItemsFeedPayload, - ItemsReferencingAssetPayload, - ItemsReferencingItemPayload, - ListContentItemsPayload, +export { + type ContentItemPayload, + type ContentItemSystemPayload, + defineContentItem, + type FetchContentItemPayload, + type ItemsFeedPayload, + type ItemsReferencingAssetPayload, + type ItemsReferencingItemPayload, + type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; export { type ContentItemElementPayload, elementDef } from "./queries/content-items/element.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 7e4db42a..6e0383e6 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -17,7 +17,7 @@ const baseContentItemSystemSchema = (schem workflow_step: codenameOf(schema?.workflowStepCodenames), }); -export const specificContentItemSystemSchema = < +export const narrowedContentItemSystemSchema = < TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], >( @@ -99,6 +99,22 @@ export const fetchContentItemSchema = (sch }) .readonly(); +export const defineContentItem = < + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], + TElementsShape extends z.ZodRawShape, +>( + schema: TSchema | undefined, + typeCodename: TTypeCodename, + elements: TElementsShape, +) => + z + .object({ + system: narrowedContentItemSystemSchema(schema, typeCodename), + elements: z.object(elements).readonly(), + }) + .readonly(); + export type ContentItemSystemPayload = z.infer>>; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 166c61f0..b1a4fb72 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,8 +1,8 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import z from "zod"; +import type z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core.models.js"; -import { specificContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; +import { defineContentItem, type narrowedContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../lib/queries/content-items/element.models.js"; const schema = { @@ -20,7 +20,7 @@ type DeliverySchema = typeof schema; type TypedDeliveryClient = DeliveryClient; type ActorPayload = { - readonly system: z.infer>>; + readonly system: z.infer>>; readonly elements: { readonly first_name: z.infer; readonly last_name: z.infer; @@ -32,7 +32,7 @@ type ActorPayload = { // Covers every element type in elementDef type MoviePayload = { - readonly system: z.infer>>; + readonly system: z.infer>>; readonly elements: { readonly title: z.infer; readonly rating: z.infer; @@ -47,37 +47,27 @@ type MoviePayload = { }; }; -const actorSchema: z.ZodType = z - .object({ - system: specificContentItemSystemSchema(schema, "actor"), - elements: z.object({ - first_name: elementDef.text, - last_name: elementDef.text, - role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), - get relatedActors() { - return elementDef.linkedItems([actorSchema]); - }, - }), - }) - .readonly(); - -const movieSchema: z.ZodType = z - .object({ - system: specificContentItemSystemSchema(schema, "movie"), - elements: z.object({ - title: elementDef.text, - rating: elementDef.number, - synopsis: elementDef.richText, - genre: elementDef.multipleChoice(["genre1", "genre2"]), - release_date: elementDef.dateTime, - poster: elementDef.asset, - categories: elementDef.taxonomy(["term1", "term2"]), - url_slug: elementDef.urlSlug, - custom_id: elementDef.custom, - actors: elementDef.linkedItems([actorSchema]), - }), - }) - .readonly(); +const actorSchema: z.ZodType = defineContentItem(schema, "actor", { + first_name: elementDef.text, + last_name: elementDef.text, + role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), + get relatedActors() { + return elementDef.linkedItems([actorSchema]); + }, +}); + +const movieSchema: z.ZodType = defineContentItem(schema, "movie", { + title: elementDef.text, + rating: elementDef.number, + synopsis: elementDef.richText, + genre: elementDef.multipleChoice(["genre1", "genre2"]), + release_date: elementDef.dateTime, + poster: elementDef.asset, + categories: elementDef.taxonomy(["term1", "term2"]), + url_slug: elementDef.urlSlug, + custom_id: elementDef.custom, + actors: elementDef.linkedItems([actorSchema]), +}); void movieSchema; diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 76f59a76..45c12230 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "vitest"; import z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; -import { specificContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; +import { narrowedContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; @@ -32,13 +32,13 @@ describe("elementDef.linkedItems", () => { test("items are validated against the union when multiple schemas provided", () => { const actorSchema = z .object({ - system: specificContentItemSystemSchema(schemaInput, "actor"), + system: narrowedContentItemSystemSchema(schemaInput, "actor"), elements: z.record(z.string(), z.unknown()), }) .readonly(); const movieSchema = z .object({ - system: specificContentItemSystemSchema(schemaInput, "movie"), + system: narrowedContentItemSystemSchema(schemaInput, "movie"), elements: z.record(z.string(), z.unknown()), }) .readonly(); From 39b9fb03d179b5f2d1167197032539c17f6c9182 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 13:46:32 +0200 Subject: [PATCH 137/221] Adds type helper --- lib/public_api.ts | 2 + .../content-items/content-item.models.ts | 20 +++++++- tests/types/delivery-client-types.test.ts | 48 +++++++++---------- tests/unit/queries/element-def.spec.ts | 6 +-- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index b7f0dc50..6f2634b4 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -23,9 +23,11 @@ export type { } from "./models/request.models.js"; export { type ContentItemPayload, + type ContentItemSystem, type ContentItemSystemPayload, defineContentItem, type FetchContentItemPayload, + type InferItemType, type ItemsFeedPayload, type ItemsReferencingAssetPayload, type ItemsReferencingItemPayload, diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 6e0383e6..4f63acc8 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -17,7 +17,7 @@ const baseContentItemSystemSchema = (schem workflow_step: codenameOf(schema?.workflowStepCodenames), }); -export const narrowedContentItemSystemSchema = < +export const contentItemSystemWithCodename = < TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], >( @@ -110,11 +110,27 @@ export const defineContentItem = < ) => z .object({ - system: narrowedContentItemSystemSchema(schema, typeCodename), + system: contentItemSystemWithCodename(schema, typeCodename), elements: z.object(elements).readonly(), }) .readonly(); +export type ContentItemSystem< + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], +> = z.infer>>; + +export type InferItemType< + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], + TElementSchemas extends z.ZodRawShape, +> = { + readonly system: ContentItemSystem; + readonly elements: { + readonly [K in keyof TElementSchemas]: z.infer; + }; +}; + export type ContentItemSystemPayload = z.infer>>; export type ContentItemPayload = z.infer>>; export type ListContentItemsPayload = z.infer>>; diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index b1a4fb72..462f1ff5 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -2,7 +2,7 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit import type z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core.models.js"; -import { defineContentItem, type narrowedContentItemSystemSchema } from "../../lib/queries/content-items/content-item.models.js"; +import { type InferItemType as ContentItemOf, defineContentItem } from "../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../lib/queries/content-items/element.models.js"; const schema = { @@ -19,35 +19,33 @@ type DeliverySchema = typeof schema; type TypedDeliveryClient = DeliveryClient; -type ActorPayload = { - readonly system: z.infer>>; - readonly elements: { - readonly first_name: z.infer; - readonly last_name: z.infer; - readonly role: z.infer>>; - // circular reference - readonly relatedActors: z.infer>>>; - }; +type ActorElements = { + first_name: typeof elementDef.text; + last_name: typeof elementDef.text; + role: ReturnType>; + relatedActors: ReturnType>>; }; +// circular reference — relatedActors items are ActorPayload itself +type ActorPayload = ContentItemOf; + // Covers every element type in elementDef -type MoviePayload = { - readonly system: z.infer>>; - readonly elements: { - readonly title: z.infer; - readonly rating: z.infer; - readonly synopsis: z.infer; - readonly genre: z.infer>>; - readonly release_date: z.infer; - readonly poster: z.infer; - readonly categories: z.infer>>; - readonly url_slug: z.infer; - readonly custom_id: z.infer; - readonly actors: z.infer>>>; - }; +type MovieElements = { + title: typeof elementDef.text; + rating: typeof elementDef.number; + synopsis: typeof elementDef.richText; + genre: ReturnType>; + release_date: typeof elementDef.dateTime; + poster: typeof elementDef.asset; + categories: ReturnType>; + url_slug: typeof elementDef.urlSlug; + custom_id: typeof elementDef.custom; + actors: ReturnType>>; }; -const actorSchema: z.ZodType = defineContentItem(schema, "actor", { +type MoviePayload = ContentItemOf; + +const actorSchema: z.ZodType = defineContentItem(schema, "actor", { first_name: elementDef.text, last_name: elementDef.text, role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 45c12230..d4bcf6d0 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "vitest"; import z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; -import { narrowedContentItemSystemSchema } from "../../../lib/queries/content-items/content-item.models.js"; +import { contentItemSystemWithCodename } from "../../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; @@ -32,13 +32,13 @@ describe("elementDef.linkedItems", () => { test("items are validated against the union when multiple schemas provided", () => { const actorSchema = z .object({ - system: narrowedContentItemSystemSchema(schemaInput, "actor"), + system: contentItemSystemWithCodename(schemaInput, "actor"), elements: z.record(z.string(), z.unknown()), }) .readonly(); const movieSchema = z .object({ - system: narrowedContentItemSystemSchema(schemaInput, "movie"), + system: contentItemSystemWithCodename(schemaInput, "movie"), elements: z.record(z.string(), z.unknown()), }) .readonly(); From 623b724f274949932a1ff63a77d8e725fc569eed Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 14:29:58 +0200 Subject: [PATCH 138/221] Extends text element def --- lib/queries/content-items/element.models.ts | 14 +++++++---- tests/types/delivery-client-types.test.ts | 12 +++++----- tests/unit/queries/element-def.spec.ts | 26 +++++++++++++++++++++ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index c729c733..59e429fc 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -120,8 +120,9 @@ const baseElementSchemas = { }), } as const; -// elementSchemas — public schemas for working with standard content item elements. -// linkedItems here is the plain API-response shape without the resolved items property. +/** + * Public schemas for working with standard content item elements. + */ export const elementSchemas = { text: baseElementSchemas.text.readonly(), number: baseElementSchemas.number.readonly(), @@ -136,10 +137,15 @@ export const elementSchemas = { linkedItems: baseElementSchemas.linkedItems.readonly(), } as const; -// elementDef — public building blocks for constructing typed content item schemas. -// linkedItems accepts an array of content item Zod schemas; items will be typed as the union of those types. +/** + * Building blocks for constructing typed content item schemas. + */ export const elementDef = { ...elementSchemas, + text: ({ maxLength, isRequired }: { readonly maxLength?: number; readonly isRequired?: boolean } = {}) => { + const valueWithMinLength = isRequired ? z.string().min(1) : z.string(); + return baseElementSchemas.text.extend({ value: maxLength ? valueWithMinLength.max(maxLength) : valueWithMinLength }).readonly(); + }, linkedItems: (schemas: readonly TAllowedItemTypes[]) => baseElementSchemas.linkedItems .extend({ diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 462f1ff5..e847a64f 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -20,8 +20,8 @@ type DeliverySchema = typeof schema; type TypedDeliveryClient = DeliveryClient; type ActorElements = { - first_name: typeof elementDef.text; - last_name: typeof elementDef.text; + first_name: ReturnType; + last_name: ReturnType; role: ReturnType>; relatedActors: ReturnType>>; }; @@ -31,7 +31,7 @@ type ActorPayload = ContentItemOf; // Covers every element type in elementDef type MovieElements = { - title: typeof elementDef.text; + title: ReturnType; rating: typeof elementDef.number; synopsis: typeof elementDef.richText; genre: ReturnType>; @@ -46,8 +46,8 @@ type MovieElements = { type MoviePayload = ContentItemOf; const actorSchema: z.ZodType = defineContentItem(schema, "actor", { - first_name: elementDef.text, - last_name: elementDef.text, + first_name: elementDef.text(), + last_name: elementDef.text(), role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), get relatedActors() { return elementDef.linkedItems([actorSchema]); @@ -55,7 +55,7 @@ const actorSchema: z.ZodType = defineContentItem = defineContentItem(schema, "movie", { - title: elementDef.text, + title: elementDef.text(), rating: elementDef.number, synopsis: elementDef.richText, genre: elementDef.multipleChoice(["genre1", "genre2"]), diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index d4bcf6d0..2308bcfa 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -28,6 +28,32 @@ const makeSystem = (): ContentItemSystemPayload => ({ sitemap_locations: [], }); +describe("elementDef.text", () => { + test("validates value without constraint when maxLength is omitted", () => { + const schema = elementDef.text(); + expect(schema.safeParse({ type: "text", name: "Title", value: "a".repeat(1000) }).success).toBe(true); + }); + + test("rejects value exceeding maxLength", () => { + const schema = elementDef.text({ maxLength: 5 }); + expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); + expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); + }); + + test("rejects empty string when isRequired is true", () => { + const schema = elementDef.text({ isRequired: true }); + expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); + expect(schema.safeParse({ type: "text", name: "Title", value: "x" }).success).toBe(true); + }); + + test("applies both isRequired and maxLength together", () => { + const schema = elementDef.text({ isRequired: true, maxLength: 5 }); + expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); + expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); + expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); + }); +}); + describe("elementDef.linkedItems", () => { test("items are validated against the union when multiple schemas provided", () => { const actorSchema = z From a53152dbbedb7c3bbc7a9ccd76f9964f86c4d52b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 5 May 2026 14:32:43 +0200 Subject: [PATCH 139/221] Update element-def.spec.ts --- tests/unit/queries/element-def.spec.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 2308bcfa..66460a19 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "vitest"; import z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; -import { contentItemSystemWithCodename } from "../../../lib/queries/content-items/content-item.models.js"; +import { contentItemSystemWithCodename, defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; @@ -28,6 +28,20 @@ const makeSystem = (): ContentItemSystemPayload => ({ sitemap_locations: [], }); +describe("defineContentItem", () => { + test("builds a schema that validates a matching content item", () => { + const schema = defineContentItem(schemaInput, "actor", { + title: elementDef.text(), + }); + expect( + schema.safeParse({ + system: makeSystem(), + elements: { title: { type: "text", name: "Title", value: "Hello" } }, + }).success, + ).toBe(true); + }); +}); + describe("elementDef.text", () => { test("validates value without constraint when maxLength is omitted", () => { const schema = elementDef.text(); From cc6ed9b42bde4045c7854598b31e1b95e70b08e8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 12:49:07 +0200 Subject: [PATCH 140/221] Adds taxonomy / multiple choice elementDef tests, extends number elem --- lib/queries/content-items/element.models.ts | 72 +++++++++------------ tests/types/delivery-client-types.test.ts | 10 +-- tests/unit/queries/element-def.spec.ts | 51 +++++++++++++++ 3 files changed, 88 insertions(+), 45 deletions(-) diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 59e429fc..df371546 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -58,8 +58,9 @@ const richTextLinkSchema = z }) .readonly(); -// Shared concrete element schemas — base shapes only, no readonly. -// readonly is applied in elementSchemas and elementDef. +/** + * Base element schema as provided by Kontent.ai API + */ const baseElementSchemas = { text: z.object({ type: z.literal("text"), @@ -79,12 +80,11 @@ const baseElementSchemas = { links: z.record(z.string(), richTextLinkSchema), modular_content: z.array(codenameSchema).readonly(), }), - multipleChoice: (codenames?: readonly TCodename[]) => - z.object({ - type: z.literal("multiple_choice"), - name: z.string(), - value: z.array(multipleChoiceOptionSchema(codenames)).readonly(), - }), + multipleChoice: z.object({ + type: z.literal("multiple_choice"), + name: z.string(), + value: z.array(multipleChoiceOptionSchema()).readonly(), + }), dateTime: z.object({ type: z.literal("date_time"), name: z.string(), @@ -96,13 +96,12 @@ const baseElementSchemas = { name: z.string(), value: z.array(assetValueSchema).readonly(), }), - taxonomy: (codenames?: readonly TCodename[]) => - z.object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - value: z.array(taxonomyTermValueSchema(codenames)).readonly(), - }), + taxonomy: z.object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + value: z.array(taxonomyTermValueSchema()).readonly(), + }), urlSlug: z.object({ type: z.literal("url_slug"), name: z.string(), @@ -121,31 +120,24 @@ const baseElementSchemas = { } as const; /** - * Public schemas for working with standard content item elements. + * Building blocks for constructing typed content item schemas. */ -export const elementSchemas = { - text: baseElementSchemas.text.readonly(), - number: baseElementSchemas.number.readonly(), +export const elementDef = { + number: ({ isRequired }: { readonly isRequired?: boolean } = {}) => + baseElementSchemas.number.extend({ value: isRequired ? z.number() : z.number().nullable() }).readonly(), richText: baseElementSchemas.richText.readonly(), - multipleChoice: (codenames?: readonly TCodename[]) => - baseElementSchemas.multipleChoice(codenames).readonly(), dateTime: baseElementSchemas.dateTime.readonly(), asset: baseElementSchemas.asset.readonly(), - taxonomy: (codenames?: readonly TCodename[]) => baseElementSchemas.taxonomy(codenames).readonly(), urlSlug: baseElementSchemas.urlSlug.readonly(), custom: baseElementSchemas.custom.readonly(), - linkedItems: baseElementSchemas.linkedItems.readonly(), -} as const; - -/** - * Building blocks for constructing typed content item schemas. - */ -export const elementDef = { - ...elementSchemas, text: ({ maxLength, isRequired }: { readonly maxLength?: number; readonly isRequired?: boolean } = {}) => { const valueWithMinLength = isRequired ? z.string().min(1) : z.string(); return baseElementSchemas.text.extend({ value: maxLength ? valueWithMinLength.max(maxLength) : valueWithMinLength }).readonly(); }, + multipleChoice: ({ codenames }: { readonly codenames?: readonly TCodename[] } = {}) => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).readonly() }).readonly(), + taxonomy: ({ codenames }: { readonly codenames?: readonly TCodename[] } = {}) => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), linkedItems: (schemas: readonly TAllowedItemTypes[]) => baseElementSchemas.linkedItems .extend({ @@ -156,16 +148,16 @@ export const elementDef = { export const contentItemElementSchema = z .discriminatedUnion("type", [ - elementSchemas.text, - elementSchemas.number, - elementSchemas.richText, - elementSchemas.multipleChoice(), - elementSchemas.dateTime, - elementSchemas.asset, - elementSchemas.taxonomy(), - elementSchemas.urlSlug, - elementSchemas.linkedItems, - elementSchemas.custom, + baseElementSchemas.text.readonly(), + baseElementSchemas.number.readonly(), + baseElementSchemas.richText.readonly(), + baseElementSchemas.multipleChoice.readonly(), + baseElementSchemas.dateTime.readonly(), + baseElementSchemas.asset.readonly(), + baseElementSchemas.taxonomy.readonly(), + baseElementSchemas.urlSlug.readonly(), + baseElementSchemas.linkedItems.readonly(), + baseElementSchemas.custom.readonly(), ]) .readonly(); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index e847a64f..3a4870ce 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -32,7 +32,7 @@ type ActorPayload = ContentItemOf; // Covers every element type in elementDef type MovieElements = { title: ReturnType; - rating: typeof elementDef.number; + rating: ReturnType; synopsis: typeof elementDef.richText; genre: ReturnType>; release_date: typeof elementDef.dateTime; @@ -48,7 +48,7 @@ type MoviePayload = ContentItemOf; const actorSchema: z.ZodType = defineContentItem(schema, "actor", { first_name: elementDef.text(), last_name: elementDef.text(), - role: elementDef.multipleChoice(["opt1", "opt2", "opt3"]), + role: elementDef.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), get relatedActors() { return elementDef.linkedItems([actorSchema]); }, @@ -56,12 +56,12 @@ const actorSchema: z.ZodType = defineContentItem = defineContentItem(schema, "movie", { title: elementDef.text(), - rating: elementDef.number, + rating: elementDef.number(), synopsis: elementDef.richText, - genre: elementDef.multipleChoice(["genre1", "genre2"]), + genre: elementDef.multipleChoice({ codenames: ["genre1", "genre2"] }), release_date: elementDef.dateTime, poster: elementDef.asset, - categories: elementDef.taxonomy(["term1", "term2"]), + categories: elementDef.taxonomy({ codenames: ["term1", "term2"] }), url_slug: elementDef.urlSlug, custom_id: elementDef.custom, actors: elementDef.linkedItems([actorSchema]), diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 66460a19..98129d65 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -42,6 +42,20 @@ describe("defineContentItem", () => { }); }); +describe("elementDef.number", () => { + test("accepts null when isRequired is omitted", () => { + const schema = elementDef.number(); + expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(true); + expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); + }); + + test("rejects null when isRequired is true", () => { + const schema = elementDef.number({ isRequired: true }); + expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(false); + expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); + }); +}); + describe("elementDef.text", () => { test("validates value without constraint when maxLength is omitted", () => { const schema = elementDef.text(); @@ -68,6 +82,43 @@ describe("elementDef.text", () => { }); }); +describe("elementDef.multipleChoice", () => { + test("validates options without codename constraint when codenames omitted", () => { + const schema = elementDef.multipleChoice(); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); + }); + + test("rejects unknown codename when codenames provided", () => { + const schema = elementDef.multipleChoice({ codenames: ["lead", "supporting"] as const }); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( + false, + ); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); + }); +}); + +describe("elementDef.taxonomy", () => { + test("validates terms without codename constraint when codenames omitted", () => { + const schema = elementDef.taxonomy(); + expect( + schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) + .success, + ).toBe(true); + }); + + test("rejects unknown codename when codenames provided", () => { + const schema = elementDef.taxonomy({ codenames: ["action", "drama"] as const }); + expect( + schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Comedy", codename: "comedy" }] }) + .success, + ).toBe(false); + expect( + schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) + .success, + ).toBe(true); + }); +}); + describe("elementDef.linkedItems", () => { test("items are validated against the union when multiple schemas provided", () => { const actorSchema = z From c2eae2e921f1fc18200705851cbccaa3689d359c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 13:27:53 +0200 Subject: [PATCH 141/221] extends datetime & custom elems --- lib/queries/content-items/element.models.ts | 6 ++-- tests/types/delivery-client-types.test.ts | 8 +++--- tests/unit/queries/element-def.spec.ts | 32 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index df371546..86565414 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -126,10 +126,12 @@ export const elementDef = { number: ({ isRequired }: { readonly isRequired?: boolean } = {}) => baseElementSchemas.number.extend({ value: isRequired ? z.number() : z.number().nullable() }).readonly(), richText: baseElementSchemas.richText.readonly(), - dateTime: baseElementSchemas.dateTime.readonly(), + dateTime: ({ isRequired }: { readonly isRequired?: boolean } = {}) => + baseElementSchemas.dateTime.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), asset: baseElementSchemas.asset.readonly(), urlSlug: baseElementSchemas.urlSlug.readonly(), - custom: baseElementSchemas.custom.readonly(), + custom: ({ isRequired }: { readonly isRequired?: boolean } = {}) => + baseElementSchemas.custom.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), text: ({ maxLength, isRequired }: { readonly maxLength?: number; readonly isRequired?: boolean } = {}) => { const valueWithMinLength = isRequired ? z.string().min(1) : z.string(); return baseElementSchemas.text.extend({ value: maxLength ? valueWithMinLength.max(maxLength) : valueWithMinLength }).readonly(); diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 3a4870ce..9bb6335f 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -35,11 +35,11 @@ type MovieElements = { rating: ReturnType; synopsis: typeof elementDef.richText; genre: ReturnType>; - release_date: typeof elementDef.dateTime; + release_date: ReturnType; poster: typeof elementDef.asset; categories: ReturnType>; url_slug: typeof elementDef.urlSlug; - custom_id: typeof elementDef.custom; + custom_id: ReturnType; actors: ReturnType>>; }; @@ -59,11 +59,11 @@ const movieSchema: z.ZodType = defineContentItem(schema, "movie", rating: elementDef.number(), synopsis: elementDef.richText, genre: elementDef.multipleChoice({ codenames: ["genre1", "genre2"] }), - release_date: elementDef.dateTime, + release_date: elementDef.dateTime(), poster: elementDef.asset, categories: elementDef.taxonomy({ codenames: ["term1", "term2"] }), url_slug: elementDef.urlSlug, - custom_id: elementDef.custom, + custom_id: elementDef.custom(), actors: elementDef.linkedItems([actorSchema]), }); diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index 98129d65..bf358c82 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -82,6 +82,38 @@ describe("elementDef.text", () => { }); }); +describe("elementDef.dateTime", () => { + test("accepts null value when isRequired is omitted", () => { + const schema = elementDef.dateTime(); + expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(true); + expect( + schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, + ).toBe(true); + }); + + test("rejects null value when isRequired is true", () => { + const schema = elementDef.dateTime({ isRequired: true }); + expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(false); + expect( + schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, + ).toBe(true); + }); +}); + +describe("elementDef.custom", () => { + test("accepts null value when isRequired is omitted", () => { + const schema = elementDef.custom(); + expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(true); + expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); + }); + + test("rejects null value when isRequired is true", () => { + const schema = elementDef.custom({ isRequired: true }); + expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(false); + expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); + }); +}); + describe("elementDef.multipleChoice", () => { test("validates options without codename constraint when codenames omitted", () => { const schema = elementDef.multipleChoice(); From de5a5cfc9c7f4a67b953a5cab2125fbb74010abe Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 13:56:13 +0200 Subject: [PATCH 142/221] Extends element defs --- lib/queries/content-items/element.models.ts | 32 +++++-- tests/types/delivery-client-types.test.ts | 12 +-- tests/unit/queries/element-def.spec.ts | 93 +++++++++++++++++++++ 3 files changed, 124 insertions(+), 13 deletions(-) diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 86565414..9a77a160 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -125,25 +125,43 @@ const baseElementSchemas = { export const elementDef = { number: ({ isRequired }: { readonly isRequired?: boolean } = {}) => baseElementSchemas.number.extend({ value: isRequired ? z.number() : z.number().nullable() }).readonly(), - richText: baseElementSchemas.richText.readonly(), + richText: () => baseElementSchemas.richText.readonly(), dateTime: ({ isRequired }: { readonly isRequired?: boolean } = {}) => baseElementSchemas.dateTime.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), - asset: baseElementSchemas.asset.readonly(), - urlSlug: baseElementSchemas.urlSlug.readonly(), + asset: ({ isRequired }: { readonly isRequired?: boolean } = {}) => + baseElementSchemas.asset + .extend({ value: isRequired ? z.array(assetValueSchema).min(1).readonly() : z.array(assetValueSchema).readonly() }) + .readonly(), + urlSlug: ({ isRequired }: { readonly isRequired?: boolean } = {}) => + baseElementSchemas.urlSlug.extend({ value: isRequired ? z.string().min(1) : z.string() }).readonly(), custom: ({ isRequired }: { readonly isRequired?: boolean } = {}) => baseElementSchemas.custom.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), text: ({ maxLength, isRequired }: { readonly maxLength?: number; readonly isRequired?: boolean } = {}) => { const valueWithMinLength = isRequired ? z.string().min(1) : z.string(); return baseElementSchemas.text.extend({ value: maxLength ? valueWithMinLength.max(maxLength) : valueWithMinLength }).readonly(); }, - multipleChoice: ({ codenames }: { readonly codenames?: readonly TCodename[] } = {}) => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).readonly() }).readonly(), + multipleChoice: ({ + codenames, + isRequired, + }: { + readonly codenames?: readonly TCodename[]; + readonly isRequired?: boolean; + } = {}) => { + const valueSchema = z.array(multipleChoiceOptionSchema(codenames)); + return baseElementSchemas.multipleChoice + .extend({ value: isRequired ? valueSchema.min(1).readonly() : valueSchema.readonly() }) + .readonly(); + }, taxonomy: ({ codenames }: { readonly codenames?: readonly TCodename[] } = {}) => baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), - linkedItems: (schemas: readonly TAllowedItemTypes[]) => + linkedItems: ( + schemas: readonly TAllowedItemTypes[], + { isRequired }: { readonly isRequired?: boolean } = {}, + ) => baseElementSchemas.linkedItems .extend({ - items: z.array(z.union(schemas)).readonly(), + value: isRequired ? z.array(codenameSchema).min(1).readonly() : z.array(codenameSchema).readonly(), + items: isRequired ? z.array(z.union(schemas)).min(1).readonly() : z.array(z.union(schemas)).readonly(), }) .readonly(), } as const; diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 9bb6335f..3974f078 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -33,12 +33,12 @@ type ActorPayload = ContentItemOf; type MovieElements = { title: ReturnType; rating: ReturnType; - synopsis: typeof elementDef.richText; + synopsis: ReturnType; genre: ReturnType>; release_date: ReturnType; - poster: typeof elementDef.asset; + poster: ReturnType; categories: ReturnType>; - url_slug: typeof elementDef.urlSlug; + url_slug: ReturnType; custom_id: ReturnType; actors: ReturnType>>; }; @@ -57,12 +57,12 @@ const actorSchema: z.ZodType = defineContentItem = defineContentItem(schema, "movie", { title: elementDef.text(), rating: elementDef.number(), - synopsis: elementDef.richText, + synopsis: elementDef.richText(), genre: elementDef.multipleChoice({ codenames: ["genre1", "genre2"] }), release_date: elementDef.dateTime(), - poster: elementDef.asset, + poster: elementDef.asset(), categories: elementDef.taxonomy({ codenames: ["term1", "term2"] }), - url_slug: elementDef.urlSlug, + url_slug: elementDef.urlSlug(), custom_id: elementDef.custom(), actors: elementDef.linkedItems([actorSchema]), }); diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-def.spec.ts index bf358c82..1cfead6d 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-def.spec.ts @@ -100,6 +100,20 @@ describe("elementDef.dateTime", () => { }); }); +describe("elementDef.urlSlug", () => { + test("accepts empty string when isRequired is omitted", () => { + const schema = elementDef.urlSlug(); + expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(true); + expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); + }); + + test("rejects empty string when isRequired is true", () => { + const schema = elementDef.urlSlug({ isRequired: true }); + expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(false); + expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); + }); +}); + describe("elementDef.custom", () => { test("accepts null value when isRequired is omitted", () => { const schema = elementDef.custom(); @@ -114,6 +128,31 @@ describe("elementDef.custom", () => { }); }); +describe("elementDef.asset", () => { + const makeAsset = () => ({ + name: "poster.jpg", + description: null, + type: "image/jpeg", + size: 1024, + url: "https://example.com/poster.jpg", + width: 800, + height: 600, + renditions: {}, + }); + + test("accepts empty value array when isRequired is omitted", () => { + const schema = elementDef.asset(); + expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(true); + expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); + }); + + test("rejects empty value array when isRequired is true", () => { + const schema = elementDef.asset({ isRequired: true }); + expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(false); + expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); + }); +}); + describe("elementDef.multipleChoice", () => { test("validates options without codename constraint when codenames omitted", () => { const schema = elementDef.multipleChoice(); @@ -127,6 +166,17 @@ describe("elementDef.multipleChoice", () => { ); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); + + test("accepts empty value array when isRequired is omitted", () => { + const schema = elementDef.multipleChoice(); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(true); + }); + + test("rejects empty value array when isRequired is true", () => { + const schema = elementDef.multipleChoice({ isRequired: true }); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(false); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); + }); }); describe("elementDef.taxonomy", () => { @@ -191,4 +241,47 @@ describe("elementDef.linkedItems", () => { expect(validMovie.success).toBe(true); expect(invalid.success).toBe(false); }); + + test("accepts empty value and items arrays when isRequired is omitted", () => { + const actorSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "actor"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const movieSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "movie"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const schema = elementDef.linkedItems([actorSchema, movieSchema]); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); + }); + + test("rejects empty value or items arrays when isRequired is true", () => { + const actorSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "actor"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const movieSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "movie"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { isRequired: true }); + const system = makeSystem(); + + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(false); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [] }).success).toBe(false); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [{ system, elements: {} }] }).success).toBe( + false, + ); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [{ system, elements: {} }] }).success).toBe( + true, + ); + }); }); From a3345e30618f9b2e85c2b9a2e9deb940de84e86e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 14:28:31 +0200 Subject: [PATCH 143/221] extends element defs --- lib/public_api.ts | 2 +- lib/queries/content-items/element.models.ts | 33 ++++- ...ent-def.spec.ts => element-models.spec.ts} | 135 ++++++++++++++++++ 3 files changed, 163 insertions(+), 7 deletions(-) rename tests/unit/queries/{element-def.spec.ts => element-models.spec.ts} (71%) diff --git a/lib/public_api.ts b/lib/public_api.ts index 6f2634b4..a1d41bd7 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -33,7 +33,7 @@ export { type ItemsReferencingItemPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; -export { type ContentItemElementPayload, elementDef } from "./queries/content-items/element.models.js"; +export { type ContentItemElementPayload, elementDef, type LinkedItemsLimitType } from "./queries/content-items/element.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 9a77a160..e5712440 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -1,6 +1,9 @@ import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { match, P } from "ts-pattern"; import { z } from "zod"; +export type LinkedItemsLimitType = "atLeast" | "exactly" | "atMost"; + const multipleChoiceOptionSchema = (codenames?: readonly TCodename[]) => z .object({ @@ -156,14 +159,32 @@ export const elementDef = { baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), linkedItems: ( schemas: readonly TAllowedItemTypes[], - { isRequired }: { readonly isRequired?: boolean } = {}, - ) => - baseElementSchemas.linkedItems + { + isRequired, + limitType, + itemsLimit, + }: { + readonly isRequired?: boolean; + readonly limitType?: LinkedItemsLimitType; + readonly itemsLimit?: number; + } = {}, + ) => { + const applyLimits = (arr: z.ZodArray) => + match({ isRequired, limitType, itemsLimit }) + .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => arr.min(itemsLimit)) + .with({ limitType: "atMost", itemsLimit: P.number, isRequired: true }, ({ itemsLimit }) => arr.min(1).max(itemsLimit)) + .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => arr.max(itemsLimit)) + .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => arr.length(itemsLimit)) + .with({ isRequired: true }, () => arr.min(1)) + .otherwise(() => arr); + + return baseElementSchemas.linkedItems .extend({ - value: isRequired ? z.array(codenameSchema).min(1).readonly() : z.array(codenameSchema).readonly(), - items: isRequired ? z.array(z.union(schemas)).min(1).readonly() : z.array(z.union(schemas)).readonly(), + value: applyLimits(z.array(codenameSchema)).readonly(), + items: applyLimits(z.array(z.union(schemas))).readonly(), }) - .readonly(), + .readonly(); + }, } as const; export const contentItemElementSchema = z diff --git a/tests/unit/queries/element-def.spec.ts b/tests/unit/queries/element-models.spec.ts similarity index 71% rename from tests/unit/queries/element-def.spec.ts rename to tests/unit/queries/element-models.spec.ts index 1cfead6d..37a0aa3c 100644 --- a/tests/unit/queries/element-def.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -100,6 +100,61 @@ describe("elementDef.dateTime", () => { }); }); +describe("elementDef.richText", () => { + const makePayload = () => ({ + type: "rich_text", + name: "Body", + value: "

hello

", + images: { + img1: { + image_id: "img1", + description: null, + url: "https://example.com/img.jpg", + width: 100, + height: 80, + }, + }, + links: { + link1: { + codename: "linked_item", + type: "actor", + url_slug: "linked-item", + }, + }, + modular_content: ["linked_item"], + }); + + test("validates a complete rich text payload", () => { + const schema = elementDef.richText(); + expect(schema.safeParse(makePayload()).success).toBe(true); + }); + + test("accepts empty images, links and modular_content", () => { + const schema = elementDef.richText(); + expect( + schema.safeParse({ + type: "rich_text", + name: "Body", + value: "", + images: {}, + links: {}, + modular_content: [], + }).success, + ).toBe(true); + }); + + test("rejects payload with wrong discriminator type", () => { + const schema = elementDef.richText(); + expect(schema.safeParse({ ...makePayload(), type: "text" }).success).toBe(false); + }); + + test("rejects payload missing required fields", () => { + const schema = elementDef.richText(); + const { images: _images, ...withoutImages } = makePayload(); + expect(schema.safeParse(withoutImages).success).toBe(false); + }); +}); + describe("elementDef.urlSlug", () => { test("accepts empty string when isRequired is omitted", () => { const schema = elementDef.urlSlug(); @@ -284,4 +339,84 @@ describe("elementDef.linkedItems", () => { true, ); }); + + const buildLinkedItemsSchemas = () => { + const actorSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "actor"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const movieSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "movie"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const item = { system: makeSystem(), elements: {} }; + const make = (count: number) => ({ + type: "modular_content" as const, + name: "Cast", + value: Array.from({ length: count }, (_, i) => `x${i}`), + items: Array.from({ length: count }, () => item), + }); + return { actorSchema, movieSchema, make }; + }; + + test("limitType atLeast enforces minimum count on value and items", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 2 }); + + expect(schema.safeParse(make(1)).success).toBe(false); + expect(schema.safeParse(make(2)).success).toBe(true); + expect(schema.safeParse(make(3)).success).toBe(true); + }); + + test("limitType atMost enforces maximum count on value and items", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); + + expect(schema.safeParse(make(0)).success).toBe(true); + expect(schema.safeParse(make(2)).success).toBe(true); + expect(schema.safeParse(make(3)).success).toBe(false); + }); + + test("limitType exactly enforces precise count on value and items", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "exactly", itemsLimit: 2 }); + + expect(schema.safeParse(make(1)).success).toBe(false); + expect(schema.safeParse(make(2)).success).toBe(true); + expect(schema.safeParse(make(3)).success).toBe(false); + }); + + test("isRequired composes with limitType atMost", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { + isRequired: true, + limitType: "atMost", + itemsLimit: 2, + }); + + expect(schema.safeParse(make(0)).success).toBe(false); + expect(schema.safeParse(make(1)).success).toBe(true); + expect(schema.safeParse(make(2)).success).toBe(true); + expect(schema.safeParse(make(3)).success).toBe(false); + }); + + test("itemsLimit without limitType is ignored", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { itemsLimit: 2 }); + + expect(schema.safeParse(make(0)).success).toBe(true); + expect(schema.safeParse(make(5)).success).toBe(true); + }); + + test("limitType without itemsLimit is ignored", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "exactly" }); + + expect(schema.safeParse(make(0)).success).toBe(true); + expect(schema.safeParse(make(5)).success).toBe(true); + }); }); From 44602c2f06171bb5c2a8b1c298a575d00b36fa41 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 15:44:27 +0200 Subject: [PATCH 144/221] separate optional / required element defs --- lib/models/core.models.ts | 5 + lib/public_api.ts | 10 +- lib/queries/content-items/element.models.ts | 116 +++--- tests/types/delivery-client-types.test.ts | 66 ++-- tests/unit/queries/element-models.spec.ts | 395 ++++++++++---------- 5 files changed, 305 insertions(+), 287 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 572856cf..350bfd58 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -121,6 +121,11 @@ export type DeliveryEndpoint = export type WaitForLoadingNewContentHeaderName = "X-KC-Wait-For-Loading-New-Content"; +/** + * Array with at least one item. + */ +export type NonEmptyArray = [T, ...T[]]; + type PublicDeliveryClientConfig = { /** * The API mode of the delivery client. Public access is the default mode. diff --git a/lib/public_api.ts b/lib/public_api.ts index a1d41bd7..2dfe68c0 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -33,7 +33,15 @@ export { type ItemsReferencingItemPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; -export { type ContentItemElementPayload, elementDef, type LinkedItemsLimitType } from "./queries/content-items/element.models.js"; +export { + type ContentItemElementPayload, + elementDef, + type LinkedItemsLimitType, + type LinkedItemsOptions, + type MultipleChoiceOptions, + type TaxonomyOptions, + type TextOptions, +} from "./queries/content-items/element.models.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index e5712440..73c962ae 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -122,69 +122,75 @@ const baseElementSchemas = { }), } as const; -/** - * Building blocks for constructing typed content item schemas. - */ -export const elementDef = { - number: ({ isRequired }: { readonly isRequired?: boolean } = {}) => - baseElementSchemas.number.extend({ value: isRequired ? z.number() : z.number().nullable() }).readonly(), - richText: () => baseElementSchemas.richText.readonly(), - dateTime: ({ isRequired }: { readonly isRequired?: boolean } = {}) => - baseElementSchemas.dateTime.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), - asset: ({ isRequired }: { readonly isRequired?: boolean } = {}) => - baseElementSchemas.asset - .extend({ value: isRequired ? z.array(assetValueSchema).min(1).readonly() : z.array(assetValueSchema).readonly() }) - .readonly(), - urlSlug: ({ isRequired }: { readonly isRequired?: boolean } = {}) => - baseElementSchemas.urlSlug.extend({ value: isRequired ? z.string().min(1) : z.string() }).readonly(), - custom: ({ isRequired }: { readonly isRequired?: boolean } = {}) => - baseElementSchemas.custom.extend({ value: isRequired ? z.string() : z.string().nullable() }).readonly(), - text: ({ maxLength, isRequired }: { readonly maxLength?: number; readonly isRequired?: boolean } = {}) => { - const valueWithMinLength = isRequired ? z.string().min(1) : z.string(); - return baseElementSchemas.text.extend({ value: maxLength ? valueWithMinLength.max(maxLength) : valueWithMinLength }).readonly(); - }, - multipleChoice: ({ - codenames, - isRequired, - }: { - readonly codenames?: readonly TCodename[]; - readonly isRequired?: boolean; - } = {}) => { - const valueSchema = z.array(multipleChoiceOptionSchema(codenames)); - return baseElementSchemas.multipleChoice - .extend({ value: isRequired ? valueSchema.min(1).readonly() : valueSchema.readonly() }) - .readonly(); - }, - taxonomy: ({ codenames }: { readonly codenames?: readonly TCodename[] } = {}) => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), - linkedItems: ( - schemas: readonly TAllowedItemTypes[], - { - isRequired, - limitType, - itemsLimit, - }: { - readonly isRequired?: boolean; - readonly limitType?: LinkedItemsLimitType; - readonly itemsLimit?: number; - } = {}, - ) => { - const applyLimits = (arr: z.ZodArray) => - match({ isRequired, limitType, itemsLimit }) - .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => arr.min(itemsLimit)) - .with({ limitType: "atMost", itemsLimit: P.number, isRequired: true }, ({ itemsLimit }) => arr.min(1).max(itemsLimit)) - .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => arr.max(itemsLimit)) - .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => arr.length(itemsLimit)) - .with({ isRequired: true }, () => arr.min(1)) - .otherwise(() => arr); +export type TextOptions = { readonly maxLength?: number }; +export type MultipleChoiceOptions = { readonly codenames?: readonly TCodename[] }; +export type TaxonomyOptions = { readonly codenames?: readonly TCodename[] }; +export type LinkedItemsOptions = { readonly limitType?: LinkedItemsLimitType; readonly itemsLimit?: number }; +const applyLinkedItemsLimits = + (isRequired: boolean) => + ({ limitType, itemsLimit }: LinkedItemsOptions) => + (arr: z.ZodArray) => + match({ isRequired, limitType, itemsLimit }) + .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => arr.min(itemsLimit)) + .with({ limitType: "atMost", itemsLimit: P.number, isRequired: true }, ({ itemsLimit }) => arr.min(1).max(itemsLimit)) + .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => arr.max(itemsLimit)) + .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => arr.length(itemsLimit)) + .with({ isRequired: true }, () => arr.min(1)) + .otherwise(() => arr); + +const buildLinkedItems = + (isRequired: boolean) => + (schemas: readonly TAllowedItemTypes[], options: LinkedItemsOptions = {}) => { + const applyLimits = applyLinkedItemsLimits(isRequired)(options); return baseElementSchemas.linkedItems .extend({ value: applyLimits(z.array(codenameSchema)).readonly(), items: applyLimits(z.array(z.union(schemas))).readonly(), }) .readonly(); + }; + +const optionalElementDef = { + number: () => baseElementSchemas.number.extend({ value: z.number().nullable() }).readonly(), + richText: () => baseElementSchemas.richText.readonly(), + dateTime: () => baseElementSchemas.dateTime.extend({ value: z.string().nullable() }).readonly(), + asset: () => baseElementSchemas.asset.extend({ value: z.array(assetValueSchema).readonly() }).readonly(), + urlSlug: () => baseElementSchemas.urlSlug.extend({ value: z.string() }).readonly(), + custom: () => baseElementSchemas.custom.extend({ value: z.string().nullable() }).readonly(), + text: ({ maxLength }: TextOptions = {}) => + baseElementSchemas.text.extend({ value: maxLength ? z.string().max(maxLength) : z.string() }).readonly(), + multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).readonly() }).readonly(), + taxonomy: ({ codenames }: TaxonomyOptions = {}) => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), + linkedItems: buildLinkedItems(false), +} as const; + +const requiredElementDef = { + number: () => baseElementSchemas.number.extend({ value: z.number() }).readonly(), + richText: () => baseElementSchemas.richText.readonly(), + dateTime: () => baseElementSchemas.dateTime.extend({ value: z.string() }).readonly(), + asset: () => baseElementSchemas.asset.extend({ value: z.array(assetValueSchema).min(1).readonly() }).readonly(), + urlSlug: () => baseElementSchemas.urlSlug.extend({ value: z.string().min(1) }).readonly(), + custom: () => baseElementSchemas.custom.extend({ value: z.string() }).readonly(), + text: ({ maxLength }: TextOptions = {}) => { + const value = z.string().min(1); + return baseElementSchemas.text.extend({ value: maxLength ? value.max(maxLength) : value }).readonly(); }, + multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).min(1).readonly() }).readonly(), + taxonomy: ({ codenames }: TaxonomyOptions = {}) => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).min(1).readonly() }).readonly(), + linkedItems: buildLinkedItems(true), +} as const; + +/** + * Building blocks for constructing typed content item schemas. + */ +export const elementDef = { + required: requiredElementDef, + optional: optionalElementDef, } as const; export const contentItemElementSchema = z diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 3974f078..e7afd16c 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -20,51 +20,53 @@ type DeliverySchema = typeof schema; type TypedDeliveryClient = DeliveryClient; type ActorElements = { - first_name: ReturnType; - last_name: ReturnType; - role: ReturnType>; - relatedActors: ReturnType>>; + first_name: ReturnType; + last_name: ReturnType; + role: ReturnType>; + relatedActors: ReturnType>>; }; // circular reference — relatedActors items are ActorPayload itself type ActorPayload = ContentItemOf; -// Covers every element type in elementDef +// Mixes required and optional element factories to verify both branches of elementDef. +// Required factories drop nullability on scalar values (number/dateTime/custom), +// optional factories preserve it. type MovieElements = { - title: ReturnType; - rating: ReturnType; - synopsis: ReturnType; - genre: ReturnType>; - release_date: ReturnType; - poster: ReturnType; - categories: ReturnType>; - url_slug: ReturnType; - custom_id: ReturnType; - actors: ReturnType>>; + title: ReturnType; + rating: ReturnType; + synopsis: ReturnType; + genre: ReturnType>; + release_date: ReturnType; + poster: ReturnType; + categories: ReturnType>; + url_slug: ReturnType; + custom_id: ReturnType; + actors: ReturnType>>; }; type MoviePayload = ContentItemOf; const actorSchema: z.ZodType = defineContentItem(schema, "actor", { - first_name: elementDef.text(), - last_name: elementDef.text(), - role: elementDef.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), + first_name: elementDef.optional.text(), + last_name: elementDef.optional.text(), + role: elementDef.optional.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), get relatedActors() { - return elementDef.linkedItems([actorSchema]); + return elementDef.optional.linkedItems([actorSchema]); }, }); const movieSchema: z.ZodType = defineContentItem(schema, "movie", { - title: elementDef.text(), - rating: elementDef.number(), - synopsis: elementDef.richText(), - genre: elementDef.multipleChoice({ codenames: ["genre1", "genre2"] }), - release_date: elementDef.dateTime(), - poster: elementDef.asset(), - categories: elementDef.taxonomy({ codenames: ["term1", "term2"] }), - url_slug: elementDef.urlSlug(), - custom_id: elementDef.custom(), - actors: elementDef.linkedItems([actorSchema]), + title: elementDef.required.text(), + rating: elementDef.required.number(), + synopsis: elementDef.optional.richText(), + genre: elementDef.required.multipleChoice({ codenames: ["genre1", "genre2"] }), + release_date: elementDef.required.dateTime(), + poster: elementDef.optional.asset(), + categories: elementDef.optional.taxonomy({ codenames: ["term1", "term2"] }), + url_slug: elementDef.required.urlSlug(), + custom_id: elementDef.required.custom(), + actors: elementDef.required.linkedItems([actorSchema]), }); void movieSchema; @@ -104,15 +106,15 @@ void firstRelatedActor; declare const movie: MoviePayload; const title: string = movie.elements.title.value; -const rating: number | null = movie.elements.rating.value; +const rating: number = movie.elements.rating.value; const synopsis: string = movie.elements.synopsis.value; const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; -const releaseDate: string | null = movie.elements.release_date.value; +const releaseDate: string = movie.elements.release_date.value; const displayTimezone: string | null = movie.elements.release_date.display_timezone; const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; const urlSlug: string = movie.elements.url_slug.value; -const customId: string | null = movie.elements.custom_id.value; +const customId: string = movie.elements.custom_id.value; const movieActor: ActorPayload | undefined = movie.elements.actors.items[0]; void title; diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index 37a0aa3c..3f397bd9 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -31,7 +31,7 @@ const makeSystem = (): ContentItemSystemPayload => ({ describe("defineContentItem", () => { test("builds a schema that validates a matching content item", () => { const schema = defineContentItem(schemaInput, "actor", { - title: elementDef.text(), + title: elementDef.optional.text(), }); expect( schema.safeParse({ @@ -42,57 +42,64 @@ describe("defineContentItem", () => { }); }); -describe("elementDef.number", () => { - test("accepts null when isRequired is omitted", () => { - const schema = elementDef.number(); +describe("elementDef.optional.number", () => { + test("accepts null and a number", () => { + const schema = elementDef.optional.number(); expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(true); expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); }); +}); - test("rejects null when isRequired is true", () => { - const schema = elementDef.number({ isRequired: true }); +describe("elementDef.required.number", () => { + test("rejects null", () => { + const schema = elementDef.required.number(); expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(false); expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); }); }); -describe("elementDef.text", () => { - test("validates value without constraint when maxLength is omitted", () => { - const schema = elementDef.text(); +describe("elementDef.optional.text", () => { + test("accepts any string when maxLength is omitted", () => { + const schema = elementDef.optional.text(); + expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(true); expect(schema.safeParse({ type: "text", name: "Title", value: "a".repeat(1000) }).success).toBe(true); }); test("rejects value exceeding maxLength", () => { - const schema = elementDef.text({ maxLength: 5 }); + const schema = elementDef.optional.text({ maxLength: 5 }); expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); }); +}); - test("rejects empty string when isRequired is true", () => { - const schema = elementDef.text({ isRequired: true }); +describe("elementDef.required.text", () => { + test("rejects empty string", () => { + const schema = elementDef.required.text(); expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); expect(schema.safeParse({ type: "text", name: "Title", value: "x" }).success).toBe(true); }); - test("applies both isRequired and maxLength together", () => { - const schema = elementDef.text({ isRequired: true, maxLength: 5 }); + test("composes min(1) with maxLength", () => { + const schema = elementDef.required.text({ maxLength: 5 }); expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); }); }); -describe("elementDef.dateTime", () => { - test("accepts null value when isRequired is omitted", () => { - const schema = elementDef.dateTime(); +describe("elementDef.optional.dateTime", () => { + test("accepts null", () => { + const schema = elementDef.optional.dateTime(); expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(true); expect( schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, ).toBe(true); }); +}); - test("rejects null value when isRequired is true", () => { - const schema = elementDef.dateTime({ isRequired: true }); +describe("elementDef.required.dateTime", () => { + test("rejects null", () => { + const schema = elementDef.required.dateTime(); expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(false); expect( schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, @@ -100,7 +107,7 @@ describe("elementDef.dateTime", () => { }); }); -describe("elementDef.richText", () => { +describe("elementDef.optional.richText / elementDef.required.richText", () => { const makePayload = () => ({ type: "rich_text", name: "Body", @@ -124,119 +131,125 @@ describe("elementDef.richText", () => { modular_content: ["linked_item"], }); - test("validates a complete rich text payload", () => { - const schema = elementDef.richText(); - expect(schema.safeParse(makePayload()).success).toBe(true); + test("optional validates a complete rich text payload", () => { + expect(elementDef.optional.richText().safeParse(makePayload()).success).toBe(true); + }); + + test("required validates a complete rich text payload", () => { + expect(elementDef.required.richText().safeParse(makePayload()).success).toBe(true); }); test("accepts empty images, links and modular_content", () => { - const schema = elementDef.richText(); - expect( - schema.safeParse({ - type: "rich_text", - name: "Body", - value: "", - images: {}, - links: {}, - modular_content: [], - }).success, - ).toBe(true); + const empty = { type: "rich_text", name: "Body", value: "", images: {}, links: {}, modular_content: [] }; + expect(elementDef.optional.richText().safeParse(empty).success).toBe(true); + expect(elementDef.required.richText().safeParse(empty).success).toBe(true); }); test("rejects payload with wrong discriminator type", () => { - const schema = elementDef.richText(); - expect(schema.safeParse({ ...makePayload(), type: "text" }).success).toBe(false); + expect(elementDef.optional.richText().safeParse({ ...makePayload(), type: "text" }).success).toBe(false); }); test("rejects payload missing required fields", () => { - const schema = elementDef.richText(); const { images: _images, ...withoutImages } = makePayload(); - expect(schema.safeParse(withoutImages).success).toBe(false); + expect(elementDef.optional.richText().safeParse(withoutImages).success).toBe(false); }); }); -describe("elementDef.urlSlug", () => { - test("accepts empty string when isRequired is omitted", () => { - const schema = elementDef.urlSlug(); +describe("elementDef.optional.urlSlug", () => { + test("accepts empty string", () => { + const schema = elementDef.optional.urlSlug(); expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(true); expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); }); +}); - test("rejects empty string when isRequired is true", () => { - const schema = elementDef.urlSlug({ isRequired: true }); +describe("elementDef.required.urlSlug", () => { + test("rejects empty string", () => { + const schema = elementDef.required.urlSlug(); expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(false); expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); }); }); -describe("elementDef.custom", () => { - test("accepts null value when isRequired is omitted", () => { - const schema = elementDef.custom(); +describe("elementDef.optional.custom", () => { + test("accepts null", () => { + const schema = elementDef.optional.custom(); expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(true); expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); }); +}); - test("rejects null value when isRequired is true", () => { - const schema = elementDef.custom({ isRequired: true }); +describe("elementDef.required.custom", () => { + test("rejects null", () => { + const schema = elementDef.required.custom(); expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(false); expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); }); }); -describe("elementDef.asset", () => { - const makeAsset = () => ({ - name: "poster.jpg", - description: null, - type: "image/jpeg", - size: 1024, - url: "https://example.com/poster.jpg", - width: 800, - height: 600, - renditions: {}, - }); +const makeAsset = () => ({ + name: "poster.jpg", + description: null, + type: "image/jpeg", + size: 1024, + url: "https://example.com/poster.jpg", + width: 800, + height: 600, + renditions: {}, +}); - test("accepts empty value array when isRequired is omitted", () => { - const schema = elementDef.asset(); +describe("elementDef.optional.asset", () => { + test("accepts empty value array", () => { + const schema = elementDef.optional.asset(); expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(true); expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); }); +}); - test("rejects empty value array when isRequired is true", () => { - const schema = elementDef.asset({ isRequired: true }); +describe("elementDef.required.asset", () => { + test("rejects empty value array", () => { + const schema = elementDef.required.asset(); expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(false); expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); }); }); -describe("elementDef.multipleChoice", () => { - test("validates options without codename constraint when codenames omitted", () => { - const schema = elementDef.multipleChoice(); +describe("elementDef.optional.multipleChoice", () => { + test("accepts empty value array and validates option codename when codenames omitted", () => { + const schema = elementDef.optional.multipleChoice(); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(true); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); test("rejects unknown codename when codenames provided", () => { - const schema = elementDef.multipleChoice({ codenames: ["lead", "supporting"] as const }); + const schema = elementDef.optional.multipleChoice({ codenames: ["lead", "supporting"] as const }); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( false, ); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); +}); - test("accepts empty value array when isRequired is omitted", () => { - const schema = elementDef.multipleChoice(); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(true); +describe("elementDef.required.multipleChoice", () => { + test("rejects empty value array", () => { + const schema = elementDef.required.multipleChoice(); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(false); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); - test("rejects empty value array when isRequired is true", () => { - const schema = elementDef.multipleChoice({ isRequired: true }); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(false); + test("still enforces codename constraint", () => { + const schema = elementDef.required.multipleChoice({ codenames: ["lead", "supporting"] as const }); + expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( + false, + ); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); }); -describe("elementDef.taxonomy", () => { - test("validates terms without codename constraint when codenames omitted", () => { - const schema = elementDef.taxonomy(); +describe("elementDef.optional.taxonomy", () => { + test("accepts empty value array and validates terms when codenames omitted", () => { + const schema = elementDef.optional.taxonomy(); + expect(schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [] }).success).toBe(true); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) .success, @@ -244,7 +257,7 @@ describe("elementDef.taxonomy", () => { }); test("rejects unknown codename when codenames provided", () => { - const schema = elementDef.taxonomy({ codenames: ["action", "drama"] as const }); + const schema = elementDef.optional.taxonomy({ codenames: ["action", "drama"] as const }); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Comedy", codename: "comedy" }] }) .success, @@ -256,157 +269,108 @@ describe("elementDef.taxonomy", () => { }); }); -describe("elementDef.linkedItems", () => { - test("items are validated against the union when multiple schemas provided", () => { - const actorSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "actor"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const movieSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "movie"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const schema = elementDef.linkedItems([actorSchema, movieSchema]); - const system = makeSystem(); - - const validActor = schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ system, elements: {} }], - }); - const validMovie = schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ system: { ...system, type: "movie", codename: "movie" }, elements: {} }], - }); - const invalid = schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ noSystemOrElements: true }], - }); - - expect(validActor.success).toBe(true); - expect(validMovie.success).toBe(true); - expect(invalid.success).toBe(false); - }); - - test("accepts empty value and items arrays when isRequired is omitted", () => { - const actorSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "actor"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const movieSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "movie"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const schema = elementDef.linkedItems([actorSchema, movieSchema]); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); +describe("elementDef.required.taxonomy", () => { + test("rejects empty value array", () => { + const schema = elementDef.required.taxonomy(); + expect(schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [] }).success).toBe(false); + expect( + schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) + .success, + ).toBe(true); }); +}); - test("rejects empty value or items arrays when isRequired is true", () => { - const actorSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "actor"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const movieSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "movie"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { isRequired: true }); +const buildLinkedItemsSchemas = () => { + const actorSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "actor"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const movieSchema = z + .object({ + system: contentItemSystemWithCodename(schemaInput, "movie"), + elements: z.record(z.string(), z.unknown()), + }) + .readonly(); + const item = { system: makeSystem(), elements: {} }; + const make = (count: number) => ({ + type: "modular_content" as const, + name: "Cast", + value: Array.from({ length: count }, (_, i) => `x${i}`), + items: Array.from({ length: count }, () => item), + }); + return { actorSchema, movieSchema, make }; +}; + +describe("elementDef.optional.linkedItems", () => { + test("items are validated against the union when multiple schemas provided", () => { + const { actorSchema, movieSchema } = buildLinkedItemsSchemas(); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema]); const system = makeSystem(); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(false); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [] }).success).toBe(false); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [{ system, elements: {} }] }).success).toBe( - false, - ); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [{ system, elements: {} }] }).success).toBe( - true, - ); + expect( + schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ system, elements: {} }], + }).success, + ).toBe(true); + expect( + schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ system: { ...system, type: "movie", codename: "movie" }, elements: {} }], + }).success, + ).toBe(true); + expect( + schema.safeParse({ + type: "modular_content", + name: "Cast", + value: [], + items: [{ noSystemOrElements: true }], + }).success, + ).toBe(false); }); - const buildLinkedItemsSchemas = () => { - const actorSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "actor"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const movieSchema = z - .object({ - system: contentItemSystemWithCodename(schemaInput, "movie"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const item = { system: makeSystem(), elements: {} }; - const make = (count: number) => ({ - type: "modular_content" as const, - name: "Cast", - value: Array.from({ length: count }, (_, i) => `x${i}`), - items: Array.from({ length: count }, () => item), - }); - return { actorSchema, movieSchema, make }; - }; + test("accepts empty value and items arrays", () => { + const { actorSchema, movieSchema } = buildLinkedItemsSchemas(); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema]); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); + }); - test("limitType atLeast enforces minimum count on value and items", () => { + test("limitType atLeast enforces minimum count", () => { const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 2 }); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 2 }); expect(schema.safeParse(make(1)).success).toBe(false); expect(schema.safeParse(make(2)).success).toBe(true); expect(schema.safeParse(make(3)).success).toBe(true); }); - test("limitType atMost enforces maximum count on value and items", () => { + test("limitType atMost enforces maximum count", () => { const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); expect(schema.safeParse(make(0)).success).toBe(true); expect(schema.safeParse(make(2)).success).toBe(true); expect(schema.safeParse(make(3)).success).toBe(false); }); - test("limitType exactly enforces precise count on value and items", () => { + test("limitType exactly enforces precise count", () => { const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "exactly", itemsLimit: 2 }); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "exactly", itemsLimit: 2 }); expect(schema.safeParse(make(1)).success).toBe(false); expect(schema.safeParse(make(2)).success).toBe(true); expect(schema.safeParse(make(3)).success).toBe(false); }); - test("isRequired composes with limitType atMost", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { - isRequired: true, - limitType: "atMost", - itemsLimit: 2, - }); - - expect(schema.safeParse(make(0)).success).toBe(false); - expect(schema.safeParse(make(1)).success).toBe(true); - expect(schema.safeParse(make(2)).success).toBe(true); - expect(schema.safeParse(make(3)).success).toBe(false); - }); - test("itemsLimit without limitType is ignored", () => { const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { itemsLimit: 2 }); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { itemsLimit: 2 }); expect(schema.safeParse(make(0)).success).toBe(true); expect(schema.safeParse(make(5)).success).toBe(true); @@ -414,9 +378,42 @@ describe("elementDef.linkedItems", () => { test("limitType without itemsLimit is ignored", () => { const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.linkedItems([actorSchema, movieSchema], { limitType: "exactly" }); + const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "exactly" }); expect(schema.safeParse(make(0)).success).toBe(true); expect(schema.safeParse(make(5)).success).toBe(true); }); }); + +describe("elementDef.required.linkedItems", () => { + test("rejects empty value or items arrays", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.required.linkedItems([actorSchema, movieSchema]); + const system = makeSystem(); + + expect(schema.safeParse(make(0)).success).toBe(false); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [] }).success).toBe(false); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [{ system, elements: {} }] }).success).toBe( + false, + ); + expect(schema.safeParse(make(1)).success).toBe(true); + }); + + test("composes implicit min(1) with limitType atMost", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.required.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); + + expect(schema.safeParse(make(0)).success).toBe(false); + expect(schema.safeParse(make(1)).success).toBe(true); + expect(schema.safeParse(make(2)).success).toBe(true); + expect(schema.safeParse(make(3)).success).toBe(false); + }); + + test("limitType atLeast already implies min(N)", () => { + const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); + const schema = elementDef.required.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 3 }); + + expect(schema.safeParse(make(2)).success).toBe(false); + expect(schema.safeParse(make(3)).success).toBe(true); + }); +}); From daefc8fe6f2889cff20e413c1cf9cf13529939e8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 6 May 2026 17:04:37 +0200 Subject: [PATCH 145/221] Use non empty array type --- lib/models/core.models.ts | 4 +- lib/queries/content-items/element.models.ts | 76 +++++++++++++++------ tests/types/delivery-client-types.test.ts | 16 ++--- 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 350bfd58..95ff0505 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -122,9 +122,9 @@ export type DeliveryEndpoint = export type WaitForLoadingNewContentHeaderName = "X-KC-Wait-For-Loading-New-Content"; /** - * Array with at least one item. + * Readonly array with at least one item. */ -export type NonEmptyArray = [T, ...T[]]; +export type NonEmptyArray = readonly [T, ...T[]]; type PublicDeliveryClientConfig = { /** diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 73c962ae..b44ebac8 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -127,30 +127,58 @@ export type MultipleChoiceOptions = { readonl export type TaxonomyOptions = { readonly codenames?: readonly TCodename[] }; export type LinkedItemsOptions = { readonly limitType?: LinkedItemsLimitType; readonly itemsLimit?: number }; -const applyLinkedItemsLimits = - (isRequired: boolean) => +const applyOptionalLinkedItemsLimits = ({ limitType, itemsLimit }: LinkedItemsOptions) => (arr: z.ZodArray) => - match({ isRequired, limitType, itemsLimit }) + match({ limitType, itemsLimit }) .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => arr.min(itemsLimit)) - .with({ limitType: "atMost", itemsLimit: P.number, isRequired: true }, ({ itemsLimit }) => arr.min(1).max(itemsLimit)) .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => arr.max(itemsLimit)) .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => arr.length(itemsLimit)) - .with({ isRequired: true }, () => arr.min(1)) .otherwise(() => arr); -const buildLinkedItems = - (isRequired: boolean) => - (schemas: readonly TAllowedItemTypes[], options: LinkedItemsOptions = {}) => { - const applyLimits = applyLinkedItemsLimits(isRequired)(options); - return baseElementSchemas.linkedItems - .extend({ - value: applyLimits(z.array(codenameSchema)).readonly(), - items: applyLimits(z.array(z.union(schemas))).readonly(), - }) - .readonly(); +const applyRequiredLinkedItemsLimits = + ({ limitType, itemsLimit }: LinkedItemsOptions) => + (item: T) => { + const tuple = z.tuple([item]).rest(item); + return match({ limitType, itemsLimit }) + .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => + tuple.refine((v): boolean => v.length >= itemsLimit, { error: `Array must contain at least ${itemsLimit} item(s).` }), + ) + .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => + tuple.refine((v): boolean => v.length <= itemsLimit, { error: `Array must contain at most ${itemsLimit} item(s).` }), + ) + .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => + tuple.refine((v): boolean => v.length === itemsLimit, { error: `Array must contain exactly ${itemsLimit} item(s).` }), + ) + .otherwise(() => tuple); }; +const buildOptionalLinkedItems = ( + schemas: readonly TAllowedItemTypes[], + options: LinkedItemsOptions = {}, +) => { + const applyLimits = applyOptionalLinkedItemsLimits(options); + return baseElementSchemas.linkedItems + .extend({ + value: applyLimits(z.array(codenameSchema)).readonly(), + items: applyLimits(z.array(z.union(schemas))).readonly(), + }) + .readonly(); +}; + +const buildRequiredLinkedItems = ( + schemas: readonly TAllowedItemTypes[], + options: LinkedItemsOptions = {}, +) => { + const applyLimits = applyRequiredLinkedItemsLimits(options); + return baseElementSchemas.linkedItems + .extend({ + value: applyLimits(codenameSchema).readonly(), + items: applyLimits(z.union(schemas)).readonly(), + }) + .readonly(); +}; + const optionalElementDef = { number: () => baseElementSchemas.number.extend({ value: z.number().nullable() }).readonly(), richText: () => baseElementSchemas.richText.readonly(), @@ -164,25 +192,29 @@ const optionalElementDef = { baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).readonly() }).readonly(), taxonomy: ({ codenames }: TaxonomyOptions = {}) => baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), - linkedItems: buildLinkedItems(false), + linkedItems: buildOptionalLinkedItems, } as const; const requiredElementDef = { number: () => baseElementSchemas.number.extend({ value: z.number() }).readonly(), richText: () => baseElementSchemas.richText.readonly(), dateTime: () => baseElementSchemas.dateTime.extend({ value: z.string() }).readonly(), - asset: () => baseElementSchemas.asset.extend({ value: z.array(assetValueSchema).min(1).readonly() }).readonly(), + asset: () => baseElementSchemas.asset.extend({ value: z.tuple([assetValueSchema]).rest(assetValueSchema).readonly() }).readonly(), urlSlug: () => baseElementSchemas.urlSlug.extend({ value: z.string().min(1) }).readonly(), custom: () => baseElementSchemas.custom.extend({ value: z.string() }).readonly(), text: ({ maxLength }: TextOptions = {}) => { const value = z.string().min(1); return baseElementSchemas.text.extend({ value: maxLength ? value.max(maxLength) : value }).readonly(); }, - multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).min(1).readonly() }).readonly(), - taxonomy: ({ codenames }: TaxonomyOptions = {}) => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).min(1).readonly() }).readonly(), - linkedItems: buildLinkedItems(true), + multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => { + const item = multipleChoiceOptionSchema(codenames); + return baseElementSchemas.multipleChoice.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); + }, + taxonomy: ({ codenames }: TaxonomyOptions = {}) => { + const item = taxonomyTermValueSchema(codenames); + return baseElementSchemas.taxonomy.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); + }, + linkedItems: buildRequiredLinkedItems, } as const; /** diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index e7afd16c..15cb7e41 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -38,8 +38,8 @@ type MovieElements = { synopsis: ReturnType; genre: ReturnType>; release_date: ReturnType; - poster: ReturnType; - categories: ReturnType>; + poster: ReturnType; + categories: ReturnType>; url_slug: ReturnType; custom_id: ReturnType; actors: ReturnType>>; @@ -62,8 +62,8 @@ const movieSchema: z.ZodType = defineContentItem(schema, "movie", synopsis: elementDef.optional.richText(), genre: elementDef.required.multipleChoice({ codenames: ["genre1", "genre2"] }), release_date: elementDef.required.dateTime(), - poster: elementDef.optional.asset(), - categories: elementDef.optional.taxonomy({ codenames: ["term1", "term2"] }), + poster: elementDef.required.asset(), + categories: elementDef.required.taxonomy({ codenames: ["term1", "term2"] }), url_slug: elementDef.required.urlSlug(), custom_id: elementDef.required.custom(), actors: elementDef.required.linkedItems([actorSchema]), @@ -108,14 +108,14 @@ declare const movie: MoviePayload; const title: string = movie.elements.title.value; const rating: number = movie.elements.rating.value; const synopsis: string = movie.elements.synopsis.value; -const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; +const genreCodename: "genre1" | "genre2" = movie.elements.genre.value[0].codename; const releaseDate: string = movie.elements.release_date.value; const displayTimezone: string | null = movie.elements.release_date.display_timezone; -const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; -const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; +const posterUrl: string = movie.elements.poster.value[0].url; +const categoryCodename: "term1" | "term2" = movie.elements.categories.value[0].codename; const urlSlug: string = movie.elements.url_slug.value; const customId: string = movie.elements.custom_id.value; -const movieActor: ActorPayload | undefined = movie.elements.actors.items[0]; +const movieActor: ActorPayload = movie.elements.actors.items[0]; void title; void rating; From ff25e9451c5f939858142929c6aa0d8f34ab07b2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 7 May 2026 13:50:17 +0200 Subject: [PATCH 146/221] Updates to new codename --- .../content-items/content-item.models.ts | 16 ++-- lib/queries/content-items/element.models.ts | 36 ++++----- .../content-types/content-type.models.ts | 12 +-- lib/queries/languages/language.models.ts | 10 +-- lib/queries/languages/list-languages-query.ts | 2 +- lib/queries/taxonomies/taxonomy.models.ts | 4 +- package.json | 4 +- pnpm-lock.yaml | 76 +++++++++---------- tests/unit/queries/element-models.spec.ts | 12 +-- .../validation/response-validation.spec.ts | 7 +- 10 files changed, 89 insertions(+), 90 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 4f63acc8..742cc210 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -1,20 +1,20 @@ -import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; import { contentItemElementSchema } from "./element.models.js"; -const baseContentItemSystemSchema = (schema: TSchema | undefined) => +const baseContentItemSystemSchema = (_schema: TSchema | undefined) => z.object({ id: kontentUuidSchema, name: z.string(), - codename: codenameSchema, - language: codenameOf(schema?.languageCodenames), - type: codenameOf(schema?.contentTypeCodenames), - collection: codenameOf(schema?.collectionCodenames), + codename: codenameOf(), + language: codenameOf(), + type: codenameOf(), + collection: codenameOf(), last_modified: z.iso.datetime(), - workflow: codenameOf(schema?.workflowCodenames), - workflow_step: codenameOf(schema?.workflowStepCodenames), + workflow: codenameOf(), + workflow_step: codenameOf(), }); export const contentItemSystemWithCodename = < diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index b44ebac8..3a0d0f39 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -1,22 +1,22 @@ -import { codenameOf, codenameSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { match, P } from "ts-pattern"; import { z } from "zod"; export type LinkedItemsLimitType = "atLeast" | "exactly" | "atMost"; -const multipleChoiceOptionSchema = (codenames?: readonly TCodename[]) => +const multipleChoiceOptionSchema = () => z .object({ name: z.string(), - codename: codenameOf(codenames), + codename: codenameOf(), }) .readonly(); -const taxonomyTermValueSchema = (codenames?: readonly TCodename[]) => +const taxonomyTermValueSchema = () => z .object({ name: z.string(), - codename: codenameOf(codenames), + codename: codenameOf(), }) .readonly(); @@ -55,7 +55,7 @@ const richTextImageSchema = z const richTextLinkSchema = z .object({ - codename: codenameSchema, + codename: codenameOf(), type: z.string(), url_slug: z.string(), }) @@ -81,7 +81,7 @@ const baseElementSchemas = { value: z.string(), images: z.record(z.string(), richTextImageSchema), links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(codenameSchema).readonly(), + modular_content: z.array(codenameOf()).readonly(), }), multipleChoice: z.object({ type: z.literal("multiple_choice"), @@ -118,7 +118,7 @@ const baseElementSchemas = { linkedItems: z.object({ type: z.literal("modular_content"), name: z.string(), - value: z.array(codenameSchema).readonly(), + value: z.array(codenameOf()).readonly(), }), } as const; @@ -160,7 +160,7 @@ const buildOptionalLinkedItems = baseElementSchemas.custom.extend({ value: z.string().nullable() }).readonly(), text: ({ maxLength }: TextOptions = {}) => baseElementSchemas.text.extend({ value: maxLength ? z.string().max(maxLength) : z.string() }).readonly(), - multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema(codenames)).readonly() }).readonly(), - taxonomy: ({ codenames }: TaxonomyOptions = {}) => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema(codenames)).readonly() }).readonly(), + multipleChoice: (_options: MultipleChoiceOptions = {}) => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), + taxonomy: (_options: TaxonomyOptions = {}) => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), linkedItems: buildOptionalLinkedItems, } as const; @@ -206,12 +206,12 @@ const requiredElementDef = { const value = z.string().min(1); return baseElementSchemas.text.extend({ value: maxLength ? value.max(maxLength) : value }).readonly(); }, - multipleChoice: ({ codenames }: MultipleChoiceOptions = {}) => { - const item = multipleChoiceOptionSchema(codenames); + multipleChoice: (_options: MultipleChoiceOptions = {}) => { + const item = multipleChoiceOptionSchema(); return baseElementSchemas.multipleChoice.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); }, - taxonomy: ({ codenames }: TaxonomyOptions = {}) => { - const item = taxonomyTermValueSchema(codenames); + taxonomy: (_options: TaxonomyOptions = {}) => { + const item = taxonomyTermValueSchema(); return baseElementSchemas.taxonomy.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); }, linkedItems: buildRequiredLinkedItems, diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index ecedb838..a534348d 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,4 +1,4 @@ -import { codenameOf, codenameSchema, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; @@ -6,7 +6,7 @@ import { paginationSchema } from "../../models/pagination.models.js"; const contentTypeElementOptionSchema = z .object({ name: z.string(), - codename: codenameSchema, + codename: codenameOf(), }) .readonly(); @@ -86,18 +86,18 @@ const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ .readonly(), ]); -export const contentTypeSchema = (schema: TSchema | undefined) => +export const contentTypeSchema = (_schema: TSchema | undefined) => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: codenameOf(schema?.contentTypeCodenames), + codename: codenameOf(), last_modified: z.iso.datetime(), }) .readonly(), - elements: z.record(codenameOf(schema?.elementCodenames), contentTypeAnyElementSchema), + elements: z.record(codenameOf(), contentTypeAnyElementSchema), }) .readonly(); @@ -116,7 +116,7 @@ export const contentTypeElementSchema = () => z .object({ // Required only for the endpoint `types/{type}/elements/{element}` - codename: codenameSchema, + codename: codenameOf(), }) .readonly(), ) diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index 6f77f7a3..b6de754b 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,25 +1,25 @@ -import { codenameOfWithStringFallback, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; -export const languageSchema = (schema: TSchema | undefined) => +export const languageSchema = () => z .object({ system: z .object({ id: kontentUuidSchema, name: z.string(), - codename: codenameOfWithStringFallback(schema?.languageCodenames), + codename: codenameOf(), }) .readonly(), }) .readonly(); -export const listLanguagesSchema = (schema: TSchema | undefined) => +export const listLanguagesSchema = () => z .object({ - languages: z.array(languageSchema(schema)).readonly(), + languages: z.array(languageSchema()).readonly(), ...paginationSchema.shape, }) .readonly(); diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index 4e494626..e2983b1d 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -24,7 +24,7 @@ export function listLanguagesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listLanguagesSchema(config.schema), + schema: listLanguagesSchema(), endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index d2f31c7b..1737b2ad 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -6,7 +6,7 @@ import { paginationSchema } from "../../models/pagination.models.js"; const taxonomyTermSchema = (schema: TSchema | undefined) => z.object({ name: z.string(), - codename: codenameOf(schema?.taxonomyCodenames), + codename: codenameOf(), get terms() { return z.array(taxonomyTermSchema(schema)).readonly(); }, @@ -19,7 +19,7 @@ export const taxonomySchema = (schema: TSc .object({ id: kontentUuidSchema, name: z.string(), - codename: codenameOf(schema?.taxonomyCodenames), + codename: codenameOf(), last_modified: z.iso.datetime(), }) .readonly(), diff --git a/package.json b/package.json index 301fa3dc..38fac56d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.34", + "@kontent-ai/core-sdk": "^12.0.0-preview.35", "ts-pattern": "^5", "zod": "^4" }, @@ -55,6 +55,6 @@ "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260503.1" + "@typescript/native-preview": "7.0.0-dev.20260507.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9038f61..2ff1aa31 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.34 - version: 12.0.0-preview.34(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.35 + version: 12.0.0-preview.35(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -31,8 +31,8 @@ importers: specifier: 25.6.0 version: 25.6.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260503.1 - version: 7.0.0-dev.20260503.1 + specifier: 7.0.0-dev.20260507.1 + version: 7.0.0-dev.20260507.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.34': - resolution: {integrity: sha512-kvBJYeVzGAcNls3Ieo2uvWnpFfgyMNR3NUfcMyElFGgp2eU6KTaIc1jTC8w7fyPfWR0dHR7E75d0p2ev5vL2Vw==} + '@kontent-ai/core-sdk@12.0.0-preview.35': + resolution: {integrity: sha512-1VV3RfjzFCq0Ervuj4XzBmEJBro9n3JB+ZHmNsEHVbmhh1RtxtxHqHVHRWj4wpwl3X5YiKiuC7c1rMUd30BQYw==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -584,50 +584,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-rUZQVuBcZlxADagx+pnhDHqjX2Ewh+KWave6vtilRWR5vsGyR3FaCzPFqXteiwPg6XRijEMnMaXg60t5itm8EA==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-2iWAWthp9tWDkgIOITi6GGQkEDQ8Mf+L28B83FR+MvvbLEtHJ5BIZoBOSBgKP5KW+eHlAv1LFUC9dggq1+NO0Q==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-YtK8ac8RCkRh7jwoP8Wt4LaBhpGK8cOVMi3e0cvF/8Xn5XV1ewJK3/HdNBnlDhCib3j0eVRxK/Pg9GIq/hFUxQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-pXBJx0gF4D9aNZsFavprlbPzL5clAvHsueaVpb3c7M8wv/3FFCdjK7NJUESxpK3+M1RW5MvNaKR6QTzkdunfvQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-c5yM3Ea2WZSLKmscMxUhEDdaR2Ugp7P9CX6osciIPgZIF9c4LDiuKQohjQAyidx9JZKCsSXnfS88QssWH/+ONQ==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-0F2o8sbpSOHR04ghnhWPFsyuH9uew78v3fc2+tplxAnwZ5Wt72hk6Ka0yG07m8D6Ca0SK/GtTVIq7BfjmNCP8w==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-28vAomYeU8hpz1f0dDoWz6PYehz0ffEfkJhFq4tqXzUM/QY1I15u5y03EJQ5UcP4LRwrdJe22J5LdrYpM2Lr3w==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-i2K4RRVjk9wSMpGcR5G2hKyUowSZMrnSKh5NYx1nVy6srBD7DVrTSBDH+KCVdAVAuZtsl0tOdVJixkRRjOsbpw==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-M64z7LwpqNfOXYCBKmD/ObwyxYOobUk4tDv0ECNLit7pDER1sswNZjJGjgRYjQsKokmydy6p3FqtJ1uUPUP/sw==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-dST5xeuhREr73obBJj4j5Dtf0dEQr6WuUyHIoLaVQCX9PZhWk0Iu2/9jJ0+Gtx7fh3jWGcidNPP1SgmSrXP6Sw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-QHy3R1VBb8MYszjpz0IyuDjKaW6JUHg8hYEqzhZIxvrydKLF3gyDeKohnmWSFTS/oII0GvUmYM3h83fbanBvcQ==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-21rGqCoY2FgnbY2YQFGoAnaHFs5kagwdCmGdn7GmsdNF7P3zvS1ag56BFRYITZ2xw02xYa0fvbXcIIycysBS1A==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-nrapqpVONrg0IZjKp3AzV9M+jxPwKGTQZEOxuKh6WHMhy/UElN8RnOFlfetA8ZMtKvPkmjgjqw0qoAa5QMwhPA==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-PORjTM6k/7ySuN7qbKKLKPJ5AlSQuZbaDkLsdQglapQySeHcrdjOhFl172U+V954sR+KhrE3ckhuinEH+Vjkug==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260503.1': - resolution: {integrity: sha512-gDro38CPFiBUGbaFGNt+ufOsEd1OrZrfrOPxsLSfBcvvoGaqAxV++ul/BHTOShoEkIYHiFsoDX2az1IPCDV2jQ==} + '@typescript/native-preview@7.0.0-dev.20260507.1': + resolution: {integrity: sha512-1NCr79LEzPErrYtminofTji5EvFDYwJ2JDQfDhcQyP8XVJF93LZ5jiDXcYE2MgqDvwPUpaHMY8seC28jHrc/ew==} engines: {node: '>=16.20.0'} hasBin: true @@ -2019,7 +2019,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.14 - '@kontent-ai/core-sdk@12.0.0-preview.34(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.35(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2210,36 +2210,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260503.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260503.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260503.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260503.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260503.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260503.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260503.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260507.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260503.1': + '@typescript/native-preview@7.0.0-dev.20260507.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260503.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260503.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260503.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260503.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260503.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260503.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260503.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260507.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260507.1 '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index 3f397bd9..88640b92 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -221,10 +221,10 @@ describe("elementDef.optional.multipleChoice", () => { expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); - test("rejects unknown codename when codenames provided", () => { + test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { const schema = elementDef.optional.multipleChoice({ codenames: ["lead", "supporting"] as const }); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( - false, + true, ); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); @@ -237,10 +237,10 @@ describe("elementDef.required.multipleChoice", () => { expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); - test("still enforces codename constraint", () => { + test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { const schema = elementDef.required.multipleChoice({ codenames: ["lead", "supporting"] as const }); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( - false, + true, ); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); @@ -256,12 +256,12 @@ describe("elementDef.optional.taxonomy", () => { ).toBe(true); }); - test("rejects unknown codename when codenames provided", () => { + test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { const schema = elementDef.optional.taxonomy({ codenames: ["action", "drama"] as const }); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Comedy", codename: "comedy" }] }) .success, - ).toBe(false); + ).toBe(true); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) .success, diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index dd70a57d..c644befc 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -48,7 +48,7 @@ describe("Response validation", () => { }, }; - test("fails when the response contains a codename outside the defined schema", async () => { + test("succeeds when the response contains a codename outside the defined schema (type-only narrowing)", async () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -72,9 +72,8 @@ describe("Response validation", () => { const { success, error } = await client.listLanguages().fetchPageSafe(); - expect(error).toBeDefined(); - expect(success).toBeFalsy(); - expect(error?.details.reason).toBe("parsingFailed"); + expect(error).toBeUndefined(); + expect(success).toBeTruthy(); }); test("succeeds when the response contains only codenames within the defined schema", async () => { From 45288c7d4c0bf2c63cc64b3c50316106259df91f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 7 May 2026 14:06:04 +0200 Subject: [PATCH 147/221] Removes schema input --- lib/client/delivery-client.ts | 17 +++---- lib/models/core.models.ts | 17 ++----- .../content-items/content-item.models.ts | 42 ++++++++--------- .../content-items/fetch-content-item-query.ts | 2 +- lib/queries/content-items/items-feed-query.ts | 2 +- .../items-referencing-asset-query.ts | 2 +- .../content-items/items-referencing-item.ts | 2 +- .../content-items/list-content-items-query.ts | 2 +- .../content-types/content-type.models.ts | 6 +-- .../content-types/fetch-content-type-query.ts | 2 +- .../content-types/list-content-types-query.ts | 2 +- .../taxonomies/fetch-taxonomy-query.ts | 2 +- .../taxonomies/list-taxonomies-query.ts | 2 +- lib/queries/taxonomies/taxonomy.models.ts | 12 ++--- migration.md | 15 ++---- tests/types/delivery-client-types.test.ts | 7 ++- tests/unit/errors/custom-errors.spec.ts | 9 ---- tests/unit/queries/element-models.spec.ts | 6 +-- .../validation/response-validation.spec.ts | 46 +++++-------------- tests/utils/integration-test.utils.ts | 27 ----------- 20 files changed, 74 insertions(+), 148 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 3e4c737a..9a8fb667 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -18,25 +18,26 @@ import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/t import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; /** - * Creates a delivery client. When you provide a schema, codenames are inferred for type safety. - * When schema is omitted or undefined, codenames are generic strings. + * Creates a delivery client. When you supply a `TSchema` type argument, codenames are narrowed for type safety. + * Without a type argument, codenames fall back to generic strings. * - * We highly recommend generating the schema using the `@kontent-ai/model-generator` npm package. - * and passing it here for full compile-time safety. + * We highly recommend generating the schema type using the `@kontent-ai/model-generator` npm package + * and passing it as the type argument for full compile-time safety. * - * By enabling the response validation, you can also achieve a run-time type safety. + * By enabling the response validation, you can also achieve run-time type safety. * * @example * With schema – narrow codename types * - * const client = createDeliveryClient({ + * type MySchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-us", "es-es"]; ... }>; + * + * const client = createDeliveryClient({ * apiMode: "public", * environmentId: "x", - * schema: { languageCodenames: ["en-us", "es-es"] }, * }); * * @example - * Without schema – schema optional, codenames are string + * Without schema – codenames are string * * const client = createDeliveryClient({ * apiMode: "public", diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 95ff0505..f0edd475 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -57,25 +57,18 @@ export type UrlPagingDeliveryExtraResponseProps = { export type ApiMode = "public" | "preview" | "secure"; +declare const schemaPhantom: unique symbol; + export type DeliveryClientConfig = SdkConfig< DeliveryApiConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. */ readonly environmentId: string; - - /** - * Schema for the delivery client. - * - * If you provide schema, you can get stronger type safety by enabling the response validation. - * - * Generate using the `@kontent-ai/model-generator` npm package. - * - * @see https://github.com/kontent-ai/model-generator-js - */ - readonly schema?: TSchema | undefined; } ->; +> & { + readonly [schemaPhantom]?: TSchema; +}; export type DeliveryApiConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 742cc210..c43742da 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -4,7 +4,7 @@ import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; import { contentItemElementSchema } from "./element.models.js"; -const baseContentItemSystemSchema = (_schema: TSchema | undefined) => +const baseContentItemSystemSchema = () => z.object({ id: kontentUuidSchema, name: z.string(), @@ -21,81 +21,80 @@ export const contentItemSystemWithCodename = < TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], >( - schema: TSchema | undefined, type: TTypeCodename, ) => z .object({ - ...baseContentItemSystemSchema(schema).shape, + ...baseContentItemSystemSchema().shape, sitemap_locations: z.array(z.string()).readonly(), type: z.literal(type), }) .readonly(); -export const contentItemSystemSchema = (schema: TSchema | undefined) => +export const contentItemSystemSchema = () => z .object({ - ...baseContentItemSystemSchema(schema).shape, + ...baseContentItemSystemSchema().shape, sitemap_locations: z.array(z.string()).readonly(), }) .readonly(); -const contentItemSchema = (schema: TSchema | undefined) => +const contentItemSchema = () => z .object({ - system: contentItemSystemSchema(schema), + system: contentItemSystemSchema(), elements: z.record(z.string(), contentItemElementSchema), }) .readonly(); -export const listContentItemsSchema = (schema: TSchema | undefined) => +export const listContentItemsSchema = () => z .object({ - items: z.array(contentItemSchema(schema)).readonly(), - modular_content: z.record(z.string(), contentItemSchema(schema)), + items: z.array(contentItemSchema()).readonly(), + modular_content: z.record(z.string(), contentItemSchema()), ...paginationWithTotalCountSchema.shape, }) .readonly(); -export const itemsFeedSchema = (schema: TSchema | undefined) => +export const itemsFeedSchema = () => z .object({ - items: z.array(contentItemSchema(schema)).readonly(), - modular_content: z.record(z.string(), contentItemSchema(schema)), + items: z.array(contentItemSchema()).readonly(), + modular_content: z.record(z.string(), contentItemSchema()), }) .readonly(); -export const itemsReferencingAssetSchema = (schema: TSchema | undefined) => +export const itemsReferencingAssetSchema = () => z .object({ items: z .array( z.object({ - system: baseContentItemSystemSchema(schema), + system: baseContentItemSystemSchema(), }), ) .readonly(), }) .readonly(); -export const itemsReferencingItemSchema = (schema: TSchema | undefined) => +export const itemsReferencingItemSchema = () => z .object({ items: z .array( z.object({ - system: baseContentItemSystemSchema(schema), + system: baseContentItemSystemSchema(), }), ) .readonly(), }) .readonly(); -export const fetchContentItemSchema = (schema: TSchema | undefined) => +export const fetchContentItemSchema = () => z .object({ - item: contentItemSchema(schema), - modular_content: z.record(z.string(), contentItemSchema(schema)), + item: contentItemSchema(), + modular_content: z.record(z.string(), contentItemSchema()), }) .readonly(); @@ -104,13 +103,12 @@ export const defineContentItem = < TTypeCodename extends TSchema["contentTypeCodenames"][number], TElementsShape extends z.ZodRawShape, >( - schema: TSchema | undefined, typeCodename: TTypeCodename, elements: TElementsShape, ) => z .object({ - system: contentItemSystemWithCodename(schema, typeCodename), + system: contentItemSystemWithCodename(typeCodename), elements: z.object(elements).readonly(), }) .readonly(); diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 2a98758d..43cfc31a 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -44,7 +44,7 @@ export function fetchContentItemQuery( return createDeliveryFetchQuery({ config, request, - schema: fetchContentItemSchema(config.schema), + schema: fetchContentItemSchema(), endpoint: `items/${request.codename}`, }); } diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index dacd5bc2..0b3f78a7 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -58,7 +58,7 @@ export function itemsFeedQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsFeedSchema(config.schema), + schema: itemsFeedSchema(), endpoint: "items-feed", }); } diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index fa75de4d..2ac41670 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -31,7 +31,7 @@ export function itemsReferencingAssetQuery return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsReferencingAssetSchema(config.schema), + schema: itemsReferencingAssetSchema(), endpoint: `assets/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/items-referencing-item.ts b/lib/queries/content-items/items-referencing-item.ts index 8e8a4454..3bf22673 100644 --- a/lib/queries/content-items/items-referencing-item.ts +++ b/lib/queries/content-items/items-referencing-item.ts @@ -31,7 +31,7 @@ export function itemsReferencingItemQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsReferencingItemSchema(config.schema), + schema: itemsReferencingItemSchema(), endpoint: `items/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index d4697a5a..d139253a 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -60,7 +60,7 @@ export function listContentItemsQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentItemsSchema(config.schema), + schema: listContentItemsSchema(), endpoint: "items", }); } diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index a534348d..1b97e8b2 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -86,7 +86,7 @@ const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ .readonly(), ]); -export const contentTypeSchema = (_schema: TSchema | undefined) => +export const contentTypeSchema = () => z .object({ system: z @@ -101,10 +101,10 @@ export const contentTypeSchema = (_schema: }) .readonly(); -export const listContentTypesSchema = (schema: TSchema | undefined) => +export const listContentTypesSchema = () => z .object({ - types: z.array(contentTypeSchema(schema)).readonly(), + types: z.array(contentTypeSchema()).readonly(), ...paginationSchema.shape, }) .readonly(); diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index f79f7b31..7b93d2bc 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -22,7 +22,7 @@ export function fetchContentTypeQuery( return createDeliveryFetchQuery({ config, request, - schema: contentTypeSchema(config.schema), + schema: contentTypeSchema(), endpoint: `types/${request.codename}`, }); } diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 5aa97e1c..ead8bd9c 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -27,7 +27,7 @@ export function listContentTypesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentTypesSchema(config.schema), + schema: listContentTypesSchema(), endpoint: "types", }); } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index b1f70a13..08bfdc59 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -18,7 +18,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - schema: taxonomySchema(config.schema), + schema: taxonomySchema(), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 8924be30..48f18d7b 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -24,7 +24,7 @@ export function listTaxonomiesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listTaxonomiesSchema(config.schema), + schema: listTaxonomiesSchema(), endpoint: "taxonomies", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 1737b2ad..8b166bfd 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -3,16 +3,16 @@ import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationSchema } from "../../models/pagination.models.js"; -const taxonomyTermSchema = (schema: TSchema | undefined) => +const taxonomyTermSchema = () => z.object({ name: z.string(), codename: codenameOf(), get terms() { - return z.array(taxonomyTermSchema(schema)).readonly(); + return z.array(taxonomyTermSchema()).readonly(); }, }); -export const taxonomySchema = (schema: TSchema | undefined) => +export const taxonomySchema = () => z .object({ system: z @@ -23,14 +23,14 @@ export const taxonomySchema = (schema: TSc last_modified: z.iso.datetime(), }) .readonly(), - terms: z.array(taxonomyTermSchema(schema)).readonly(), + terms: z.array(taxonomyTermSchema()).readonly(), }) .readonly(); -export const listTaxonomiesSchema = (schema: TSchema | undefined) => +export const listTaxonomiesSchema = () => z .object({ - taxonomies: z.array(taxonomySchema(schema)).readonly(), + taxonomies: z.array(taxonomySchema()).readonly(), ...paginationSchema.shape, }) .readonly(); diff --git a/migration.md b/migration.md index 7dd6f1be..714eae19 100644 --- a/migration.md +++ b/migration.md @@ -75,7 +75,7 @@ The following v16 config properties have no v17 equivalent and should be removed ## TypeScript schema (replaces `ClientTypes` generic) -v16 used a generic type parameter to narrow codenames. v17 passes a `schema` object in the config instead. +v16 used a generic type parameter to narrow codenames. v17 keeps a generic type parameter, but the shape is provided through `DeliveryClientSchema<...>`. **v16** ```typescript @@ -108,21 +108,14 @@ type MySchema = DeliveryClientSchema<{ readonly elementCodenames: readonly ["title", "summary"]; }>; -const client = createDeliveryClient({ +const client = createDeliveryClient({ apiMode: "public", environmentId: "...", - schema: { - languageCodenames: ["en-US", "cs-CZ"], - contentTypeCodenames: ["article", "movie"], - collectionCodenames: ["default"], - workflowCodenames: ["default"], - workflowStepCodenames: ["published", "draft"], - taxonomyCodenames: ["genre"], - elementCodenames: ["title", "summary"], - }, }); ``` +The schema is type-only — it narrows codenames at compile time and is not passed as a runtime value. + --- ## Query API diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 15cb7e41..a3675cab 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -47,7 +47,7 @@ type MovieElements = { type MoviePayload = ContentItemOf; -const actorSchema: z.ZodType = defineContentItem(schema, "actor", { +const actorSchema: z.ZodType = defineContentItem("actor", { first_name: elementDef.optional.text(), last_name: elementDef.optional.text(), role: elementDef.optional.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), @@ -56,7 +56,7 @@ const actorSchema: z.ZodType = defineContentItem = defineContentItem(schema, "movie", { +const movieSchema: z.ZodType = defineContentItem("movie", { title: elementDef.required.text(), rating: elementDef.required.number(), synopsis: elementDef.optional.richText(), @@ -71,10 +71,9 @@ const movieSchema: z.ZodType = defineContentItem(schema, "movie", void movieSchema; -const client: TypedDeliveryClient = createDeliveryClient({ +const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", environmentId: "x", - schema, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: {}, statusCode: 200, diff --git a/tests/unit/errors/custom-errors.spec.ts b/tests/unit/errors/custom-errors.spec.ts index fdafc307..fbf1ca44 100644 --- a/tests/unit/errors/custom-errors.spec.ts +++ b/tests/unit/errors/custom-errors.spec.ts @@ -9,15 +9,6 @@ describe("Custom Error Handling", async () => { const { success, error } = await createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: () => { diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index 88640b92..e1c13b3b 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -30,7 +30,7 @@ const makeSystem = (): ContentItemSystemPayload => ({ describe("defineContentItem", () => { test("builds a schema that validates a matching content item", () => { - const schema = defineContentItem(schemaInput, "actor", { + const schema = defineContentItem }>("actor", { title: elementDef.optional.text(), }); expect( @@ -283,13 +283,13 @@ describe("elementDef.required.taxonomy", () => { const buildLinkedItemsSchemas = () => { const actorSchema = z .object({ - system: contentItemSystemWithCodename(schemaInput, "actor"), + system: contentItemSystemWithCodename("actor"), elements: z.record(z.string(), z.unknown()), }) .readonly(); const movieSchema = z .object({ - system: contentItemSystemWithCodename(schemaInput, "movie"), + system: contentItemSystemWithCodename("movie"), elements: z.record(z.string(), z.unknown()), }) .readonly(); diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index c644befc..3576e17c 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -8,16 +8,6 @@ import type { PaginationPayload } from "../../../lib/public_api.js"; import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; -const baseSchema = { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], -} as const satisfies DeliveryClientSchema; - describe("Response validation", () => { describe("Codename narrowing", () => { type TestSchema = DeliveryClientSchema<{ @@ -48,19 +38,20 @@ describe("Response validation", () => { }, }; + type NarrowSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-US", "cs-CZ"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly []; + readonly elementCodenames: readonly []; + readonly collectionCodenames: readonly []; + readonly workflowCodenames: readonly []; + readonly workflowStepCodenames: readonly []; + }>; + test("succeeds when the response contains a codename outside the defined schema (type-only narrowing)", async () => { - const client = createDeliveryClient({ + const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: ["en-US", "cs-CZ"], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, runtimeValidation: { validateResponses: true, }, @@ -77,18 +68,9 @@ describe("Response validation", () => { }); test("succeeds when the response contains only codenames within the defined schema", async () => { - const client = createDeliveryClient({ + const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: ["en-US", "cs-CZ", "de-DE"], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, runtimeValidation: { validateResponses: true, }, @@ -108,7 +90,6 @@ describe("Response validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: baseSchema, runtimeValidation: { validateResponses: true, }, @@ -151,7 +132,6 @@ describe("Response validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: baseSchema, runtimeValidation: { validateResponses: true, }, @@ -185,7 +165,6 @@ describe("Response validation", () => { const client = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: baseSchema, runtimeValidation: { validateResponses: true, }, @@ -208,7 +187,6 @@ describe("Response validation", () => { const query = createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: baseSchema, runtimeValidation: { validateResponses: true, }, diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 5bcfe403..fe69b415 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -110,15 +110,6 @@ function createFailingUnitTestClient(): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, httpService: getDefaultHttpService({ adapter: { executeRequest: () => { @@ -133,15 +124,6 @@ function createUnitTestClient(unitTestPayloa return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: unitTestPayload, statusCode: 200, @@ -153,15 +135,6 @@ function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: Bas return createDeliveryClient({ apiMode: "public", environmentId, - schema: { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }, ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), }); } From f412cb5be6c3e75d8e35ec3f63bd6adb3db681cc Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 7 May 2026 15:36:06 +0200 Subject: [PATCH 148/221] Simplifies DeliveryClientSchema type --- lib/client/delivery-client.ts | 4 +- lib/models/core.models.ts | 32 ++++++--------- lib/public_api.ts | 1 - tests/types/delivery-client-types.test.ts | 39 +++++++++---------- .../create-delivery-fetch-query.spec.ts | 4 +- ...eate-delivery-paged-by-token-query.spec.ts | 4 +- ...create-delivery-paged-by-url-query.spec.ts | 4 +- tests/unit/headers/headers.spec.ts | 4 +- 8 files changed, 41 insertions(+), 51 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 9a8fb667..d776545e 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,4 +1,4 @@ -import type { DefaultDeliveryClientSchema, DeliveryClient, DeliveryClientConfig } from "../models/core.models.js"; +import type { DeliveryClient, DeliveryClientConfig, DeliveryClientSchema } from "../models/core.models.js"; import { type FetchContentItemQueryRequest, fetchContentItemQuery } from "../queries/content-items/fetch-content-item-query.js"; import { type ItemsFeedQueryRequest, itemsFeedQuery } from "../queries/content-items/items-feed-query.js"; import { @@ -44,7 +44,7 @@ import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries * environmentId: "x", * }); */ -export function createDeliveryClient( +export function createDeliveryClient( config: DeliveryClientConfig, ): DeliveryClient { return { diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index f0edd475..7c8d77be 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -18,25 +18,17 @@ import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/t import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; import type { DeliverySdkError } from "./error.models.js"; -export type DefaultDeliveryClientSchema = { - readonly languageCodenames: readonly string[]; - readonly taxonomyCodenames: readonly string[]; - readonly contentTypeCodenames: readonly string[]; - readonly elementCodenames: readonly string[]; - readonly collectionCodenames: readonly string[]; - readonly workflowCodenames: readonly string[]; - readonly workflowStepCodenames: readonly string[]; -}; - -export type DeliveryClientSchema = { - readonly languageCodenames: TSchema["languageCodenames"]; - readonly taxonomyCodenames: TSchema["taxonomyCodenames"]; - readonly contentTypeCodenames: TSchema["contentTypeCodenames"]; - readonly elementCodenames: TSchema["elementCodenames"]; - readonly collectionCodenames: TSchema["collectionCodenames"]; - readonly workflowCodenames: TSchema["workflowCodenames"]; - readonly workflowStepCodenames: TSchema["workflowStepCodenames"]; -}; +export type DeliveryClientSchema< + TSchema extends DeliveryClientSchema = { + readonly languageCodenames: readonly string[]; + readonly taxonomyCodenames: readonly string[]; + readonly contentTypeCodenames: readonly string[]; + readonly elementCodenames: readonly string[]; + readonly collectionCodenames: readonly string[]; + readonly workflowCodenames: readonly string[]; + readonly workflowStepCodenames: readonly string[]; + }, +> = TSchema; /** * Placeholder type if extension is needed in future @@ -59,7 +51,7 @@ export type ApiMode = "public" | "preview" | "secure"; declare const schemaPhantom: unique symbol; -export type DeliveryClientConfig = SdkConfig< +export type DeliveryClientConfig = SdkConfig< DeliveryApiConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. diff --git a/lib/public_api.ts b/lib/public_api.ts index 2dfe68c0..78bab553 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -2,7 +2,6 @@ export { createDeliveryClient } from "./client/delivery-client.js"; export type { ApiMode, - DefaultDeliveryClientSchema, DeliveryApiConfig, DeliveryClient, DeliveryClientConfig, diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index a3675cab..97986f38 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -5,19 +5,17 @@ import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core import { type InferItemType as ContentItemOf, defineContentItem } from "../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../lib/queries/content-items/element.models.js"; -const schema = { - languageCodenames: ["en-us", "es-es"], - taxonomyCodenames: ["category", "tag"], - contentTypeCodenames: ["movie", "actor"], - elementCodenames: ["title", "first_name", "last_name"], - collectionCodenames: ["movies", "tv-shows"], - workflowCodenames: ["published", "draft"], - workflowStepCodenames: ["published", "draft"], -} as const satisfies DeliveryClientSchema; - -type DeliverySchema = typeof schema; - -type TypedDeliveryClient = DeliveryClient; +type TypedSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-us", "es-es"]; + readonly taxonomyCodenames: readonly ["category", "tag"]; + readonly contentTypeCodenames: readonly ["movie", "actor"]; + readonly elementCodenames: readonly ["title", "first_name", "last_name"]; + readonly collectionCodenames: readonly ["movies", "tv-shows"]; + readonly workflowCodenames: readonly ["published", "draft"]; + readonly workflowStepCodenames: readonly ["published", "draft"]; +}>; + +type TypedDeliveryClient = DeliveryClient; type ActorElements = { first_name: ReturnType; @@ -27,7 +25,7 @@ type ActorElements = { }; // circular reference — relatedActors items are ActorPayload itself -type ActorPayload = ContentItemOf; +type ActorPayload = ContentItemOf; // Mixes required and optional element factories to verify both branches of elementDef. // Required factories drop nullability on scalar values (number/dateTime/custom), @@ -45,9 +43,9 @@ type MovieElements = { actors: ReturnType>>; }; -type MoviePayload = ContentItemOf; +type MoviePayload = ContentItemOf; -const actorSchema: z.ZodType = defineContentItem("actor", { +const actorSchema: z.ZodType = defineContentItem("actor", { first_name: elementDef.optional.text(), last_name: elementDef.optional.text(), role: elementDef.optional.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), @@ -56,7 +54,7 @@ const actorSchema: z.ZodType = defineContentItem = defineContentItem("movie", { +const movieSchema: z.ZodType = defineContentItem("movie", { title: elementDef.required.text(), rating: elementDef.required.number(), synopsis: elementDef.optional.richText(), @@ -71,7 +69,7 @@ const movieSchema: z.ZodType = defineContentItem({ +const client: TypedDeliveryClient = createDeliveryClient({ apiMode: "public", environmentId: "x", httpService: getTestHttpServiceWithJsonResponse({ @@ -83,13 +81,14 @@ const client: TypedDeliveryClient = createDeliveryClient({ const languageResponse = await client.listLanguages().fetchPage(); // Verifies that the language codenames are assignable from the response schema -const responseLanguageCodenames: readonly (typeof schema.languageCodenames)[number][] = languageResponse.payload.languages.map( +const responseLanguageCodenames: readonly TypedSchema["languageCodenames"][number][] = languageResponse.payload.languages.map( (language) => language.system.codename, ); void responseLanguageCodenames; -await client.fetchContentItem({ codename: "itemCodename" }).fetch(); +const item = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); +void item; // Type showcase — compile-time verification of typed element access declare const actor: ActorPayload; diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts index 349fb5b4..c70ad4fb 100644 --- a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -1,14 +1,14 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; import { type ZodType, z } from "zod"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryFetchQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index ceb0ef81..fb6d802f 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -2,14 +2,14 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { type ZodType, z } from "zod"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index 68a5ab05..72e5d872 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -1,6 +1,6 @@ import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { DefaultDeliveryClientSchema, DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; @@ -8,7 +8,7 @@ import { createDeliveryPagedByUrlQuery } from "../../../lib/queries/delivery-que import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; diff --git a/tests/unit/headers/headers.spec.ts b/tests/unit/headers/headers.spec.ts index 962f118b..ce356c53 100644 --- a/tests/unit/headers/headers.spec.ts +++ b/tests/unit/headers/headers.spec.ts @@ -8,11 +8,11 @@ import { import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; -import type { DefaultDeliveryClientSchema, WaitForLoadingNewContentHeaderName } from "../../../lib/models/core.models.js"; +import type { DeliveryClientSchema, WaitForLoadingNewContentHeaderName } from "../../../lib/models/core.models.js"; import type { ItemsFeedQueryRequest } from "../../../lib/queries/content-items/items-feed-query.js"; import { unitEnvironmentId } from "../../utils/test.utils.js"; -async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest): Promise { +async function captureRequestHeaders(listConfig?: ItemsFeedQueryRequest): Promise { let captured: readonly Header[] = []; const client = createDeliveryClient({ From 6a7aef6516bfaef63f1356dfc344bc169e7577db Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 7 May 2026 16:22:28 +0200 Subject: [PATCH 149/221] Export type aliases for elements, simplifies elements --- lib/public_api.ts | 11 +- .../content-items/content-item.models.ts | 16 +- lib/queries/content-items/element-types.ts | 12 + lib/queries/content-items/element.models.ts | 112 +----- tests/types/delivery-client-types.test.ts | 86 +++-- tests/unit/queries/element-models.spec.ts | 328 +++--------------- 6 files changed, 127 insertions(+), 438 deletions(-) create mode 100644 lib/queries/content-items/element-types.ts diff --git a/lib/public_api.ts b/lib/public_api.ts index 78bab553..7a9a5a2d 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -32,15 +32,8 @@ export { type ItemsReferencingItemPayload, type ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; -export { - type ContentItemElementPayload, - elementDef, - type LinkedItemsLimitType, - type LinkedItemsOptions, - type MultipleChoiceOptions, - type TaxonomyOptions, - type TextOptions, -} from "./queries/content-items/element.models.js"; +export { type ContentItemElementPayload, elementDef } from "./queries/content-items/element.models.js"; +export type * as ElementType from "./queries/content-items/element-types.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index c43742da..9b7181c1 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -17,6 +17,14 @@ const baseContentItemSystemSchema = () => workflow_step: codenameOf(), }); +const contentItemSchema = () => + z + .object({ + system: contentItemSystemSchema(), + elements: z.record(z.string(), contentItemElementSchema), + }) + .readonly(); + export const contentItemSystemWithCodename = < TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], @@ -39,14 +47,6 @@ export const contentItemSystemSchema = () }) .readonly(); -const contentItemSchema = () => - z - .object({ - system: contentItemSystemSchema(), - elements: z.record(z.string(), contentItemElementSchema), - }) - .readonly(); - export const listContentItemsSchema = () => z .object({ diff --git a/lib/queries/content-items/element-types.ts b/lib/queries/content-items/element-types.ts new file mode 100644 index 00000000..38fd87ba --- /dev/null +++ b/lib/queries/content-items/element-types.ts @@ -0,0 +1,12 @@ +import type { elementDef } from "./element.models.js"; + +export type Text = typeof elementDef.text; +export type Number = typeof elementDef.number; +export type RichText = typeof elementDef.richText; +export type MultipleChoice = ReturnType>; +export type DateTime = typeof elementDef.dateTime; +export type Asset = typeof elementDef.asset; +export type Taxonomy = ReturnType>; +export type UrlSlug = typeof elementDef.urlSlug; +export type Custom = typeof elementDef.custom; +export type LinkedItems = typeof elementDef.linkedItems; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 3a0d0f39..3286780c 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -1,9 +1,6 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { match, P } from "ts-pattern"; import { z } from "zod"; -export type LinkedItemsLimitType = "atLeast" | "exactly" | "atMost"; - const multipleChoiceOptionSchema = () => z .object({ @@ -122,107 +119,22 @@ const baseElementSchemas = { }), } as const; -export type TextOptions = { readonly maxLength?: number }; -export type MultipleChoiceOptions = { readonly codenames?: readonly TCodename[] }; -export type TaxonomyOptions = { readonly codenames?: readonly TCodename[] }; -export type LinkedItemsOptions = { readonly limitType?: LinkedItemsLimitType; readonly itemsLimit?: number }; - -const applyOptionalLinkedItemsLimits = - ({ limitType, itemsLimit }: LinkedItemsOptions) => - (arr: z.ZodArray) => - match({ limitType, itemsLimit }) - .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => arr.min(itemsLimit)) - .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => arr.max(itemsLimit)) - .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => arr.length(itemsLimit)) - .otherwise(() => arr); - -const applyRequiredLinkedItemsLimits = - ({ limitType, itemsLimit }: LinkedItemsOptions) => - (item: T) => { - const tuple = z.tuple([item]).rest(item); - return match({ limitType, itemsLimit }) - .with({ limitType: "atLeast", itemsLimit: P.number }, ({ itemsLimit }) => - tuple.refine((v): boolean => v.length >= itemsLimit, { error: `Array must contain at least ${itemsLimit} item(s).` }), - ) - .with({ limitType: "atMost", itemsLimit: P.number }, ({ itemsLimit }) => - tuple.refine((v): boolean => v.length <= itemsLimit, { error: `Array must contain at most ${itemsLimit} item(s).` }), - ) - .with({ limitType: "exactly", itemsLimit: P.number }, ({ itemsLimit }) => - tuple.refine((v): boolean => v.length === itemsLimit, { error: `Array must contain exactly ${itemsLimit} item(s).` }), - ) - .otherwise(() => tuple); - }; - -const buildOptionalLinkedItems = ( - schemas: readonly TAllowedItemTypes[], - options: LinkedItemsOptions = {}, -) => { - const applyLimits = applyOptionalLinkedItemsLimits(options); - return baseElementSchemas.linkedItems - .extend({ - value: applyLimits(z.array(codenameOf())).readonly(), - items: applyLimits(z.array(z.union(schemas))).readonly(), - }) - .readonly(); -}; - -const buildRequiredLinkedItems = ( - schemas: readonly TAllowedItemTypes[], - options: LinkedItemsOptions = {}, -) => { - const applyLimits = applyRequiredLinkedItemsLimits(options); - return baseElementSchemas.linkedItems - .extend({ - value: applyLimits(codenameOf()).readonly(), - items: applyLimits(z.union(schemas)).readonly(), - }) - .readonly(); -}; - -const optionalElementDef = { - number: () => baseElementSchemas.number.extend({ value: z.number().nullable() }).readonly(), - richText: () => baseElementSchemas.richText.readonly(), - dateTime: () => baseElementSchemas.dateTime.extend({ value: z.string().nullable() }).readonly(), - asset: () => baseElementSchemas.asset.extend({ value: z.array(assetValueSchema).readonly() }).readonly(), - urlSlug: () => baseElementSchemas.urlSlug.extend({ value: z.string() }).readonly(), - custom: () => baseElementSchemas.custom.extend({ value: z.string().nullable() }).readonly(), - text: ({ maxLength }: TextOptions = {}) => - baseElementSchemas.text.extend({ value: maxLength ? z.string().max(maxLength) : z.string() }).readonly(), - multipleChoice: (_options: MultipleChoiceOptions = {}) => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), - taxonomy: (_options: TaxonomyOptions = {}) => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), - linkedItems: buildOptionalLinkedItems, -} as const; - -const requiredElementDef = { - number: () => baseElementSchemas.number.extend({ value: z.number() }).readonly(), - richText: () => baseElementSchemas.richText.readonly(), - dateTime: () => baseElementSchemas.dateTime.extend({ value: z.string() }).readonly(), - asset: () => baseElementSchemas.asset.extend({ value: z.tuple([assetValueSchema]).rest(assetValueSchema).readonly() }).readonly(), - urlSlug: () => baseElementSchemas.urlSlug.extend({ value: z.string().min(1) }).readonly(), - custom: () => baseElementSchemas.custom.extend({ value: z.string() }).readonly(), - text: ({ maxLength }: TextOptions = {}) => { - const value = z.string().min(1); - return baseElementSchemas.text.extend({ value: maxLength ? value.max(maxLength) : value }).readonly(); - }, - multipleChoice: (_options: MultipleChoiceOptions = {}) => { - const item = multipleChoiceOptionSchema(); - return baseElementSchemas.multipleChoice.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); - }, - taxonomy: (_options: TaxonomyOptions = {}) => { - const item = taxonomyTermValueSchema(); - return baseElementSchemas.taxonomy.extend({ value: z.tuple([item]).rest(item).readonly() }).readonly(); - }, - linkedItems: buildRequiredLinkedItems, -} as const; - /** * Building blocks for constructing typed content item schemas. */ export const elementDef = { - required: requiredElementDef, - optional: optionalElementDef, + text: baseElementSchemas.text.readonly(), + number: baseElementSchemas.number.readonly(), + richText: baseElementSchemas.richText.readonly(), + multipleChoice: () => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), + dateTime: baseElementSchemas.dateTime.readonly(), + asset: baseElementSchemas.asset.readonly(), + taxonomy: () => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), + urlSlug: baseElementSchemas.urlSlug.readonly(), + custom: baseElementSchemas.custom.readonly(), + linkedItems: baseElementSchemas.linkedItems.readonly(), } as const; export const contentItemElementSchema = z diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts index 97986f38..9e8aa823 100644 --- a/tests/types/delivery-client-types.test.ts +++ b/tests/types/delivery-client-types.test.ts @@ -1,7 +1,7 @@ import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import type z from "zod"; import { createDeliveryClient } from "../../lib/client/delivery-client.js"; -import type { DeliveryClient, DeliveryClientSchema } from "../../lib/models/core.models.js"; +import type { DeliveryClient, DeliveryClientSchema, ElementType } from "../../lib/public_api.js"; import { type InferItemType as ContentItemOf, defineContentItem } from "../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../lib/queries/content-items/element.models.js"; @@ -18,53 +18,49 @@ type TypedSchema = DeliveryClientSchema<{ type TypedDeliveryClient = DeliveryClient; type ActorElements = { - first_name: ReturnType; - last_name: ReturnType; - role: ReturnType>; - relatedActors: ReturnType>>; + first_name: ElementType.Text; + last_name: ElementType.Text; + role: ElementType.MultipleChoice<"opt1" | "opt2" | "opt3">; + relatedActors: ElementType.LinkedItems; }; -// circular reference — relatedActors items are ActorPayload itself type ActorPayload = ContentItemOf; -// Mixes required and optional element factories to verify both branches of elementDef. -// Required factories drop nullability on scalar values (number/dateTime/custom), -// optional factories preserve it. type MovieElements = { - title: ReturnType; - rating: ReturnType; - synopsis: ReturnType; - genre: ReturnType>; - release_date: ReturnType; - poster: ReturnType; - categories: ReturnType>; - url_slug: ReturnType; - custom_id: ReturnType; - actors: ReturnType>>; + title: ElementType.Text; + rating: ElementType.Number; + synopsis: ElementType.RichText; + genre: ElementType.MultipleChoice<"genre1" | "genre2">; + release_date: ElementType.DateTime; + poster: ElementType.Asset; + categories: ElementType.Taxonomy<"term1" | "term2">; + url_slug: ElementType.UrlSlug; + custom_id: ElementType.Custom; + actors: ElementType.LinkedItems; }; type MoviePayload = ContentItemOf; const actorSchema: z.ZodType = defineContentItem("actor", { - first_name: elementDef.optional.text(), - last_name: elementDef.optional.text(), - role: elementDef.optional.multipleChoice({ codenames: ["opt1", "opt2", "opt3"] }), - get relatedActors() { - return elementDef.optional.linkedItems([actorSchema]); - }, + first_name: elementDef.text, + last_name: elementDef.text, + role: elementDef.multipleChoice<"opt1" | "opt2" | "opt3">(), + relatedActors: elementDef.linkedItems, }); +void actorSchema; + const movieSchema: z.ZodType = defineContentItem("movie", { - title: elementDef.required.text(), - rating: elementDef.required.number(), - synopsis: elementDef.optional.richText(), - genre: elementDef.required.multipleChoice({ codenames: ["genre1", "genre2"] }), - release_date: elementDef.required.dateTime(), - poster: elementDef.required.asset(), - categories: elementDef.required.taxonomy({ codenames: ["term1", "term2"] }), - url_slug: elementDef.required.urlSlug(), - custom_id: elementDef.required.custom(), - actors: elementDef.required.linkedItems([actorSchema]), + title: elementDef.text, + rating: elementDef.number, + synopsis: elementDef.richText, + genre: elementDef.multipleChoice<"genre1" | "genre2">(), + release_date: elementDef.dateTime, + poster: elementDef.asset, + categories: elementDef.taxonomy<"term1" | "term2">(), + url_slug: elementDef.urlSlug, + custom_id: elementDef.custom, + actors: elementDef.linkedItems, }); void movieSchema; @@ -95,25 +91,25 @@ declare const actor: ActorPayload; const firstName: string = actor.elements.first_name.value; const roleCodename: "opt1" | "opt2" | "opt3" | undefined = actor.elements.role.value[0]?.codename; -const firstRelatedActor: ActorPayload | undefined = actor.elements.relatedActors.items[0]; +const firstRelatedActorCodename: string | undefined = actor.elements.relatedActors.value[0]; void firstName; void roleCodename; -void firstRelatedActor; +void firstRelatedActorCodename; declare const movie: MoviePayload; const title: string = movie.elements.title.value; -const rating: number = movie.elements.rating.value; +const rating: number | null = movie.elements.rating.value; const synopsis: string = movie.elements.synopsis.value; -const genreCodename: "genre1" | "genre2" = movie.elements.genre.value[0].codename; -const releaseDate: string = movie.elements.release_date.value; +const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; +const releaseDate: string | null = movie.elements.release_date.value; const displayTimezone: string | null = movie.elements.release_date.display_timezone; -const posterUrl: string = movie.elements.poster.value[0].url; -const categoryCodename: "term1" | "term2" = movie.elements.categories.value[0].codename; +const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; +const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; const urlSlug: string = movie.elements.url_slug.value; -const customId: string = movie.elements.custom_id.value; -const movieActor: ActorPayload = movie.elements.actors.items[0]; +const customId: string | null = movie.elements.custom_id.value; +const movieActorCodename: string | undefined = movie.elements.actors.value[0]; void title; void rating; @@ -125,4 +121,4 @@ void posterUrl; void categoryCodename; void urlSlug; void customId; -void movieActor; +void movieActorCodename; diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index e1c13b3b..f25d388f 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -1,7 +1,6 @@ import { describe, expect, test } from "vitest"; -import z from "zod"; -import type { ContentItemSystemPayload, DeliveryClientSchema } from "../../../lib/public_api.js"; -import { contentItemSystemWithCodename, defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; +import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; +import { defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; @@ -30,8 +29,8 @@ const makeSystem = (): ContentItemSystemPayload => ({ describe("defineContentItem", () => { test("builds a schema that validates a matching content item", () => { - const schema = defineContentItem }>("actor", { - title: elementDef.optional.text(), + const schema = defineContentItem("actor", { + title: elementDef.text, }); expect( schema.safeParse({ @@ -42,72 +41,33 @@ describe("defineContentItem", () => { }); }); -describe("elementDef.optional.number", () => { - test("accepts null and a number", () => { - const schema = elementDef.optional.number(); - expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(true); - expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); - }); -}); - -describe("elementDef.required.number", () => { - test("rejects null", () => { - const schema = elementDef.required.number(); - expect(schema.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(false); - expect(schema.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); - }); -}); - -describe("elementDef.optional.text", () => { - test("accepts any string when maxLength is omitted", () => { - const schema = elementDef.optional.text(); - expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(true); - expect(schema.safeParse({ type: "text", name: "Title", value: "a".repeat(1000) }).success).toBe(true); - }); - - test("rejects value exceeding maxLength", () => { - const schema = elementDef.optional.text({ maxLength: 5 }); - expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); - expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); +describe("elementDef.text", () => { + test("accepts any string", () => { + expect(elementDef.text.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(true); + expect(elementDef.text.safeParse({ type: "text", name: "Title", value: "a".repeat(1000) }).success).toBe(true); }); }); -describe("elementDef.required.text", () => { - test("rejects empty string", () => { - const schema = elementDef.required.text(); - expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); - expect(schema.safeParse({ type: "text", name: "Title", value: "x" }).success).toBe(true); - }); - - test("composes min(1) with maxLength", () => { - const schema = elementDef.required.text({ maxLength: 5 }); - expect(schema.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(false); - expect(schema.safeParse({ type: "text", name: "Title", value: "toolong" }).success).toBe(false); - expect(schema.safeParse({ type: "text", name: "Title", value: "ok" }).success).toBe(true); - }); -}); - -describe("elementDef.optional.dateTime", () => { - test("accepts null", () => { - const schema = elementDef.optional.dateTime(); - expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(true); - expect( - schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, - ).toBe(true); +describe("elementDef.number", () => { + test("accepts null and a number", () => { + expect(elementDef.number.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(true); + expect(elementDef.number.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); }); }); -describe("elementDef.required.dateTime", () => { - test("rejects null", () => { - const schema = elementDef.required.dateTime(); - expect(schema.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe(false); +describe("elementDef.dateTime", () => { + test("accepts null and a string", () => { + expect(elementDef.dateTime.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe( + true, + ); expect( - schema.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }).success, + elementDef.dateTime.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }) + .success, ).toBe(true); }); }); -describe("elementDef.optional.richText / elementDef.required.richText", () => { +describe("elementDef.richText", () => { const makePayload = () => ({ type: "rich_text", name: "Body", @@ -131,59 +91,36 @@ describe("elementDef.optional.richText / elementDef.required.richText", () => { modular_content: ["linked_item"], }); - test("optional validates a complete rich text payload", () => { - expect(elementDef.optional.richText().safeParse(makePayload()).success).toBe(true); - }); - - test("required validates a complete rich text payload", () => { - expect(elementDef.required.richText().safeParse(makePayload()).success).toBe(true); + test("validates a complete rich text payload", () => { + expect(elementDef.richText.safeParse(makePayload()).success).toBe(true); }); test("accepts empty images, links and modular_content", () => { const empty = { type: "rich_text", name: "Body", value: "", images: {}, links: {}, modular_content: [] }; - expect(elementDef.optional.richText().safeParse(empty).success).toBe(true); - expect(elementDef.required.richText().safeParse(empty).success).toBe(true); + expect(elementDef.richText.safeParse(empty).success).toBe(true); }); test("rejects payload with wrong discriminator type", () => { - expect(elementDef.optional.richText().safeParse({ ...makePayload(), type: "text" }).success).toBe(false); + expect(elementDef.richText.safeParse({ ...makePayload(), type: "text" }).success).toBe(false); }); test("rejects payload missing required fields", () => { const { images: _images, ...withoutImages } = makePayload(); - expect(elementDef.optional.richText().safeParse(withoutImages).success).toBe(false); + expect(elementDef.richText.safeParse(withoutImages).success).toBe(false); }); }); -describe("elementDef.optional.urlSlug", () => { - test("accepts empty string", () => { - const schema = elementDef.optional.urlSlug(); - expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(true); - expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); +describe("elementDef.urlSlug", () => { + test("accepts any string", () => { + expect(elementDef.urlSlug.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(true); + expect(elementDef.urlSlug.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); }); }); -describe("elementDef.required.urlSlug", () => { - test("rejects empty string", () => { - const schema = elementDef.required.urlSlug(); - expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(false); - expect(schema.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); - }); -}); - -describe("elementDef.optional.custom", () => { - test("accepts null", () => { - const schema = elementDef.optional.custom(); - expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(true); - expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); - }); -}); - -describe("elementDef.required.custom", () => { - test("rejects null", () => { - const schema = elementDef.required.custom(); - expect(schema.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(false); - expect(schema.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); +describe("elementDef.custom", () => { + test("accepts null and a string", () => { + expect(elementDef.custom.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(true); + expect(elementDef.custom.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); }); }); @@ -198,47 +135,22 @@ const makeAsset = () => ({ renditions: {}, }); -describe("elementDef.optional.asset", () => { - test("accepts empty value array", () => { - const schema = elementDef.optional.asset(); - expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(true); - expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); +describe("elementDef.asset", () => { + test("accepts empty value array and populated array", () => { + expect(elementDef.asset.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(true); + expect(elementDef.asset.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); }); }); -describe("elementDef.required.asset", () => { - test("rejects empty value array", () => { - const schema = elementDef.required.asset(); - expect(schema.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(false); - expect(schema.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); - }); -}); - -describe("elementDef.optional.multipleChoice", () => { - test("accepts empty value array and validates option codename when codenames omitted", () => { - const schema = elementDef.optional.multipleChoice(); +describe("elementDef.multipleChoice", () => { + test("accepts empty value array and populated array", () => { + const schema = elementDef.multipleChoice(); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(true); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); }); test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { - const schema = elementDef.optional.multipleChoice({ codenames: ["lead", "supporting"] as const }); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( - true, - ); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); - }); -}); - -describe("elementDef.required.multipleChoice", () => { - test("rejects empty value array", () => { - const schema = elementDef.required.multipleChoice(); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(false); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); - }); - - test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { - const schema = elementDef.required.multipleChoice({ codenames: ["lead", "supporting"] as const }); + const schema = elementDef.multipleChoice<"lead" | "supporting">(); expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( true, ); @@ -246,9 +158,9 @@ describe("elementDef.required.multipleChoice", () => { }); }); -describe("elementDef.optional.taxonomy", () => { - test("accepts empty value array and validates terms when codenames omitted", () => { - const schema = elementDef.optional.taxonomy(); +describe("elementDef.taxonomy", () => { + test("accepts empty value array and populated array", () => { + const schema = elementDef.taxonomy(); expect(schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [] }).success).toBe(true); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) @@ -257,7 +169,7 @@ describe("elementDef.optional.taxonomy", () => { }); test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { - const schema = elementDef.optional.taxonomy({ codenames: ["action", "drama"] as const }); + const schema = elementDef.taxonomy<"action" | "drama">(); expect( schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Comedy", codename: "comedy" }] }) .success, @@ -269,151 +181,15 @@ describe("elementDef.optional.taxonomy", () => { }); }); -describe("elementDef.required.taxonomy", () => { - test("rejects empty value array", () => { - const schema = elementDef.required.taxonomy(); - expect(schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [] }).success).toBe(false); - expect( - schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) - .success, - ).toBe(true); - }); -}); - -const buildLinkedItemsSchemas = () => { - const actorSchema = z - .object({ - system: contentItemSystemWithCodename("actor"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const movieSchema = z - .object({ - system: contentItemSystemWithCodename("movie"), - elements: z.record(z.string(), z.unknown()), - }) - .readonly(); - const item = { system: makeSystem(), elements: {} }; - const make = (count: number) => ({ - type: "modular_content" as const, - name: "Cast", - value: Array.from({ length: count }, (_, i) => `x${i}`), - items: Array.from({ length: count }, () => item), - }); - return { actorSchema, movieSchema, make }; -}; - -describe("elementDef.optional.linkedItems", () => { - test("items are validated against the union when multiple schemas provided", () => { - const { actorSchema, movieSchema } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema]); - const system = makeSystem(); - - expect( - schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ system, elements: {} }], - }).success, - ).toBe(true); - expect( - schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ system: { ...system, type: "movie", codename: "movie" }, elements: {} }], - }).success, - ).toBe(true); - expect( - schema.safeParse({ - type: "modular_content", - name: "Cast", - value: [], - items: [{ noSystemOrElements: true }], - }).success, - ).toBe(false); - }); - - test("accepts empty value and items arrays", () => { - const { actorSchema, movieSchema } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema]); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); - }); - - test("limitType atLeast enforces minimum count", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 2 }); - - expect(schema.safeParse(make(1)).success).toBe(false); - expect(schema.safeParse(make(2)).success).toBe(true); - expect(schema.safeParse(make(3)).success).toBe(true); - }); - - test("limitType atMost enforces maximum count", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); - - expect(schema.safeParse(make(0)).success).toBe(true); - expect(schema.safeParse(make(2)).success).toBe(true); - expect(schema.safeParse(make(3)).success).toBe(false); - }); - - test("limitType exactly enforces precise count", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "exactly", itemsLimit: 2 }); - - expect(schema.safeParse(make(1)).success).toBe(false); - expect(schema.safeParse(make(2)).success).toBe(true); - expect(schema.safeParse(make(3)).success).toBe(false); - }); - - test("itemsLimit without limitType is ignored", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { itemsLimit: 2 }); - - expect(schema.safeParse(make(0)).success).toBe(true); - expect(schema.safeParse(make(5)).success).toBe(true); - }); - - test("limitType without itemsLimit is ignored", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.optional.linkedItems([actorSchema, movieSchema], { limitType: "exactly" }); - - expect(schema.safeParse(make(0)).success).toBe(true); - expect(schema.safeParse(make(5)).success).toBe(true); - }); -}); - -describe("elementDef.required.linkedItems", () => { - test("rejects empty value or items arrays", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.required.linkedItems([actorSchema, movieSchema]); - const system = makeSystem(); - - expect(schema.safeParse(make(0)).success).toBe(false); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["x"], items: [] }).success).toBe(false); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [{ system, elements: {} }] }).success).toBe( - false, +describe("elementDef.linkedItems", () => { + test("accepts empty and populated value arrays", () => { + expect(elementDef.linkedItems.safeParse({ type: "modular_content", name: "Cast", value: [] }).success).toBe(true); + expect(elementDef.linkedItems.safeParse({ type: "modular_content", name: "Cast", value: ["actor_one", "actor_two"] }).success).toBe( + true, ); - expect(schema.safeParse(make(1)).success).toBe(true); }); - test("composes implicit min(1) with limitType atMost", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.required.linkedItems([actorSchema, movieSchema], { limitType: "atMost", itemsLimit: 2 }); - - expect(schema.safeParse(make(0)).success).toBe(false); - expect(schema.safeParse(make(1)).success).toBe(true); - expect(schema.safeParse(make(2)).success).toBe(true); - expect(schema.safeParse(make(3)).success).toBe(false); - }); - - test("limitType atLeast already implies min(N)", () => { - const { actorSchema, movieSchema, make } = buildLinkedItemsSchemas(); - const schema = elementDef.required.linkedItems([actorSchema, movieSchema], { limitType: "atLeast", itemsLimit: 3 }); - - expect(schema.safeParse(make(2)).success).toBe(false); - expect(schema.safeParse(make(3)).success).toBe(true); + test("rejects payload with wrong discriminator type", () => { + expect(elementDef.linkedItems.safeParse({ type: "text", name: "Cast", value: [] }).success).toBe(false); }); }); From 506cd9bece8d82c89930d94a63160c68421b8c87 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 10:39:03 +0200 Subject: [PATCH 150/221] Separates & updates types sample --- biome.json | 2 +- eslint.config.mjs | 2 +- package.json | 2 +- {tests/types => sample}/tsconfig.json | 2 +- sample/typed-content-model.ts | 158 ++++++++++++++++++++++ tests/types/delivery-client-types.test.ts | 124 ----------------- tsconfig.build.json | 2 +- 7 files changed, 163 insertions(+), 129 deletions(-) rename {tests/types => sample}/tsconfig.json (78%) create mode 100644 sample/typed-content-model.ts delete mode 100644 tests/types/delivery-client-types.test.ts diff --git a/biome.json b/biome.json index 35238129..d7e9b719 100644 --- a/biome.json +++ b/biome.json @@ -31,6 +31,6 @@ } }, "files": { - "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "**/*.json", "!_legacy/**/*"] + "includes": ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "sample/**/*.ts", "**/*.json", "!_legacy/**/*"] } } diff --git a/eslint.config.mjs b/eslint.config.mjs index d79f27cf..b85add81 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,7 +8,7 @@ export default defineConfig( }, { extends: [kontentAiConfig], - files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts"], + files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "sample/**/*.ts"], rules: { "no-unused-vars": "off", }, diff --git a/package.json b/package.json index 38fac56d..0ca211e7 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "test": "vitest run --config=vitest.config.ts --coverage", "test:unit": "vitest run --config=vitest-unit.config.ts", "test:integration": "vitest run --config=vitest-integration.config.ts", - "test:types": "tsgo -p tests/types/tsconfig.json", + "test:types": "tsgo -p sample/tsconfig.json", "biome:check": "biome check", "biome:fix": "biome check --write", "biome:fix:unsafe": "biome check --write --unsafe", diff --git a/tests/types/tsconfig.json b/sample/tsconfig.json similarity index 78% rename from tests/types/tsconfig.json rename to sample/tsconfig.json index 0fbcd0e3..8cd5b443 100644 --- a/tests/types/tsconfig.json +++ b/sample/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../tsconfig.json", "compilerOptions": { "noEmit": true, "noUnusedLocals": false, diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts new file mode 100644 index 00000000..bf7f289b --- /dev/null +++ b/sample/typed-content-model.ts @@ -0,0 +1,158 @@ +/** + * Sample: defining a strongly typed Kontent.ai delivery model. + * + * Top to bottom: + * 1. Declare your project's codename schema. + * 2. Define content-type element shapes and their payload types. + * 3. Build Zod schemas with `defineContentItem`. + * 4. Create a typed delivery client. + * 5. See how response values narrow at the call site. + * + * In a real consumer project, imports below would come from + * `@kontent-ai/delivery-sdk`. This sample lives in the SDK repo, + * so it imports from the in-tree source instead. + */ +/** biome-ignore-all lint/correctness/noUnusedVariables: Disabled for clarity of the sample */ + +import type z from "zod"; +import { createDeliveryClient } from "../lib/client/delivery-client.js"; +import type { DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; +import { defineContentItem, type InferItemType } from "../lib/queries/content-items/content-item.models.js"; +import { elementDef } from "../lib/queries/content-items/element.models.js"; + +/** + * 1. Schema declaration + * + * `DeliveryClientSchema` lists every codename your project uses so queries, + * payloads, and element accessors are checked against it. + */ +export type SampleProjectSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-us", "es-es"]; + readonly taxonomyCodenames: readonly ["category", "tag"]; + readonly contentTypeCodenames: readonly ["movie", "actor"]; + readonly elementCodenames: readonly ["title", "first_name", "last_name"]; + readonly collectionCodenames: readonly ["movies", "tv-shows"]; + readonly workflowCodenames: readonly ["published", "draft"]; + readonly workflowStepCodenames: readonly ["published", "draft"]; +}>; + +/** + * 2. Content type: Actor + * + * Each property on `ActorElements` maps an element codename to its element type. + * Codename generics on `MultipleChoice<...>` and `Taxonomy<...>` are TypeScript + * hints only: they power autocomplete and narrowing, but the runtime schema + * still accepts any string codename the API returns. + */ +export type ActorElements = { + readonly first_name: ElementType.Text; + readonly last_name: ElementType.Text; + readonly role: ElementType.MultipleChoice<"opt1" | "opt2" | "opt3">; + readonly relatedActors: ElementType.LinkedItems; +}; + +// Fully-typed Actor item payload (system metadata + elements). +export type Actor = InferItemType; + +// Runtime Zod schema for parsing Actor items into the typed `Actor` payload. +export const actorSchema: z.ZodType = defineContentItem("actor", { + first_name: elementDef.text, + last_name: elementDef.text, + role: elementDef.multipleChoice<"opt1" | "opt2" | "opt3">(), + relatedActors: elementDef.linkedItems, +}); + +/** + * 3. Content type: Movie + * + * Movie exercises every element type the SDK supports. + */ +export type MovieElements = { + readonly title: ElementType.Text; + readonly rating: ElementType.Number; + readonly synopsis: ElementType.RichText; + readonly genre: ElementType.MultipleChoice<"genre1" | "genre2">; + readonly release_date: ElementType.DateTime; + readonly poster: ElementType.Asset; + readonly categories: ElementType.Taxonomy<"term1" | "term2">; + readonly url_slug: ElementType.UrlSlug; + readonly custom_id: ElementType.Custom; + readonly actors: ElementType.LinkedItems; +}; + +// Fully-typed Movie item payload. +export type Movie = InferItemType; + +export const movieSchema: z.ZodType = defineContentItem("movie", { + title: elementDef.text, + rating: elementDef.number, + synopsis: elementDef.richText, + genre: elementDef.multipleChoice<"genre1" | "genre2">(), + release_date: elementDef.dateTime, + poster: elementDef.asset, + categories: elementDef.taxonomy<"term1" | "term2">(), + url_slug: elementDef.urlSlug, + custom_id: elementDef.custom, + actors: elementDef.linkedItems, +}); + +/** + * 4. Typed delivery client + * + * Pass `SampleProjectSchema` as the generic to `createDeliveryClient` and + * every query is narrowed against your schema. + */ +export type SampleDeliveryClient = DeliveryClient; + +export const client: SampleDeliveryClient = createDeliveryClient({ + apiMode: "public", + environmentId: "x", +}); + +/** + * 5. Demonstration: query typing + * + * Each annotated `const` shows what the SDK narrows a response value to. + */ +export async function demonstrateQueries(): Promise { + const languageResponse = await client.listLanguages().fetchPage(); + + // Languages are typed to the schema codenames. + const responseLanguageCodenames: readonly ("en-us" | "es-es")[] = languageResponse.payload.languages.map( + (language) => language.system.codename, + ); + + // `fetchContentItem` returns a fully typed item payload. + const item = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); +} + +/** + * 6. Demonstration: element value narrowing + * + * Annotations below are the types the SDK gives you at compile time. They + * produce a compile error if the public types drift. Narrowed codenames are + * TypeScript hints; the runtime value can be any string the API returns. + */ +export function demonstrateActorAccess(actor: Actor): void { + const firstName: string = actor.elements.first_name.value; + + // `value[0]?.codename` is narrowed to one of the declared literals (or undefined when empty). + const roleCodename: "opt1" | "opt2" | "opt3" | undefined = actor.elements.role.value[0]?.codename; + + // `relatedActors.value` holds the codenames of the referenced items. + const firstRelatedActorCodename: string | undefined = actor.elements.relatedActors.value[0]; +} + +export function demonstrateMovieAccess(movie: Movie): void { + const title: string = movie.elements.title.value; + const rating: number | null = movie.elements.rating.value; + const synopsis: string = movie.elements.synopsis.value; + const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; + const releaseDate: string | null = movie.elements.release_date.value; + const displayTimezone: string | null = movie.elements.release_date.display_timezone; + const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; + const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; + const urlSlug: string = movie.elements.url_slug.value; + const customId: string | null = movie.elements.custom_id.value; + const movieActorCodename: string | undefined = movie.elements.actors.value[0]; +} diff --git a/tests/types/delivery-client-types.test.ts b/tests/types/delivery-client-types.test.ts deleted file mode 100644 index 9e8aa823..00000000 --- a/tests/types/delivery-client-types.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; -import type z from "zod"; -import { createDeliveryClient } from "../../lib/client/delivery-client.js"; -import type { DeliveryClient, DeliveryClientSchema, ElementType } from "../../lib/public_api.js"; -import { type InferItemType as ContentItemOf, defineContentItem } from "../../lib/queries/content-items/content-item.models.js"; -import { elementDef } from "../../lib/queries/content-items/element.models.js"; - -type TypedSchema = DeliveryClientSchema<{ - readonly languageCodenames: readonly ["en-us", "es-es"]; - readonly taxonomyCodenames: readonly ["category", "tag"]; - readonly contentTypeCodenames: readonly ["movie", "actor"]; - readonly elementCodenames: readonly ["title", "first_name", "last_name"]; - readonly collectionCodenames: readonly ["movies", "tv-shows"]; - readonly workflowCodenames: readonly ["published", "draft"]; - readonly workflowStepCodenames: readonly ["published", "draft"]; -}>; - -type TypedDeliveryClient = DeliveryClient; - -type ActorElements = { - first_name: ElementType.Text; - last_name: ElementType.Text; - role: ElementType.MultipleChoice<"opt1" | "opt2" | "opt3">; - relatedActors: ElementType.LinkedItems; -}; - -type ActorPayload = ContentItemOf; - -type MovieElements = { - title: ElementType.Text; - rating: ElementType.Number; - synopsis: ElementType.RichText; - genre: ElementType.MultipleChoice<"genre1" | "genre2">; - release_date: ElementType.DateTime; - poster: ElementType.Asset; - categories: ElementType.Taxonomy<"term1" | "term2">; - url_slug: ElementType.UrlSlug; - custom_id: ElementType.Custom; - actors: ElementType.LinkedItems; -}; - -type MoviePayload = ContentItemOf; - -const actorSchema: z.ZodType = defineContentItem("actor", { - first_name: elementDef.text, - last_name: elementDef.text, - role: elementDef.multipleChoice<"opt1" | "opt2" | "opt3">(), - relatedActors: elementDef.linkedItems, -}); - -void actorSchema; - -const movieSchema: z.ZodType = defineContentItem("movie", { - title: elementDef.text, - rating: elementDef.number, - synopsis: elementDef.richText, - genre: elementDef.multipleChoice<"genre1" | "genre2">(), - release_date: elementDef.dateTime, - poster: elementDef.asset, - categories: elementDef.taxonomy<"term1" | "term2">(), - url_slug: elementDef.urlSlug, - custom_id: elementDef.custom, - actors: elementDef.linkedItems, -}); - -void movieSchema; - -const client: TypedDeliveryClient = createDeliveryClient({ - apiMode: "public", - environmentId: "x", - httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: {}, - statusCode: 200, - }), -}); - -const languageResponse = await client.listLanguages().fetchPage(); - -// Verifies that the language codenames are assignable from the response schema -const responseLanguageCodenames: readonly TypedSchema["languageCodenames"][number][] = languageResponse.payload.languages.map( - (language) => language.system.codename, -); - -void responseLanguageCodenames; - -const item = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); -void item; - -// Type showcase — compile-time verification of typed element access -declare const actor: ActorPayload; - -const firstName: string = actor.elements.first_name.value; -const roleCodename: "opt1" | "opt2" | "opt3" | undefined = actor.elements.role.value[0]?.codename; -const firstRelatedActorCodename: string | undefined = actor.elements.relatedActors.value[0]; - -void firstName; -void roleCodename; -void firstRelatedActorCodename; - -declare const movie: MoviePayload; - -const title: string = movie.elements.title.value; -const rating: number | null = movie.elements.rating.value; -const synopsis: string = movie.elements.synopsis.value; -const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; -const releaseDate: string | null = movie.elements.release_date.value; -const displayTimezone: string | null = movie.elements.release_date.display_timezone; -const posterUrl: string | undefined = movie.elements.poster.value[0]?.url; -const categoryCodename: "term1" | "term2" | undefined = movie.elements.categories.value[0]?.codename; -const urlSlug: string = movie.elements.url_slug.value; -const customId: string | null = movie.elements.custom_id.value; -const movieActorCodename: string | undefined = movie.elements.actors.value[0]; - -void title; -void rating; -void synopsis; -void genreCodename; -void releaseDate; -void displayTimezone; -void posterUrl; -void categoryCodename; -void urlSlug; -void customId; -void movieActorCodename; diff --git a/tsconfig.build.json b/tsconfig.build.json index d776d4cf..d90cc3df 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -6,5 +6,5 @@ "rootDir": "./lib" }, "include": ["lib/**/*"], - "exclude": ["tests/**/*", "scripts/**/*"] + "exclude": ["tests/**/*", "scripts/**/*", "sample/**/*"] } From 04f33cede59a1006e8d141684fa3d6bca481a58b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 10:59:50 +0200 Subject: [PATCH 151/221] Adds safe / unsafe queries sample --- sample/safe-vs-unsafe-queries.ts | 95 ++++++++++++++++++++++++++++++++ sample/typed-content-model.ts | 2 +- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 sample/safe-vs-unsafe-queries.ts diff --git a/sample/safe-vs-unsafe-queries.ts b/sample/safe-vs-unsafe-queries.ts new file mode 100644 index 00000000..85cc2b66 --- /dev/null +++ b/sample/safe-vs-unsafe-queries.ts @@ -0,0 +1,95 @@ +/** biome-ignore-all lint/correctness/noUnusedVariables: Disabled for clarity of the sample */ +/** + * Sample: safe vs unsafe queries. + * + * Every query the SDK exposes comes in two flavors: + * - unsafe (`fetchPage`, `fetchAllPages`, `pages`): throws on error. + * - safe (`fetchPageSafe`, `fetchAllPagesSafe`, `pagesSafe`): returns a + * discriminated `{ success, response | error }` result and never throws. + * + * The only difference is how a failure is delivered to your code. + * + * `listLanguages` is used here as a representative paged query. The same + * pattern applies to every other query on the delivery client. + */ + +import { createDeliveryClient } from "../lib/client/delivery-client.js"; + +// Minimal client setup. A real consumer would supply their own environmentId +// and (optionally) a typed schema generic; both are irrelevant to the topic here. +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "x", +}); + +/** + * 1. Unsafe single page + * + * `fetchPage()` throws on any failure, regardless of cause (transport, + * validation, anything else). Wrap at the call boundary if you want the + * error to propagate to your framework. + */ +export async function listLanguagesUnsafe(): Promise { + try { + const response = await client.listLanguages().fetchPage(); + + // response.payload is the validated, fully typed languages page. + const firstLanguageCodename: string | undefined = response.payload.languages[0]?.system.codename; + } catch (error) { + console.error("listLanguages failed:", error); + } +} + +/** + * 2. Safe single page + * + * `fetchPageSafe()` never throws. Branch on `result.success` to access + * either the validated payload or the error. + */ +export async function listLanguagesSafe(): Promise { + const result = await client.listLanguages().fetchPageSafe(); + + if (result.success) { + // Same payload shape as the unsafe path, reached via `result.response`. + const firstLanguageCodename: string | undefined = result.response.payload.languages[0]?.system.codename; + } else { + // `result.error` is always a `DeliverySdkError` regardless of the underlying cause. + console.error("listLanguages failed:", result.error); + } +} + +/** + * 3. All pages, unsafe + * + * `fetchAllPages()` walks the entire result set and throws on the first + * failure. Any pages already fetched before the failure are lost. + */ +export async function listAllLanguagesUnsafe(): Promise { + try { + const response = await client.listLanguages().fetchAllPages(); + + // response.responses is one entry per page. + const totalLanguages = response.responses.flatMap((page) => page.payload.languages).length; + } catch (error) { + console.error("listLanguages paging failed:", error); + } +} + +/** + * 4. All pages, safe + * + * `fetchAllPagesSafe()` is the strongest reason to reach for the safe API: + * on failure, `partialResponses` still contains the pages fetched before + * the error - you can recover whatever progress was made. + */ +export async function listAllLanguagesSafe(): Promise { + const result = await client.listLanguages().fetchAllPagesSafe(); + + if (result.success) { + const totalLanguages = result.responses.flatMap((page) => page.payload.languages).length; + } else { + // Partial progress is preserved on failure - useful for resilient paging. + const recoveredLanguages = result.partialResponses.flatMap((page) => page.payload.languages); + console.error("listLanguages paging failed after", recoveredLanguages.length, "languages:", result.error); + } +} diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index bf7f289b..49d4a48e 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -1,3 +1,4 @@ +/** biome-ignore-all lint/correctness/noUnusedVariables: Disabled for clarity of the sample */ /** * Sample: defining a strongly typed Kontent.ai delivery model. * @@ -12,7 +13,6 @@ * `@kontent-ai/delivery-sdk`. This sample lives in the SDK repo, * so it imports from the in-tree source instead. */ -/** biome-ignore-all lint/correctness/noUnusedVariables: Disabled for clarity of the sample */ import type z from "zod"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; From 79bd834b75d84f34b281e68c95031b23a3b7ae78 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 11:43:28 +0200 Subject: [PATCH 152/221] Extends linked items --- .../content-items/content-item.models.ts | 2 +- lib/queries/content-items/element-types.ts | 6 +++++- lib/queries/content-items/element.models.ts | 15 ++++++++++++++- sample/typed-content-model.ts | 13 +++++++++---- tests/unit/queries/element-models.spec.ts | 18 ++++++++++++++---- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 9b7181c1..fbed47da 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -17,7 +17,7 @@ const baseContentItemSystemSchema = () => workflow_step: codenameOf(), }); -const contentItemSchema = () => +export const contentItemSchema = () => z .object({ system: contentItemSystemSchema(), diff --git a/lib/queries/content-items/element-types.ts b/lib/queries/content-items/element-types.ts index 38fd87ba..78ef3f2d 100644 --- a/lib/queries/content-items/element-types.ts +++ b/lib/queries/content-items/element-types.ts @@ -1,3 +1,5 @@ +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import type { ContentItemPayload } from "./content-item.models.js"; import type { elementDef } from "./element.models.js"; export type Text = typeof elementDef.text; @@ -9,4 +11,6 @@ export type Asset = typeof elementDef.asset; export type Taxonomy = ReturnType>; export type UrlSlug = typeof elementDef.urlSlug; export type Custom = typeof elementDef.custom; -export type LinkedItems = typeof elementDef.linkedItems; +export type LinkedItems = ContentItemPayload> = ReturnType< + typeof elementDef.linkedItems +>; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 3286780c..514cc8e6 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -1,5 +1,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { type ContentItemPayload, contentItemSchema } from "./content-item.models.js"; const multipleChoiceOptionSchema = () => z @@ -134,7 +136,18 @@ export const elementDef = { baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), urlSlug: baseElementSchemas.urlSlug.readonly(), custom: baseElementSchemas.custom.readonly(), - linkedItems: baseElementSchemas.linkedItems.readonly(), + linkedItems: = ContentItemPayload>() => + baseElementSchemas.linkedItems + .extend({ + items: z + .array( + z.custom((item) => contentItemSchema().safeParse(item).success, { + error: "Invalid referenced linked item", + }), + ) + .readonly(), + }) + .readonly(), } as const; export const contentItemElementSchema = z diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index 49d4a48e..0ecadea5 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -59,13 +59,15 @@ export const actorSchema: z.ZodType = defineContentItem(), - relatedActors: elementDef.linkedItems, + relatedActors: elementDef.linkedItems(), }); /** * 3. Content type: Movie * - * Movie exercises every element type the SDK supports. + * Movie exercises every element type the SDK supports. `LinkedItems` + * tells the SDK that the resolved `items[i]` of `actors` should be typed as + * `Actor`, so consumers get full element narrowing on referenced items. */ export type MovieElements = { readonly title: ElementType.Text; @@ -77,7 +79,7 @@ export type MovieElements = { readonly categories: ElementType.Taxonomy<"term1" | "term2">; readonly url_slug: ElementType.UrlSlug; readonly custom_id: ElementType.Custom; - readonly actors: ElementType.LinkedItems; + readonly actors: ElementType.LinkedItems; }; // Fully-typed Movie item payload. @@ -93,7 +95,7 @@ export const movieSchema: z.ZodType = defineContentItem(), url_slug: elementDef.urlSlug, custom_id: elementDef.custom, - actors: elementDef.linkedItems, + actors: elementDef.linkedItems(), }); /** @@ -155,4 +157,7 @@ export function demonstrateMovieAccess(movie: Movie): void { const urlSlug: string = movie.elements.url_slug.value; const customId: string | null = movie.elements.custom_id.value; const movieActorCodename: string | undefined = movie.elements.actors.value[0]; + + // `LinkedItems` types `items[i]` as `Actor` - full element narrowing on referenced items. + const firstMovieActor: Actor | undefined = movie.elements.actors.items[0]; } diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index f25d388f..4d569328 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from "vitest"; +import type z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; import { defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; import { elementDef } from "../../../lib/queries/content-items/element.models.js"; @@ -124,7 +125,7 @@ describe("elementDef.custom", () => { }); }); -const makeAsset = () => ({ +const makeAsset = (): ElementType.Asset => ({ name: "poster.jpg", description: null, type: "image/jpeg", @@ -183,13 +184,22 @@ describe("elementDef.taxonomy", () => { describe("elementDef.linkedItems", () => { test("accepts empty and populated value arrays", () => { - expect(elementDef.linkedItems.safeParse({ type: "modular_content", name: "Cast", value: [] }).success).toBe(true); - expect(elementDef.linkedItems.safeParse({ type: "modular_content", name: "Cast", value: ["actor_one", "actor_two"] }).success).toBe( + const schema = elementDef.linkedItems(); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); + expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["actor_one", "actor_two"], items: [] }).success).toBe( true, ); }); test("rejects payload with wrong discriminator type", () => { - expect(elementDef.linkedItems.safeParse({ type: "text", name: "Cast", value: [] }).success).toBe(false); + const schema = elementDef.linkedItems(); + expect(schema.safeParse({ type: "text", name: "Cast", value: [], items: [] }).success).toBe(false); + }); + + test("items is typed as the generic argument at the TypeScript level", () => { + type TaggedItem = { readonly tag: "movie" }; + type ItemsOf = z.infer>>["items"]; + const items: ItemsOf = [{ tag: "movie" }]; + expect(items.length).toBe(1); }); }); From ab486e60089b8a1ad45fe1c3134cff6d8d7e0bf6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 12:17:38 +0200 Subject: [PATCH 153/221] Simplifies elements --- .../content-items/content-item.models.ts | 20 ++++++++++------ lib/queries/content-items/element-types.ts | 23 ++++++++++--------- lib/queries/content-items/element.models.ts | 2 ++ tests/unit/queries/element-models.spec.ts | 4 ++-- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index fbed47da..639ef003 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -2,7 +2,15 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; -import { contentItemElementSchema } from "./element.models.js"; +import { type ContentItemElementPayload, contentItemElementSchema } from "./element.models.js"; + +/** A consumer-facing element shape: each key holds an element's payload type, not its Zod schema. */ +type ContentItemElementShape = Record; + +/** Maps a payload-shaped element record to the Zod-schema-shaped record `z.object(...)` expects. */ +type ElementSchemasOf = { + readonly [K in keyof TElements]: z.ZodType; +}; const baseContentItemSystemSchema = () => z.object({ @@ -101,10 +109,10 @@ export const fetchContentItemSchema = () = export const defineContentItem = < TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], - TElementsShape extends z.ZodRawShape, + TElements extends ContentItemElementShape, >( typeCodename: TTypeCodename, - elements: TElementsShape, + elements: ElementSchemasOf, ) => z .object({ @@ -121,12 +129,10 @@ export type ContentItemSystem< export type InferItemType< TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], - TElementSchemas extends z.ZodRawShape, + TElements extends ContentItemElementShape, > = { readonly system: ContentItemSystem; - readonly elements: { - readonly [K in keyof TElementSchemas]: z.infer; - }; + readonly elements: TElements; }; export type ContentItemSystemPayload = z.infer>>; diff --git a/lib/queries/content-items/element-types.ts b/lib/queries/content-items/element-types.ts index 78ef3f2d..ce7f346e 100644 --- a/lib/queries/content-items/element-types.ts +++ b/lib/queries/content-items/element-types.ts @@ -1,16 +1,17 @@ +import type z from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import type { ContentItemPayload } from "./content-item.models.js"; import type { elementDef } from "./element.models.js"; -export type Text = typeof elementDef.text; -export type Number = typeof elementDef.number; -export type RichText = typeof elementDef.richText; -export type MultipleChoice = ReturnType>; -export type DateTime = typeof elementDef.dateTime; -export type Asset = typeof elementDef.asset; -export type Taxonomy = ReturnType>; -export type UrlSlug = typeof elementDef.urlSlug; -export type Custom = typeof elementDef.custom; -export type LinkedItems = ContentItemPayload> = ReturnType< - typeof elementDef.linkedItems +export type Text = z.infer; +export type Number = z.infer; +export type RichText = z.infer; +export type MultipleChoice = z.infer>>; +export type DateTime = z.infer; +export type Asset = z.infer; +export type Taxonomy = z.infer>>; +export type UrlSlug = z.infer; +export type Custom = z.infer; +export type LinkedItems = ContentItemPayload> = z.infer< + ReturnType> >; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index 514cc8e6..a2a17c62 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -165,4 +165,6 @@ export const contentItemElementSchema = z ]) .readonly(); +export type Asset = z.infer; + export type ContentItemElementPayload = z.infer; diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index 4d569328..df0cbdeb 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "vitest"; import type z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; import { defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; -import { elementDef } from "../../../lib/queries/content-items/element.models.js"; +import { type Asset, elementDef } from "../../../lib/queries/content-items/element.models.js"; import { getFakeUuid } from "../../utils/test.utils.js"; const schemaInput = { @@ -125,7 +125,7 @@ describe("elementDef.custom", () => { }); }); -const makeAsset = (): ElementType.Asset => ({ +const makeAsset = (): Asset => ({ name: "poster.jpg", description: null, type: "image/jpeg", From c2b509f69d31fca598ed63e044374b83c4daf9ae Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 13:51:05 +0200 Subject: [PATCH 154/221] Uses dynamic import for zod schemas --- lib/models/pagination.models.ts | 25 +-- lib/models/pagination.schemas.ts | 23 +++ lib/public_api.ts | 23 ++- lib/public_typed_items.ts | 3 + .../content-items/content-item.models.ts | 135 ++----------- .../content-items/content-item.schemas.ts | 119 +++++++++++ lib/queries/content-items/element-types.ts | 2 +- lib/queries/content-items/element.models.ts | 168 +--------------- lib/queries/content-items/element.schemas.ts | 167 ++++++++++++++++ .../content-items/fetch-content-item-query.ts | 4 +- lib/queries/content-items/items-feed-query.ts | 4 +- .../items-referencing-asset-query.ts | 4 +- .../content-items/items-referencing-item.ts | 4 +- .../content-items/list-content-items-query.ts | 4 +- .../content-types/content-type.models.ts | 124 +----------- .../content-types/content-type.schemas.ts | 123 ++++++++++++ .../fetch-content-type-element-query.ts | 4 +- .../content-types/fetch-content-type-query.ts | 4 +- .../content-types/list-content-types-query.ts | 4 +- lib/queries/delivery-queries.ts | 8 +- lib/queries/languages/language.models.ts | 26 +-- lib/queries/languages/language.schemas.ts | 25 +++ lib/queries/languages/list-languages-query.ts | 4 +- .../taxonomies/fetch-taxonomy-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 4 +- lib/queries/taxonomies/taxonomy.models.ts | 37 +--- lib/queries/taxonomies/taxonomy.schemas.ts | 36 ++++ package.json | 19 +- pnpm-lock.yaml | 186 +++++++++--------- pnpm-workspace.yaml | 4 +- sample/typed-content-model.ts | 5 +- .../fetch-content-item-query.spec.ts | 3 +- .../content-items/items-feed-query.spec.ts | 3 +- .../items-referencing-asset-query.spec.ts | 6 +- .../items-referencing-item-query.spec.ts | 3 +- .../list-content-items-query.spec.ts | 3 +- .../fetch-content-type-element-query.spec.ts | 3 +- .../fetch-content-type-query.spec.ts | 3 +- .../list-content-types-query.spec.ts | 3 +- .../languages/list-languages-query.spec.ts | 3 +- .../taxonomies/fetch-taxonomy-query.spec.ts | 3 +- .../taxonomies/list-taxonomies-query.spec.ts | 3 +- .../create-delivery-fetch-query.spec.ts | 2 +- ...eate-delivery-paged-by-token-query.spec.ts | 2 +- ...create-delivery-paged-by-url-query.spec.ts | 20 +- tests/unit/queries/element-models.spec.ts | 5 +- 46 files changed, 707 insertions(+), 660 deletions(-) create mode 100644 lib/models/pagination.schemas.ts create mode 100644 lib/public_typed_items.ts create mode 100644 lib/queries/content-items/content-item.schemas.ts create mode 100644 lib/queries/content-items/element.schemas.ts create mode 100644 lib/queries/content-types/content-type.schemas.ts create mode 100644 lib/queries/languages/language.schemas.ts create mode 100644 lib/queries/taxonomies/taxonomy.schemas.ts diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index 1c0c7392..f353d359 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,26 +1,5 @@ -import { z } from "zod"; - -const nextPageSchema = z.url().or(z.literal("")); - -const paginationObjectSchema = z.object({ - skip: z.number(), - limit: z.number(), - count: z.number(), - next_page: nextPageSchema, -}); - -export const paginationSchema = z.object({ - pagination: paginationObjectSchema.readonly(), -}); - -export const paginationWithTotalCountSchema = z.object({ - pagination: z - .object({ - ...paginationObjectSchema.shape, - total_count: z.number().optional(), - }) - .readonly(), -}); +import type { z } from "zod"; +import type { paginationSchema, paginationWithTotalCountSchema } from "./pagination.schemas.js"; export type PaginationPayload = Readonly>; export type PaginationWithTotalCountPayload = Readonly>; diff --git a/lib/models/pagination.schemas.ts b/lib/models/pagination.schemas.ts new file mode 100644 index 00000000..34947e5b --- /dev/null +++ b/lib/models/pagination.schemas.ts @@ -0,0 +1,23 @@ +import { z } from "zod"; + +const nextPageSchema = z.url().or(z.literal("")); + +const paginationObjectSchema = z.object({ + skip: z.number(), + limit: z.number(), + count: z.number(), + next_page: nextPageSchema, +}); + +export const paginationSchema = z.object({ + pagination: paginationObjectSchema.readonly(), +}); + +export const paginationWithTotalCountSchema = z.object({ + pagination: z + .object({ + ...paginationObjectSchema.shape, + total_count: z.number().optional(), + }) + .readonly(), +}); diff --git a/lib/public_api.ts b/lib/public_api.ts index 7a9a5a2d..8d120d81 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -20,19 +20,18 @@ export type { OrderDirection, SystemOrderQueryParam, } from "./models/request.models.js"; -export { - type ContentItemPayload, - type ContentItemSystem, - type ContentItemSystemPayload, - defineContentItem, - type FetchContentItemPayload, - type InferItemType, - type ItemsFeedPayload, - type ItemsReferencingAssetPayload, - type ItemsReferencingItemPayload, - type ListContentItemsPayload, +export type { + ContentItemPayload, + ContentItemSystem, + ContentItemSystemPayload, + FetchContentItemPayload, + InferItemType, + ItemsFeedPayload, + ItemsReferencingAssetPayload, + ItemsReferencingItemPayload, + ListContentItemsPayload, } from "./queries/content-items/content-item.models.js"; -export { type ContentItemElementPayload, elementDef } from "./queries/content-items/element.models.js"; +export type { ContentItemElementPayload } from "./queries/content-items/element.models.js"; export type * as ElementType from "./queries/content-items/element-types.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; diff --git a/lib/public_typed_items.ts b/lib/public_typed_items.ts new file mode 100644 index 00000000..d433ccf2 --- /dev/null +++ b/lib/public_typed_items.ts @@ -0,0 +1,3 @@ +// biome-ignore lint/performance/noBarrelFile: One barrel for the typed-items subpath is fine +export { defineContentItem } from "./queries/content-items/content-item.schemas.js"; +export { elementDef } from "./queries/content-items/element.schemas.js"; diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/content-item.models.ts index 639ef003..d724b30d 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/content-item.models.ts @@ -1,125 +1,18 @@ -import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import type { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationWithTotalCountSchema } from "../../models/pagination.models.js"; -import { type ContentItemElementPayload, contentItemElementSchema } from "./element.models.js"; - -/** A consumer-facing element shape: each key holds an element's payload type, not its Zod schema. */ -type ContentItemElementShape = Record; - -/** Maps a payload-shaped element record to the Zod-schema-shaped record `z.object(...)` expects. */ -type ElementSchemasOf = { - readonly [K in keyof TElements]: z.ZodType; -}; - -const baseContentItemSystemSchema = () => - z.object({ - id: kontentUuidSchema, - name: z.string(), - codename: codenameOf(), - language: codenameOf(), - type: codenameOf(), - collection: codenameOf(), - last_modified: z.iso.datetime(), - workflow: codenameOf(), - workflow_step: codenameOf(), - }); - -export const contentItemSchema = () => - z - .object({ - system: contentItemSystemSchema(), - elements: z.record(z.string(), contentItemElementSchema), - }) - .readonly(); - -export const contentItemSystemWithCodename = < - TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], ->( - type: TTypeCodename, -) => - z - .object({ - ...baseContentItemSystemSchema().shape, - sitemap_locations: z.array(z.string()).readonly(), - type: z.literal(type), - }) - .readonly(); - -export const contentItemSystemSchema = () => - z - .object({ - ...baseContentItemSystemSchema().shape, - sitemap_locations: z.array(z.string()).readonly(), - }) - .readonly(); - -export const listContentItemsSchema = () => - z - .object({ - items: z.array(contentItemSchema()).readonly(), - modular_content: z.record(z.string(), contentItemSchema()), - ...paginationWithTotalCountSchema.shape, - }) - .readonly(); - -export const itemsFeedSchema = () => - z - .object({ - items: z.array(contentItemSchema()).readonly(), - modular_content: z.record(z.string(), contentItemSchema()), - }) - .readonly(); - -export const itemsReferencingAssetSchema = () => - z - .object({ - items: z - .array( - z.object({ - system: baseContentItemSystemSchema(), - }), - ) - .readonly(), - }) - .readonly(); - -export const itemsReferencingItemSchema = () => - z - .object({ - items: z - .array( - z.object({ - system: baseContentItemSystemSchema(), - }), - ) - .readonly(), - }) - .readonly(); - -export const fetchContentItemSchema = () => - z - .object({ - item: contentItemSchema(), - modular_content: z.record(z.string(), contentItemSchema()), - }) - .readonly(); - -export const defineContentItem = < - TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], - TElements extends ContentItemElementShape, ->( - typeCodename: TTypeCodename, - elements: ElementSchemasOf, -) => - z - .object({ - system: contentItemSystemWithCodename(typeCodename), - elements: z.object(elements).readonly(), - }) - .readonly(); +import type { + contentItemSchema, + contentItemSystemSchema, + contentItemSystemWithCodename, + fetchContentItemSchema, + itemsFeedSchema, + itemsReferencingAssetSchema, + itemsReferencingItemSchema, + listContentItemsSchema, +} from "./content-item.schemas.js"; +import type { ContentItemElementPayload } from "./element.models.js"; + +export type ContentItemElementShape = Record; export type ContentItemSystem< TSchema extends DeliveryClientSchema, diff --git a/lib/queries/content-items/content-item.schemas.ts b/lib/queries/content-items/content-item.schemas.ts new file mode 100644 index 00000000..caa465e1 --- /dev/null +++ b/lib/queries/content-items/content-item.schemas.ts @@ -0,0 +1,119 @@ +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationWithTotalCountSchema } from "../../models/pagination.schemas.js"; +import type { ContentItemElementShape } from "./content-item.models.js"; +import { contentItemElementSchema } from "./element.schemas.js"; + +type ElementSchemasOf = { + readonly [K in keyof TElements]: z.ZodType; +}; + +const baseContentItemSystemSchema = () => + z.object({ + id: kontentUuidSchema, + name: z.string(), + codename: codenameOf(), + language: codenameOf(), + type: codenameOf(), + collection: codenameOf(), + last_modified: z.iso.datetime(), + workflow: codenameOf(), + workflow_step: codenameOf(), + }); + +export const contentItemSchema = () => + z + .object({ + system: contentItemSystemSchema(), + elements: z.record(z.string(), contentItemElementSchema), + }) + .readonly(); + +export const contentItemSystemWithCodename = < + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], +>( + type: TTypeCodename, +) => + z + .object({ + ...baseContentItemSystemSchema().shape, + sitemap_locations: z.array(z.string()).readonly(), + type: z.literal(type), + }) + .readonly(); + +export const contentItemSystemSchema = () => + z + .object({ + ...baseContentItemSystemSchema().shape, + sitemap_locations: z.array(z.string()).readonly(), + }) + .readonly(); + +export const listContentItemsSchema = () => + z + .object({ + items: z.array(contentItemSchema()).readonly(), + modular_content: z.record(z.string(), contentItemSchema()), + ...paginationWithTotalCountSchema.shape, + }) + .readonly(); + +export const itemsFeedSchema = () => + z + .object({ + items: z.array(contentItemSchema()).readonly(), + modular_content: z.record(z.string(), contentItemSchema()), + }) + .readonly(); + +export const itemsReferencingAssetSchema = () => + z + .object({ + items: z + .array( + z.object({ + system: baseContentItemSystemSchema(), + }), + ) + .readonly(), + }) + .readonly(); + +export const itemsReferencingItemSchema = () => + z + .object({ + items: z + .array( + z.object({ + system: baseContentItemSystemSchema(), + }), + ) + .readonly(), + }) + .readonly(); + +export const fetchContentItemSchema = () => + z + .object({ + item: contentItemSchema(), + modular_content: z.record(z.string(), contentItemSchema()), + }) + .readonly(); + +export const defineContentItem = < + TSchema extends DeliveryClientSchema, + TTypeCodename extends TSchema["contentTypeCodenames"][number], + TElements extends ContentItemElementShape, +>( + typeCodename: TTypeCodename, + elements: ElementSchemasOf, +) => + z + .object({ + system: contentItemSystemWithCodename(typeCodename), + elements: z.object(elements).readonly(), + }) + .readonly(); diff --git a/lib/queries/content-items/element-types.ts b/lib/queries/content-items/element-types.ts index ce7f346e..17162499 100644 --- a/lib/queries/content-items/element-types.ts +++ b/lib/queries/content-items/element-types.ts @@ -1,7 +1,7 @@ import type z from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; import type { ContentItemPayload } from "./content-item.models.js"; -import type { elementDef } from "./element.models.js"; +import type { elementDef } from "./element.schemas.js"; export type Text = z.infer; export type Number = z.infer; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/element.models.ts index a2a17c62..538a6801 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/element.models.ts @@ -1,169 +1,5 @@ -import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { type ContentItemPayload, contentItemSchema } from "./content-item.models.js"; - -const multipleChoiceOptionSchema = () => - z - .object({ - name: z.string(), - codename: codenameOf(), - }) - .readonly(); - -const taxonomyTermValueSchema = () => - z - .object({ - name: z.string(), - codename: codenameOf(), - }) - .readonly(); - -const renditionSchema = z - .object({ - rendition_id: kontentUuidSchema, - preset_id: kontentUuidSchema, - width: z.number(), - height: z.number(), - query: z.string(), - }) - .readonly(); - -const assetValueSchema = z - .object({ - name: z.string(), - description: z.string().nullable(), - type: z.string(), - size: z.number(), - url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - renditions: z.object({ default: renditionSchema.optional() }).readonly(), - }) - .readonly(); - -const richTextImageSchema = z - .object({ - image_id: z.string(), - description: z.string().nullable(), - url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - }) - .readonly(); - -const richTextLinkSchema = z - .object({ - codename: codenameOf(), - type: z.string(), - url_slug: z.string(), - }) - .readonly(); - -/** - * Base element schema as provided by Kontent.ai API - */ -const baseElementSchemas = { - text: z.object({ - type: z.literal("text"), - name: z.string(), - value: z.string(), - }), - number: z.object({ - type: z.literal("number"), - name: z.string(), - value: z.number().nullable(), - }), - richText: z.object({ - type: z.literal("rich_text"), - name: z.string(), - value: z.string(), - images: z.record(z.string(), richTextImageSchema), - links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(codenameOf()).readonly(), - }), - multipleChoice: z.object({ - type: z.literal("multiple_choice"), - name: z.string(), - value: z.array(multipleChoiceOptionSchema()).readonly(), - }), - dateTime: z.object({ - type: z.literal("date_time"), - name: z.string(), - value: z.string().nullable(), - display_timezone: z.string().nullable(), - }), - asset: z.object({ - type: z.literal("asset"), - name: z.string(), - value: z.array(assetValueSchema).readonly(), - }), - taxonomy: z.object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - value: z.array(taxonomyTermValueSchema()).readonly(), - }), - urlSlug: z.object({ - type: z.literal("url_slug"), - name: z.string(), - value: z.string(), - }), - custom: z.object({ - type: z.literal("custom"), - name: z.string(), - value: z.string().nullable(), - }), - linkedItems: z.object({ - type: z.literal("modular_content"), - name: z.string(), - value: z.array(codenameOf()).readonly(), - }), -} as const; - -/** - * Building blocks for constructing typed content item schemas. - */ -export const elementDef = { - text: baseElementSchemas.text.readonly(), - number: baseElementSchemas.number.readonly(), - richText: baseElementSchemas.richText.readonly(), - multipleChoice: () => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), - dateTime: baseElementSchemas.dateTime.readonly(), - asset: baseElementSchemas.asset.readonly(), - taxonomy: () => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), - urlSlug: baseElementSchemas.urlSlug.readonly(), - custom: baseElementSchemas.custom.readonly(), - linkedItems: = ContentItemPayload>() => - baseElementSchemas.linkedItems - .extend({ - items: z - .array( - z.custom((item) => contentItemSchema().safeParse(item).success, { - error: "Invalid referenced linked item", - }), - ) - .readonly(), - }) - .readonly(), -} as const; - -export const contentItemElementSchema = z - .discriminatedUnion("type", [ - baseElementSchemas.text.readonly(), - baseElementSchemas.number.readonly(), - baseElementSchemas.richText.readonly(), - baseElementSchemas.multipleChoice.readonly(), - baseElementSchemas.dateTime.readonly(), - baseElementSchemas.asset.readonly(), - baseElementSchemas.taxonomy.readonly(), - baseElementSchemas.urlSlug.readonly(), - baseElementSchemas.linkedItems.readonly(), - baseElementSchemas.custom.readonly(), - ]) - .readonly(); +import type { z } from "zod"; +import type { assetValueSchema, contentItemElementSchema } from "./element.schemas.js"; export type Asset = z.infer; diff --git a/lib/queries/content-items/element.schemas.ts b/lib/queries/content-items/element.schemas.ts new file mode 100644 index 00000000..a9181f48 --- /dev/null +++ b/lib/queries/content-items/element.schemas.ts @@ -0,0 +1,167 @@ +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import type { ContentItemPayload } from "./content-item.models.js"; +import { contentItemSchema } from "./content-item.schemas.js"; + +const multipleChoiceOptionSchema = () => + z + .object({ + name: z.string(), + codename: codenameOf(), + }) + .readonly(); + +const taxonomyTermValueSchema = () => + z + .object({ + name: z.string(), + codename: codenameOf(), + }) + .readonly(); + +const renditionSchema = z + .object({ + rendition_id: kontentUuidSchema, + preset_id: kontentUuidSchema, + width: z.number(), + height: z.number(), + query: z.string(), + }) + .readonly(); + +export const assetValueSchema = z + .object({ + name: z.string(), + description: z.string().nullable(), + type: z.string(), + size: z.number(), + url: z.url(), + width: z.number().nullable(), + height: z.number().nullable(), + renditions: z.object({ default: renditionSchema.optional() }).readonly(), + }) + .readonly(); + +const richTextImageSchema = z + .object({ + image_id: z.string(), + description: z.string().nullable(), + url: z.url(), + width: z.number().nullable(), + height: z.number().nullable(), + }) + .readonly(); + +const richTextLinkSchema = z + .object({ + codename: codenameOf(), + type: z.string(), + url_slug: z.string(), + }) + .readonly(); + +/** + * Base element schema as provided by Kontent.ai API + */ +const baseElementSchemas = { + text: z.object({ + type: z.literal("text"), + name: z.string(), + value: z.string(), + }), + number: z.object({ + type: z.literal("number"), + name: z.string(), + value: z.number().nullable(), + }), + richText: z.object({ + type: z.literal("rich_text"), + name: z.string(), + value: z.string(), + images: z.record(z.string(), richTextImageSchema), + links: z.record(z.string(), richTextLinkSchema), + modular_content: z.array(codenameOf()).readonly(), + }), + multipleChoice: z.object({ + type: z.literal("multiple_choice"), + name: z.string(), + value: z.array(multipleChoiceOptionSchema()).readonly(), + }), + dateTime: z.object({ + type: z.literal("date_time"), + name: z.string(), + value: z.string().nullable(), + display_timezone: z.string().nullable(), + }), + asset: z.object({ + type: z.literal("asset"), + name: z.string(), + value: z.array(assetValueSchema).readonly(), + }), + taxonomy: z.object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + value: z.array(taxonomyTermValueSchema()).readonly(), + }), + urlSlug: z.object({ + type: z.literal("url_slug"), + name: z.string(), + value: z.string(), + }), + custom: z.object({ + type: z.literal("custom"), + name: z.string(), + value: z.string().nullable(), + }), + linkedItems: z.object({ + type: z.literal("modular_content"), + name: z.string(), + value: z.array(codenameOf()).readonly(), + }), +} as const; + +/** + * Building blocks for constructing typed content item schemas. + */ +export const elementDef = { + text: baseElementSchemas.text.readonly(), + number: baseElementSchemas.number.readonly(), + richText: baseElementSchemas.richText.readonly(), + multipleChoice: () => + baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), + dateTime: baseElementSchemas.dateTime.readonly(), + asset: baseElementSchemas.asset.readonly(), + taxonomy: () => + baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), + urlSlug: baseElementSchemas.urlSlug.readonly(), + custom: baseElementSchemas.custom.readonly(), + linkedItems: = ContentItemPayload>() => + baseElementSchemas.linkedItems + .extend({ + items: z + .array( + z.custom((item) => contentItemSchema().safeParse(item).success, { + error: "Invalid referenced linked item", + }), + ) + .readonly(), + }) + .readonly(), +} as const; + +export const contentItemElementSchema = z + .discriminatedUnion("type", [ + baseElementSchemas.text.readonly(), + baseElementSchemas.number.readonly(), + baseElementSchemas.richText.readonly(), + baseElementSchemas.multipleChoice.readonly(), + baseElementSchemas.dateTime.readonly(), + baseElementSchemas.asset.readonly(), + baseElementSchemas.taxonomy.readonly(), + baseElementSchemas.urlSlug.readonly(), + baseElementSchemas.linkedItems.readonly(), + baseElementSchemas.custom.readonly(), + ]) + .readonly(); diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 43cfc31a..94e51367 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type FetchContentItemPayload, fetchContentItemSchema } from "./content-item.models.js"; +import type { FetchContentItemPayload } from "./content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery< FetchContentItemPayload, @@ -44,7 +44,7 @@ export function fetchContentItemQuery( return createDeliveryFetchQuery({ config, request, - schema: fetchContentItemSchema(), + schema: async () => (await import("./content-item.schemas.js")).fetchContentItemSchema(), endpoint: `items/${request.codename}`, }); } diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 0b3f78a7..eff2fdb4 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -12,7 +12,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ItemsFeedPayload, itemsFeedSchema } from "./content-item.models.js"; +import type { ContentItemPayload, ItemsFeedPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -58,7 +58,7 @@ export function itemsFeedQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsFeedSchema(), + schema: async () => (await import("./content-item.schemas.js")).itemsFeedSchema(), endpoint: "items-feed", }); } diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index 2ac41670..44aab5e8 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -7,7 +7,7 @@ import type { import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemSystemPayload, type ItemsReferencingAssetPayload, itemsReferencingAssetSchema } from "./content-item.models.js"; +import type { ContentItemSystemPayload, ItemsReferencingAssetPayload } from "./content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< ItemsReferencingAssetPayload, @@ -31,7 +31,7 @@ export function itemsReferencingAssetQuery return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsReferencingAssetSchema(), + schema: async () => (await import("./content-item.schemas.js")).itemsReferencingAssetSchema(), endpoint: `assets/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/items-referencing-item.ts b/lib/queries/content-items/items-referencing-item.ts index 3bf22673..0262d1df 100644 --- a/lib/queries/content-items/items-referencing-item.ts +++ b/lib/queries/content-items/items-referencing-item.ts @@ -7,7 +7,7 @@ import type { import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import { type ContentItemSystemPayload, type ItemsReferencingItemPayload, itemsReferencingItemSchema } from "./content-item.models.js"; +import type { ContentItemSystemPayload, ItemsReferencingItemPayload } from "./content-item.models.js"; export type ItemsReferencingItemQuery = DeliveryPagedFetchQuery< ItemsReferencingItemPayload, @@ -31,7 +31,7 @@ export function itemsReferencingItemQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: itemsReferencingItemSchema(), + schema: async () => (await import("./content-item.schemas.js")).itemsReferencingItemSchema(), endpoint: `items/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index d139253a..fb8cc199 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -7,7 +7,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ContentItemPayload, type ListContentItemsPayload, listContentItemsSchema } from "./content-item.models.js"; +import type { ContentItemPayload, ListContentItemsPayload } from "./content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -60,7 +60,7 @@ export function listContentItemsQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentItemsSchema(), + schema: async () => (await import("./content-item.schemas.js")).listContentItemsSchema(), endpoint: "items", }); } diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/content-type.models.ts index 1b97e8b2..e6838664 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/content-type.models.ts @@ -1,126 +1,6 @@ -import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import type { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.models.js"; - -const contentTypeElementOptionSchema = z - .object({ - name: z.string(), - codename: codenameOf(), - }) - .readonly(); - -const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ - z - .object({ - type: z.literal("text"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("number"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("rich_text"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("multiple_choice"), - name: z.string(), - options: z.array(contentTypeElementOptionSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("date_time"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("asset"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("url_slug"), - name: z.string(), - }) - - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("modular_content"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("custom"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), -]); - -export const contentTypeSchema = () => - z - .object({ - system: z - .object({ - id: kontentUuidSchema, - name: z.string(), - codename: codenameOf(), - last_modified: z.iso.datetime(), - }) - .readonly(), - elements: z.record(codenameOf(), contentTypeAnyElementSchema), - }) - .readonly(); - -export const listContentTypesSchema = () => - z - .object({ - types: z.array(contentTypeSchema()).readonly(), - ...paginationSchema.shape, - }) - .readonly(); - -export const contentTypeElementSchema = () => - z - .intersection( - contentTypeAnyElementSchema, - z - .object({ - // Required only for the endpoint `types/{type}/elements/{element}` - codename: codenameOf(), - }) - .readonly(), - ) - .readonly(); +import type { contentTypeElementSchema, contentTypeSchema, listContentTypesSchema } from "./content-type.schemas.js"; export type ContentTypePayload = z.infer>>; diff --git a/lib/queries/content-types/content-type.schemas.ts b/lib/queries/content-types/content-type.schemas.ts new file mode 100644 index 00000000..8a378993 --- /dev/null +++ b/lib/queries/content-types/content-type.schemas.ts @@ -0,0 +1,123 @@ +import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.schemas.js"; + +const contentTypeElementOptionSchema = z + .object({ + name: z.string(), + codename: codenameOf(), + }) + .readonly(); + +const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ + z + .object({ + type: z.literal("text"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("number"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("rich_text"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("multiple_choice"), + name: z.string(), + options: z.array(contentTypeElementOptionSchema).readonly(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("date_time"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("asset"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("url_slug"), + name: z.string(), + }) + + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("modular_content"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), + z + .object({ + type: z.literal("custom"), + name: z.string(), + }) + .catchall(jsonValueSchema) + .readonly(), +]); + +export const contentTypeSchema = () => + z + .object({ + system: z + .object({ + id: kontentUuidSchema, + name: z.string(), + codename: codenameOf(), + last_modified: z.iso.datetime(), + }) + .readonly(), + elements: z.record(codenameOf(), contentTypeAnyElementSchema), + }) + .readonly(); + +export const listContentTypesSchema = () => + z + .object({ + types: z.array(contentTypeSchema()).readonly(), + ...paginationSchema.shape, + }) + .readonly(); + +export const contentTypeElementSchema = () => + z + .intersection( + contentTypeAnyElementSchema, + z + .object({ + // Required only for the endpoint `types/{type}/elements/{element}` + codename: codenameOf(), + }) + .readonly(), + ) + .readonly(); diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 08cb2d9f..5910a020 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type ContentTypeElementPayload, contentTypeElementSchema } from "./content-type.models.js"; +import type { ContentTypeElementPayload } from "./content-type.models.js"; export type FetchContentTypeElementQuery = DeliveryFetchQuery; @@ -17,7 +17,7 @@ export function fetchContentTypeElementQuery (await import("./content-type.schemas.js")).contentTypeElementSchema(), endpoint: `types/${request.typeCodename}/elements/${request.elementCodename}`, }); } diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 7b93d2bc..d59675c1 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type ContentTypePayload, contentTypeSchema } from "./content-type.models.js"; +import type { ContentTypePayload } from "./content-type.models.js"; type ElementProperties = NonNullable[number]; @@ -22,7 +22,7 @@ export function fetchContentTypeQuery( return createDeliveryFetchQuery({ config, request, - schema: contentTypeSchema(), + schema: async () => (await import("./content-type.schemas.js")).contentTypeSchema(), endpoint: `types/${request.codename}`, }); } diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index ead8bd9c..d1e3f071 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ContentTypePayload, type ListContentTypesPayload, listContentTypesSchema } from "./content-type.models.js"; +import type { ContentTypePayload, ListContentTypesPayload } from "./content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; type ElementProperties = NonNullable[number]; @@ -27,7 +27,7 @@ export function listContentTypesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listContentTypesSchema(), + schema: async () => (await import("./content-type.schemas.js")).listContentTypesSchema(), endpoint: "types", }); } diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index bde92b48..a732fb25 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -36,7 +36,7 @@ export function createDeliveryPagedByUrlQuery; - readonly schema: ZodType; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ @@ -57,7 +57,7 @@ export function createDeliveryPagedByTokenQuery({ }: { readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly schema: ZodType; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ @@ -80,7 +80,7 @@ export function createDeliveryFetchQuery({ }: { readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly schema: ZodType; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): FetchQuery { return createFetchQuery({ @@ -98,7 +98,7 @@ function getSharedRequestData({ readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; - readonly schema: ZodType; + readonly schema: () => Promise>; }): Pick< FetchQueryRequest, | "abortSignal" diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/language.models.ts index b6de754b..6a39cca1 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/language.models.ts @@ -1,28 +1,6 @@ -import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import type { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.models.js"; - -export const languageSchema = () => - z - .object({ - system: z - .object({ - id: kontentUuidSchema, - name: z.string(), - codename: codenameOf(), - }) - .readonly(), - }) - .readonly(); - -export const listLanguagesSchema = () => - z - .object({ - languages: z.array(languageSchema()).readonly(), - ...paginationSchema.shape, - }) - .readonly(); +import type { languageSchema, listLanguagesSchema } from "./language.schemas.js"; export type LanguagePayload = z.infer>>; diff --git a/lib/queries/languages/language.schemas.ts b/lib/queries/languages/language.schemas.ts new file mode 100644 index 00000000..3839118c --- /dev/null +++ b/lib/queries/languages/language.schemas.ts @@ -0,0 +1,25 @@ +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.schemas.js"; + +export const languageSchema = () => + z + .object({ + system: z + .object({ + id: kontentUuidSchema, + name: z.string(), + codename: codenameOf(), + }) + .readonly(), + }) + .readonly(); + +export const listLanguagesSchema = () => + z + .object({ + languages: z.array(languageSchema()).readonly(), + ...paginationSchema.shape, + }) + .readonly(); diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index e2983b1d..ad94fdcf 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type LanguagePayload, type ListLanguagesPayload, listLanguagesSchema } from "./language.models.js"; +import type { LanguagePayload, ListLanguagesPayload } from "./language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery< ListLanguagesPayload, @@ -24,7 +24,7 @@ export function listLanguagesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listLanguagesSchema(), + schema: async () => (await import("./language.schemas.js")).listLanguagesSchema(), endpoint: "languages", }); } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 08bfdc59..1374a2cd 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import { type TaxonomyPayload, taxonomySchema } from "./taxonomy.models.js"; +import type { TaxonomyPayload } from "./taxonomy.models.js"; export type FetchTaxonomyQuery = DeliveryFetchQuery, DeliveryMetadata>; @@ -18,7 +18,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - schema: taxonomySchema(), + schema: async () => (await import("./taxonomy.schemas.js")).taxonomySchema(), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 48f18d7b..e30fcd8a 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import { type ListTaxonomiesPayload, listTaxonomiesSchema, type TaxonomyPayload } from "./taxonomy.models.js"; +import type { ListTaxonomiesPayload, TaxonomyPayload } from "./taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< ListTaxonomiesPayload, @@ -24,7 +24,7 @@ export function listTaxonomiesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: listTaxonomiesSchema(), + schema: async () => (await import("./taxonomy.schemas.js")).listTaxonomiesSchema(), endpoint: "taxonomies", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/taxonomy.models.ts index 8b166bfd..1bded35d 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/taxonomy.models.ts @@ -1,39 +1,6 @@ -import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import type { z } from "zod"; import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.models.js"; - -const taxonomyTermSchema = () => - z.object({ - name: z.string(), - codename: codenameOf(), - get terms() { - return z.array(taxonomyTermSchema()).readonly(); - }, - }); - -export const taxonomySchema = () => - z - .object({ - system: z - .object({ - id: kontentUuidSchema, - name: z.string(), - codename: codenameOf(), - last_modified: z.iso.datetime(), - }) - .readonly(), - terms: z.array(taxonomyTermSchema()).readonly(), - }) - .readonly(); - -export const listTaxonomiesSchema = () => - z - .object({ - taxonomies: z.array(taxonomySchema()).readonly(), - ...paginationSchema.shape, - }) - .readonly(); +import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "./taxonomy.schemas.js"; export type TaxonomyTermPayload = z.infer>>; diff --git a/lib/queries/taxonomies/taxonomy.schemas.ts b/lib/queries/taxonomies/taxonomy.schemas.ts new file mode 100644 index 00000000..30aa4a54 --- /dev/null +++ b/lib/queries/taxonomies/taxonomy.schemas.ts @@ -0,0 +1,36 @@ +import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; +import { z } from "zod"; +import type { DeliveryClientSchema } from "../../models/core.models.js"; +import { paginationSchema } from "../../models/pagination.schemas.js"; + +export const taxonomyTermSchema = () => + z.object({ + name: z.string(), + codename: codenameOf(), + get terms() { + return z.array(taxonomyTermSchema()).readonly(); + }, + }); + +export const taxonomySchema = () => + z + .object({ + system: z + .object({ + id: kontentUuidSchema, + name: z.string(), + codename: codenameOf(), + last_modified: z.iso.datetime(), + }) + .readonly(), + terms: z.array(taxonomyTermSchema()).readonly(), + }) + .readonly(); + +export const listTaxonomiesSchema = () => + z + .object({ + taxonomies: z.array(taxonomySchema()).readonly(), + ...paginationSchema.shape, + }) + .readonly(); diff --git a/package.json b/package.json index 0ca211e7..8384508c 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,16 @@ "engines": { "node": ">= 22" }, - "exports": "./dist/public_api.js", + "exports": { + ".": { + "types": "./dist/public_api.d.ts", + "default": "./dist/public_api.js" + }, + "./typed-items": { + "types": "./dist/public_typed_items.d.ts", + "default": "./dist/public_typed_items.js" + } + }, "types": "./dist/public_api.d.ts", "type": "module", "scripts": { @@ -42,7 +51,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.35", + "@kontent-ai/core-sdk": "^12.0.0-preview.36", "ts-pattern": "^5", "zod": "^4" }, @@ -50,11 +59,11 @@ "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.3.0", - "@biomejs/biome": "2.4.14", - "@types/node": "25.6.0", + "@biomejs/biome": "2.4.15", + "@types/node": "25.6.2", "vitest": "4.1.5", "@vitest/coverage-v8": "4.1.5", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260507.1" + "@typescript/native-preview": "7.0.0-dev.20260511.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ff1aa31..57260d9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.35 - version: 12.0.0-preview.35(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.36 + version: 12.0.0-preview.36(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -19,20 +19,20 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.4.14 - version: 2.4.14 + specifier: 2.4.15 + version: 2.4.15 '@kontent-ai/biome-config': specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.14) + version: 0.7.0(@biomejs/biome@2.4.15) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.6.0 - version: 25.6.0 + specifier: 25.6.2 + version: 25.6.2 '@typescript/native-preview': - specifier: 7.0.0-dev.20260507.1 - version: 7.0.0-dev.20260507.1 + specifier: 7.0.0-dev.20260511.1 + version: 7.0.0-dev.20260511.1 '@vitest/coverage-v8': specifier: 4.1.5 version: 4.1.5(vitest@4.1.5) @@ -44,7 +44,7 @@ importers: version: 4.21.0 vitest: specifier: 4.1.5 - version: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) + version: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) packages: @@ -69,59 +69,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.14': - resolution: {integrity: sha512-TmAvxOEgrpLypzVGJ8FulIZnlyA9TxrO1hyqYrCz9r+bwma9xXxuLA5IuYnj55XQneFx460KjRbx6SWGLkg3bQ==} + '@biomejs/biome@2.4.15': + resolution: {integrity: sha512-j5VH3a/h/HXTKBM50MDMxRCzkeLv9S2XJcW2WgnZT1+xyisi+0bISrXR82gCX+8S9lvK0skEvHJRN+3Ktr2hlw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.14': - resolution: {integrity: sha512-XvgoE9XOawUOQPdmvs4J7wPhi/DLwSCGks3AlPJDmh34O0awRTqCED1HRcRDdpf1Zrp4us4MGOOdIxNpbqNF5Q==} + '@biomejs/cli-darwin-arm64@2.4.15': + resolution: {integrity: sha512-rF3PPqLq1yoST79zaQbDjVJwsuIeci/O+9bgNmC5QpgOqz6aqYuzA4abyAGx+mgyiDXn4A049xAN8gijbuR1Qg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.14': - resolution: {integrity: sha512-jE7hKBCFhOx3uUh+ZkWBfOHxAcILPfhFplNkuID/eZeSTLHzfZzoZxW8fbqY9xXRnPi7jGNAf1iPVR+0yWsM/Q==} + '@biomejs/cli-darwin-x64@2.4.15': + resolution: {integrity: sha512-/5KHXYMfSJs1fNXiX30xFtI8JcCFV6zaVVLxOa0M2sfqBKHkpQhRTv94yxQWxeTY2lzo2OuTlNvPC+hDQt2wcQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.14': - resolution: {integrity: sha512-/z+6gqAqqUQTHazwStxSXKHg9b8UvqBmDFRp+c4wYbq2KXhELQDon9EoC9RpmQ8JWkqQx/lIUy/cs+MhzDZp6A==} + '@biomejs/cli-linux-arm64-musl@2.4.15': + resolution: {integrity: sha512-ZPcxznxm0pogHBLZhYntyR3sR+MrZjqJIKEr7ZqVen0Rl+P/4upVmfYXjftizi9RoqZntg33fv/1fbdhbYXpEQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.14': - resolution: {integrity: sha512-2TELhZnW5RSLL063l9rc5xLpA0ZIw0Ccwy/0q384rvNAgFw3yI76bd59547yxowdQr5MNPET/xDLrLuvgSeeWQ==} + '@biomejs/cli-linux-arm64@2.4.15': + resolution: {integrity: sha512-owaAMZD/T4LrD0ELNCk0Km3qrRHuM0X6EAyVE1FSqGY0rbLoiDLrO4Us2tllm6cAeB2Ioa9C2C08NZPdr8+0Ug==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.14': - resolution: {integrity: sha512-R6BWgJdQOwW9ulJatuTVrQkjnODjqHZkKNOqb1sz++3Noe5LYd0i3PchnOBUCYAPHoPWHhjJqbdZlHEu0hpjdA==} + '@biomejs/cli-linux-x64-musl@2.4.15': + resolution: {integrity: sha512-CNq/9W38SYSH023lfcQ4KKU8K0YX8T//FZUhcgtMMRABDojx5XsMV7jlweAvGSl389wJQB29Qo6Zb/a+jdvt+w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.14': - resolution: {integrity: sha512-zHrlQZDBDUz4OLAraYpWKcnLS6HOewBFWYOzY91d1ZjdqZwibOyb6BEu6WuWLugyo0P3riCmsbV9UqV1cSXwQg==} + '@biomejs/cli-linux-x64@2.4.15': + resolution: {integrity: sha512-0jj7THz12GbUOLmMibktK6DZjqz2zV64KFxyBtcFTKPiiOIY0a7vns1elpO1dERvxpsZ5ik0oFfz0oGwFde1+g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.14': - resolution: {integrity: sha512-M3EH5hqOI/F/FUA2u4xcLoUgmxd218mvuj/6JL7Hv2toQvr2/AdOvKSpGkoRuWFCtQPVa+ZqkEV3Q5xBA9+XSA==} + '@biomejs/cli-win32-arm64@2.4.15': + resolution: {integrity: sha512-ouhkYdlhp/1GghEJPdWwD/Vi3gQ1nFxuSpMolWsbq3Lsq3QUR4jl6UdhhscdCugKU5vOEuMiJhvKj66O0OCq+w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.14': - resolution: {integrity: sha512-WL0EG5qE+EAKomGXbf2g6VnSKJhTL3tXC0QRzWRwA5VpjxNYa6H4P7ZWfymbGE4IhZZQi1KXQ2R0YjwInmz2fA==} + '@biomejs/cli-win32-x64@2.4.15': + resolution: {integrity: sha512-zBrGq5mx5wwpnow4+2BxUvleDM+GNd4sLbPaMapsSLQLD0NGRCquqPBTgN+7XkUteHvj7M+BstuI8tmnV7+HgQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.35': - resolution: {integrity: sha512-1VV3RfjzFCq0Ervuj4XzBmEJBro9n3JB+ZHmNsEHVbmhh1RtxtxHqHVHRWj4wpwl3X5YiKiuC7c1rMUd30BQYw==} + '@kontent-ai/core-sdk@12.0.0-preview.36': + resolution: {integrity: sha512-D5Rl0OG/naig4VO5xyqI0lYTqWfoSH7wTVMgRaWY6MXZXN2qLbTjJWyr/yMpQQr4uwu0BTtifGftWrzE7jc0BA==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -522,8 +522,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.6.2': + resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} '@typescript-eslint/eslint-plugin@8.59.0': resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} @@ -584,50 +584,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-2iWAWthp9tWDkgIOITi6GGQkEDQ8Mf+L28B83FR+MvvbLEtHJ5BIZoBOSBgKP5KW+eHlAv1LFUC9dggq1+NO0Q==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-SYrqVOlapDxDG7FzHBIJbfgaix+mXPkYzYGqwpz/TAhoPA7sgbfAoGLaqi3ut9N88C/OYNhEX4tjz/0PC9i1nw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-pXBJx0gF4D9aNZsFavprlbPzL5clAvHsueaVpb3c7M8wv/3FFCdjK7NJUESxpK3+M1RW5MvNaKR6QTzkdunfvQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-zIe31OYgBvkgTIQEwJtKim6SYyuVTkr+9fK/87hVwKN15X3Ikjeh0C0g2W/Vl4rXeMvy95wBGDN1jpW11DIvgg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-0F2o8sbpSOHR04ghnhWPFsyuH9uew78v3fc2+tplxAnwZ5Wt72hk6Ka0yG07m8D6Ca0SK/GtTVIq7BfjmNCP8w==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-YbmCQXGYkDChGFG7hXJzIgmRjtU1kE5VK/+k322nGnbq4ePqSjS3dS0+ehPATmvfO1XjCDfh3ekED+AtmWk6aQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-i2K4RRVjk9wSMpGcR5G2hKyUowSZMrnSKh5NYx1nVy6srBD7DVrTSBDH+KCVdAVAuZtsl0tOdVJixkRRjOsbpw==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-02b45lpPmYf125PvcnK67WW93N55qwKmtInwfVefV997S17Ib3h6hlCW4e24BDhNsGRCSLhPA4Lu7ZvTq5pLkw==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-dST5xeuhREr73obBJj4j5Dtf0dEQr6WuUyHIoLaVQCX9PZhWk0Iu2/9jJ0+Gtx7fh3jWGcidNPP1SgmSrXP6Sw==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-e+TweaVJFaM96tV1UM1kRfk2y8QBkZtz7+0wcxrDGmyJz3IIRUlg1btocaBkhsmVtQPXMr37RutBBMgpl3vgUg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-21rGqCoY2FgnbY2YQFGoAnaHFs5kagwdCmGdn7GmsdNF7P3zvS1ag56BFRYITZ2xw02xYa0fvbXcIIycysBS1A==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-zgkoGiCpOrly5h8ghcuu6ZNSfrnRqtHoCq584Q92+s4D/j1MU3oKkGPvmkezp5Mj2v7ffR9AjU+lWRDkrfm6eA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-PORjTM6k/7ySuN7qbKKLKPJ5AlSQuZbaDkLsdQglapQySeHcrdjOhFl172U+V954sR+KhrE3ckhuinEH+Vjkug==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-SUm7iVYzKaflol+QwH0Ny5jZtco6PJduI+h/TEg0sgBJzVBa+9RN4I9+Xu9v+EJ1bci3XI7835IRdSP36lCgCw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260507.1': - resolution: {integrity: sha512-1NCr79LEzPErrYtminofTji5EvFDYwJ2JDQfDhcQyP8XVJF93LZ5jiDXcYE2MgqDvwPUpaHMY8seC28jHrc/ew==} + '@typescript/native-preview@7.0.0-dev.20260511.1': + resolution: {integrity: sha512-cUyY4Sr6065280lB6hCwTMCBMTxlEIGjSLzHym28yikA5sFiEsAzlwiU0i+XkTUIqr5K5M/SzSJiioDN+vpjtA==} engines: {node: '>=16.20.0'} hasBin: true @@ -1787,39 +1787,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.14': + '@biomejs/biome@2.4.15': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.14 - '@biomejs/cli-darwin-x64': 2.4.14 - '@biomejs/cli-linux-arm64': 2.4.14 - '@biomejs/cli-linux-arm64-musl': 2.4.14 - '@biomejs/cli-linux-x64': 2.4.14 - '@biomejs/cli-linux-x64-musl': 2.4.14 - '@biomejs/cli-win32-arm64': 2.4.14 - '@biomejs/cli-win32-x64': 2.4.14 + '@biomejs/cli-darwin-arm64': 2.4.15 + '@biomejs/cli-darwin-x64': 2.4.15 + '@biomejs/cli-linux-arm64': 2.4.15 + '@biomejs/cli-linux-arm64-musl': 2.4.15 + '@biomejs/cli-linux-x64': 2.4.15 + '@biomejs/cli-linux-x64-musl': 2.4.15 + '@biomejs/cli-win32-arm64': 2.4.15 + '@biomejs/cli-win32-x64': 2.4.15 - '@biomejs/cli-darwin-arm64@2.4.14': + '@biomejs/cli-darwin-arm64@2.4.15': optional: true - '@biomejs/cli-darwin-x64@2.4.14': + '@biomejs/cli-darwin-x64@2.4.15': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.14': + '@biomejs/cli-linux-arm64-musl@2.4.15': optional: true - '@biomejs/cli-linux-arm64@2.4.14': + '@biomejs/cli-linux-arm64@2.4.15': optional: true - '@biomejs/cli-linux-x64-musl@2.4.14': + '@biomejs/cli-linux-x64-musl@2.4.15': optional: true - '@biomejs/cli-linux-x64@2.4.14': + '@biomejs/cli-linux-x64@2.4.15': optional: true - '@biomejs/cli-win32-arm64@2.4.14': + '@biomejs/cli-win32-arm64@2.4.15': optional: true - '@biomejs/cli-win32-x64@2.4.14': + '@biomejs/cli-win32-x64@2.4.15': optional: true '@emnapi/core@1.10.0': @@ -2015,11 +2015,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.14)': + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.15)': dependencies: - '@biomejs/biome': 2.4.14 + '@biomejs/biome': 2.4.15 - '@kontent-ai/core-sdk@12.0.0-preview.35(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.36(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2115,7 +2115,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.6.0': + '@types/node@25.6.2': dependencies: undici-types: 7.19.2 @@ -2210,36 +2210,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260507.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260507.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260507.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260507.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260507.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260507.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260507.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260511.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260507.1': + '@typescript/native-preview@7.0.0-dev.20260511.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260507.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260507.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260507.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260507.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260507.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260507.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260507.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260511.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260511.1 '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: @@ -2253,7 +2253,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) + vitest: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) '@vitest/expect@4.1.5': dependencies: @@ -2264,13 +2264,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0))': + '@vitest/mocker@4.1.5(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0) '@vitest/pretty-format@4.1.5': dependencies: @@ -3529,7 +3529,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0): + vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3537,15 +3537,15 @@ snapshots: rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 esbuild: 0.27.7 fsevents: 2.3.3 tsx: 4.21.0 - vitest@4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)): + vitest@4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)) + '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -3562,10 +3562,10 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.6.0 + '@types/node': 25.6.2 '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index fd4bae86..e8875b33 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,4 @@ +allowBuilds: + esbuild: true ignoredBuiltDependencies: - - esbuild \ No newline at end of file + - esbuild diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index 0ecadea5..655faad9 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -16,9 +16,8 @@ import type z from "zod"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; -import type { DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; -import { defineContentItem, type InferItemType } from "../lib/queries/content-items/content-item.models.js"; -import { elementDef } from "../lib/queries/content-items/element.models.js"; +import type { DeliveryClient, DeliveryClientSchema, ElementType, InferItemType } from "../lib/public_api.js"; +import { defineContentItem, elementDef } from "../lib/public_typed_items.js"; /** * 1. Schema declaration diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index c68d2edf..8d03fc1a 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type FetchContentItemPayload, fetchContentItemSchema } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { fetchContentItemSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 535eb17d..6e11cfb7 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ItemsFeedPayload, itemsFeedSchema } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { itemsFeedSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index 3fd07c76..43a6bbba 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -1,9 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { - type ItemsReferencingAssetPayload, - itemsReferencingAssetSchema, -} from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts index b9845df7..dc954403 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ItemsReferencingItemPayload, itemsReferencingItemSchema } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { itemsReferencingItemSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-referencing-item-query.payload.js"; diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index d2c34f9a..360323ea 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListContentItemsPayload, listContentItemsSchema } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import { listContentItemsSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 9f60f622..6a4d4b0c 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ContentTypeElementPayload, contentTypeElementSchema } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { contentTypeElementSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import payloads from "./fetch-content-type-element-query.payload.js"; diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index 86325608..339f4d19 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ContentTypePayload, contentTypeSchema } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ContentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { contentTypeSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-type-query.payload.js"; diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index 103e1dc1..d07f1b3c 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListContentTypesPayload, listContentTypesSchema } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import { listContentTypesSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-types-query.payload.js"; diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index 337a40d1..bde229d3 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListLanguagesPayload, listLanguagesSchema } from "../../../../lib/queries/languages/language.models.js"; +import type { ListLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; +import { listLanguagesSchema } from "../../../../lib/queries/languages/language.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-languages-query.payload.js"; diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index b2f2886a..689187f6 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type TaxonomyPayload, taxonomySchema } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { taxonomySchema } from "../../../../lib/queries/taxonomies/taxonomy.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-taxonomy-query.payload.js"; diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index 1cca046f..2bb51112 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -1,6 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { type ListTaxonomiesPayload, listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import { listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/taxonomy.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-taxonomies-query.payload.js"; diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts index c70ad4fb..a23a1345 100644 --- a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -13,7 +13,7 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; -const testSchema: ZodType = z.object({}); +const testSchema: () => Promise> = async () => z.object({}); describe("createDeliveryFetchQuery", () => { it("returns a query with FetchQuery shape", () => { diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index fb6d802f..f3acfe73 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -14,7 +14,7 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; -const testSchema: ZodType = z.object({}); +const testSchema: () => Promise> = async () => z.object({}); describe("createDeliveryPagedByTokenQuery", () => { it("returns a query with PagedFetchQuery shape", () => { diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index 72e5d872..35362033 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -2,7 +2,7 @@ import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; -import { paginationSchema } from "../../../lib/models/pagination.models.js"; +import { paginationSchema } from "../../../lib/models/pagination.schemas.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; @@ -22,7 +22,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const query = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }); expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); @@ -33,7 +33,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint, }); expect(inspect().data?.url?.toString()).toEqual(new URL(getDeliveryUrl({ ...clientConfig, path: endpoint })).toString()); @@ -43,7 +43,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }); expect(inspect().data?.url?.toString()).not.toContain("?"); @@ -54,7 +54,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }); expect(inspect().data?.url?.toString()).not.toContain("?"); @@ -67,7 +67,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }); @@ -83,7 +83,7 @@ describe("createDeliveryPagedByUrlQuery", () => { const { inspect } = createDeliveryPagedByUrlQuery({ config: clientConfig, request, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }); expect(inspect().data?.url?.toString()).toContain(new URLSearchParams("system.type[eq]=movie").toString()); @@ -102,7 +102,7 @@ describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPagesSafe res const { success, nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }).fetchAllPagesSafe({ maxPagesCount: 1 }); @@ -116,7 +116,7 @@ describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPagesSafe res const { success, nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }).fetchAllPagesSafe(); @@ -137,7 +137,7 @@ describe("createDeliveryPagedByUrlQuery — nextPageUrl in fetchAllPages result" const { nextPageUrl } = await createDeliveryPagedByUrlQuery({ config: clientConfig, request: undefined, - schema: paginationSchema, + schema: async () => paginationSchema, endpoint: "items", }).fetchAllPages({ maxPagesCount: 1 }); diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index df0cbdeb..736a1f5e 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -1,8 +1,9 @@ import { describe, expect, test } from "vitest"; import type z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; -import { defineContentItem } from "../../../lib/queries/content-items/content-item.models.js"; -import { type Asset, elementDef } from "../../../lib/queries/content-items/element.models.js"; +import { defineContentItem } from "../../../lib/queries/content-items/content-item.schemas.js"; +import type { Asset } from "../../../lib/queries/content-items/element.models.js"; +import { elementDef } from "../../../lib/queries/content-items/element.schemas.js"; import { getFakeUuid } from "../../utils/test.utils.js"; const schemaInput = { From 229b04cebac8d7a78bf072cba55139bea1ceaa77 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 14:17:03 +0200 Subject: [PATCH 155/221] updates models / schemas structure --- lib/public_api.ts | 38 +++++++++---------- lib/public_typed_items.ts | 4 +- .../content-items/fetch-content-item-query.ts | 4 +- lib/queries/content-items/items-feed-query.ts | 4 +- .../items-referencing-asset-query.ts | 4 +- .../content-items/items-referencing-item.ts | 4 +- .../content-items/list-content-items-query.ts | 4 +- .../{ => models}/content-item.models.ts | 6 +-- .../{ => models}/element-types.ts | 4 +- .../{ => models}/element.models.ts | 2 +- .../{ => schemas}/content-item.schemas.ts | 6 +-- .../{ => schemas}/element.schemas.ts | 4 +- .../fetch-content-type-element-query.ts | 4 +- .../content-types/fetch-content-type-query.ts | 4 +- .../content-types/list-content-types-query.ts | 4 +- .../{ => models}/content-type.models.ts | 4 +- .../{ => schemas}/content-type.schemas.ts | 4 +- lib/queries/languages/list-languages-query.ts | 4 +- .../languages/{ => models}/language.models.ts | 4 +- .../{ => schemas}/language.schemas.ts | 4 +- .../taxonomies/fetch-taxonomy-query.ts | 4 +- .../taxonomies/list-taxonomies-query.ts | 4 +- .../{ => models}/taxonomy.models.ts | 4 +- .../{ => schemas}/taxonomy.schemas.ts | 4 +- sample/typed-content-model.ts | 6 +-- .../fetch-content-item-query.payload.ts | 2 +- .../fetch-content-item-query.spec.ts | 4 +- .../content-items/items-feed-query.payload.ts | 2 +- .../content-items/items-feed-query.spec.ts | 4 +- .../items-referencing-asset-query.spec.ts | 4 +- .../items-referencing-item-query.payload.ts | 2 +- .../items-referencing-item-query.spec.ts | 4 +- .../itesm-referencing-asset-query.payload.ts | 2 +- .../list-content-items-query.payload.ts | 2 +- .../list-content-items-query.spec.ts | 4 +- ...etch-content-type-element-query.payload.ts | 2 +- .../fetch-content-type-element-query.spec.ts | 4 +- .../fetch-content-type-query.payload.ts | 2 +- .../fetch-content-type-query.spec.ts | 4 +- .../list-content-types-query.payload.ts | 2 +- .../list-content-types-query.spec.ts | 4 +- .../languages/list-languages-query.payload.ts | 2 +- .../languages/list-languages-query.spec.ts | 4 +- .../fetch-taxonomy-query.payload.ts | 2 +- .../taxonomies/fetch-taxonomy-query.spec.ts | 4 +- .../list-taxonomies-query.payload.ts | 2 +- .../taxonomies/list-taxonomies-query.spec.ts | 4 +- tests/unit/queries/element-models.spec.ts | 6 +-- .../validation/response-validation.spec.ts | 2 +- 49 files changed, 106 insertions(+), 106 deletions(-) rename lib/queries/content-items/{ => models}/content-item.models.ts (92%) rename lib/queries/content-items/{ => models}/element-types.ts (86%) rename lib/queries/content-items/{ => models}/element.models.ts (87%) rename lib/queries/content-items/{ => schemas}/content-item.schemas.ts (93%) rename lib/queries/content-items/{ => schemas}/element.schemas.ts (96%) rename lib/queries/content-types/{ => models}/content-type.models.ts (76%) rename lib/queries/content-types/{ => schemas}/content-type.schemas.ts (94%) rename lib/queries/languages/{ => models}/language.models.ts (62%) rename lib/queries/languages/{ => schemas}/language.schemas.ts (79%) rename lib/queries/taxonomies/{ => models}/taxonomy.models.ts (79%) rename lib/queries/taxonomies/{ => schemas}/taxonomy.schemas.ts (86%) diff --git a/lib/public_api.ts b/lib/public_api.ts index 8d120d81..3c34e904 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -20,19 +20,6 @@ export type { OrderDirection, SystemOrderQueryParam, } from "./models/request.models.js"; -export type { - ContentItemPayload, - ContentItemSystem, - ContentItemSystemPayload, - FetchContentItemPayload, - InferItemType, - ItemsFeedPayload, - ItemsReferencingAssetPayload, - ItemsReferencingItemPayload, - ListContentItemsPayload, -} from "./queries/content-items/content-item.models.js"; -export type { ContentItemElementPayload } from "./queries/content-items/element.models.js"; -export type * as ElementType from "./queries/content-items/element-types.js"; export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; export type { @@ -45,18 +32,31 @@ export type { } from "./queries/content-items/items-referencing-item.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; export type { - ContentTypeElementPayload, - ContentTypePayload, - ListContentTypesPayload, -} from "./queries/content-types/content-type.models.js"; + ContentItemOf, + ContentItemPayload, + ContentItemSystem, + ContentItemSystemPayload, + FetchContentItemPayload, + ItemsFeedPayload, + ItemsReferencingAssetPayload, + ItemsReferencingItemPayload, + ListContentItemsPayload, +} from "./queries/content-items/models/content-item.models.js"; +export type { ContentItemElementPayload } from "./queries/content-items/models/element.models.js"; +export type * as ElementType from "./queries/content-items/models/element-types.js"; export type { FetchContentTypeElementQuery, FetchContentTypeElementQueryRequest, } from "./queries/content-types/fetch-content-type-element-query.js"; export type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; -export type { LanguagePayload, ListLanguagesPayload } from "./queries/languages/language.models.js"; +export type { + ContentTypeElementPayload, + ContentTypePayload, + ListContentTypesPayload, +} from "./queries/content-types/models/content-type.models.js"; export type { ListLanguagesQuery, ListLanguagesQueryRequest } from "./queries/languages/list-languages-query.js"; +export type { LanguagePayload, ListLanguagesPayload } from "./queries/languages/models/language.models.js"; export type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; export type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "./queries/taxonomies/list-taxonomies-query.js"; -export type { ListTaxonomiesPayload, TaxonomyPayload, TaxonomyTermPayload } from "./queries/taxonomies/taxonomy.models.js"; +export type { ListTaxonomiesPayload, TaxonomyPayload, TaxonomyTermPayload } from "./queries/taxonomies/models/taxonomy.models.js"; diff --git a/lib/public_typed_items.ts b/lib/public_typed_items.ts index d433ccf2..39cf9245 100644 --- a/lib/public_typed_items.ts +++ b/lib/public_typed_items.ts @@ -1,3 +1,3 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the typed-items subpath is fine -export { defineContentItem } from "./queries/content-items/content-item.schemas.js"; -export { elementDef } from "./queries/content-items/element.schemas.js"; +export { defineContentItem } from "./queries/content-items/schemas/content-item.schemas.js"; +export { elementDef } from "./queries/content-items/schemas/element.schemas.js"; diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 94e51367..6810c195 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { FetchContentItemPayload } from "./content-item.models.js"; +import type { FetchContentItemPayload } from "./models/content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery< FetchContentItemPayload, @@ -44,7 +44,7 @@ export function fetchContentItemQuery( return createDeliveryFetchQuery({ config, request, - schema: async () => (await import("./content-item.schemas.js")).fetchContentItemSchema(), + schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), endpoint: `items/${request.codename}`, }); } diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index eff2fdb4..5f4668bd 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -12,7 +12,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ItemsFeedPayload } from "./content-item.models.js"; +import type { ContentItemPayload, ItemsFeedPayload } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -58,7 +58,7 @@ export function itemsFeedQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: async () => (await import("./content-item.schemas.js")).itemsFeedSchema(), + schema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchema(), endpoint: "items-feed", }); } diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index 44aab5e8..e6c489c6 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -7,7 +7,7 @@ import type { import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemSystemPayload, ItemsReferencingAssetPayload } from "./content-item.models.js"; +import type { ContentItemSystemPayload, ItemsReferencingAssetPayload } from "./models/content-item.models.js"; export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< ItemsReferencingAssetPayload, @@ -31,7 +31,7 @@ export function itemsReferencingAssetQuery return createDeliveryPagedByTokenQuery({ config, request, - schema: async () => (await import("./content-item.schemas.js")).itemsReferencingAssetSchema(), + schema: async () => (await import("./schemas/content-item.schemas.js")).itemsReferencingAssetSchema(), endpoint: `assets/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/items-referencing-item.ts b/lib/queries/content-items/items-referencing-item.ts index 0262d1df..b7ad2d5c 100644 --- a/lib/queries/content-items/items-referencing-item.ts +++ b/lib/queries/content-items/items-referencing-item.ts @@ -7,7 +7,7 @@ import type { import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemSystemPayload, ItemsReferencingItemPayload } from "./content-item.models.js"; +import type { ContentItemSystemPayload, ItemsReferencingItemPayload } from "./models/content-item.models.js"; export type ItemsReferencingItemQuery = DeliveryPagedFetchQuery< ItemsReferencingItemPayload, @@ -31,7 +31,7 @@ export function itemsReferencingItemQuery( return createDeliveryPagedByTokenQuery({ config, request, - schema: async () => (await import("./content-item.schemas.js")).itemsReferencingItemSchema(), + schema: async () => (await import("./schemas/content-item.schemas.js")).itemsReferencingItemSchema(), endpoint: `items/${request.codename}/used-in`, }); } diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index fb8cc199..267d4cca 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -7,7 +7,7 @@ import type { SystemOrderQueryParam, } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ListContentItemsPayload } from "./content-item.models.js"; +import type { ContentItemPayload, ListContentItemsPayload } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -60,7 +60,7 @@ export function listContentItemsQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: async () => (await import("./content-item.schemas.js")).listContentItemsSchema(), + schema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchema(), endpoint: "items", }); } diff --git a/lib/queries/content-items/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts similarity index 92% rename from lib/queries/content-items/content-item.models.ts rename to lib/queries/content-items/models/content-item.models.ts index d724b30d..9a28a1f9 100644 --- a/lib/queries/content-items/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -1,5 +1,5 @@ import type { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { contentItemSchema, contentItemSystemSchema, @@ -9,7 +9,7 @@ import type { itemsReferencingAssetSchema, itemsReferencingItemSchema, listContentItemsSchema, -} from "./content-item.schemas.js"; +} from "../schemas/content-item.schemas.js"; import type { ContentItemElementPayload } from "./element.models.js"; export type ContentItemElementShape = Record; @@ -19,7 +19,7 @@ export type ContentItemSystem< TTypeCodename extends TSchema["contentTypeCodenames"][number], > = z.infer>>; -export type InferItemType< +export type ContentItemOf< TSchema extends DeliveryClientSchema, TTypeCodename extends TSchema["contentTypeCodenames"][number], TElements extends ContentItemElementShape, diff --git a/lib/queries/content-items/element-types.ts b/lib/queries/content-items/models/element-types.ts similarity index 86% rename from lib/queries/content-items/element-types.ts rename to lib/queries/content-items/models/element-types.ts index 17162499..da734d5e 100644 --- a/lib/queries/content-items/element-types.ts +++ b/lib/queries/content-items/models/element-types.ts @@ -1,7 +1,7 @@ import type z from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { elementDef } from "../schemas/element.schemas.js"; import type { ContentItemPayload } from "./content-item.models.js"; -import type { elementDef } from "./element.schemas.js"; export type Text = z.infer; export type Number = z.infer; diff --git a/lib/queries/content-items/element.models.ts b/lib/queries/content-items/models/element.models.ts similarity index 87% rename from lib/queries/content-items/element.models.ts rename to lib/queries/content-items/models/element.models.ts index 538a6801..cfe6ec7f 100644 --- a/lib/queries/content-items/element.models.ts +++ b/lib/queries/content-items/models/element.models.ts @@ -1,5 +1,5 @@ import type { z } from "zod"; -import type { assetValueSchema, contentItemElementSchema } from "./element.schemas.js"; +import type { assetValueSchema, contentItemElementSchema } from "../schemas/element.schemas.js"; export type Asset = z.infer; diff --git a/lib/queries/content-items/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts similarity index 93% rename from lib/queries/content-items/content-item.schemas.ts rename to lib/queries/content-items/schemas/content-item.schemas.ts index caa465e1..67a2c748 100644 --- a/lib/queries/content-items/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -1,8 +1,8 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationWithTotalCountSchema } from "../../models/pagination.schemas.js"; -import type { ContentItemElementShape } from "./content-item.models.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import { paginationWithTotalCountSchema } from "../../../models/pagination.schemas.js"; +import type { ContentItemElementShape } from "../models/content-item.models.js"; import { contentItemElementSchema } from "./element.schemas.js"; type ElementSchemasOf = { diff --git a/lib/queries/content-items/element.schemas.ts b/lib/queries/content-items/schemas/element.schemas.ts similarity index 96% rename from lib/queries/content-items/element.schemas.ts rename to lib/queries/content-items/schemas/element.schemas.ts index a9181f48..45366a79 100644 --- a/lib/queries/content-items/element.schemas.ts +++ b/lib/queries/content-items/schemas/element.schemas.ts @@ -1,7 +1,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import type { ContentItemPayload } from "./content-item.models.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { ContentItemPayload } from "../models/content-item.models.js"; import { contentItemSchema } from "./content-item.schemas.js"; const multipleChoiceOptionSchema = () => diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 5910a020..1679cfb6 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { ContentTypeElementPayload } from "./content-type.models.js"; +import type { ContentTypeElementPayload } from "./models/content-type.models.js"; export type FetchContentTypeElementQuery = DeliveryFetchQuery; @@ -17,7 +17,7 @@ export function fetchContentTypeElementQuery (await import("./content-type.schemas.js")).contentTypeElementSchema(), + schema: async () => (await import("./schemas/content-type.schemas.js")).contentTypeElementSchema(), endpoint: `types/${request.typeCodename}/elements/${request.elementCodename}`, }); } diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index d59675c1..7eadf0e7 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { ContentTypePayload } from "./content-type.models.js"; +import type { ContentTypePayload } from "./models/content-type.models.js"; type ElementProperties = NonNullable[number]; @@ -22,7 +22,7 @@ export function fetchContentTypeQuery( return createDeliveryFetchQuery({ config, request, - schema: async () => (await import("./content-type.schemas.js")).contentTypeSchema(), + schema: async () => (await import("./schemas/content-type.schemas.js")).contentTypeSchema(), endpoint: `types/${request.codename}`, }); } diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index d1e3f071..8149ba80 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentTypePayload, ListContentTypesPayload } from "./content-type.models.js"; +import type { ContentTypePayload, ListContentTypesPayload } from "./models/content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; type ElementProperties = NonNullable[number]; @@ -27,7 +27,7 @@ export function listContentTypesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: async () => (await import("./content-type.schemas.js")).listContentTypesSchema(), + schema: async () => (await import("./schemas/content-type.schemas.js")).listContentTypesSchema(), endpoint: "types", }); } diff --git a/lib/queries/content-types/content-type.models.ts b/lib/queries/content-types/models/content-type.models.ts similarity index 76% rename from lib/queries/content-types/content-type.models.ts rename to lib/queries/content-types/models/content-type.models.ts index e6838664..7e4edceb 100644 --- a/lib/queries/content-types/content-type.models.ts +++ b/lib/queries/content-types/models/content-type.models.ts @@ -1,6 +1,6 @@ import type { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import type { contentTypeElementSchema, contentTypeSchema, listContentTypesSchema } from "./content-type.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { contentTypeElementSchema, contentTypeSchema, listContentTypesSchema } from "../schemas/content-type.schemas.js"; export type ContentTypePayload = z.infer>>; diff --git a/lib/queries/content-types/content-type.schemas.ts b/lib/queries/content-types/schemas/content-type.schemas.ts similarity index 94% rename from lib/queries/content-types/content-type.schemas.ts rename to lib/queries/content-types/schemas/content-type.schemas.ts index 8a378993..75bf0a57 100644 --- a/lib/queries/content-types/content-type.schemas.ts +++ b/lib/queries/content-types/schemas/content-type.schemas.ts @@ -1,7 +1,7 @@ import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import { paginationSchema } from "../../../models/pagination.schemas.js"; const contentTypeElementOptionSchema = z .object({ diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index ad94fdcf..cc3762fe 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { LanguagePayload, ListLanguagesPayload } from "./language.models.js"; +import type { LanguagePayload, ListLanguagesPayload } from "./models/language.models.js"; export type ListLanguagesQuery = DeliveryPagedFetchQuery< ListLanguagesPayload, @@ -24,7 +24,7 @@ export function listLanguagesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: async () => (await import("./language.schemas.js")).listLanguagesSchema(), + schema: async () => (await import("./schemas/language.schemas.js")).listLanguagesSchema(), endpoint: "languages", }); } diff --git a/lib/queries/languages/language.models.ts b/lib/queries/languages/models/language.models.ts similarity index 62% rename from lib/queries/languages/language.models.ts rename to lib/queries/languages/models/language.models.ts index 6a39cca1..1a4ac4b5 100644 --- a/lib/queries/languages/language.models.ts +++ b/lib/queries/languages/models/language.models.ts @@ -1,6 +1,6 @@ import type { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import type { languageSchema, listLanguagesSchema } from "./language.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { languageSchema, listLanguagesSchema } from "../schemas/language.schemas.js"; export type LanguagePayload = z.infer>>; diff --git a/lib/queries/languages/language.schemas.ts b/lib/queries/languages/schemas/language.schemas.ts similarity index 79% rename from lib/queries/languages/language.schemas.ts rename to lib/queries/languages/schemas/language.schemas.ts index 3839118c..a2cf0b9c 100644 --- a/lib/queries/languages/language.schemas.ts +++ b/lib/queries/languages/schemas/language.schemas.ts @@ -1,7 +1,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import { paginationSchema } from "../../../models/pagination.schemas.js"; export const languageSchema = () => z diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 1374a2cd..aab129f8 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,7 +1,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { TaxonomyPayload } from "./taxonomy.models.js"; +import type { TaxonomyPayload } from "./models/taxonomy.models.js"; export type FetchTaxonomyQuery = DeliveryFetchQuery, DeliveryMetadata>; @@ -18,7 +18,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - schema: async () => (await import("./taxonomy.schemas.js")).taxonomySchema(), + schema: async () => (await import("./schemas/taxonomy.schemas.js")).taxonomySchema(), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index e30fcd8a..129cc84f 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -2,7 +2,7 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ListTaxonomiesPayload, TaxonomyPayload } from "./taxonomy.models.js"; +import type { ListTaxonomiesPayload, TaxonomyPayload } from "./models/taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< ListTaxonomiesPayload, @@ -24,7 +24,7 @@ export function listTaxonomiesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: async () => (await import("./taxonomy.schemas.js")).listTaxonomiesSchema(), + schema: async () => (await import("./schemas/taxonomy.schemas.js")).listTaxonomiesSchema(), endpoint: "taxonomies", }); } diff --git a/lib/queries/taxonomies/taxonomy.models.ts b/lib/queries/taxonomies/models/taxonomy.models.ts similarity index 79% rename from lib/queries/taxonomies/taxonomy.models.ts rename to lib/queries/taxonomies/models/taxonomy.models.ts index 1bded35d..bb088a3d 100644 --- a/lib/queries/taxonomies/taxonomy.models.ts +++ b/lib/queries/taxonomies/models/taxonomy.models.ts @@ -1,6 +1,6 @@ import type { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "./taxonomy.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "../schemas/taxonomy.schemas.js"; export type TaxonomyTermPayload = z.infer>>; diff --git a/lib/queries/taxonomies/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts similarity index 86% rename from lib/queries/taxonomies/taxonomy.schemas.ts rename to lib/queries/taxonomies/schemas/taxonomy.schemas.ts index 30aa4a54..8ef73901 100644 --- a/lib/queries/taxonomies/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -1,7 +1,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import { z } from "zod"; -import type { DeliveryClientSchema } from "../../models/core.models.js"; -import { paginationSchema } from "../../models/pagination.schemas.js"; +import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import { paginationSchema } from "../../../models/pagination.schemas.js"; export const taxonomyTermSchema = () => z.object({ diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index 655faad9..b1cc7ee0 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -16,7 +16,7 @@ import type z from "zod"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; -import type { DeliveryClient, DeliveryClientSchema, ElementType, InferItemType } from "../lib/public_api.js"; +import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; import { defineContentItem, elementDef } from "../lib/public_typed_items.js"; /** @@ -51,7 +51,7 @@ export type ActorElements = { }; // Fully-typed Actor item payload (system metadata + elements). -export type Actor = InferItemType; +export type Actor = ContentItemOf; // Runtime Zod schema for parsing Actor items into the typed `Actor` payload. export const actorSchema: z.ZodType = defineContentItem("actor", { @@ -82,7 +82,7 @@ export type MovieElements = { }; // Fully-typed Movie item payload. -export type Movie = InferItemType; +export type Movie = ContentItemOf; export const movieSchema: z.ZodType = defineContentItem("movie", { title: elementDef.text, diff --git a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts index 69d1ded7..6207e64a 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; export default { item: { diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index 8d03fc1a..bc844948 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; -import { fetchContentItemSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; +import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { fetchContentItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-feed-query.payload.ts b/tests/integration/queries/content-items/items-feed-query.payload.ts index e2852769..eb95033c 100644 --- a/tests/integration/queries/content-items/items-feed-query.payload.ts +++ b/tests/integration/queries/content-items/items-feed-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; export default { items: [ diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 6e11cfb7..1e1a0389 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/content-item.models.js"; -import { itemsFeedSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; +import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { itemsFeedSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index 43a6bbba..a9dc1f5f 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/content-item.models.js"; -import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; +import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; diff --git a/tests/integration/queries/content-items/items-referencing-item-query.payload.ts b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts index 44a7f4c8..35b3e67d 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.payload.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; export default { items: [ diff --git a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts index dc954403..d0426b65 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/content-item.models.js"; -import { itemsReferencingItemSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; +import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { itemsReferencingItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-referencing-item-query.payload.js"; diff --git a/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts b/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts index 66481ae8..17f89874 100644 --- a/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts +++ b/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; export default { items: [ diff --git a/tests/integration/queries/content-items/list-content-items-query.payload.ts b/tests/integration/queries/content-items/list-content-items-query.payload.ts index ba883da0..a34cec5f 100644 --- a/tests/integration/queries/content-items/list-content-items-query.payload.ts +++ b/tests/integration/queries/content-items/list-content-items-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; +import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; export default { items: [ diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 360323ea..0a4191b5 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/content-item.models.js"; -import { listContentItemsSchema } from "../../../../lib/queries/content-items/content-item.schemas.js"; +import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts index fd1086d5..052e2999 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; export default [ { diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 6a4d4b0c..1916a827 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/content-type.models.js"; -import { contentTypeElementSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; +import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; +import { contentTypeElementSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import payloads from "./fetch-content-type-element-query.payload.js"; diff --git a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts index a3e15c87..120e2fd2 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ContentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; export default { system: { diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index 339f4d19..8e695f2a 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ContentTypePayload } from "../../../../lib/queries/content-types/content-type.models.js"; -import { contentTypeSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; +import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; +import { contentTypeSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-type-query.payload.js"; diff --git a/tests/integration/queries/content-types/list-content-types-query.payload.ts b/tests/integration/queries/content-types/list-content-types-query.payload.ts index 583f5eed..c74b47a6 100644 --- a/tests/integration/queries/content-types/list-content-types-query.payload.ts +++ b/tests/integration/queries/content-types/list-content-types-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; +import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; export default { types: [ diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index d07f1b3c..17d8a147 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/content-type.models.js"; -import { listContentTypesSchema } from "../../../../lib/queries/content-types/content-type.schemas.js"; +import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; +import { listContentTypesSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-types-query.payload.js"; diff --git a/tests/integration/queries/languages/list-languages-query.payload.ts b/tests/integration/queries/languages/list-languages-query.payload.ts index d6710d72..c6c0922c 100644 --- a/tests/integration/queries/languages/list-languages-query.payload.ts +++ b/tests/integration/queries/languages/list-languages-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; +import type { ListLanguagesPayload } from "../../../../lib/queries/languages/models/language.models.js"; export default { languages: [ diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index bde229d3..8a277d4b 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListLanguagesPayload } from "../../../../lib/queries/languages/language.models.js"; -import { listLanguagesSchema } from "../../../../lib/queries/languages/language.schemas.js"; +import type { ListLanguagesPayload } from "../../../../lib/queries/languages/models/language.models.js"; +import { listLanguagesSchema } from "../../../../lib/queries/languages/schemas/language.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-languages-query.payload.js"; diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts index 047db5f6..f45b406b 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; export default { system: { diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index 689187f6..0be9563a 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; -import { taxonomySchema } from "../../../../lib/queries/taxonomies/taxonomy.schemas.js"; +import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; +import { taxonomySchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-taxonomy-query.payload.js"; diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts index 23f55457..4c30ad9c 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts @@ -1,5 +1,5 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; +import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; export default { taxonomies: [ diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index 2bb51112..33dfa5cf 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/taxonomy.models.js"; -import { listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/taxonomy.schemas.js"; +import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; +import { listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-taxonomies-query.payload.js"; diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index 736a1f5e..e1e37c1d 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -1,9 +1,9 @@ import { describe, expect, test } from "vitest"; import type z from "zod"; import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; -import { defineContentItem } from "../../../lib/queries/content-items/content-item.schemas.js"; -import type { Asset } from "../../../lib/queries/content-items/element.models.js"; -import { elementDef } from "../../../lib/queries/content-items/element.schemas.js"; +import type { Asset } from "../../../lib/queries/content-items/models/element.models.js"; +import { defineContentItem } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { elementDef } from "../../../lib/queries/content-items/schemas/element.schemas.js"; import { getFakeUuid } from "../../utils/test.utils.js"; const schemaInput = { diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index 3576e17c..5dc9e666 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -5,7 +5,7 @@ import { ZodError } from "zod"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { PaginationPayload } from "../../../lib/public_api.js"; -import type { ListLanguagesPayload } from "../../../lib/queries/languages/language.models.js"; +import type { ListLanguagesPayload } from "../../../lib/queries/languages/models/language.models.js"; import { getFakeUuid, unitEnvironmentId } from "../../utils/test.utils.js"; describe("Response validation", () => { From b20cd27c68aa9d39fbbde43aa8ea68c12861d105 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 11 May 2026 14:59:12 +0200 Subject: [PATCH 156/221] fixes tests --- .../fetch-content-item-query.spec.ts | 4 ++-- .../content-items/items-feed-query.spec.ts | 4 ++-- .../items-referencing-asset-query.spec.ts | 4 ++-- .../items-referencing-item-query.spec.ts | 4 ++-- .../list-content-items-query.spec.ts | 4 ++-- ...fetch-content-type-element-query.payload.ts | 3 +-- .../fetch-content-type-element-query.spec.ts | 7 +++---- .../fetch-content-type-query.spec.ts | 10 +++++----- .../list-content-types-query.spec.ts | 4 ++-- .../languages/list-languages-query.spec.ts | 4 ++-- .../taxonomies/fetch-taxonomy-query.spec.ts | 4 ++-- .../taxonomies/list-taxonomies-query.spec.ts | 4 ++-- tests/utils/integration-test.utils.ts | 18 ++++++------------ 13 files changed, 33 insertions(+), 41 deletions(-) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index bc844948..2644541b 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { fetchContentItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; describe("Fetch content item query", async () => { @@ -11,6 +11,6 @@ describe("Fetch content item query", async () => { endpoint: `items/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchContentItem({ codename }), - expectedSchema: fetchContentItemSchema(getIntegrationTestsSchema()), + expectedSchema: fetchContentItemSchema(), }); }); diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 1e1a0389..248cde31 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsFeedSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; describe("Items feed query", async () => { @@ -10,6 +10,6 @@ describe("Items feed query", async () => { endpoint: "items-feed", unitTestPayload, selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedSchema(getIntegrationTestsSchema()), + expectedSchema: itemsFeedSchema(), }); }); diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index a9dc1f5f..60a23ca0 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; describe("Items referencing asset query", async () => { @@ -11,6 +11,6 @@ describe("Items referencing asset query", async () => { endpoint: `assets/${assetCodename}/used-in`, unitTestPayload, selectQuery: (client) => client.itemsReferencingAsset({ codename: assetCodename }), - expectedSchema: itemsReferencingAssetSchema(getIntegrationTestsSchema()), + expectedSchema: itemsReferencingAssetSchema(), }); }); diff --git a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts index d0426b65..09d3fe74 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsReferencingItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-referencing-item-query.payload.js"; describe("Items referencing item query", async () => { @@ -11,6 +11,6 @@ describe("Items referencing item query", async () => { endpoint: `items/${itemCodename}/used-in`, unitTestPayload, selectQuery: (client) => client.itemsReferencingItem({ codename: itemCodename }), - expectedSchema: itemsReferencingItemSchema(getIntegrationTestsSchema()), + expectedSchema: itemsReferencingItemSchema(), }); }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 0a4191b5..30d307e4 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; describe("List content items query", async () => { @@ -10,6 +10,6 @@ describe("List content items query", async () => { endpoint: "items", unitTestPayload, selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsSchema(getIntegrationTestsSchema()), + expectedSchema: listContentItemsSchema(), }); }); diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts index 052e2999..8c75d5e5 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.payload.ts @@ -1,4 +1,3 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; export default [ @@ -59,4 +58,4 @@ export default [ name: "Cast", codename: "cast", }, -] satisfies readonly ContentTypeElementPayload[]; +] satisfies readonly ContentTypeElementPayload[]; diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 1916a827..98a3b7d0 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -1,19 +1,18 @@ import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { contentTypeElementSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import payloads from "./fetch-content-type-element-query.payload.js"; describe("Fetch content type element query", async () => { const typeCodename = "movie"; const tests: readonly Promise[] = payloads.map(async (payload) => - runQueryTestsAsync>({ + runQueryTestsAsync({ endpoint: `types/${typeCodename}/elements/${payload.codename}`, unitTestPayload: payload, selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename: payload.codename }), - expectedSchema: contentTypeElementSchema(getIntegrationTestsSchema()), + expectedSchema: contentTypeElementSchema(), }), ); diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index 8e695f2a..d0c3ea41 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { contentTypeSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-type-query.payload.js"; describe("Fetch content type query", async () => { @@ -11,7 +11,7 @@ describe("Fetch content type query", async () => { endpoint: `types/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchContentType({ codename: codename }), - expectedSchema: contentTypeSchema(getIntegrationTestsSchema()), + expectedSchema: contentTypeSchema(), }); }); @@ -32,7 +32,7 @@ describe("Fetch Content Type Query — Extra Field in Element", async () => { }, }; - const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema().safeParseAsync(payload); it("parses successfully when extra fields are present in an element", () => { expect(success).toBeTruthy(); @@ -55,7 +55,7 @@ describe("Fetch Content Type Query — Invalid Field Type in Element", async () }, }; - const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema().safeParseAsync(payload); it("fails to parse when an invalid field type is present in element", () => { expect(success).toBeFalsy(); @@ -77,7 +77,7 @@ describe("Fetch Content Type Query — Missing System Field", async () => { }, }; - const { success } = await contentTypeSchema(getIntegrationTestsSchema()).safeParseAsync(payload); + const { success } = await contentTypeSchema().safeParseAsync(payload); it("fails to parse when the system field is missing", () => { expect(success).toBeFalsy(); diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index 17d8a147..6f307012 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { listContentTypesSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-types-query.payload.js"; describe("List content types query", async () => { @@ -10,6 +10,6 @@ describe("List content types query", async () => { endpoint: "types", unitTestPayload, selectQuery: (client) => client.listContentTypes(), - expectedSchema: listContentTypesSchema(getIntegrationTestsSchema()), + expectedSchema: listContentTypesSchema(), }); }); diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index 8a277d4b..4df63f30 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../../lib/queries/languages/models/language.models.js"; import { listLanguagesSchema } from "../../../../lib/queries/languages/schemas/language.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-languages-query.payload.js"; describe("List languages query", async () => { @@ -10,6 +10,6 @@ describe("List languages query", async () => { endpoint: "languages", unitTestPayload, selectQuery: (client) => client.listLanguages(), - expectedSchema: listLanguagesSchema(getIntegrationTestsSchema()), + expectedSchema: listLanguagesSchema(), }); }); diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index 0be9563a..8d36d7d7 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; import { taxonomySchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-taxonomy-query.payload.js"; describe("Fetch taxonomy query", async () => { @@ -11,6 +11,6 @@ describe("Fetch taxonomy query", async () => { endpoint: `taxonomies/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchTaxonomy({ codename: codename }), - expectedSchema: taxonomySchema(getIntegrationTestsSchema()), + expectedSchema: taxonomySchema(), }); }); diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index 33dfa5cf..32150120 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; import { listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; -import { getIntegrationTestsSchema, runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-taxonomies-query.payload.js"; describe("List taxonomies query", async () => { @@ -10,6 +10,6 @@ describe("List taxonomies query", async () => { endpoint: "taxonomies", unitTestPayload, selectQuery: (client) => client.listTaxonomies(), - expectedSchema: listTaxonomiesSchema(getIntegrationTestsSchema()), + expectedSchema: listTaxonomiesSchema(), }); }); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index fe69b415..289aff2e 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -23,18 +23,6 @@ type SelectQuery = ( client: DeliveryClient, ) => FetchQuery | PagedFetchQuery; -export function getIntegrationTestsSchema(): DeliveryClientSchema { - return { - languageCodenames: [], - taxonomyCodenames: [], - contentTypeCodenames: [], - elementCodenames: [], - collectionCodenames: [], - workflowCodenames: [], - workflowStepCodenames: [], - }; -} - export async function runQueryTestsAsync({ endpoint, unitTestPayload, @@ -124,6 +112,9 @@ function createUnitTestClient(unitTestPayloa return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, + runtimeValidation: { + validateResponses: true, + }, httpService: getTestHttpServiceWithJsonResponse({ jsonResponse: unitTestPayload, statusCode: 200, @@ -135,6 +126,9 @@ function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: Bas return createDeliveryClient({ apiMode: "public", environmentId, + runtimeValidation: { + validateResponses: true, + }, ...(deliveryBaseUrl ? { baseUrl: deliveryBaseUrl } : {}), }); } From ebf8e0295a2110cdb32e64c4e0777a797a433fe2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 12 May 2026 14:53:51 +0200 Subject: [PATCH 157/221] updates deps, set sideEffects, cover entire lib in test --- lib/queries/delivery-queries.ts | 4 +- package.json | 11 +- pnpm-lock.yaml | 216 +++++++++--------- sample/safe-vs-unsafe-queries.ts | 4 +- .../validation/response-validation.spec.ts | 2 +- tests/utils/test.utils.ts | 3 +- vitest.config.ts | 2 +- 7 files changed, 120 insertions(+), 122 deletions(-) diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index a732fb25..58afcdcb 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -82,8 +82,8 @@ export function createDeliveryFetchQuery({ readonly config: DeliveryClientConfig; readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; -}): FetchQuery { - return createFetchQuery({ +}): FetchQuery { + return createFetchQuery({ ...getSharedRequestData({ config, endpoint, schema: schema, request }), mapMetadata: () => ({}), }); diff --git a/package.json b/package.json index 8384508c..7417aa4f 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ }, "types": "./dist/public_api.d.ts", "type": "module", + "sideEffects": false, "scripts": { "prepublishOnly": "pnpm run build", "eslint": "eslint -c eslint.config.mjs .", @@ -51,7 +52,7 @@ "update:version": "tsx ./scripts/update-version.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.36", + "@kontent-ai/core-sdk": "^12.0.0-preview.38", "ts-pattern": "^5", "zod": "^4" }, @@ -60,10 +61,10 @@ "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.3.0", "@biomejs/biome": "2.4.15", - "@types/node": "25.6.2", - "vitest": "4.1.5", - "@vitest/coverage-v8": "4.1.5", + "@types/node": "25.7.0", + "vitest": "4.1.6", + "@vitest/coverage-v8": "4.1.6", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260511.1" + "@typescript/native-preview": "7.0.0-dev.20260512.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57260d9c..70fb0146 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.36 - version: 12.0.0-preview.36(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.38 + version: 12.0.0-preview.38(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -28,14 +28,14 @@ importers: specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.6.2 - version: 25.6.2 + specifier: 25.7.0 + version: 25.7.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260511.1 - version: 7.0.0-dev.20260511.1 + specifier: 7.0.0-dev.20260512.1 + version: 7.0.0-dev.20260512.1 '@vitest/coverage-v8': - specifier: 4.1.5 - version: 4.1.5(vitest@4.1.5) + specifier: 4.1.6 + version: 4.1.6(vitest@4.1.6) eslint: specifier: 10.3.0 version: 10.3.0 @@ -43,8 +43,8 @@ importers: specifier: 4.21.0 version: 4.21.0 vitest: - specifier: 4.1.5 - version: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) + specifier: 4.1.6 + version: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) packages: @@ -384,8 +384,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.36': - resolution: {integrity: sha512-D5Rl0OG/naig4VO5xyqI0lYTqWfoSH7wTVMgRaWY6MXZXN2qLbTjJWyr/yMpQQr4uwu0BTtifGftWrzE7jc0BA==} + '@kontent-ai/core-sdk@12.0.0-preview.38': + resolution: {integrity: sha512-18QxlL6s5AN35oJurDHNl01ZzTWB5exAbNFbT2dyPbBE3OS3YV2hZPhGr+ygPMvvlGtRdZONMkyyLznnShxpqQ==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -522,8 +522,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} '@typescript-eslint/eslint-plugin@8.59.0': resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} @@ -584,67 +584,67 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-SYrqVOlapDxDG7FzHBIJbfgaix+mXPkYzYGqwpz/TAhoPA7sgbfAoGLaqi3ut9N88C/OYNhEX4tjz/0PC9i1nw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-l9AJi/TIVMPx5R1c7fxZCSA7eUaHeA0C9Mxdxx/oQJo1K/GtbI3mzYe/SiKNltko1KSdKUmWVhPwxTOS289REg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-zIe31OYgBvkgTIQEwJtKim6SYyuVTkr+9fK/87hVwKN15X3Ikjeh0C0g2W/Vl4rXeMvy95wBGDN1jpW11DIvgg==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-oABZLQrfB8JN2Ct2CiLK5PyE28Em3sIJlZsAMD45/A2ymtIaa5826dwv8vapE5Wjp54ao0LXxCSuKFm1A8zzCQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-YbmCQXGYkDChGFG7hXJzIgmRjtU1kE5VK/+k322nGnbq4ePqSjS3dS0+ehPATmvfO1XjCDfh3ekED+AtmWk6aQ==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-xvbwzpTe+5N6bnBI/t9n4zsGzXxz3V6rVbvDUoJmRLfav5fz+ck0QDkGQGUPrQEEIp0KEzQvx7c+AEZnzdvTQA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-02b45lpPmYf125PvcnK67WW93N55qwKmtInwfVefV997S17Ib3h6hlCW4e24BDhNsGRCSLhPA4Lu7ZvTq5pLkw==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-0Hs1Gqa/t9cthoPdqHud1pFGUr9DgJivBTjwquTUh8jt/6PI2bQxoMNZLiN/bhqeDFDTzdxoMBfCaytsTMcXqw==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-e+TweaVJFaM96tV1UM1kRfk2y8QBkZtz7+0wcxrDGmyJz3IIRUlg1btocaBkhsmVtQPXMr37RutBBMgpl3vgUg==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-qr5h6FPo74bN/U+EwRuayBhUbxaji8xzFbIbhMOA2oYSc/qozp5ia2g1+9xGw67MXxPPw/IPT+UGvrNK7K1NeQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-zgkoGiCpOrly5h8ghcuu6ZNSfrnRqtHoCq584Q92+s4D/j1MU3oKkGPvmkezp5Mj2v7ffR9AjU+lWRDkrfm6eA==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-meNWxhNEfaqos2U0JXvfxWvy4JWrKE9fZepCndDZi+t04X+AIiLYp5s6crWnKP67nzVAzMNgTAc8mu8CnGM+/A==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-SUm7iVYzKaflol+QwH0Ny5jZtco6PJduI+h/TEg0sgBJzVBa+9RN4I9+Xu9v+EJ1bci3XI7835IRdSP36lCgCw==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-Hp6vBnxJSKEEAVWgIoWMmfqkZXCdkhm6XTivrwgRzBwWfiTVe2ZyZ7byWegIKeNnBbffg/K2KvoM8JAHl059GQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260511.1': - resolution: {integrity: sha512-cUyY4Sr6065280lB6hCwTMCBMTxlEIGjSLzHym28yikA5sFiEsAzlwiU0i+XkTUIqr5K5M/SzSJiioDN+vpjtA==} + '@typescript/native-preview@7.0.0-dev.20260512.1': + resolution: {integrity: sha512-KIzYPGuxZnyiiYkYrozDT94Af2nwbdLXoY1cgGY66RRa9HSEw13RH9WHg8wA8fZhT4wYzF5uF7WY3hz0QhaxGg==} engines: {node: '>=16.20.0'} hasBin: true - '@vitest/coverage-v8@4.1.5': - resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} + '@vitest/coverage-v8@4.1.6': + resolution: {integrity: sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==} peerDependencies: - '@vitest/browser': 4.1.5 - vitest: 4.1.5 + '@vitest/browser': 4.1.6 + vitest: 4.1.6 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.6': + resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.6': + resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -654,20 +654,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.6': + resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.6': + resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.6': + resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.6': + resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.6': + resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1643,8 +1643,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1692,20 +1692,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.6: + resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.6 + '@vitest/browser-preview': 4.1.6 + '@vitest/browser-webdriverio': 4.1.6 + '@vitest/coverage-istanbul': 4.1.6 + '@vitest/coverage-v8': 4.1.6 + '@vitest/ui': 4.1.6 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2019,7 +2019,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.15 - '@kontent-ai/core-sdk@12.0.0-preview.36(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.38(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2115,9 +2115,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.6.2': + '@types/node@25.7.0': dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: @@ -2210,41 +2210,41 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260511.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260511.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260511.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260511.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260511.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260511.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260511.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260512.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260511.1': + '@typescript/native-preview@7.0.0-dev.20260512.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260511.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260511.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260511.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260511.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260511.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260511.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260511.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260512.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260512.1 - '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': + '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.6 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2253,46 +2253,46 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) + vitest: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.6': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0))': + '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.6': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.6': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.6 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.6 + '@vitest/utils': 4.1.6 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.6': {} - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.6 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -3523,13 +3523,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.19.2: {} + undici-types@7.21.0: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0): + vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3537,20 +3537,20 @@ snapshots: rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.6.2 + '@types/node': 25.7.0 esbuild: 0.27.7 fsevents: 2.3.3 tsx: 4.21.0 - vitest@4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)): + vitest@4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.6 + '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.6 + '@vitest/runner': 4.1.6 + '@vitest/snapshot': 4.1.6 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3562,11 +3562,11 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.6.2)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.6.2 - '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) + '@types/node': 25.7.0 + '@vitest/coverage-v8': 4.1.6(vitest@4.1.6) transitivePeerDependencies: - msw diff --git a/sample/safe-vs-unsafe-queries.ts b/sample/safe-vs-unsafe-queries.ts index 85cc2b66..58d4e436 100644 --- a/sample/safe-vs-unsafe-queries.ts +++ b/sample/safe-vs-unsafe-queries.ts @@ -88,8 +88,6 @@ export async function listAllLanguagesSafe(): Promise { if (result.success) { const totalLanguages = result.responses.flatMap((page) => page.payload.languages).length; } else { - // Partial progress is preserved on failure - useful for resilient paging. - const recoveredLanguages = result.partialResponses.flatMap((page) => page.payload.languages); - console.error("listLanguages paging failed after", recoveredLanguages.length, "languages:", result.error); + console.error("listLanguages paging failed", result.error); } } diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index 5dc9e666..1e050964 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -207,7 +207,7 @@ describe("Response validation", () => { if (error?.details.reason === "parsingFailed") { expect(error.details.url).toStrictEqual(query.inspect().data?.url); expect(error.details.zodError).toBeInstanceOf(ZodError); - expect(error.details.response).toBeDefined(); + expect(error.details.payload).toBeDefined(); } else { throw new Error(`Unexpected error reason '${error?.details.reason}'`); } diff --git a/tests/utils/test.utils.ts b/tests/utils/test.utils.ts index 0cb4d56a..d48c57f1 100644 --- a/tests/utils/test.utils.ts +++ b/tests/utils/test.utils.ts @@ -25,7 +25,7 @@ export function isFetchQueryWithExpectedFunctions(query: unknown): query is Fetc return false; } - const expectedFunctions: readonly ExpectedFunctions[] = ["fetchSafe", "fetch", "schema", "inspect"]; + const expectedFunctions: readonly ExpectedFunctions[] = ["fetchSafe", "fetch", "inspect"]; if (expectedFunctions.every((func) => func in query)) { return true; @@ -43,7 +43,6 @@ export function isPagedFetchQueryWithExpectedFunctions(query: unknown): query is "fetchAllPagesSafe", "fetchPageSafe", "pages", - "schema", "inspect", "fetchAllPages", "fetchPage", diff --git a/vitest.config.ts b/vitest.config.ts index 9711a416..9977aca2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,7 +4,6 @@ export default defineConfig({ root: ".", test: { dir: "tests", - exclude: ["types/**"], globals: true, environment: "node", coverage: { @@ -12,6 +11,7 @@ export default defineConfig({ reporter: ["text"], thresholds: { lines: 100, functions: 100, branches: 100 }, exclude: ["**/tests/**", "**/types/**"], + include: ["lib/**"], }, }, build: { From 78673ab3db775e59d4b46d38d3876cc23e1c3486 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 11:35:34 +0200 Subject: [PATCH 158/221] Use zod/mini, updates eslint rules, adds bundle-size tests --- eslint.config.mjs | 19 ++ lib/models/pagination.models.ts | 2 +- lib/models/pagination.schemas.ts | 16 +- .../models/content-item.models.ts | 2 +- .../content-items/models/element-types.ts | 2 +- .../content-items/models/element.models.ts | 2 +- .../schemas/content-item.schemas.ts | 103 +++++---- .../content-items/schemas/element.schemas.ts | 152 ++++++------ .../models/content-type.models.ts | 2 +- .../schemas/content-type.schemas.ts | 217 ++++++++++-------- lib/queries/delivery-queries.ts | 14 +- .../languages/models/language.models.ts | 2 +- .../languages/schemas/language.schemas.ts | 28 +-- .../taxonomies/models/taxonomy.models.ts | 2 +- .../taxonomies/schemas/taxonomy.schemas.ts | 32 +-- package.json | 8 +- pnpm-lock.yaml | 13 +- sample/typed-content-model.ts | 6 +- scripts/measure-bundle.ts | 6 + scripts/utils/measure-bundle-utils.ts | 102 ++++++++ tests/unit/bundle/bundle-size.spec.ts | 22 ++ .../create-delivery-fetch-query.spec.ts | 5 +- ...eate-delivery-paged-by-token-query.spec.ts | 5 +- tests/unit/queries/element-models.spec.ts | 2 +- .../validation/response-validation.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 14 +- 26 files changed, 483 insertions(+), 299 deletions(-) create mode 100644 scripts/measure-bundle.ts create mode 100644 scripts/utils/measure-bundle-utils.ts create mode 100644 tests/unit/bundle/bundle-size.spec.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index b85add81..57ff2fc1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -11,6 +11,25 @@ export default defineConfig( files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "sample/**/*.ts"], rules: { "no-unused-vars": "off", + "no-restricted-imports": [ + "error", + { + paths: [ + { + name: "zod", + message: "Import from 'zod/mini' instead to keep the SDK tree-shakeable.", + }, + ], + }, + ], + "no-restricted-syntax": [ + "error", + { + selector: "ImportDeclaration[source.value='zod/mini'] > ImportSpecifier[imported.name='z']", + message: + 'Use `import * as z from "zod/mini"` instead. The named `{ z }` import defeats esbuild\'s namespace tree-shaking and pulls ~280 kB of zod locales into consumer bundles.', + }, + ], }, }, ); diff --git a/lib/models/pagination.models.ts b/lib/models/pagination.models.ts index f353d359..e589b12f 100644 --- a/lib/models/pagination.models.ts +++ b/lib/models/pagination.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { paginationSchema, paginationWithTotalCountSchema } from "./pagination.schemas.js"; export type PaginationPayload = Readonly>; diff --git a/lib/models/pagination.schemas.ts b/lib/models/pagination.schemas.ts index 34947e5b..84567142 100644 --- a/lib/models/pagination.schemas.ts +++ b/lib/models/pagination.schemas.ts @@ -1,6 +1,6 @@ -import { z } from "zod"; +import * as z from "zod/mini"; -const nextPageSchema = z.url().or(z.literal("")); +const nextPageSchema = z.union([z.url(), z.literal("")]); const paginationObjectSchema = z.object({ skip: z.number(), @@ -10,14 +10,14 @@ const paginationObjectSchema = z.object({ }); export const paginationSchema = z.object({ - pagination: paginationObjectSchema.readonly(), + pagination: z.readonly(paginationObjectSchema), }); export const paginationWithTotalCountSchema = z.object({ - pagination: z - .object({ + pagination: z.readonly( + z.object({ ...paginationObjectSchema.shape, - total_count: z.number().optional(), - }) - .readonly(), + total_count: z.optional(z.number()), + }), + ), }); diff --git a/lib/queries/content-items/models/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts index 9a28a1f9..74a0a545 100644 --- a/lib/queries/content-items/models/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { contentItemSchema, diff --git a/lib/queries/content-items/models/element-types.ts b/lib/queries/content-items/models/element-types.ts index da734d5e..80a30793 100644 --- a/lib/queries/content-items/models/element-types.ts +++ b/lib/queries/content-items/models/element-types.ts @@ -1,4 +1,4 @@ -import type z from "zod"; +import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { elementDef } from "../schemas/element.schemas.js"; import type { ContentItemPayload } from "./content-item.models.js"; diff --git a/lib/queries/content-items/models/element.models.ts b/lib/queries/content-items/models/element.models.ts index cfe6ec7f..c9f9415e 100644 --- a/lib/queries/content-items/models/element.models.ts +++ b/lib/queries/content-items/models/element.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { assetValueSchema, contentItemElementSchema } from "../schemas/element.schemas.js"; export type Asset = z.infer; diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index 67a2c748..aa989dd2 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -1,12 +1,13 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import type { ZodMiniType } from "zod/mini"; +import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../../models/pagination.schemas.js"; import type { ContentItemElementShape } from "../models/content-item.models.js"; import { contentItemElementSchema } from "./element.schemas.js"; type ElementSchemasOf = { - readonly [K in keyof TElements]: z.ZodType; + readonly [K in keyof TElements]: ZodMiniType; }; const baseContentItemSystemSchema = () => @@ -23,12 +24,12 @@ const baseContentItemSystemSchema = () => }); export const contentItemSchema = () => - z - .object({ + z.readonly( + z.object({ system: contentItemSystemSchema(), elements: z.record(z.string(), contentItemElementSchema), - }) - .readonly(); + }), + ); export const contentItemSystemWithCodename = < TSchema extends DeliveryClientSchema, @@ -36,72 +37,72 @@ export const contentItemSystemWithCodename = < >( type: TTypeCodename, ) => - z - .object({ + z.readonly( + z.object({ ...baseContentItemSystemSchema().shape, - sitemap_locations: z.array(z.string()).readonly(), + sitemap_locations: z.readonly(z.array(z.string())), type: z.literal(type), - }) - .readonly(); + }), + ); export const contentItemSystemSchema = () => - z - .object({ + z.readonly( + z.object({ ...baseContentItemSystemSchema().shape, - sitemap_locations: z.array(z.string()).readonly(), - }) - .readonly(); + sitemap_locations: z.readonly(z.array(z.string())), + }), + ); export const listContentItemsSchema = () => - z - .object({ - items: z.array(contentItemSchema()).readonly(), + z.readonly( + z.object({ + items: z.readonly(z.array(contentItemSchema())), modular_content: z.record(z.string(), contentItemSchema()), ...paginationWithTotalCountSchema.shape, - }) - .readonly(); + }), + ); export const itemsFeedSchema = () => - z - .object({ - items: z.array(contentItemSchema()).readonly(), + z.readonly( + z.object({ + items: z.readonly(z.array(contentItemSchema())), modular_content: z.record(z.string(), contentItemSchema()), - }) - .readonly(); + }), + ); export const itemsReferencingAssetSchema = () => - z - .object({ - items: z - .array( + z.readonly( + z.object({ + items: z.readonly( + z.array( z.object({ system: baseContentItemSystemSchema(), }), - ) - .readonly(), - }) - .readonly(); + ), + ), + }), + ); export const itemsReferencingItemSchema = () => - z - .object({ - items: z - .array( + z.readonly( + z.object({ + items: z.readonly( + z.array( z.object({ system: baseContentItemSystemSchema(), }), - ) - .readonly(), - }) - .readonly(); + ), + ), + }), + ); export const fetchContentItemSchema = () => - z - .object({ + z.readonly( + z.object({ item: contentItemSchema(), modular_content: z.record(z.string(), contentItemSchema()), - }) - .readonly(); + }), + ); export const defineContentItem = < TSchema extends DeliveryClientSchema, @@ -111,9 +112,9 @@ export const defineContentItem = < typeCodename: TTypeCodename, elements: ElementSchemasOf, ) => - z - .object({ + z.readonly( + z.object({ system: contentItemSystemWithCodename(typeCodename), - elements: z.object(elements).readonly(), - }) - .readonly(); + elements: z.readonly(z.object(elements)), + }), + ); diff --git a/lib/queries/content-items/schemas/element.schemas.ts b/lib/queries/content-items/schemas/element.schemas.ts index 45366a79..06f57053 100644 --- a/lib/queries/content-items/schemas/element.schemas.ts +++ b/lib/queries/content-items/schemas/element.schemas.ts @@ -1,65 +1,65 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { ContentItemPayload } from "../models/content-item.models.js"; import { contentItemSchema } from "./content-item.schemas.js"; const multipleChoiceOptionSchema = () => - z - .object({ + z.readonly( + z.object({ name: z.string(), codename: codenameOf(), - }) - .readonly(); + }), + ); const taxonomyTermValueSchema = () => - z - .object({ + z.readonly( + z.object({ name: z.string(), codename: codenameOf(), - }) - .readonly(); + }), + ); -const renditionSchema = z - .object({ +const renditionSchema = z.readonly( + z.object({ rendition_id: kontentUuidSchema, preset_id: kontentUuidSchema, width: z.number(), height: z.number(), query: z.string(), - }) - .readonly(); + }), +); -export const assetValueSchema = z - .object({ +export const assetValueSchema = z.readonly( + z.object({ name: z.string(), - description: z.string().nullable(), + description: z.nullable(z.string()), type: z.string(), size: z.number(), url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - renditions: z.object({ default: renditionSchema.optional() }).readonly(), - }) - .readonly(); + width: z.nullable(z.number()), + height: z.nullable(z.number()), + renditions: z.readonly(z.object({ default: z.optional(renditionSchema) })), + }), +); -const richTextImageSchema = z - .object({ +const richTextImageSchema = z.readonly( + z.object({ image_id: z.string(), - description: z.string().nullable(), + description: z.nullable(z.string()), url: z.url(), - width: z.number().nullable(), - height: z.number().nullable(), - }) - .readonly(); + width: z.nullable(z.number()), + height: z.nullable(z.number()), + }), +); -const richTextLinkSchema = z - .object({ +const richTextLinkSchema = z.readonly( + z.object({ codename: codenameOf(), type: z.string(), url_slug: z.string(), - }) - .readonly(); + }), +); /** * Base element schema as provided by Kontent.ai API @@ -73,7 +73,7 @@ const baseElementSchemas = { number: z.object({ type: z.literal("number"), name: z.string(), - value: z.number().nullable(), + value: z.nullable(z.number()), }), richText: z.object({ type: z.literal("rich_text"), @@ -81,29 +81,29 @@ const baseElementSchemas = { value: z.string(), images: z.record(z.string(), richTextImageSchema), links: z.record(z.string(), richTextLinkSchema), - modular_content: z.array(codenameOf()).readonly(), + modular_content: z.readonly(z.array(codenameOf())), }), multipleChoice: z.object({ type: z.literal("multiple_choice"), name: z.string(), - value: z.array(multipleChoiceOptionSchema()).readonly(), + value: z.readonly(z.array(multipleChoiceOptionSchema())), }), dateTime: z.object({ type: z.literal("date_time"), name: z.string(), - value: z.string().nullable(), - display_timezone: z.string().nullable(), + value: z.nullable(z.string()), + display_timezone: z.nullable(z.string()), }), asset: z.object({ type: z.literal("asset"), name: z.string(), - value: z.array(assetValueSchema).readonly(), + value: z.readonly(z.array(assetValueSchema)), }), taxonomy: z.object({ type: z.literal("taxonomy"), name: z.string(), taxonomy_group: z.string(), - value: z.array(taxonomyTermValueSchema()).readonly(), + value: z.readonly(z.array(taxonomyTermValueSchema())), }), urlSlug: z.object({ type: z.literal("url_slug"), @@ -113,12 +113,12 @@ const baseElementSchemas = { custom: z.object({ type: z.literal("custom"), name: z.string(), - value: z.string().nullable(), + value: z.nullable(z.string()), }), linkedItems: z.object({ type: z.literal("modular_content"), name: z.string(), - value: z.array(codenameOf()).readonly(), + value: z.readonly(z.array(codenameOf())), }), } as const; @@ -126,42 +126,50 @@ const baseElementSchemas = { * Building blocks for constructing typed content item schemas. */ export const elementDef = { - text: baseElementSchemas.text.readonly(), - number: baseElementSchemas.number.readonly(), - richText: baseElementSchemas.richText.readonly(), + text: z.readonly(baseElementSchemas.text), + number: z.readonly(baseElementSchemas.number), + richText: z.readonly(baseElementSchemas.richText), multipleChoice: () => - baseElementSchemas.multipleChoice.extend({ value: z.array(multipleChoiceOptionSchema()).readonly() }).readonly(), - dateTime: baseElementSchemas.dateTime.readonly(), - asset: baseElementSchemas.asset.readonly(), + z.readonly( + z.extend(baseElementSchemas.multipleChoice, { + value: z.readonly(z.array(multipleChoiceOptionSchema())), + }), + ), + dateTime: z.readonly(baseElementSchemas.dateTime), + asset: z.readonly(baseElementSchemas.asset), taxonomy: () => - baseElementSchemas.taxonomy.extend({ value: z.array(taxonomyTermValueSchema()).readonly() }).readonly(), - urlSlug: baseElementSchemas.urlSlug.readonly(), - custom: baseElementSchemas.custom.readonly(), + z.readonly( + z.extend(baseElementSchemas.taxonomy, { + value: z.readonly(z.array(taxonomyTermValueSchema())), + }), + ), + urlSlug: z.readonly(baseElementSchemas.urlSlug), + custom: z.readonly(baseElementSchemas.custom), linkedItems: = ContentItemPayload>() => - baseElementSchemas.linkedItems - .extend({ - items: z - .array( + z.readonly( + z.extend(baseElementSchemas.linkedItems, { + items: z.readonly( + z.array( z.custom((item) => contentItemSchema().safeParse(item).success, { error: "Invalid referenced linked item", }), - ) - .readonly(), - }) - .readonly(), + ), + ), + }), + ), } as const; -export const contentItemElementSchema = z - .discriminatedUnion("type", [ - baseElementSchemas.text.readonly(), - baseElementSchemas.number.readonly(), - baseElementSchemas.richText.readonly(), - baseElementSchemas.multipleChoice.readonly(), - baseElementSchemas.dateTime.readonly(), - baseElementSchemas.asset.readonly(), - baseElementSchemas.taxonomy.readonly(), - baseElementSchemas.urlSlug.readonly(), - baseElementSchemas.linkedItems.readonly(), - baseElementSchemas.custom.readonly(), - ]) - .readonly(); +export const contentItemElementSchema = z.readonly( + z.discriminatedUnion("type", [ + z.readonly(baseElementSchemas.text), + z.readonly(baseElementSchemas.number), + z.readonly(baseElementSchemas.richText), + z.readonly(baseElementSchemas.multipleChoice), + z.readonly(baseElementSchemas.dateTime), + z.readonly(baseElementSchemas.asset), + z.readonly(baseElementSchemas.taxonomy), + z.readonly(baseElementSchemas.urlSlug), + z.readonly(baseElementSchemas.linkedItems), + z.readonly(baseElementSchemas.custom), + ]), +); diff --git a/lib/queries/content-types/models/content-type.models.ts b/lib/queries/content-types/models/content-type.models.ts index 7e4edceb..cd9e06ce 100644 --- a/lib/queries/content-types/models/content-type.models.ts +++ b/lib/queries/content-types/models/content-type.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { contentTypeElementSchema, contentTypeSchema, listContentTypesSchema } from "../schemas/content-type.schemas.js"; diff --git a/lib/queries/content-types/schemas/content-type.schemas.ts b/lib/queries/content-types/schemas/content-type.schemas.ts index 75bf0a57..ca6eb22e 100644 --- a/lib/queries/content-types/schemas/content-type.schemas.ts +++ b/lib/queries/content-types/schemas/content-type.schemas.ts @@ -1,123 +1,142 @@ import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; -const contentTypeElementOptionSchema = z - .object({ +const contentTypeElementOptionSchema = z.readonly( + z.object({ name: z.string(), codename: codenameOf(), - }) - .readonly(); + }), +); const contentTypeAnyElementSchema = z.discriminatedUnion("type", [ - z - .object({ - type: z.literal("text"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("number"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("rich_text"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("multiple_choice"), - name: z.string(), - options: z.array(contentTypeElementOptionSchema).readonly(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("date_time"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("asset"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("taxonomy"), - name: z.string(), - taxonomy_group: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("url_slug"), - name: z.string(), - }) - - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("modular_content"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), - z - .object({ - type: z.literal("custom"), - name: z.string(), - }) - .catchall(jsonValueSchema) - .readonly(), + z.readonly( + z.catchall( + z.object({ + type: z.literal("text"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("number"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("rich_text"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("multiple_choice"), + name: z.string(), + options: z.readonly(z.array(contentTypeElementOptionSchema)), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("date_time"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("asset"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("taxonomy"), + name: z.string(), + taxonomy_group: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("url_slug"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("modular_content"), + name: z.string(), + }), + jsonValueSchema, + ), + ), + z.readonly( + z.catchall( + z.object({ + type: z.literal("custom"), + name: z.string(), + }), + jsonValueSchema, + ), + ), ]); export const contentTypeSchema = () => - z - .object({ - system: z - .object({ + z.readonly( + z.object({ + system: z.readonly( + z.object({ id: kontentUuidSchema, name: z.string(), codename: codenameOf(), last_modified: z.iso.datetime(), - }) - .readonly(), + }), + ), elements: z.record(codenameOf(), contentTypeAnyElementSchema), - }) - .readonly(); + }), + ); export const listContentTypesSchema = () => - z - .object({ - types: z.array(contentTypeSchema()).readonly(), + z.readonly( + z.object({ + types: z.readonly(z.array(contentTypeSchema())), ...paginationSchema.shape, - }) - .readonly(); + }), + ); export const contentTypeElementSchema = () => - z - .intersection( + z.readonly( + z.intersection( contentTypeAnyElementSchema, - z - .object({ + z.readonly( + z.object({ // Required only for the endpoint `types/{type}/elements/{element}` codename: codenameOf(), - }) - .readonly(), - ) - .readonly(); + }), + ), + ), + ); diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 58afcdcb..346efda6 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -7,7 +7,7 @@ import { type JsonValue, type PagedFetchQuery, } from "@kontent-ai/core-sdk"; -import type { ZodType } from "zod"; +import type { ZodMiniType } from "zod/mini"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, @@ -36,7 +36,7 @@ export function createDeliveryPagedByUrlQuery; - readonly schema: () => Promise>; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ @@ -57,7 +57,7 @@ export function createDeliveryPagedByTokenQuery({ }: { readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly schema: () => Promise>; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { return createPagedFetchQuery({ @@ -80,7 +80,7 @@ export function createDeliveryFetchQuery({ }: { readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; - readonly schema: () => Promise>; + readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): FetchQuery { return createFetchQuery({ @@ -98,7 +98,7 @@ function getSharedRequestData({ readonly request: AnyDeliveryRequest | undefined; readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; - readonly schema: () => Promise>; + readonly schema: () => Promise>; }): Pick< FetchQueryRequest, | "abortSignal" @@ -107,7 +107,7 @@ function getSharedRequestData({ | "authorizationApiKey" | "url" | "requestHeaders" - | "zodSchema" + | "schema" | "mapError" | "mapExtraResponseProps" > { @@ -119,7 +119,7 @@ function getSharedRequestData({ requestHeaders: getHeaders(request), url: getUrl({ request, config, endpoint }), authorizationApiKey: config.apiMode === "preview" || config.apiMode === "secure" ? config.deliveryApiKey : undefined, - zodSchema: schema, + schema, mapError: mapDeliveryError, }; } diff --git a/lib/queries/languages/models/language.models.ts b/lib/queries/languages/models/language.models.ts index 1a4ac4b5..09af0a64 100644 --- a/lib/queries/languages/models/language.models.ts +++ b/lib/queries/languages/models/language.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { languageSchema, listLanguagesSchema } from "../schemas/language.schemas.js"; diff --git a/lib/queries/languages/schemas/language.schemas.ts b/lib/queries/languages/schemas/language.schemas.ts index a2cf0b9c..42c64320 100644 --- a/lib/queries/languages/schemas/language.schemas.ts +++ b/lib/queries/languages/schemas/language.schemas.ts @@ -1,25 +1,25 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; export const languageSchema = () => - z - .object({ - system: z - .object({ + z.readonly( + z.object({ + system: z.readonly( + z.object({ id: kontentUuidSchema, name: z.string(), codename: codenameOf(), - }) - .readonly(), - }) - .readonly(); + }), + ), + }), + ); export const listLanguagesSchema = () => - z - .object({ - languages: z.array(languageSchema()).readonly(), + z.readonly( + z.object({ + languages: z.readonly(z.array(languageSchema())), ...paginationSchema.shape, - }) - .readonly(); + }), + ); diff --git a/lib/queries/taxonomies/models/taxonomy.models.ts b/lib/queries/taxonomies/models/taxonomy.models.ts index bb088a3d..731010cf 100644 --- a/lib/queries/taxonomies/models/taxonomy.models.ts +++ b/lib/queries/taxonomies/models/taxonomy.models.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "../schemas/taxonomy.schemas.js"; diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index 8ef73901..2aa7a710 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -1,5 +1,5 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import { z } from "zod"; +import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; @@ -8,29 +8,29 @@ export const taxonomyTermSchema = () => name: z.string(), codename: codenameOf(), get terms() { - return z.array(taxonomyTermSchema()).readonly(); + return z.readonly(z.array(taxonomyTermSchema())); }, }); export const taxonomySchema = () => - z - .object({ - system: z - .object({ + z.readonly( + z.object({ + system: z.readonly( + z.object({ id: kontentUuidSchema, name: z.string(), codename: codenameOf(), last_modified: z.iso.datetime(), - }) - .readonly(), - terms: z.array(taxonomyTermSchema()).readonly(), - }) - .readonly(); + }), + ), + terms: z.readonly(z.array(taxonomyTermSchema())), + }), + ); export const listTaxonomiesSchema = () => - z - .object({ - taxonomies: z.array(taxonomySchema()).readonly(), + z.readonly( + z.object({ + taxonomies: z.readonly(z.array(taxonomySchema())), ...paginationSchema.shape, - }) - .readonly(); + }), + ); diff --git a/package.json b/package.json index 7417aa4f..f415c1bc 100644 --- a/package.json +++ b/package.json @@ -49,10 +49,11 @@ "biome:fix": "biome check --write", "biome:fix:unsafe": "biome check --write --unsafe", "clean": "tsx scripts/clean.ts", - "update:version": "tsx ./scripts/update-version.ts" + "update:version": "tsx ./scripts/update-version.ts", + "bundle:size": "tsx scripts/measure-bundle.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.38", + "@kontent-ai/core-sdk": "^12.0.0-preview.39", "ts-pattern": "^5", "zod": "^4" }, @@ -65,6 +66,7 @@ "vitest": "4.1.6", "@vitest/coverage-v8": "4.1.6", "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260512.1" + "@typescript/native-preview": "7.0.0-dev.20260512.1", + "esbuild": "0.28.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70fb0146..8a495623 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.38 - version: 12.0.0-preview.38(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.39 + version: 12.0.0-preview.39(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -36,6 +36,9 @@ importers: '@vitest/coverage-v8': specifier: 4.1.6 version: 4.1.6(vitest@4.1.6) + esbuild: + specifier: 0.27.7 + version: 0.27.7 eslint: specifier: 10.3.0 version: 10.3.0 @@ -384,8 +387,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.38': - resolution: {integrity: sha512-18QxlL6s5AN35oJurDHNl01ZzTWB5exAbNFbT2dyPbBE3OS3YV2hZPhGr+ygPMvvlGtRdZONMkyyLznnShxpqQ==} + '@kontent-ai/core-sdk@12.0.0-preview.39': + resolution: {integrity: sha512-khSpvc8nWeOg/5r70tdj98YO4zQQiJuPM0Be2f+UDG0YCKv4NaRkOU4fHkt6lQrp+skkriy7uSpgfcaujp/opg==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -2019,7 +2022,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.15 - '@kontent-ai/core-sdk@12.0.0-preview.38(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.39(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index b1cc7ee0..9979ee5f 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -14,7 +14,7 @@ * so it imports from the in-tree source instead. */ -import type z from "zod"; +import type * as z from "zod/mini"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; import { defineContentItem, elementDef } from "../lib/public_typed_items.js"; @@ -54,7 +54,7 @@ export type ActorElements = { export type Actor = ContentItemOf; // Runtime Zod schema for parsing Actor items into the typed `Actor` payload. -export const actorSchema: z.ZodType = defineContentItem("actor", { +export const actorSchema: z.ZodMiniType = defineContentItem("actor", { first_name: elementDef.text, last_name: elementDef.text, role: elementDef.multipleChoice<"opt1" | "opt2" | "opt3">(), @@ -84,7 +84,7 @@ export type MovieElements = { // Fully-typed Movie item payload. export type Movie = ContentItemOf; -export const movieSchema: z.ZodType = defineContentItem("movie", { +export const movieSchema: z.ZodMiniType = defineContentItem("movie", { title: elementDef.text, rating: elementDef.number, synopsis: elementDef.richText, diff --git a/scripts/measure-bundle.ts b/scripts/measure-bundle.ts new file mode 100644 index 00000000..be612189 --- /dev/null +++ b/scripts/measure-bundle.ts @@ -0,0 +1,6 @@ +import { fileURLToPath } from "node:url"; +import { measureScenarios, printSizeTable, scenarios } from "./utils/measure-bundle-utils.js"; + +const repoRoot = fileURLToPath(new URL("..", import.meta.url)); + +printSizeTable(await measureScenarios(scenarios, { resolveDir: repoRoot })); diff --git a/scripts/utils/measure-bundle-utils.ts b/scripts/utils/measure-bundle-utils.ts new file mode 100644 index 00000000..5bc06c99 --- /dev/null +++ b/scripts/utils/measure-bundle-utils.ts @@ -0,0 +1,102 @@ +import { brotliCompressSync, gzipSync } from "node:zlib"; +import { build } from "esbuild"; + +export type Scenario = { + readonly name: TName; + readonly entryContents: string; + readonly thresholdKb: number; +}; + +export type SizeResult = { + readonly scenario: TName; + readonly raw: number; + readonly min: number; + readonly gzip: number; + readonly brotli: number; +}; + +export type ScenarioName = "public_api (full)" | "public_typed_items (full)"; + +export const scenarios: readonly Scenario[] = [ + { + name: "public_api (full)", + entryContents: `export * from "./lib/public_api.ts";`, + thresholdKb: 20, + }, + { + name: "public_typed_items (full)", + entryContents: `export * from "./lib/public_typed_items.ts";`, + thresholdKb: 9, + }, +]; + +const bundleScenario = async ( + scenario: Scenario, + { resolveDir, minify }: { readonly resolveDir: string; readonly minify: boolean }, +): Promise => { + const result = await build({ + stdin: { + contents: scenario.entryContents, + resolveDir, + loader: "ts", + }, + bundle: true, + format: "esm", + platform: "neutral", + target: "es2022", + treeShaking: true, + minify, + write: false, + legalComments: "none", + logLevel: "silent", + }); + + const output = result.outputFiles?.[0]; + if (!output) { + throw new Error(`esbuild produced no output for scenario "${scenario.name}"`); + } + return output.contents; +}; + +export const measureScenarios = async ( + scenarios: readonly Scenario[], + options: { readonly resolveDir: string }, +): Promise[]> => + Promise.all( + scenarios.map(async (scenario): Promise> => { + const [rawBytes, minBytes] = await Promise.all([ + bundleScenario(scenario, { resolveDir: options.resolveDir, minify: false }), + bundleScenario(scenario, { resolveDir: options.resolveDir, minify: true }), + ]); + return { + scenario: scenario.name, + raw: rawBytes.byteLength, + min: minBytes.byteLength, + gzip: gzipSync(minBytes).byteLength, + brotli: brotliCompressSync(minBytes).byteLength, + }; + }), + ); + +export const formatBytes = (n: number): string => { + if (n < 1024) { + return `${n} B`; + } + const kb = n / 1024; + return `${kb.toFixed(1)} kB`; +}; + +const columns = ["scenario", "raw", "min", "gzip", "brotli"] as const; + +export const printSizeTable = (rows: readonly SizeResult[]): void => { + const cell = (row: SizeResult, col: (typeof columns)[number]): string => + col === "scenario" ? row.scenario : formatBytes(row[col]); + const widths = columns.map((col) => Math.max(col.length, ...rows.map((row) => cell(row, col).length))); + const renderRow = (cells: readonly string[]): string => cells.map((value, i) => value.padEnd(widths[i] ?? 0)).join(" "); + + console.log(renderRow([...columns])); + console.log(renderRow(widths.map((w) => "-".repeat(w)))); + for (const row of rows) { + console.log(renderRow(columns.map((col) => cell(row, col)))); + } +}; diff --git a/tests/unit/bundle/bundle-size.spec.ts b/tests/unit/bundle/bundle-size.spec.ts new file mode 100644 index 00000000..cf434663 --- /dev/null +++ b/tests/unit/bundle/bundle-size.spec.ts @@ -0,0 +1,22 @@ +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; +import { formatBytes, measureScenarios, scenarios } from "../../../scripts/utils/measure-bundle-utils.js"; + +const repoRoot = fileURLToPath(new URL("../../../", import.meta.url)); + +describe("bundle size", () => { + const resultsPromise = measureScenarios(scenarios, { resolveDir: repoRoot }); + + for (const scenario of scenarios) { + it(`${scenario.name} stays under ${scenario.thresholdKb} kB gzipped`, async () => { + const results = await resultsPromise; + const result = results.find((r) => r.scenario === scenario.name); + expect(result, `missing measurement for ${scenario.name}`).toBeDefined(); + const limitBytes = scenario.thresholdKb * 1024; + expect( + result?.gzip, + `${scenario.name} is ${formatBytes(result?.gzip ?? 0)} gzipped, limit is ${formatBytes(limitBytes)}`, + ).toBeLessThanOrEqual(limitBytes); + }); + } +}); diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts index a23a1345..58fb8b11 100644 --- a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -1,6 +1,7 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; -import { type ZodType, z } from "zod"; +import type { ZodMiniType } from "zod/mini"; +import * as z from "zod/mini"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; @@ -13,7 +14,7 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; -const testSchema: () => Promise> = async () => z.object({}); +const testSchema: () => Promise> = async () => z.object({}); describe("createDeliveryFetchQuery", () => { it("returns a query with FetchQuery shape", () => { diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index f3acfe73..73722397 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -1,7 +1,8 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { type ZodType, z } from "zod"; +import type { ZodMiniType } from "zod/mini"; +import * as z from "zod/mini"; import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; @@ -14,7 +15,7 @@ const clientConfig: DeliveryClientConfig = { environmentId: unitEnvironmentId, }; -const testSchema: () => Promise> = async () => z.object({}); +const testSchema: () => Promise> = async () => z.object({}); describe("createDeliveryPagedByTokenQuery", () => { it("returns a query with PagedFetchQuery shape", () => { diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts index e1e37c1d..4b651faa 100644 --- a/tests/unit/queries/element-models.spec.ts +++ b/tests/unit/queries/element-models.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import type z from "zod"; +import type * as z from "zod/mini"; import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; import type { Asset } from "../../../lib/queries/content-items/models/element.models.js"; import { defineContentItem } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index 1e050964..1a0ec6d0 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -1,7 +1,7 @@ import type { ErrorReason } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { describe, expect, test } from "vitest"; -import { ZodError } from "zod"; +import * as z from "zod/mini"; import { createDeliveryClient } from "../../../lib/client/delivery-client.js"; import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; import type { PaginationPayload } from "../../../lib/public_api.js"; @@ -206,7 +206,7 @@ describe("Response validation", () => { if (error?.details.reason === "parsingFailed") { expect(error.details.url).toStrictEqual(query.inspect().data?.url); - expect(error.details.zodError).toBeInstanceOf(ZodError); + expect(error.details.zodError).toBeInstanceOf(z.core.$ZodError); expect(error.details.payload).toBeDefined(); } else { throw new Error(`Unexpected error reason '${error?.details.reason}'`); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 289aff2e..02c2a4ba 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -9,7 +9,7 @@ import { } from "@kontent-ai/core-sdk"; import { getTestHttpServiceWithJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { expect, it } from "vitest"; -import type { ZodType } from "zod"; +import type { ZodMiniType } from "zod/mini"; import type { DeliveryClient, DeliveryClientSchema, DeliveryEndpoint } from "../../lib/models/core.models.js"; import { DeliverySdkError } from "../../lib/models/error.models.js"; import { createDeliveryClient } from "../../lib/public_api.js"; @@ -29,7 +29,7 @@ export async function runQueryTestsAsync({ selectQuery, expectedSchema, }: { - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly endpoint: DeliveryEndpoint; readonly unitTestPayload: TResponsePayload; readonly selectQuery: SelectQuery; @@ -68,7 +68,7 @@ async function runClientQueryTestsAsync({ readonly integrationEnvironmentId: string; readonly endpoint: DeliveryEndpoint; readonly selectQuery: SelectQuery; - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly unitTestPayload: TResponsePayload; }): Promise { const { testType, testName } = createTestMetadata({ @@ -183,7 +183,7 @@ function registerBaseTests({ readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; readonly error: unknown; - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly unitTestPayload: TResponsePayload; readonly testType: TestType; }): void { @@ -226,7 +226,7 @@ function registerResponseValidationTests({ readonly testName: string; readonly success: boolean; readonly error: unknown; - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly response: { readonly payload: TResponsePayload } | undefined; readonly testType: TestType; readonly unitTestPayload: TResponsePayload; @@ -264,7 +264,7 @@ function registerPagingTests({ readonly testName: string; readonly testType: TestType; readonly unitTestPayload: TResponsePayload; - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly response: { readonly payload: TResponsePayload } | undefined; readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; readonly pagingSuccess: boolean; @@ -298,7 +298,7 @@ function registerPagingResponseTests({ readonly testName: string; readonly pagingSuccess: boolean; readonly pagingError: unknown; - readonly expectedSchema: ZodType; + readonly expectedSchema: ZodMiniType; readonly response: { readonly payload: TResponsePayload } | undefined; readonly testType: TestType; readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; From 6c4f86517b2342c0b25fc71d9f4d9ff054f9262d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 11:35:42 +0200 Subject: [PATCH 159/221] Update pnpm-lock.yaml --- pnpm-lock.yaml | 290 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 279 insertions(+), 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a495623..8d0e48d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,8 @@ importers: specifier: 4.1.6 version: 4.1.6(vitest@4.1.6) esbuild: - specifier: 0.27.7 - version: 0.27.7 + specifier: 0.28.0 + version: 0.28.0 eslint: specifier: 10.3.0 version: 10.3.0 @@ -47,7 +47,7 @@ importers: version: 4.21.0 vitest: specifier: 4.1.6 - version: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) + version: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) packages: @@ -144,156 +144,312 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.7': resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.7': resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.7': resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -874,6 +1030,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1844,81 +2005,159 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.27.7': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.27.7': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.27.7': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.27.7': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.27.7': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.27.7': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.27.7': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.27.7': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.27.7': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.27.7': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.27.7': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.27.7': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.27.7': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.27.7': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.27.7': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.27.7': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.27.7': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.27.7': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.27.7': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.27.7': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.27.7': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.27.7': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.27.7': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.27.7': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.27.7': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: eslint: 10.3.0 @@ -2256,7 +2495,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) + vitest: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) '@vitest/expect@4.1.6': dependencies: @@ -2267,13 +2506,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0))': + '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0) '@vitest/pretty-format@4.1.6': dependencies: @@ -2624,6 +2863,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escape-string-regexp@4.0.0: {} eslint-plugin-react@7.37.5(eslint@9.39.4): @@ -3532,7 +3800,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0): + vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3541,14 +3809,14 @@ snapshots: tinyglobby: 0.2.16 optionalDependencies: '@types/node': 25.7.0 - esbuild: 0.27.7 + esbuild: 0.28.0 fsevents: 2.3.3 tsx: 4.21.0 - vitest@4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)): + vitest@4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)): dependencies: '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0)) + '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) '@vitest/pretty-format': 4.1.6 '@vitest/runner': 4.1.6 '@vitest/snapshot': 4.1.6 @@ -3565,7 +3833,7 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.7.0)(esbuild@0.27.7)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.7.0 From 591e9b3fbe07c7797a811041046c17c0181f2262 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 12:34:39 +0200 Subject: [PATCH 160/221] adds create bundles script, removes defineContentItem --- .gitignore | 1 + lib/public_typed_items.ts | 1 - .../schemas/content-item.schemas.ts | 21 -- package.json | 3 +- sample/typed-content-model.ts | 24 -- scripts/clean.ts | 2 +- scripts/create-bundles.ts | 15 ++ scripts/utils/measure-bundle-utils.ts | 30 +++ tests/unit/queries/element-models.spec.ts | 206 ------------------ 9 files changed, 49 insertions(+), 254 deletions(-) create mode 100644 scripts/create-bundles.ts delete mode 100644 tests/unit/queries/element-models.spec.ts diff --git a/.gitignore b/.gitignore index f6c74648..9fcf9394 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # compiled output /definitions /dist +/bundles /tmp /coverage /out-tsc diff --git a/lib/public_typed_items.ts b/lib/public_typed_items.ts index 39cf9245..47b983c3 100644 --- a/lib/public_typed_items.ts +++ b/lib/public_typed_items.ts @@ -1,3 +1,2 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the typed-items subpath is fine -export { defineContentItem } from "./queries/content-items/schemas/content-item.schemas.js"; export { elementDef } from "./queries/content-items/schemas/element.schemas.js"; diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index aa989dd2..e6b0571d 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -1,15 +1,9 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; -import type { ZodMiniType } from "zod/mini"; import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../../models/pagination.schemas.js"; -import type { ContentItemElementShape } from "../models/content-item.models.js"; import { contentItemElementSchema } from "./element.schemas.js"; -type ElementSchemasOf = { - readonly [K in keyof TElements]: ZodMiniType; -}; - const baseContentItemSystemSchema = () => z.object({ id: kontentUuidSchema, @@ -103,18 +97,3 @@ export const fetchContentItemSchema = () = modular_content: z.record(z.string(), contentItemSchema()), }), ); - -export const defineContentItem = < - TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], - TElements extends ContentItemElementShape, ->( - typeCodename: TTypeCodename, - elements: ElementSchemasOf, -) => - z.readonly( - z.object({ - system: contentItemSystemWithCodename(typeCodename), - elements: z.readonly(z.object(elements)), - }), - ); diff --git a/package.json b/package.json index f415c1bc..cde89cfc 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "biome:fix:unsafe": "biome check --write --unsafe", "clean": "tsx scripts/clean.ts", "update:version": "tsx ./scripts/update-version.ts", - "bundle:size": "tsx scripts/measure-bundle.ts" + "bundle:size": "tsx scripts/measure-bundle.ts", + "bundle:create": "tsx scripts/create-bundles.ts" }, "peerDependencies": { "@kontent-ai/core-sdk": "^12.0.0-preview.39", diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index 9979ee5f..715ceabd 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -5,7 +5,6 @@ * Top to bottom: * 1. Declare your project's codename schema. * 2. Define content-type element shapes and their payload types. - * 3. Build Zod schemas with `defineContentItem`. * 4. Create a typed delivery client. * 5. See how response values narrow at the call site. * @@ -14,10 +13,8 @@ * so it imports from the in-tree source instead. */ -import type * as z from "zod/mini"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; -import { defineContentItem, elementDef } from "../lib/public_typed_items.js"; /** * 1. Schema declaration @@ -53,14 +50,6 @@ export type ActorElements = { // Fully-typed Actor item payload (system metadata + elements). export type Actor = ContentItemOf; -// Runtime Zod schema for parsing Actor items into the typed `Actor` payload. -export const actorSchema: z.ZodMiniType = defineContentItem("actor", { - first_name: elementDef.text, - last_name: elementDef.text, - role: elementDef.multipleChoice<"opt1" | "opt2" | "opt3">(), - relatedActors: elementDef.linkedItems(), -}); - /** * 3. Content type: Movie * @@ -84,19 +73,6 @@ export type MovieElements = { // Fully-typed Movie item payload. export type Movie = ContentItemOf; -export const movieSchema: z.ZodMiniType = defineContentItem("movie", { - title: elementDef.text, - rating: elementDef.number, - synopsis: elementDef.richText, - genre: elementDef.multipleChoice<"genre1" | "genre2">(), - release_date: elementDef.dateTime, - poster: elementDef.asset, - categories: elementDef.taxonomy<"term1" | "term2">(), - url_slug: elementDef.urlSlug, - custom_id: elementDef.custom, - actors: elementDef.linkedItems(), -}); - /** * 4. Typed delivery client * diff --git a/scripts/clean.ts b/scripts/clean.ts index bd7f34d3..1a0e42dc 100644 --- a/scripts/clean.ts +++ b/scripts/clean.ts @@ -1,5 +1,5 @@ import { deleteFolderRecursive } from "@kontent-ai/core-sdk/devkit"; -for (const path of ["dist"]) { +for (const path of ["dist", "bundles"]) { deleteFolderRecursive(path); } diff --git a/scripts/create-bundles.ts b/scripts/create-bundles.ts new file mode 100644 index 00000000..1c1d9b4b --- /dev/null +++ b/scripts/create-bundles.ts @@ -0,0 +1,15 @@ +import { fileURLToPath } from "node:url"; +import { formatBytes, scenarios, writeBundles } from "./utils/measure-bundle-utils.js"; + +const repoRoot = fileURLToPath(new URL("..", import.meta.url)); +const outDir = `${repoRoot}bundles`; + +const [minified, unminified] = await Promise.all([ + writeBundles(scenarios, { resolveDir: repoRoot, outDir, minify: true }), + writeBundles(scenarios, { resolveDir: repoRoot, outDir, minify: false }), +]); + +console.log(`Wrote ${minified.length + unminified.length} bundles to ${outDir}:`); +for (const { path, bytes } of [...unminified, ...minified]) { + console.log(` ${path} (${formatBytes(bytes)})`); +} diff --git a/scripts/utils/measure-bundle-utils.ts b/scripts/utils/measure-bundle-utils.ts index 5bc06c99..df9733d6 100644 --- a/scripts/utils/measure-bundle-utils.ts +++ b/scripts/utils/measure-bundle-utils.ts @@ -1,3 +1,4 @@ +import { mkdir, writeFile } from "node:fs/promises"; import { brotliCompressSync, gzipSync } from "node:zlib"; import { build } from "esbuild"; @@ -78,6 +79,35 @@ export const measureScenarios = async ( }), ); +const toSafeFileName = (name: string): string => + name + .replaceAll(/[^a-z0-9]+/gi, "-") + .replace(/^-+|-+$/g, "") + .toLowerCase(); + +export type WrittenBundle = { + readonly scenario: TName; + readonly path: string; + readonly bytes: number; +}; + +export const writeBundles = async ( + scenarios: readonly Scenario[], + options: { readonly resolveDir: string; readonly outDir: string; readonly minify?: boolean }, +): Promise[]> => { + await mkdir(options.outDir, { recursive: true }); + const minify = options.minify ?? true; + return Promise.all( + scenarios.map(async (scenario): Promise> => { + const bytes = await bundleScenario(scenario, { resolveDir: options.resolveDir, minify }); + const suffix = minify ? ".min.js" : ".js"; + const path = `${options.outDir}/${toSafeFileName(scenario.name)}${suffix}`; + await writeFile(path, bytes); + return { scenario: scenario.name, path, bytes: bytes.byteLength }; + }), + ); +}; + export const formatBytes = (n: number): string => { if (n < 1024) { return `${n} B`; diff --git a/tests/unit/queries/element-models.spec.ts b/tests/unit/queries/element-models.spec.ts deleted file mode 100644 index 4b651faa..00000000 --- a/tests/unit/queries/element-models.spec.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { describe, expect, test } from "vitest"; -import type * as z from "zod/mini"; -import type { ContentItemSystemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; -import type { Asset } from "../../../lib/queries/content-items/models/element.models.js"; -import { defineContentItem } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { elementDef } from "../../../lib/queries/content-items/schemas/element.schemas.js"; -import { getFakeUuid } from "../../utils/test.utils.js"; - -const schemaInput = { - languageCodenames: ["en"], - contentTypeCodenames: ["actor", "movie"], - taxonomyCodenames: [], - elementCodenames: [], - collectionCodenames: ["default"], - workflowCodenames: ["published"], - workflowStepCodenames: ["published"], -} as const satisfies DeliveryClientSchema; - -const makeSystem = (): ContentItemSystemPayload => ({ - id: getFakeUuid(), - name: "Test Item", - codename: "x", - language: "en", - type: "actor", - collection: "default", - last_modified: "2024-01-01T00:00:00.000Z", - workflow: "published", - workflow_step: "published", - sitemap_locations: [], -}); - -describe("defineContentItem", () => { - test("builds a schema that validates a matching content item", () => { - const schema = defineContentItem("actor", { - title: elementDef.text, - }); - expect( - schema.safeParse({ - system: makeSystem(), - elements: { title: { type: "text", name: "Title", value: "Hello" } }, - }).success, - ).toBe(true); - }); -}); - -describe("elementDef.text", () => { - test("accepts any string", () => { - expect(elementDef.text.safeParse({ type: "text", name: "Title", value: "" }).success).toBe(true); - expect(elementDef.text.safeParse({ type: "text", name: "Title", value: "a".repeat(1000) }).success).toBe(true); - }); -}); - -describe("elementDef.number", () => { - test("accepts null and a number", () => { - expect(elementDef.number.safeParse({ type: "number", name: "Rating", value: null }).success).toBe(true); - expect(elementDef.number.safeParse({ type: "number", name: "Rating", value: 5 }).success).toBe(true); - }); -}); - -describe("elementDef.dateTime", () => { - test("accepts null and a string", () => { - expect(elementDef.dateTime.safeParse({ type: "date_time", name: "Release", value: null, display_timezone: null }).success).toBe( - true, - ); - expect( - elementDef.dateTime.safeParse({ type: "date_time", name: "Release", value: "2024-01-01T00:00:00.000Z", display_timezone: null }) - .success, - ).toBe(true); - }); -}); - -describe("elementDef.richText", () => { - const makePayload = () => ({ - type: "rich_text", - name: "Body", - value: "

hello

", - images: { - img1: { - image_id: "img1", - description: null, - url: "https://example.com/img.jpg", - width: 100, - height: 80, - }, - }, - links: { - link1: { - codename: "linked_item", - type: "actor", - url_slug: "linked-item", - }, - }, - modular_content: ["linked_item"], - }); - - test("validates a complete rich text payload", () => { - expect(elementDef.richText.safeParse(makePayload()).success).toBe(true); - }); - - test("accepts empty images, links and modular_content", () => { - const empty = { type: "rich_text", name: "Body", value: "", images: {}, links: {}, modular_content: [] }; - expect(elementDef.richText.safeParse(empty).success).toBe(true); - }); - - test("rejects payload with wrong discriminator type", () => { - expect(elementDef.richText.safeParse({ ...makePayload(), type: "text" }).success).toBe(false); - }); - - test("rejects payload missing required fields", () => { - const { images: _images, ...withoutImages } = makePayload(); - expect(elementDef.richText.safeParse(withoutImages).success).toBe(false); - }); -}); - -describe("elementDef.urlSlug", () => { - test("accepts any string", () => { - expect(elementDef.urlSlug.safeParse({ type: "url_slug", name: "Slug", value: "" }).success).toBe(true); - expect(elementDef.urlSlug.safeParse({ type: "url_slug", name: "Slug", value: "my-slug" }).success).toBe(true); - }); -}); - -describe("elementDef.custom", () => { - test("accepts null and a string", () => { - expect(elementDef.custom.safeParse({ type: "custom", name: "ID", value: null }).success).toBe(true); - expect(elementDef.custom.safeParse({ type: "custom", name: "ID", value: "abc" }).success).toBe(true); - }); -}); - -const makeAsset = (): Asset => ({ - name: "poster.jpg", - description: null, - type: "image/jpeg", - size: 1024, - url: "https://example.com/poster.jpg", - width: 800, - height: 600, - renditions: {}, -}); - -describe("elementDef.asset", () => { - test("accepts empty value array and populated array", () => { - expect(elementDef.asset.safeParse({ type: "asset", name: "Poster", value: [] }).success).toBe(true); - expect(elementDef.asset.safeParse({ type: "asset", name: "Poster", value: [makeAsset()] }).success).toBe(true); - }); -}); - -describe("elementDef.multipleChoice", () => { - test("accepts empty value array and populated array", () => { - const schema = elementDef.multipleChoice(); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [] }).success).toBe(true); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); - }); - - test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { - const schema = elementDef.multipleChoice<"lead" | "supporting">(); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Extra", codename: "extra" }] }).success).toBe( - true, - ); - expect(schema.safeParse({ type: "multiple_choice", name: "Role", value: [{ name: "Lead", codename: "lead" }] }).success).toBe(true); - }); -}); - -describe("elementDef.taxonomy", () => { - test("accepts empty value array and populated array", () => { - const schema = elementDef.taxonomy(); - expect(schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [] }).success).toBe(true); - expect( - schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) - .success, - ).toBe(true); - }); - - test("accepts any codename at runtime when codenames provided (type-only narrowing)", () => { - const schema = elementDef.taxonomy<"action" | "drama">(); - expect( - schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Comedy", codename: "comedy" }] }) - .success, - ).toBe(true); - expect( - schema.safeParse({ type: "taxonomy", name: "Genre", taxonomy_group: "genre", value: [{ name: "Action", codename: "action" }] }) - .success, - ).toBe(true); - }); -}); - -describe("elementDef.linkedItems", () => { - test("accepts empty and populated value arrays", () => { - const schema = elementDef.linkedItems(); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: [], items: [] }).success).toBe(true); - expect(schema.safeParse({ type: "modular_content", name: "Cast", value: ["actor_one", "actor_two"], items: [] }).success).toBe( - true, - ); - }); - - test("rejects payload with wrong discriminator type", () => { - const schema = elementDef.linkedItems(); - expect(schema.safeParse({ type: "text", name: "Cast", value: [], items: [] }).success).toBe(false); - }); - - test("items is typed as the generic argument at the TypeScript level", () => { - type TaggedItem = { readonly tag: "movie" }; - type ItemsOf = z.infer>>["items"]; - const items: ItemsOf = [{ tag: "movie" }]; - expect(items.length).toBe(1); - }); -}); From 93ed44ccbf167434baa0b3c07b979a66def43749 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 12:46:17 +0200 Subject: [PATCH 161/221] export public schemas --- lib/public_schemas.ts | 19 +++++++++++++++++++ lib/public_typed_items.ts | 2 -- package.json | 6 +++--- scripts/utils/measure-bundle-utils.ts | 8 ++++---- 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 lib/public_schemas.ts delete mode 100644 lib/public_typed_items.ts diff --git a/lib/public_schemas.ts b/lib/public_schemas.ts new file mode 100644 index 00000000..92b4e59f --- /dev/null +++ b/lib/public_schemas.ts @@ -0,0 +1,19 @@ +// biome-ignore lint/performance/noBarrelFile: One barrel for the schemas subpath is fine +export { + contentItemSchema, + contentItemSystemSchema, + contentItemSystemWithCodename, + fetchContentItemSchema, + itemsFeedSchema, + itemsReferencingAssetSchema, + itemsReferencingItemSchema, + listContentItemsSchema, +} from "./queries/content-items/schemas/content-item.schemas.js"; +export { assetValueSchema, contentItemElementSchema, elementDef } from "./queries/content-items/schemas/element.schemas.js"; +export { + contentTypeElementSchema, + contentTypeSchema, + listContentTypesSchema, +} from "./queries/content-types/schemas/content-type.schemas.js"; +export { languageSchema, listLanguagesSchema } from "./queries/languages/schemas/language.schemas.js"; +export { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "./queries/taxonomies/schemas/taxonomy.schemas.js"; diff --git a/lib/public_typed_items.ts b/lib/public_typed_items.ts deleted file mode 100644 index 47b983c3..00000000 --- a/lib/public_typed_items.ts +++ /dev/null @@ -1,2 +0,0 @@ -// biome-ignore lint/performance/noBarrelFile: One barrel for the typed-items subpath is fine -export { elementDef } from "./queries/content-items/schemas/element.schemas.js"; diff --git a/package.json b/package.json index cde89cfc..3d60e0c6 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,9 @@ "types": "./dist/public_api.d.ts", "default": "./dist/public_api.js" }, - "./typed-items": { - "types": "./dist/public_typed_items.d.ts", - "default": "./dist/public_typed_items.js" + "./schemas": { + "types": "./dist/public_schemas.d.ts", + "default": "./dist/public_schemas.js" } }, "types": "./dist/public_api.d.ts", diff --git a/scripts/utils/measure-bundle-utils.ts b/scripts/utils/measure-bundle-utils.ts index df9733d6..07800910 100644 --- a/scripts/utils/measure-bundle-utils.ts +++ b/scripts/utils/measure-bundle-utils.ts @@ -16,7 +16,7 @@ export type SizeResult = { readonly brotli: number; }; -export type ScenarioName = "public_api (full)" | "public_typed_items (full)"; +export type ScenarioName = "public_api (full)" | "public_schemas (full)"; export const scenarios: readonly Scenario[] = [ { @@ -25,9 +25,9 @@ export const scenarios: readonly Scenario[] = [ thresholdKb: 20, }, { - name: "public_typed_items (full)", - entryContents: `export * from "./lib/public_typed_items.ts";`, - thresholdKb: 9, + name: "public_schemas (full)", + entryContents: `export * from "./lib/public_schemas.ts";`, + thresholdKb: 11, }, ]; From c445dc12e5e24b3bf3e0b924eead394508a6a07f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 16:15:46 +0200 Subject: [PATCH 162/221] Prepares extended schemas / models and implements fetch content item query --- .../content-items/fetch-content-item-query.ts | 36 +++++++-- .../models/content-item.models.ts | 15 ++++ .../content-items/models/element-types.ts | 4 +- .../content-items/models/element.models.ts | 4 +- .../schemas/content-item.schemas.ts | 35 ++++++++- .../content-items/schemas/element.schemas.ts | 28 ++++++- lib/queries/delivery-queries.ts | 21 ++++++ lib/transforms/content-item-transforms.ts | 73 +++++++++++++++++++ lib/utils/array.utils.ts | 3 + sample/typed-content-model.ts | 4 +- 10 files changed, 211 insertions(+), 12 deletions(-) create mode 100644 lib/transforms/content-item-transforms.ts create mode 100644 lib/utils/array.utils.ts diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 6810c195..b476b3d0 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,10 +1,11 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; -import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { FetchContentItemPayload } from "./models/content-item.models.js"; +import { resolveExtendedItems } from "../../transforms/content-item-transforms.js"; +import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; +import type { FetchContentItemPayloadExtended } from "./models/content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery< - FetchContentItemPayload, + FetchContentItemPayloadExtended, DeliveryMetadata >; @@ -41,10 +42,31 @@ export function fetchContentItemQuery( config: DeliveryClientConfig, request: FetchContentItemQueryRequest, ): FetchContentItemQuery { - return createDeliveryFetchQuery({ + return transformDeliveryFetchQuery({ config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), - endpoint: `items/${request.codename}`, + query: createDeliveryFetchQuery({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), + endpoint: `items/${request.codename}`, + }), + transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), + transform: (payload) => { + const { extendedItems, extendedModularContent } = resolveExtendedItems({ + modular_content: payload.modular_content, + inputItems: [payload.item], + }); + + const extendedItem = extendedItems[0]; + + if (!extendedItem) { + throw new Error("Could not resolve extended item. This is a SDK related issue. Please, report it to the developers."); + } + + return { + item: extendedItem, + modular_content: extendedModularContent, + }; + }, }); } diff --git a/lib/queries/content-items/models/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts index 74a0a545..ca5b6ffe 100644 --- a/lib/queries/content-items/models/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -2,13 +2,17 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { contentItemSchema, + contentItemSchemaExtended, contentItemSystemSchema, contentItemSystemWithCodename, fetchContentItemSchema, + fetchContentItemSchemaExtended, itemsFeedSchema, + itemsFeedSchemaExtended, itemsReferencingAssetSchema, itemsReferencingItemSchema, listContentItemsSchema, + listContentItemsSchemaExtended, } from "../schemas/content-item.schemas.js"; import type { ContentItemElementPayload } from "./element.models.js"; @@ -39,3 +43,14 @@ export type ItemsReferencingAssetPayload = export type ItemsReferencingItemPayload = z.infer< ReturnType> >; + +export type ContentItemPayloadExtended = z.infer< + ReturnType> +>; +export type FetchContentItemPayloadExtended = z.infer< + ReturnType> +>; +export type ListContentItemsPayloadExtended = z.infer< + ReturnType> +>; +export type ItemsFeedPayloadExtended = z.infer>>; diff --git a/lib/queries/content-items/models/element-types.ts b/lib/queries/content-items/models/element-types.ts index 80a30793..50e22160 100644 --- a/lib/queries/content-items/models/element-types.ts +++ b/lib/queries/content-items/models/element-types.ts @@ -5,7 +5,9 @@ import type { ContentItemPayload } from "./content-item.models.js"; export type Text = z.infer; export type Number = z.infer; -export type RichText = z.infer; +export type RichText = ContentItemPayload> = z.infer< + ReturnType> +>; export type MultipleChoice = z.infer>>; export type DateTime = z.infer; export type Asset = z.infer; diff --git a/lib/queries/content-items/models/element.models.ts b/lib/queries/content-items/models/element.models.ts index c9f9415e..a1806cb4 100644 --- a/lib/queries/content-items/models/element.models.ts +++ b/lib/queries/content-items/models/element.models.ts @@ -1,6 +1,8 @@ import type * as z from "zod/mini"; -import type { assetValueSchema, contentItemElementSchema } from "../schemas/element.schemas.js"; +import type { assetValueSchema, contentItemElementSchema, contentItemElementSchemaExtended } from "../schemas/element.schemas.js"; export type Asset = z.infer; export type ContentItemElementPayload = z.infer; + +export type ContentItemElementPayloadExtended = z.infer; diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index e6b0571d..bec83988 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -2,7 +2,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../../models/pagination.schemas.js"; -import { contentItemElementSchema } from "./element.schemas.js"; +import { contentItemElementSchema, contentItemElementSchemaExtended } from "./element.schemas.js"; const baseContentItemSystemSchema = () => z.object({ @@ -97,3 +97,36 @@ export const fetchContentItemSchema = () = modular_content: z.record(z.string(), contentItemSchema()), }), ); + +export const contentItemSchemaExtended = () => + z.readonly( + z.object({ + system: contentItemSystemSchema(), + elements: z.record(z.string(), contentItemElementSchemaExtended), + }), + ); + +export const listContentItemsSchemaExtended = () => + z.readonly( + z.object({ + items: z.readonly(z.array(contentItemSchemaExtended())), + modular_content: z.record(z.string(), contentItemSchemaExtended()), + ...paginationWithTotalCountSchema.shape, + }), + ); + +export const itemsFeedSchemaExtended = () => + z.readonly( + z.object({ + items: z.readonly(z.array(contentItemSchemaExtended())), + modular_content: z.record(z.string(), contentItemSchemaExtended()), + }), + ); + +export const fetchContentItemSchemaExtended = () => + z.readonly( + z.object({ + item: contentItemSchemaExtended(), + modular_content: z.record(z.string(), contentItemSchemaExtended()), + }), + ); diff --git a/lib/queries/content-items/schemas/element.schemas.ts b/lib/queries/content-items/schemas/element.schemas.ts index 06f57053..51ab2f4f 100644 --- a/lib/queries/content-items/schemas/element.schemas.ts +++ b/lib/queries/content-items/schemas/element.schemas.ts @@ -128,7 +128,18 @@ const baseElementSchemas = { export const elementDef = { text: z.readonly(baseElementSchemas.text), number: z.readonly(baseElementSchemas.number), - richText: z.readonly(baseElementSchemas.richText), + richText: = ContentItemPayload>() => + z.readonly( + z.extend(baseElementSchemas.richText, { + items: z.readonly( + z.array( + z.custom((item) => contentItemSchema().safeParse(item).success, { + error: "Invalid referenced linked item", + }), + ), + ), + }), + ), multipleChoice: () => z.readonly( z.extend(baseElementSchemas.multipleChoice, { @@ -173,3 +184,18 @@ export const contentItemElementSchema = z.readonly( z.readonly(baseElementSchemas.custom), ]), ); + +export const contentItemElementSchemaExtended = z.readonly( + z.discriminatedUnion("type", [ + elementDef.text, + elementDef.number, + elementDef.richText(), + elementDef.multipleChoice(), + elementDef.dateTime, + elementDef.asset, + elementDef.taxonomy(), + elementDef.urlSlug, + elementDef.linkedItems(), + elementDef.custom, + ]), +); diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 346efda6..35e2db5e 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -6,6 +6,7 @@ import { type Header, type JsonValue, type PagedFetchQuery, + transformFetchQuery, } from "@kontent-ai/core-sdk"; import type { ZodMiniType } from "zod/mini"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; @@ -89,6 +90,26 @@ export function createDeliveryFetchQuery({ }); } +export function transformDeliveryFetchQuery({ + config, + query, + transform, + transformSchema, +}: { + readonly query: FetchQuery; +} & Pick< + Parameters>[0], + "transform" | "transformSchema" | "config" +>): FetchQuery { + return transformFetchQuery({ + query, + transform, + transformSchema, + mapError: mapDeliveryError, + config, + }); +} + function getSharedRequestData({ config, endpoint, diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts new file mode 100644 index 00000000..30a9fe9b --- /dev/null +++ b/lib/transforms/content-item-transforms.ts @@ -0,0 +1,73 @@ +import { isDefined } from "@kontent-ai/core-sdk"; +import { match } from "ts-pattern"; +import type { DeliveryClientSchema } from "../models/core.models.js"; +import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; +import type { ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; + +function extractToMapByCodename({ + items, + modular_content, +}: { + readonly items: readonly ContentItemPayload[]; + readonly modular_content: Readonly>>; +}) { + const itemsFromModularContent = new Map>( + Object.entries(modular_content).map(([codename, item]) => { + return [codename, item]; + }), + ); + + const mainItems = new Map>(items.map((m) => [m.system.codename, m])); + + return new Map>([...itemsFromModularContent, ...mainItems]); +} + +export function resolveExtendedItems({ + inputItems, + modular_content, +}: { + readonly inputItems: readonly ContentItemPayload[]; + readonly modular_content: Readonly>>; +}): { + readonly extendedItems: readonly ContentItemPayloadExtended[]; + readonly extendedModularContent: Readonly>>; +} { + const allInputItems = extractToMapByCodename({ + items: inputItems, + modular_content, + }); + const preparedItems = new Map>( + allInputItems.entries().map(([codename, item]) => [codename, { system: item.system, elements: {} }]), + ); + + for (const item of allInputItems.values()) { + const preparedItem = preparedItems.get(item.system.codename); + + if (!preparedItem) { + throw new Error( + `Item with codename ${item.system.codename} was not prepared for extension. This is a SDK related issue. Please, report it to the developers.`, + ); + } + + for (const [key, element] of Object.entries(item.elements)) { + const extendedElement = match(element) + .returnType() + .with({ type: "modular_content" }, (linkedItemElement) => ({ + ...linkedItemElement, + items: linkedItemElement.value.map((itemCodename) => preparedItems.get(itemCodename)).filter(isDefined), + })) + .with({ type: "rich_text" }, (richTextElement) => ({ + ...richTextElement, + items: richTextElement.modular_content.map((itemCodename) => preparedItems.get(itemCodename)).filter(isDefined), + })) + .otherwise((element) => element); + + preparedItem.elements[key] = extendedElement; + } + } + + return { + extendedItems: inputItems.map((item) => preparedItems.get(item.system.codename)).filter(isDefined), + extendedModularContent: Object.fromEntries(preparedItems.entries()), + }; +} diff --git a/lib/utils/array.utils.ts b/lib/utils/array.utils.ts new file mode 100644 index 00000000..10f95656 --- /dev/null +++ b/lib/utils/array.utils.ts @@ -0,0 +1,3 @@ +export function isArray(a: T | readonly T[]): a is readonly T[] { + return Array.isArray(a); +} diff --git a/sample/typed-content-model.ts b/sample/typed-content-model.ts index 715ceabd..7dde270b 100644 --- a/sample/typed-content-model.ts +++ b/sample/typed-content-model.ts @@ -100,7 +100,7 @@ export async function demonstrateQueries(): Promise { ); // `fetchContentItem` returns a fully typed item payload. - const item = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); + const response = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); } /** @@ -135,4 +135,6 @@ export function demonstrateMovieAccess(movie: Movie): void { // `LinkedItems` types `items[i]` as `Actor` - full element narrowing on referenced items. const firstMovieActor: Actor | undefined = movie.elements.actors.items[0]; + + const actors: readonly Actor[] = movie.elements.actors.items; } From 1920ede83a5291fc636daac15fea0728a9b1828a Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 14 May 2026 16:21:45 +0200 Subject: [PATCH 163/221] exports extended schemas, fix modular content --- lib/public_schemas.ts | 11 ++++++++++- lib/queries/content-items/fetch-content-item-query.ts | 2 +- lib/transforms/content-item-transforms.ts | 9 +++++---- .../content-items/fetch-content-item-query.spec.ts | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/public_schemas.ts b/lib/public_schemas.ts index 92b4e59f..b7ef6e6a 100644 --- a/lib/public_schemas.ts +++ b/lib/public_schemas.ts @@ -1,15 +1,24 @@ // biome-ignore lint/performance/noBarrelFile: One barrel for the schemas subpath is fine export { contentItemSchema, + contentItemSchemaExtended, contentItemSystemSchema, contentItemSystemWithCodename, fetchContentItemSchema, + fetchContentItemSchemaExtended, itemsFeedSchema, + itemsFeedSchemaExtended, itemsReferencingAssetSchema, itemsReferencingItemSchema, listContentItemsSchema, + listContentItemsSchemaExtended, } from "./queries/content-items/schemas/content-item.schemas.js"; -export { assetValueSchema, contentItemElementSchema, elementDef } from "./queries/content-items/schemas/element.schemas.js"; +export { + assetValueSchema, + contentItemElementSchema, + contentItemElementSchemaExtended, + elementDef, +} from "./queries/content-items/schemas/element.schemas.js"; export { contentTypeElementSchema, contentTypeSchema, diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index b476b3d0..3b9fb839 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -53,7 +53,7 @@ export function fetchContentItemQuery( transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), transform: (payload) => { const { extendedItems, extendedModularContent } = resolveExtendedItems({ - modular_content: payload.modular_content, + modularContent: payload.modular_content, inputItems: [payload.item], }); diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 30a9fe9b..8f48df1c 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -24,17 +24,17 @@ function extractToMapByCodename({ export function resolveExtendedItems({ inputItems, - modular_content, + modularContent, }: { readonly inputItems: readonly ContentItemPayload[]; - readonly modular_content: Readonly>>; + readonly modularContent: Readonly>>; }): { readonly extendedItems: readonly ContentItemPayloadExtended[]; readonly extendedModularContent: Readonly>>; } { const allInputItems = extractToMapByCodename({ items: inputItems, - modular_content, + modular_content: modularContent, }); const preparedItems = new Map>( allInputItems.entries().map(([codename, item]) => [codename, { system: item.system, elements: {} }]), @@ -68,6 +68,7 @@ export function resolveExtendedItems({ return { extendedItems: inputItems.map((item) => preparedItems.get(item.system.codename)).filter(isDefined), - extendedModularContent: Object.fromEntries(preparedItems.entries()), + // filter only items that were initially present in the modular_content + extendedModularContent: Object.fromEntries(preparedItems.entries().filter(([key]) => modularContent[key])), }; } diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index 2644541b..d4651dba 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { fetchContentItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { fetchContentItemSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; @@ -11,6 +11,6 @@ describe("Fetch content item query", async () => { endpoint: `items/${codename}`, unitTestPayload, selectQuery: (client) => client.fetchContentItem({ codename }), - expectedSchema: fetchContentItemSchema(), + expectedSchema: fetchContentItemSchemaExtended(), }); }); From f4b9e13cc2e830790e75258a6de38be121853cfc Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 09:05:25 +0200 Subject: [PATCH 164/221] content item transform performance improvements --- lib/transforms/content-item-transforms.ts | 106 ++++++++++++++-------- 1 file changed, 67 insertions(+), 39 deletions(-) diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 8f48df1c..6d1d1096 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -1,25 +1,61 @@ -import { isDefined } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; -import type { ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; +import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; -function extractToMapByCodename({ +type IntermediateRecord = { + readonly item: ContentItemPayload; + readonly preparedItem: ContentItemPayloadExtended; +}; + +function getIntermediateMap({ items, modular_content, }: { readonly items: readonly ContentItemPayload[]; readonly modular_content: Readonly>>; -}) { - const itemsFromModularContent = new Map>( - Object.entries(modular_content).map(([codename, item]) => { - return [codename, item]; - }), +}): Map> { + const createIntermediateRecord = ( + item: ContentItemPayload, + ): IntermediateRecord => ({ item, preparedItem: { system: item.system, elements: {} } }); + + const modularContentRecords = Object.entries(modular_content).reduce>>( + (map, [key, item]) => map.set(key, createIntermediateRecord(item)), + new Map>(), + ); + return items.reduce>>( + (map, item) => map.set(item.system.codename, createIntermediateRecord(item)), + modularContentRecords, ); +} - const mainItems = new Map>(items.map((m) => [m.system.codename, m])); +function resolveExtendedElement( + element: ContentItemElementPayload, + intermediateRecords: Readonly>>, +): ContentItemElementPayloadExtended { + const resolveCodenamesToPreparedItems = ( + codenames: readonly string[], + intermediateRecords: Readonly>>, + ): readonly ContentItemPayloadExtended[] => + codenames.reduce[]>((preparedItems, codename) => { + const record = intermediateRecords.get(codename); + if (record) { + preparedItems.push(record.preparedItem); + } + return preparedItems; + }, []); - return new Map>([...itemsFromModularContent, ...mainItems]); + return match(element) + .returnType() + .with({ type: "modular_content" }, (linkedItemElement) => ({ + ...linkedItemElement, + items: resolveCodenamesToPreparedItems(linkedItemElement.value, intermediateRecords), + })) + .with({ type: "rich_text" }, (richTextElement) => ({ + ...richTextElement, + items: resolveCodenamesToPreparedItems(richTextElement.modular_content, intermediateRecords), + })) + .otherwise((element) => element); } export function resolveExtendedItems({ @@ -32,43 +68,35 @@ export function resolveExtendedItems({ readonly extendedItems: readonly ContentItemPayloadExtended[]; readonly extendedModularContent: Readonly>>; } { - const allInputItems = extractToMapByCodename({ + const intermediateRecords = getIntermediateMap({ items: inputItems, modular_content: modularContent, }); - const preparedItems = new Map>( - allInputItems.entries().map(([codename, item]) => [codename, { system: item.system, elements: {} }]), - ); - - for (const item of allInputItems.values()) { - const preparedItem = preparedItems.get(item.system.codename); - - if (!preparedItem) { - throw new Error( - `Item with codename ${item.system.codename} was not prepared for extension. This is a SDK related issue. Please, report it to the developers.`, - ); - } - - for (const [key, element] of Object.entries(item.elements)) { - const extendedElement = match(element) - .returnType() - .with({ type: "modular_content" }, (linkedItemElement) => ({ - ...linkedItemElement, - items: linkedItemElement.value.map((itemCodename) => preparedItems.get(itemCodename)).filter(isDefined), - })) - .with({ type: "rich_text" }, (richTextElement) => ({ - ...richTextElement, - items: richTextElement.modular_content.map((itemCodename) => preparedItems.get(itemCodename)).filter(isDefined), - })) - .otherwise((element) => element); - preparedItem.elements[key] = extendedElement; + for (const intermediateRecord of intermediateRecords.values()) { + for (const [key, element] of Object.entries(intermediateRecord.item.elements)) { + intermediateRecord.preparedItem.elements[key] = resolveExtendedElement(element, intermediateRecords); } } return { - extendedItems: inputItems.map((item) => preparedItems.get(item.system.codename)).filter(isDefined), + extendedItems: inputItems.reduce[]>((items, item) => { + const intermediateRecord = intermediateRecords.get(item.system.codename); + if (intermediateRecord) { + items.push(intermediateRecord.preparedItem); + } + return items; + }, []), // filter only items that were initially present in the modular_content - extendedModularContent: Object.fromEntries(preparedItems.entries().filter(([key]) => modularContent[key])), + extendedModularContent: Object.keys(modularContent).reduce>>( + (extendedModularContent, key) => { + const record = intermediateRecords.get(key); + if (record) { + extendedModularContent[key] = record.preparedItem; + } + return extendedModularContent; + }, + {}, + ), }; } From f23507091ae7cae9818270909af6d691d423f8bf Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 09:10:01 +0200 Subject: [PATCH 165/221] Further perf improvements --- lib/transforms/content-item-transforms.ts | 25 ++++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 6d1d1096..d332594a 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -29,22 +29,23 @@ function getIntermediateMap({ ); } +function resolveCodenamesToPreparedItems( + codenames: readonly string[], + intermediateRecords: Readonly>>, +): readonly ContentItemPayloadExtended[] { + return codenames.reduce[]>((preparedItems, codename) => { + const record = intermediateRecords.get(codename); + if (record) { + preparedItems.push(record.preparedItem); + } + return preparedItems; + }, []); +} + function resolveExtendedElement( element: ContentItemElementPayload, intermediateRecords: Readonly>>, ): ContentItemElementPayloadExtended { - const resolveCodenamesToPreparedItems = ( - codenames: readonly string[], - intermediateRecords: Readonly>>, - ): readonly ContentItemPayloadExtended[] => - codenames.reduce[]>((preparedItems, codename) => { - const record = intermediateRecords.get(codename); - if (record) { - preparedItems.push(record.preparedItem); - } - return preparedItems; - }, []); - return match(element) .returnType() .with({ type: "modular_content" }, (linkedItemElement) => ({ From 7feaf237077403d4bd62508c3c3766b7bbd65de9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 09:10:42 +0200 Subject: [PATCH 166/221] Delete array.utils.ts --- lib/utils/array.utils.ts | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 lib/utils/array.utils.ts diff --git a/lib/utils/array.utils.ts b/lib/utils/array.utils.ts deleted file mode 100644 index 10f95656..00000000 --- a/lib/utils/array.utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isArray(a: T | readonly T[]): a is readonly T[] { - return Array.isArray(a); -} From 48b3f9bf1d9fb8cf64235f3b7a55efc7a1c4da62 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 09:45:54 +0200 Subject: [PATCH 167/221] extend list-content-items-query --- .../content-items/fetch-content-item-query.ts | 12 ++----- .../content-items/list-content-items-query.ts | 30 +++++++++++++---- lib/queries/delivery-queries.ts | 30 +++++++++++++++++ lib/transforms/content-item-transforms.ts | 32 ++++++++++++++++++- .../list-content-items-query.spec.ts | 4 +-- 5 files changed, 89 insertions(+), 19 deletions(-) diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 3b9fb839..fd19f969 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,6 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; -import { resolveExtendedItems } from "../../transforms/content-item-transforms.js"; +import { resolveExtendedItem } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; import type { FetchContentItemPayloadExtended } from "./models/content-item.models.js"; @@ -52,17 +52,11 @@ export function fetchContentItemQuery( }), transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), transform: (payload) => { - const { extendedItems, extendedModularContent } = resolveExtendedItems({ + const { extendedItem, extendedModularContent } = resolveExtendedItem({ modularContent: payload.modular_content, - inputItems: [payload.item], + inputItem: payload.item, }); - const extendedItem = extendedItems[0]; - - if (!extendedItem) { - throw new Error("Could not resolve extended item. This is a SDK related issue. Please, report it to the developers."); - } - return { item: extendedItem, modular_content: extendedModularContent, diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 267d4cca..32425b4f 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -6,14 +6,15 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ListContentItemsPayload } from "./models/content-item.models.js"; +import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; +import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; +import type { ContentItemPayload, ListContentItemsPayloadExtended } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; export type ListContentItemsQuery = DeliveryPagedFetchQuery< - ListContentItemsPayload, + ListContentItemsPayloadExtended, DeliveryMetadata >; @@ -57,10 +58,25 @@ export function listContentItemsQuery( config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { - return createDeliveryPagedByUrlQuery({ + return transformDeliveryPagedByUrlQuery({ config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchema(), - endpoint: "items", + query: createDeliveryPagedByUrlQuery({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchema(), + endpoint: "items", + }), + transformSchema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchemaExtended(), + transform: (payload) => { + const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ + modularContent: payload.modular_content, + inputItems: payload.items, + }); + return { + items: extendedItems, + modular_content: extendedModularContent, + pagination: payload.pagination, + }; + }, }); } diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 35e2db5e..3d2ff2c4 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -7,6 +7,7 @@ import { type JsonValue, type PagedFetchQuery, transformFetchQuery, + transformPagedFetchQuery, } from "@kontent-ai/core-sdk"; import type { ZodMiniType } from "zod/mini"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; @@ -110,6 +111,35 @@ export function transformDeliveryFetchQuery({ + config, + query, + transform, + transformSchema, +}: { + readonly query: PagedFetchQuery; +} & Pick< + Parameters< + typeof transformPagedFetchQuery< + TPayload, + TTransformedPayload, + DeliverySdkError, + DeliveryMetadata, + unknown, + UrlPagingDeliveryExtraResponseProps + > + >[0], + "transform" | "transformSchema" | "config" +>): PagedFetchQuery { + return transformPagedFetchQuery({ + query, + transform, + transformSchema, + mapError: mapDeliveryError, + config, + }); +} + function getSharedRequestData({ config, endpoint, diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index d332594a..bcfe8be0 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -59,7 +59,7 @@ function resolveExtendedElement( .otherwise((element) => element); } -export function resolveExtendedItems({ +function resolveExtendedItems({ inputItems, modularContent, }: { @@ -101,3 +101,33 @@ export function resolveExtendedItems({ ), }; } + +export function resolveExtendedItemsArray(params: { + readonly inputItems: readonly ContentItemPayload[]; + readonly modularContent: Readonly>>; +}): { + readonly extendedItems: readonly ContentItemPayloadExtended[]; + readonly extendedModularContent: Readonly>>; +} { + return resolveExtendedItems(params); +} + +export function resolveExtendedItem({ + inputItem, + modularContent, +}: { + readonly inputItem: ContentItemPayload; + readonly modularContent: Readonly>>; +}): { + readonly extendedItem: ContentItemPayloadExtended; + readonly extendedModularContent: Readonly>>; +} { + const { extendedItems, extendedModularContent } = resolveExtendedItems({ + inputItems: [inputItem], + modularContent, + }); + // We wrapped a single item; the internal helper preserves order and length, + // so extendedItems[0] is guaranteed defined here by construction. + const [extendedItem] = extendedItems as readonly [ContentItemPayloadExtended]; + return { extendedItem, extendedModularContent }; +} diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 30d307e4..c9b913a9 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { listContentItemsSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; @@ -10,6 +10,6 @@ describe("List content items query", async () => { endpoint: "items", unitTestPayload, selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsSchema(), + expectedSchema: listContentItemsSchemaExtended(), }); }); From 92a362c8b8df291b6237a59939dfa55c0b125d53 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 09:49:45 +0200 Subject: [PATCH 168/221] use extended items feed query --- lib/queries/content-items/items-feed-query.ts | 29 ++++++++++++++----- lib/queries/delivery-queries.ts | 29 +++++++++++++++++++ .../content-items/items-feed-query.spec.ts | 4 +-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 5f4668bd..21b32791 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -11,14 +11,15 @@ import type { ElementSelectionQueryParam, SystemOrderQueryParam, } from "../../models/request.models.js"; -import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ItemsFeedPayload } from "./models/content-item.models.js"; +import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; +import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; +import type { ContentItemPayload, ItemsFeedPayloadExtended } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; export type ItemsFeedQuery = DeliveryPagedFetchQuery< - ItemsFeedPayload, + ItemsFeedPayloadExtended, DeliveryMetadataWithToken >; @@ -55,10 +56,24 @@ export function itemsFeedQuery( config: DeliveryClientConfig, request?: ItemsFeedQueryRequest, ): ItemsFeedQuery { - return createDeliveryPagedByTokenQuery({ + return transformDeliveryPagedByTokenQuery({ config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchema(), - endpoint: "items-feed", + query: createDeliveryPagedByTokenQuery({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchema(), + endpoint: "items-feed", + }), + transformSchema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchemaExtended(), + transform: (payload) => { + const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ + modularContent: payload.modular_content, + inputItems: payload.items, + }); + return { + items: extendedItems, + modular_content: extendedModularContent, + }; + }, }); } diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 3d2ff2c4..1952c3b5 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -140,6 +140,35 @@ export function transformDeliveryPagedByUrlQuery({ + config, + query, + transform, + transformSchema, +}: { + readonly query: PagedFetchQuery; +} & Pick< + Parameters< + typeof transformPagedFetchQuery< + TPayload, + TTransformedPayload, + DeliverySdkError, + DeliveryMetadataWithToken, + unknown, + TokenPagingDeliveryExtraResponseProps + > + >[0], + "transform" | "transformSchema" | "config" +>): PagedFetchQuery { + return transformPagedFetchQuery({ + query, + transform, + transformSchema, + mapError: mapDeliveryError, + config, + }); +} + function getSharedRequestData({ config, endpoint, diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 248cde31..5fa4abdf 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { itemsFeedSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { itemsFeedSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; @@ -10,6 +10,6 @@ describe("Items feed query", async () => { endpoint: "items-feed", unitTestPayload, selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedSchema(), + expectedSchema: itemsFeedSchemaExtended(), }); }); From eb015e1798cace84277c1cf5f5e59f8f1dc4c4de Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 10:14:42 +0200 Subject: [PATCH 169/221] extends unit payloads --- .../fetch-content-item-query.payload.ts | 161 ++++++++- .../list-content-items-query.payload.ts | 319 +++++++++++++++++- 2 files changed, 452 insertions(+), 28 deletions(-) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts index 6207e64a..9bb06dc6 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts @@ -4,29 +4,166 @@ import type { FetchContentItemPayload } from "../../../../lib/queries/content-it export default { item: { system: { - id: "d7862a9a-0333-491c-9db9-ee91a7828a84", - name: "Brad Pitt", - codename: "brad_pitt", + id: "21586dc9-9c04-4c9e-a9e4-83b8cd65baef", + name: "The Dark Knight", + codename: "the_dark_knight", language: "default", - type: "star", + type: "movie", collection: "default", sitemap_locations: [], - last_modified: "2026-04-07T10:20:15.7816154Z", + last_modified: "2026-05-04T10:30:48.5100633Z", workflow: "default", workflow_step: "published", }, elements: { - firstname: { + just_a_number_and_required: { + type: "number", + name: "just a number and required", + value: null, + }, + title: { type: "text", - name: "Firstname", - value: "Brad", + name: "Title", + value: "The Dark Knight", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 152, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, he sets out to dismantle the remaining criminal organizations that plague Gotham City. But the emergence of the Joker creates chaos.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2008-07-18T00:00:00Z", + display_timezone: null, }, - lastname: { + cover: { + type: "asset", + name: "Cover", + value: [ + { + name: "The_Dark_Knight_(2008_film).jpg", + description: null, + type: "image/jpeg", + size: 52188, + url: "https://assets-eu-01.kc-usercontent.com:443/6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b/1ee1e759-4af3-4f0a-acfc-b61a88c1eafe/The_Dark_Knight_%282008_film%29.jpg", + width: 259, + height: 383, + renditions: { + default: { + rendition_id: "467ed3c4-6c7a-4cb3-908b-f908f7b1e7dd", + preset_id: "a6d98cd5-8b2c-4e50-99c9-15192bce2490", + width: 150, + height: 150, + query: "w=150&h=150&fit=clip&rect=54,122,150,150", + }, + }, + }, + ], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "the-dark-knight", + }, + metadata__metadata_description: { type: "text", - name: "Lastname", - value: "Pitt", + name: "Metadata description", + value: "Christopher Nolan's The Dark Knight is widely regarded as one of the greatest superhero films ever made.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["christian_bale", "gary_oldman"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + modular_content: { + christian_bale: { + system: { + id: "2630c0c1-f25a-46df-9dd2-f258ff0d3c60", + name: "Christian Bale", + codename: "christian_bale", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:23.6060976Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Christian", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Bale", + }, + }, + }, + gary_oldman: { + system: { + id: "55b225d8-9d62-4306-9a8f-16feea53a3ac", + name: "Gary Oldman", + codename: "gary_oldman", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:23:57.9327818Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Gary", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Oldman", + }, }, }, }, - modular_content: {}, } satisfies FetchContentItemPayload; diff --git a/tests/integration/queries/content-items/list-content-items-query.payload.ts b/tests/integration/queries/content-items/list-content-items-query.payload.ts index a34cec5f..13239db9 100644 --- a/tests/integration/queries/content-items/list-content-items-query.payload.ts +++ b/tests/integration/queries/content-items/list-content-items-query.payload.ts @@ -5,14 +5,198 @@ export default { items: [ { system: { - id: "d56bff34-5ce8-4ac1-9cb8-547848b3a22b", - name: "Al Pacino", - codename: "al_pacino", + id: "f87989d8-ac15-4b87-b43a-37d85e0002f6", + name: "Avengers: Endgame", + codename: "avengers__endgame", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:39.8815857Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + just_a_number_and_required: { + type: "number", + name: "just a number and required", + value: null, + }, + title: { + type: "text", + name: "Title", + value: "Avengers: Endgame", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 181, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

After the devastating events of Avengers: Infinity War, the remaining Avengers assemble one final time to undo Thanos' destruction and restore the universe. The epic conclusion to the Infinity Saga.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2019-04-26T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "avengers-endgame", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "The highest-grossing film of all time upon release, Avengers: Endgame is the culmination of 22 Marvel Cinematic Universe films.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["chris_evans", "scarlett_johansson", "robert_downey_jr_", "jeremy_renner"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + { + system: { + id: "292468fe-ac5a-4505-b6f1-83cbbee89687", + name: "Black Panther", + codename: "black_panther", + language: "default", + type: "movie", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:25:53.6784162Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + just_a_number_and_required: { + type: "number", + name: "just a number and required", + value: null, + }, + title: { + type: "text", + name: "Title", + value: "Black Panther", + }, + length_in_minutes: { + type: "number", + name: "Length in minutes", + value: 134, + }, + description: { + type: "rich_text", + name: "Description", + images: {}, + links: {}, + modular_content: [], + value: "

T'Challa returns home to the African nation of Wakanda to take his rightful place as king. When a powerful enemy with ties to his past threatens to destroy the country, he must rally his allies and release the full power of the Black Panther.

", + }, + is_blockbuster: { + type: "multiple_choice", + name: "Is blockbuster", + value: [ + { + name: "yes", + codename: "yes", + }, + ], + }, + release_date: { + type: "date_time", + name: "Release date", + value: "2018-02-16T00:00:00Z", + display_timezone: null, + }, + cover: { + type: "asset", + name: "Cover", + value: [], + }, + category: { + type: "taxonomy", + name: "Category", + taxonomy_group: "movie_type", + value: [ + { + name: "Action", + codename: "action", + }, + ], + }, + url: { + type: "url_slug", + name: "Url", + value: "black-panther", + }, + metadata__metadata_description: { + type: "text", + name: "Metadata description", + value: "Marvel's Black Panther became a cultural phenomenon and was nominated for 7 Academy Awards including Best Picture.", + }, + cast: { + type: "modular_content", + name: "Cast", + value: ["chadwick_boseman", "lupita_nyong_o"], + }, + custom: { + type: "custom", + name: "Custom", + value: null, + }, + }, + }, + ], + modular_content: { + chadwick_boseman: { + system: { + id: "831a6311-5e6a-40ee-bb2e-a1a51439b1e1", + name: "Chadwick Boseman", + codename: "chadwick_boseman", language: "default", type: "star", collection: "default", sitemap_locations: [], - last_modified: "2026-04-07T10:20:25.6499619Z", + last_modified: "2026-04-07T10:21:12.1866334Z", workflow: "default", workflow_step: "published", }, @@ -20,25 +204,25 @@ export default { firstname: { type: "text", name: "Firstname", - value: "Al", + value: "Chadwick", }, lastname: { type: "text", name: "Lastname", - value: "Pacino", + value: "Boseman", }, }, }, - { + chris_evans: { system: { - id: "b25e6ed1-0a3f-4975-bb84-4c7efefa70d0", - name: "Amy Adams", - codename: "amy_adams", + id: "7a6f289c-3c2f-4b8d-a66e-f7361e8a2a6f", + name: "Chris Evans", + codename: "chris_evans", language: "default", type: "star", collection: "default", sitemap_locations: [], - last_modified: "2026-04-07T10:21:17.8650469Z", + last_modified: "2026-04-07T10:21:20.9296898Z", workflow: "default", workflow_step: "published", }, @@ -46,21 +230,124 @@ export default { firstname: { type: "text", name: "Firstname", - value: "Amy", + value: "Chris", }, lastname: { type: "text", name: "Lastname", - value: "Adams", + value: "Evans", }, }, }, - ], - modular_content: {}, + jeremy_renner: { + system: { + id: "d87ce611-4f91-451e-8fa2-24f0922ba71c", + name: "Jeremy Renner", + codename: "jeremy_renner", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:55.7508643Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Jeremy", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Renner", + }, + }, + }, + lupita_nyong_o: { + system: { + id: "2c71df49-6390-453f-b2dd-12467406b350", + name: "Lupita Nyong'o", + codename: "lupita_nyong_o", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:21:13.5243957Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Lupita", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Nyong'o", + }, + }, + }, + robert_downey_jr_: { + system: { + id: "bbc14c55-9d5b-4c75-a968-6e17799987a7", + name: "Robert Downey Jr.", + codename: "robert_downey_jr_", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:22:45.6740229Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Robert", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Downey Jr.", + }, + }, + }, + scarlett_johansson: { + system: { + id: "70c23859-845e-40d6-86f7-2c1865ff828d", + name: "Scarlett Johansson", + codename: "scarlett_johansson", + language: "default", + type: "star", + collection: "default", + sitemap_locations: [], + last_modified: "2026-04-07T10:20:20.2541643Z", + workflow: "default", + workflow_step: "published", + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: "Scarlett", + }, + lastname: { + type: "text", + name: "Lastname", + value: "Johansson", + }, + }, + }, + }, pagination: { skip: 0, limit: 2, count: 2, - next_page: "", + next_page: "https://deliver.kontent.ai/6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b/items?system.type=movie&limit=2&skip=2", }, } satisfies ListContentItemsPayload; From ddb1da8d3d55bce83364ac83796f969e2e25dc2e Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 10:27:45 +0200 Subject: [PATCH 170/221] test fixes --- .../queries/content-items/fetch-content-item-query.spec.ts | 2 +- .../queries/content-items/list-content-items-query.payload.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index d4651dba..b8db64e3 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -6,7 +6,7 @@ import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; describe("Fetch content item query", async () => { - const codename = "brad_pitt"; + const codename = unitTestPayload.item.system.codename; await runQueryTestsAsync>({ endpoint: `items/${codename}`, unitTestPayload, diff --git a/tests/integration/queries/content-items/list-content-items-query.payload.ts b/tests/integration/queries/content-items/list-content-items-query.payload.ts index 13239db9..c8fb9660 100644 --- a/tests/integration/queries/content-items/list-content-items-query.payload.ts +++ b/tests/integration/queries/content-items/list-content-items-query.payload.ts @@ -348,6 +348,6 @@ export default { skip: 0, limit: 2, count: 2, - next_page: "https://deliver.kontent.ai/6bdd84fc-f71e-01a0-0ba6-79ce07af7f9b/items?system.type=movie&limit=2&skip=2", + next_page: "", }, } satisfies ListContentItemsPayload; From 450bd61ceb04dc1183599dd356789aee9ecf6075 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 10:41:08 +0200 Subject: [PATCH 171/221] Update delivery-client.ts --- lib/client/delivery-client.ts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index d776545e..29bd7995 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -23,26 +23,6 @@ import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries * * We highly recommend generating the schema type using the `@kontent-ai/model-generator` npm package * and passing it as the type argument for full compile-time safety. - * - * By enabling the response validation, you can also achieve run-time type safety. - * - * @example - * With schema – narrow codename types - * - * type MySchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-us", "es-es"]; ... }>; - * - * const client = createDeliveryClient({ - * apiMode: "public", - * environmentId: "x", - * }); - * - * @example - * Without schema – codenames are string - * - * const client = createDeliveryClient({ - * apiMode: "public", - * environmentId: "x", - * }); */ export function createDeliveryClient( config: DeliveryClientConfig, From 72278db49be3bbe0a34be5ee17d55ccec30debdd Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 11:14:08 +0200 Subject: [PATCH 172/221] Adds ability to run raw queries instead of extended --- lib/models/request.models.ts | 4 ++++ .../content-items/fetch-content-item-query.ts | 23 +++++++++++-------- lib/queries/content-items/items-feed-query.ts | 22 ++++++++++-------- .../content-items/list-content-items-query.ts | 22 ++++++++++-------- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index 79660d07..a5864b8d 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -40,6 +40,10 @@ export type DeliveryRequestWithCodename< export type QueryParameterRecord = Record; +export type WithRaw = { + readonly raw: () => TRawQuery; +}; + export type DeliveryRequestConfig = { /** * Additional headers to be added to the request. diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index fd19f969..0f391f3d 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,13 +1,14 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; -import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; +import type { DeliveryRequestWithCodename, ElementSelectionQueryParam, WithRaw } from "../../models/request.models.js"; import { resolveExtendedItem } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; -import type { FetchContentItemPayloadExtended } from "./models/content-item.models.js"; +import type { FetchContentItemPayload, FetchContentItemPayloadExtended } from "./models/content-item.models.js"; export type FetchContentItemQuery = DeliveryFetchQuery< FetchContentItemPayloadExtended, DeliveryMetadata ->; +> & + WithRaw, DeliveryMetadata>>; export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< readonly string[], @@ -42,14 +43,15 @@ export function fetchContentItemQuery( config: DeliveryClientConfig, request: FetchContentItemQueryRequest, ): FetchContentItemQuery { - return transformDeliveryFetchQuery({ + const rawQuery = createDeliveryFetchQuery>({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), + endpoint: `items/${request.codename}`, + }); + const extendedQuery = transformDeliveryFetchQuery({ config, - query: createDeliveryFetchQuery({ - config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), - endpoint: `items/${request.codename}`, - }), + query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), transform: (payload) => { const { extendedItem, extendedModularContent } = resolveExtendedItem({ @@ -63,4 +65,5 @@ export function fetchContentItemQuery( }; }, }); + return { ...extendedQuery, raw: () => rawQuery }; } diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 21b32791..92eb58ac 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -10,10 +10,11 @@ import type { ElementOrderQueryParam, ElementSelectionQueryParam, SystemOrderQueryParam, + WithRaw, } from "../../models/request.models.js"; import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ItemsFeedPayloadExtended } from "./models/content-item.models.js"; +import type { ContentItemPayload, ItemsFeedPayload, ItemsFeedPayloadExtended } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -21,7 +22,8 @@ type ElementProperties = NonNullable = DeliveryPagedFetchQuery< ItemsFeedPayloadExtended, DeliveryMetadataWithToken ->; +> & + WithRaw, DeliveryMetadataWithToken>>; export type ItemsFeedQueryRequest = DeliveryRequestWithTokenPaging< { @@ -56,14 +58,15 @@ export function itemsFeedQuery( config: DeliveryClientConfig, request?: ItemsFeedQueryRequest, ): ItemsFeedQuery { - return transformDeliveryPagedByTokenQuery({ + const rawQuery = createDeliveryPagedByTokenQuery>({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchema(), + endpoint: "items-feed", + }); + const extendedQuery = transformDeliveryPagedByTokenQuery({ config, - query: createDeliveryPagedByTokenQuery({ - config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchema(), - endpoint: "items-feed", - }), + query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchemaExtended(), transform: (payload) => { const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ @@ -76,4 +79,5 @@ export function itemsFeedQuery( }; }, }); + return { ...extendedQuery, raw: () => rawQuery }; } diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 32425b4f..4a2b72b6 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -5,10 +5,11 @@ import type { ElementOrderQueryParam, ElementSelectionQueryParam, SystemOrderQueryParam, + WithRaw, } from "../../models/request.models.js"; import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ListContentItemsPayloadExtended } from "./models/content-item.models.js"; +import type { ContentItemPayload, ListContentItemsPayload, ListContentItemsPayloadExtended } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -16,7 +17,8 @@ type ElementProperties = NonNullable = DeliveryPagedFetchQuery< ListContentItemsPayloadExtended, DeliveryMetadata ->; +> & + WithRaw, DeliveryMetadata>>; export type ListContentItemsQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam | ElementOrderQueryParam>, @@ -58,14 +60,15 @@ export function listContentItemsQuery( config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { - return transformDeliveryPagedByUrlQuery({ + const rawQuery = createDeliveryPagedByUrlQuery>({ + config, + request, + schema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchema(), + endpoint: "items", + }); + const extendedQuery = transformDeliveryPagedByUrlQuery({ config, - query: createDeliveryPagedByUrlQuery({ - config, - request, - schema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchema(), - endpoint: "items", - }), + query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchemaExtended(), transform: (payload) => { const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ @@ -79,4 +82,5 @@ export function listContentItemsQuery( }; }, }); + return { ...extendedQuery, raw: () => rawQuery }; } From 58939cbd75ffc5c46468255a298f48d425922326 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 15 May 2026 11:16:29 +0200 Subject: [PATCH 173/221] fixes tests --- .../queries/content-items/fetch-content-item-query.spec.ts | 6 +++--- .../queries/content-items/items-feed-query.spec.ts | 6 +++--- ....payload.ts => items-referencing-asset-query.payload.ts} | 0 .../content-items/items-referencing-asset-query.spec.ts | 2 +- .../queries/content-items/list-content-items-query.spec.ts | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) rename tests/integration/queries/content-items/{itesm-referencing-asset-query.payload.ts => items-referencing-asset-query.payload.ts} (100%) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index b8db64e3..8fbb623d 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { fetchContentItemSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { fetchContentItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./fetch-content-item-query.payload.js"; @@ -10,7 +10,7 @@ describe("Fetch content item query", async () => { await runQueryTestsAsync>({ endpoint: `items/${codename}`, unitTestPayload, - selectQuery: (client) => client.fetchContentItem({ codename }), - expectedSchema: fetchContentItemSchemaExtended(), + selectQuery: (client) => client.fetchContentItem({ codename }).raw(), + expectedSchema: fetchContentItemSchema(), }); }); diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 5fa4abdf..3f4f757c 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { itemsFeedSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { itemsFeedSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./items-feed-query.payload.js"; @@ -9,7 +9,7 @@ describe("Items feed query", async () => { await runQueryTestsAsync>({ endpoint: "items-feed", unitTestPayload, - selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedSchemaExtended(), + selectQuery: (client) => client.itemsFeed().raw(), + expectedSchema: itemsFeedSchema(), }); }); diff --git a/tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts b/tests/integration/queries/content-items/items-referencing-asset-query.payload.ts similarity index 100% rename from tests/integration/queries/content-items/itesm-referencing-asset-query.payload.ts rename to tests/integration/queries/content-items/items-referencing-asset-query.payload.ts diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index 60a23ca0..9e9a038f 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -3,7 +3,7 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./itesm-referencing-asset-query.payload.js"; +import unitTestPayload from "./items-referencing-asset-query.payload.js"; describe("Items referencing asset query", async () => { const assetCodename = "the_dark_knight__2008_film__jpg"; diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index c9b913a9..58b75309 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,7 +1,7 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { listContentItemsSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import unitTestPayload from "./list-content-items-query.payload.js"; @@ -9,7 +9,7 @@ describe("List content items query", async () => { await runQueryTestsAsync>({ endpoint: "items", unitTestPayload, - selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsSchemaExtended(), + selectQuery: (client) => client.listContentItems().raw(), + expectedSchema: listContentItemsSchema(), }); }); From 45fabff0f314940479ce5502015a856427f6a63c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 09:56:58 +0200 Subject: [PATCH 174/221] Renames unit test payload to rawPayload, adds basic extended query tests --- .../fetch-content-item-query.spec.ts | 24 ++++- .../content-items/items-feed-query.spec.ts | 6 +- .../items-referencing-asset-query.spec.ts | 4 +- .../items-referencing-item-query.spec.ts | 4 +- .../list-content-items-query.spec.ts | 8 +- .../fetch-content-type-element-query.spec.ts | 6 +- .../fetch-content-type-query.spec.ts | 4 +- .../list-content-types-query.spec.ts | 4 +- .../languages/list-languages-query.spec.ts | 4 +- .../taxonomies/fetch-taxonomy-query.spec.ts | 4 +- .../taxonomies/list-taxonomies-query.spec.ts | 4 +- tests/utils/integration-test.utils.ts | 98 +++++++++++++------ 12 files changed, 116 insertions(+), 54 deletions(-) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index 8fbb623d..fbd36bb2 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,16 +1,32 @@ import { describe } from "vitest"; import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; +import { createDeliveryClient } from "../../../../lib/public_api.js"; import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { fetchContentItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { + fetchContentItemSchema, + fetchContentItemSchemaExtended, +} from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { getIntegrationTestConfig } from "../../../integration-tests.config.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./fetch-content-item-query.payload.js"; +import rawPayload from "./fetch-content-item-query.payload.js"; describe("Fetch content item query", async () => { - const codename = unitTestPayload.item.system.codename; + const codename = rawPayload.item.system.codename; await runQueryTestsAsync>({ endpoint: `items/${codename}`, - unitTestPayload, + rawPayload, selectQuery: (client) => client.fetchContentItem({ codename }).raw(), expectedSchema: fetchContentItemSchema(), + extendedQuery: { + expectedSchema: fetchContentItemSchemaExtended(), + selectQuery: (client) => client.fetchContentItem({ codename }), + }, }); + + const client = createDeliveryClient({ apiMode: "public", environmentId: getIntegrationTestConfig().env.id }); + const { payload } = await client.fetchContentItem({ codename }).fetch(); + + if (payload.item.elements.cast?.type === "modular_content") { + console.log(payload.item.elements.cast.items); + } }); diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 3f4f757c..2f00bcfa 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -8,8 +8,12 @@ import unitTestPayload from "./items-feed-query.payload.js"; describe("Items feed query", async () => { await runQueryTestsAsync>({ endpoint: "items-feed", - unitTestPayload, + rawPayload: unitTestPayload, selectQuery: (client) => client.itemsFeed().raw(), expectedSchema: itemsFeedSchema(), + extendedQuery: { + selectQuery: (client) => client.itemsFeed(), + expectedSchema: itemsFeedSchema(), + }, }); }); diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts index 9e9a038f..ffe434f9 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.spec.ts @@ -3,13 +3,13 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsReferencingAssetSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./items-referencing-asset-query.payload.js"; +import rawPayload from "./items-referencing-asset-query.payload.js"; describe("Items referencing asset query", async () => { const assetCodename = "the_dark_knight__2008_film__jpg"; await runQueryTestsAsync>({ endpoint: `assets/${assetCodename}/used-in`, - unitTestPayload, + rawPayload, selectQuery: (client) => client.itemsReferencingAsset({ codename: assetCodename }), expectedSchema: itemsReferencingAssetSchema(), }); diff --git a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts index 09d3fe74..8fe0b7d7 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.spec.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.spec.ts @@ -3,13 +3,13 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsReferencingItemSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./items-referencing-item-query.payload.js"; +import rawPayload from "./items-referencing-item-query.payload.js"; describe("Items referencing item query", async () => { const itemCodename = "the_dark_knight"; await runQueryTestsAsync>({ endpoint: `items/${itemCodename}/used-in`, - unitTestPayload, + rawPayload: rawPayload, selectQuery: (client) => client.itemsReferencingItem({ codename: itemCodename }), expectedSchema: itemsReferencingItemSchema(), }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 58b75309..edf149de 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -3,13 +3,17 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./list-content-items-query.payload.js"; +import rawPayload from "./list-content-items-query.payload.js"; describe("List content items query", async () => { await runQueryTestsAsync>({ endpoint: "items", - unitTestPayload, + rawPayload, selectQuery: (client) => client.listContentItems().raw(), expectedSchema: listContentItemsSchema(), + extendedQuery: { + selectQuery: (client) => client.listContentItems(), + expectedSchema: listContentItemsSchema(), + }, }); }); diff --git a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts index 98a3b7d0..b2072be3 100644 --- a/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-element-query.spec.ts @@ -2,15 +2,15 @@ import { describe } from "vitest"; import type { ContentTypeElementPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { contentTypeElementSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import payloads from "./fetch-content-type-element-query.payload.js"; +import rawPayload from "./fetch-content-type-element-query.payload.js"; describe("Fetch content type element query", async () => { const typeCodename = "movie"; - const tests: readonly Promise[] = payloads.map(async (payload) => + const tests: readonly Promise[] = rawPayload.map(async (payload) => runQueryTestsAsync({ endpoint: `types/${typeCodename}/elements/${payload.codename}`, - unitTestPayload: payload, + rawPayload: payload, selectQuery: (client) => client.fetchContentTypeElement({ typeCodename, elementCodename: payload.codename }), expectedSchema: contentTypeElementSchema(), }), diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index d0c3ea41..dbffe3a3 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -3,13 +3,13 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { contentTypeSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./fetch-content-type-query.payload.js"; +import rawPayload from "./fetch-content-type-query.payload.js"; describe("Fetch content type query", async () => { const codename = "movie"; await runQueryTestsAsync>({ endpoint: `types/${codename}`, - unitTestPayload, + rawPayload, selectQuery: (client) => client.fetchContentType({ codename: codename }), expectedSchema: contentTypeSchema(), }); diff --git a/tests/integration/queries/content-types/list-content-types-query.spec.ts b/tests/integration/queries/content-types/list-content-types-query.spec.ts index 6f307012..9d7b5911 100644 --- a/tests/integration/queries/content-types/list-content-types-query.spec.ts +++ b/tests/integration/queries/content-types/list-content-types-query.spec.ts @@ -3,12 +3,12 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { listContentTypesSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./list-content-types-query.payload.js"; +import rawPayload from "./list-content-types-query.payload.js"; describe("List content types query", async () => { await runQueryTestsAsync>({ endpoint: "types", - unitTestPayload, + rawPayload, selectQuery: (client) => client.listContentTypes(), expectedSchema: listContentTypesSchema(), }); diff --git a/tests/integration/queries/languages/list-languages-query.spec.ts b/tests/integration/queries/languages/list-languages-query.spec.ts index 4df63f30..dce2baad 100644 --- a/tests/integration/queries/languages/list-languages-query.spec.ts +++ b/tests/integration/queries/languages/list-languages-query.spec.ts @@ -3,12 +3,12 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ListLanguagesPayload } from "../../../../lib/queries/languages/models/language.models.js"; import { listLanguagesSchema } from "../../../../lib/queries/languages/schemas/language.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./list-languages-query.payload.js"; +import rawPayload from "./list-languages-query.payload.js"; describe("List languages query", async () => { await runQueryTestsAsync>({ endpoint: "languages", - unitTestPayload, + rawPayload, selectQuery: (client) => client.listLanguages(), expectedSchema: listLanguagesSchema(), }); diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts index 8d36d7d7..84a1d3ed 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.spec.ts @@ -3,13 +3,13 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; import { taxonomySchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./fetch-taxonomy-query.payload.js"; +import rawPayload from "./fetch-taxonomy-query.payload.js"; describe("Fetch taxonomy query", async () => { const codename = "movie_type"; await runQueryTestsAsync>({ endpoint: `taxonomies/${codename}`, - unitTestPayload, + rawPayload, selectQuery: (client) => client.fetchTaxonomy({ codename: codename }), expectedSchema: taxonomySchema(), }); diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts index 32150120..33790676 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.spec.ts @@ -3,12 +3,12 @@ import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; import { listTaxonomiesSchema } from "../../../../lib/queries/taxonomies/schemas/taxonomy.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import unitTestPayload from "./list-taxonomies-query.payload.js"; +import rawPayload from "./list-taxonomies-query.payload.js"; describe("List taxonomies query", async () => { await runQueryTestsAsync>({ endpoint: "taxonomies", - unitTestPayload, + rawPayload, selectQuery: (client) => client.listTaxonomies(), expectedSchema: listTaxonomiesSchema(), }); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 02c2a4ba..f2187b0d 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -25,19 +25,24 @@ type SelectQuery = ( export async function runQueryTestsAsync({ endpoint, - unitTestPayload, + rawPayload, selectQuery, expectedSchema, + extendedQuery, }: { readonly expectedSchema: ZodMiniType; readonly endpoint: DeliveryEndpoint; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload | undefined; readonly selectQuery: SelectQuery; + readonly extendedQuery?: { + readonly expectedSchema: ZodMiniType; + readonly selectQuery: SelectQuery; + }; }): Promise { const integrationTestConfig = getIntegrationTestConfig(); const clients = createTestClients({ - unitTestPayload, + rawPayload, environmentId: integrationTestConfig.env.id, deliveryBaseUrl: integrationTestConfig.env.deliveryBaseUrl, }); @@ -49,27 +54,60 @@ export async function runQueryTestsAsync({ endpoint, selectQuery, expectedSchema, - unitTestPayload, + rawPayload, + }); + } + + if (extendedQuery) { + await runExtendedQueryTestsAsync({ + expectedSchema: extendedQuery.expectedSchema, + selectQuery: extendedQuery.selectQuery, + environmentId: integrationTestConfig.env.id, + deliveryBaseUrl: integrationTestConfig.env.deliveryBaseUrl, + endpoint, }); } await runFailingClientQueryTestAsync({ endpoint, selectQuery }); } +async function runExtendedQueryTestsAsync({ + expectedSchema, + selectQuery, + environmentId, + deliveryBaseUrl, + endpoint, +}: { + readonly endpoint: DeliveryEndpoint; + readonly expectedSchema: ZodMiniType; + readonly selectQuery: SelectQuery; + readonly environmentId: string; + readonly deliveryBaseUrl: BaseUrl | undefined; +}): Promise { + await runClientQueryTestsAsync({ + client: createIntegrationTestClient(environmentId, deliveryBaseUrl), + integrationEnvironmentId: environmentId, + endpoint, + selectQuery, + expectedSchema, + rawPayload: undefined, + }); +} + async function runClientQueryTestsAsync({ client, integrationEnvironmentId, endpoint, selectQuery, expectedSchema, - unitTestPayload, + rawPayload, }: { readonly client: DeliveryClient; readonly integrationEnvironmentId: string; readonly endpoint: DeliveryEndpoint; readonly selectQuery: SelectQuery; readonly expectedSchema: ZodMiniType; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; }): Promise { const { testType, testName } = createTestMetadata({ clientEnvironmentId: client.config.environmentId, @@ -79,14 +117,14 @@ async function runClientQueryTestsAsync({ const { query, response, success, error } = await executeDefaultQueryAsync({ client, selectQuery }); - registerBaseTests({ testName, endpoint, client, query, response, success, error, expectedSchema, unitTestPayload, testType }); + registerBaseTests({ testName, endpoint, client, query, response, success, error, expectedSchema, rawPayload, testType }); if (isPagingQuery(query)) { registerPagingTests({ query, testName, testType, - unitTestPayload, + rawPayload, expectedSchema, response, ...(await executePagingQueryAsync({ query })), @@ -108,7 +146,7 @@ function createFailingUnitTestClient(): DeliveryClient { }); } -function createUnitTestClient(unitTestPayload: TResponsePayload): DeliveryClient { +function createUnitTestClient(rawPayload: TResponsePayload): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -116,7 +154,7 @@ function createUnitTestClient(unitTestPayloa validateResponses: true, }, httpService: getTestHttpServiceWithJsonResponse({ - jsonResponse: unitTestPayload, + jsonResponse: rawPayload, statusCode: 200, }), }); @@ -134,15 +172,15 @@ function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: Bas } function createTestClients({ - unitTestPayload, + rawPayload, environmentId, deliveryBaseUrl, }: { - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; readonly environmentId: string; readonly deliveryBaseUrl: BaseUrl | undefined; }): readonly DeliveryClient[] { - return [createUnitTestClient(unitTestPayload), createIntegrationTestClient(environmentId, deliveryBaseUrl)]; + return [createUnitTestClient(rawPayload), createIntegrationTestClient(environmentId, deliveryBaseUrl)]; } function createTestMetadata({ @@ -173,7 +211,7 @@ function registerBaseTests({ success, error, expectedSchema, - unitTestPayload, + rawPayload, testType, }: { readonly testName: string; @@ -184,11 +222,11 @@ function registerBaseTests({ readonly success: boolean; readonly error: unknown; readonly expectedSchema: ZodMiniType; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; readonly testType: TestType; }): void { registerQueryStructureTests({ testName, query, endpoint, client }); - registerResponseValidationTests({ testName, success, error, expectedSchema, response, testType, unitTestPayload }); + registerResponseValidationTests({ testName, success, error, expectedSchema, response, testType, rawPayload }); } function registerQueryStructureTests({ @@ -221,7 +259,7 @@ function registerResponseValidationTests({ expectedSchema, response, testType, - unitTestPayload, + rawPayload, }: { readonly testName: string; readonly success: boolean; @@ -229,7 +267,7 @@ function registerResponseValidationTests({ readonly expectedSchema: ZodMiniType; readonly response: { readonly payload: TResponsePayload } | undefined; readonly testType: TestType; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; }): void { it(`${testName} Response should be successful`, () => { expect(error).toBeUndefined(); @@ -240,9 +278,9 @@ function registerResponseValidationTests({ expect(parseError).toBeUndefined(); expect(parseSuccess).toBeTruthy(); }); - if (testType === "Unit") { + if (testType === "Unit" && rawPayload) { it(`${testName} Payload should be equal to unit test payload`, () => { - expect(response?.payload).toEqual(unitTestPayload); + expect(response?.payload).toEqual(rawPayload); }); } } @@ -251,7 +289,7 @@ function registerPagingTests({ query, testName, testType, - unitTestPayload, + rawPayload, expectedSchema, response, pagingResponses, @@ -263,7 +301,7 @@ function registerPagingTests({ readonly query: PagedFetchQuery; readonly testName: string; readonly testType: TestType; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; readonly expectedSchema: ZodMiniType; readonly response: { readonly payload: TResponsePayload } | undefined; readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; @@ -280,9 +318,9 @@ function registerPagingTests({ response, testType, pagingResponses, - unitTestPayload, + rawPayload, }); - registerPagingIteratorTests({ testName, query, iteratorPayloads, maxPagesCount, testType, unitTestPayload }); + registerPagingIteratorTests({ testName, query, iteratorPayloads, maxPagesCount, testType, rawPayload }); } function registerPagingResponseTests({ @@ -293,7 +331,7 @@ function registerPagingResponseTests({ response, testType, pagingResponses, - unitTestPayload, + rawPayload, }: { readonly testName: string; readonly pagingSuccess: boolean; @@ -302,7 +340,7 @@ function registerPagingResponseTests({ readonly response: { readonly payload: TResponsePayload } | undefined; readonly testType: TestType; readonly pagingResponses: readonly { readonly payload: TResponsePayload }[] | undefined; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; }): void { it(`${testName} Response should be successful`, () => { expect(pagingError).toBeUndefined(); @@ -316,7 +354,7 @@ function registerPagingResponseTests({ if (testType === "Unit") { const firstResponse = pagingResponses?.[0]; it(`${testName} First paging response payload should match unit test payload`, () => { - expect(firstResponse?.payload).toEqual(unitTestPayload); + expect(firstResponse?.payload).toEqual(rawPayload); }); } } @@ -327,14 +365,14 @@ function registerPagingIteratorTests({ iteratorPayloads, maxPagesCount, testType, - unitTestPayload, + rawPayload, }: { readonly testName: string; readonly query: PagedFetchQuery; readonly iteratorPayloads: readonly TResponsePayload[]; readonly maxPagesCount: number; readonly testType: TestType; - readonly unitTestPayload: TResponsePayload; + readonly rawPayload: TResponsePayload; }): void { it(`${testName} Iterator responses should be equal to paging responses`, () => { expect(iteratorPayloads.length).toEqual(maxPagesCount); @@ -345,7 +383,7 @@ function registerPagingIteratorTests({ if (testType === "Unit") { const firstIteratorResponse = iteratorPayloads?.[0]; it(`${testName} First iterator response payload should match schema`, () => { - expect(firstIteratorResponse).toEqual(unitTestPayload); + expect(firstIteratorResponse).toEqual(rawPayload); }); } } From 5485344cf78c22f4ef9d3b62c14b91bc44bd78e3 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 12:04:53 +0200 Subject: [PATCH 175/221] simplifies extended query tests --- .../fetch-content-item-query.spec.ts | 14 ++++-- .../content-items/items-feed-query.spec.ts | 13 ++++-- .../list-content-items-query.spec.ts | 13 ++++-- tests/utils/integration-test.utils.ts | 43 ++----------------- 4 files changed, 31 insertions(+), 52 deletions(-) diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index fbd36bb2..545a80bc 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -17,10 +17,6 @@ describe("Fetch content item query", async () => { rawPayload, selectQuery: (client) => client.fetchContentItem({ codename }).raw(), expectedSchema: fetchContentItemSchema(), - extendedQuery: { - expectedSchema: fetchContentItemSchemaExtended(), - selectQuery: (client) => client.fetchContentItem({ codename }), - }, }); const client = createDeliveryClient({ apiMode: "public", environmentId: getIntegrationTestConfig().env.id }); @@ -30,3 +26,13 @@ describe("Fetch content item query", async () => { console.log(payload.item.elements.cast.items); } }); + +describe("Fetch content item query - extended", async () => { + const codename = rawPayload.item.system.codename; + await runQueryTestsAsync({ + endpoint: `items/${codename}`, + rawPayload: undefined, + selectQuery: (client) => client.fetchContentItem({ codename }), + expectedSchema: fetchContentItemSchemaExtended(), + }); +}); diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 2f00bcfa..595f9857 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -11,9 +11,14 @@ describe("Items feed query", async () => { rawPayload: unitTestPayload, selectQuery: (client) => client.itemsFeed().raw(), expectedSchema: itemsFeedSchema(), - extendedQuery: { - selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedSchema(), - }, + }); +}); + +describe("Items feed query - extended", async () => { + await runQueryTestsAsync({ + endpoint: "items-feed", + rawPayload: undefined, + selectQuery: (client) => client.itemsFeed(), + expectedSchema: itemsFeedSchema(), }); }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index edf149de..91dc875d 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -11,9 +11,14 @@ describe("List content items query", async () => { rawPayload, selectQuery: (client) => client.listContentItems().raw(), expectedSchema: listContentItemsSchema(), - extendedQuery: { - selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsSchema(), - }, + }); +}); + +describe("List content items query - extended", async () => { + await runQueryTestsAsync({ + endpoint: "items", + rawPayload: undefined, + selectQuery: (client) => client.listContentItems(), + expectedSchema: listContentItemsSchema(), }); }); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index f2187b0d..4562fd0c 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -28,16 +28,11 @@ export async function runQueryTestsAsync({ rawPayload, selectQuery, expectedSchema, - extendedQuery, }: { readonly expectedSchema: ZodMiniType; readonly endpoint: DeliveryEndpoint; readonly rawPayload: TResponsePayload | undefined; readonly selectQuery: SelectQuery; - readonly extendedQuery?: { - readonly expectedSchema: ZodMiniType; - readonly selectQuery: SelectQuery; - }; }): Promise { const integrationTestConfig = getIntegrationTestConfig(); @@ -58,42 +53,9 @@ export async function runQueryTestsAsync({ }); } - if (extendedQuery) { - await runExtendedQueryTestsAsync({ - expectedSchema: extendedQuery.expectedSchema, - selectQuery: extendedQuery.selectQuery, - environmentId: integrationTestConfig.env.id, - deliveryBaseUrl: integrationTestConfig.env.deliveryBaseUrl, - endpoint, - }); - } - await runFailingClientQueryTestAsync({ endpoint, selectQuery }); } -async function runExtendedQueryTestsAsync({ - expectedSchema, - selectQuery, - environmentId, - deliveryBaseUrl, - endpoint, -}: { - readonly endpoint: DeliveryEndpoint; - readonly expectedSchema: ZodMiniType; - readonly selectQuery: SelectQuery; - readonly environmentId: string; - readonly deliveryBaseUrl: BaseUrl | undefined; -}): Promise { - await runClientQueryTestsAsync({ - client: createIntegrationTestClient(environmentId, deliveryBaseUrl), - integrationEnvironmentId: environmentId, - endpoint, - selectQuery, - expectedSchema, - rawPayload: undefined, - }); -} - async function runClientQueryTestsAsync({ client, integrationEnvironmentId, @@ -176,11 +138,12 @@ function createTestClients({ environmentId, deliveryBaseUrl, }: { - readonly rawPayload: TResponsePayload; + readonly rawPayload: TResponsePayload | undefined; readonly environmentId: string; readonly deliveryBaseUrl: BaseUrl | undefined; }): readonly DeliveryClient[] { - return [createUnitTestClient(rawPayload), createIntegrationTestClient(environmentId, deliveryBaseUrl)]; + const integrationClient = createIntegrationTestClient(environmentId, deliveryBaseUrl); + return rawPayload === undefined ? [integrationClient] : [createUnitTestClient(rawPayload), integrationClient]; } function createTestMetadata({ From 4feb267a25ebbdb0deeb038c0f90cd0a375b2acf Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 12:21:08 +0200 Subject: [PATCH 176/221] Prepares delivery integration test schemas --- ...yped-content-model.ts => sample-schema.ts} | 0 .../models/integration-test.schema.ts | 46 +++++++++++++++++++ 2 files changed, 46 insertions(+) rename sample/{typed-content-model.ts => sample-schema.ts} (100%) create mode 100644 tests/integration/models/integration-test.schema.ts diff --git a/sample/typed-content-model.ts b/sample/sample-schema.ts similarity index 100% rename from sample/typed-content-model.ts rename to sample/sample-schema.ts diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts new file mode 100644 index 00000000..4cec3710 --- /dev/null +++ b/tests/integration/models/integration-test.schema.ts @@ -0,0 +1,46 @@ +import type { ContentItemOf, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; + +export type IntegrationTestProjectSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["default"]; + readonly taxonomyCodenames: readonly ["movie_type"]; + readonly contentTypeCodenames: readonly ["movie", "star"]; + readonly elementCodenames: readonly [ + "title", + "length_in_minutes", + "description", + "is_blockbuster", + "release_date", + "cover", + "category", + "url", + "metadata__metadata_description", + "cast", + "firstname", + "lastname", + ]; + readonly collectionCodenames: readonly ["default"]; + readonly workflowCodenames: readonly ["default"]; + readonly workflowStepCodenames: readonly ["published", "draft"]; +}>; + +export type StarElements = { + readonly firstname: ElementType.Text; + readonly lastname: ElementType.Text; +}; + +export type Star = ContentItemOf; + +export type MovieElements = { + readonly title: ElementType.Text; + readonly length_in_minutes: ElementType.Number; + readonly description: ElementType.RichText; + readonly is_blockbuster: ElementType.MultipleChoice<"yes">; + readonly release_date: ElementType.DateTime; + readonly cover: ElementType.Asset; + readonly category: ElementType.Taxonomy; + readonly url: ElementType.UrlSlug; + readonly metadata__metadata_description: ElementType.Text; + readonly cast: ElementType.LinkedItems; +}; + +export type Movie = ContentItemOf; From d5dea35c7dfe79ea492bbdac5f7a31d2dc1cb037 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 13:27:47 +0200 Subject: [PATCH 177/221] adds extra test support for fetch-content-item-query & extended payload --- .../models/integration-test.schema.ts | 10 ++- .../fetch-content-item-query.payload.ts | 4 +- .../fetch-content-item-query.spec.ts | 44 ++++++---- tests/utils/integration-test.utils.ts | 81 ++++++++++++------- 4 files changed, 90 insertions(+), 49 deletions(-) diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index 4cec3710..19b8ae97 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -1,4 +1,4 @@ -import type { ContentItemOf, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; +import type { ContentItemOf, ContentItemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; export type IntegrationTestProjectSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; @@ -44,3 +44,11 @@ export type MovieElements = { }; export type Movie = ContentItemOf; + +export function isMovie(item: ContentItemPayload): item is Movie { + return item.system.type === "movie"; +} + +export function isStar(item: ContentItemPayload): item is Star { + return item.system.type === "star"; +} diff --git a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts index 9bb06dc6..aa23635e 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.payload.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { item: { @@ -166,4 +166,4 @@ export default { }, }, }, -} satisfies FetchContentItemPayload; +} satisfies FetchContentItemPayload; diff --git a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts index 545a80bc..d3ff763a 100644 --- a/tests/integration/queries/content-items/fetch-content-item-query.spec.ts +++ b/tests/integration/queries/content-items/fetch-content-item-query.spec.ts @@ -1,38 +1,50 @@ -import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import { createDeliveryClient } from "../../../../lib/public_api.js"; -import type { FetchContentItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { describe, expect, it } from "vitest"; +import type { + FetchContentItemPayload, + FetchContentItemPayloadExtended, +} from "../../../../lib/queries/content-items/models/content-item.models.js"; import { fetchContentItemSchema, fetchContentItemSchemaExtended, } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; -import { getIntegrationTestConfig } from "../../../integration-tests.config.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { type IntegrationTestProjectSchema, isMovie, isStar } from "../../models/integration-test.schema.js"; import rawPayload from "./fetch-content-item-query.payload.js"; describe("Fetch content item query", async () => { const codename = rawPayload.item.system.codename; - await runQueryTestsAsync>({ + await runQueryTestsAsync, IntegrationTestProjectSchema>({ endpoint: `items/${codename}`, rawPayload, selectQuery: (client) => client.fetchContentItem({ codename }).raw(), - expectedSchema: fetchContentItemSchema(), + expectedSchema: fetchContentItemSchema(), }); - - const client = createDeliveryClient({ apiMode: "public", environmentId: getIntegrationTestConfig().env.id }); - const { payload } = await client.fetchContentItem({ codename }).fetch(); - - if (payload.item.elements.cast?.type === "modular_content") { - console.log(payload.item.elements.cast.items); - } }); describe("Fetch content item query - extended", async () => { const codename = rawPayload.item.system.codename; - await runQueryTestsAsync({ + await runQueryTestsAsync, IntegrationTestProjectSchema>({ endpoint: `items/${codename}`, rawPayload: undefined, selectQuery: (client) => client.fetchContentItem({ codename }), - expectedSchema: fetchContentItemSchemaExtended(), + expectedSchema: fetchContentItemSchemaExtended(), + extraTests: (response) => { + const item = response.item; + if (!isMovie(item)) { + throw new Error("Item is not a movie"); + } + + it("Star items should contain items with identical codenames as raw value", () => { + expect(item.elements.cast.items.map((m) => m.system.codename).sort()).toEqual(rawPayload.item.elements.cast.value.sort()); + }); + + it("Star items should be typed as Star and elements should be defined", () => { + for (const star of item.elements.cast.items) { + expect(isStar(star)).toBe(true); + expect(star.elements.firstname).toBeDefined(); + expect(star.elements.lastname).toBeDefined(); + } + }); + }, }); }); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 4562fd0c..7a7b6ce7 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -19,24 +19,26 @@ import { isFetchQueryWithExpectedFunctions, isPagedFetchQueryWithExpectedFunctio type TestType = "Integration" | "Unit"; -type SelectQuery = ( - client: DeliveryClient, +type SelectQuery = ( + client: DeliveryClient, ) => FetchQuery | PagedFetchQuery; -export async function runQueryTestsAsync({ +export async function runQueryTestsAsync({ endpoint, rawPayload, selectQuery, expectedSchema, + extraTests, }: { readonly expectedSchema: ZodMiniType; readonly endpoint: DeliveryEndpoint; readonly rawPayload: TResponsePayload | undefined; - readonly selectQuery: SelectQuery; + readonly selectQuery: SelectQuery; + readonly extraTests?: ((response: TResponsePayload) => void) | undefined; }): Promise { const integrationTestConfig = getIntegrationTestConfig(); - const clients = createTestClients({ + const clients = createTestClients({ rawPayload, environmentId: integrationTestConfig.env.id, deliveryBaseUrl: integrationTestConfig.env.deliveryBaseUrl, @@ -50,26 +52,29 @@ export async function runQueryTestsAsync({ selectQuery, expectedSchema, rawPayload, + extraTests, }); } await runFailingClientQueryTestAsync({ endpoint, selectQuery }); } -async function runClientQueryTestsAsync({ +async function runClientQueryTestsAsync({ client, integrationEnvironmentId, endpoint, selectQuery, expectedSchema, rawPayload, + extraTests, }: { - readonly client: DeliveryClient; + readonly client: DeliveryClient; readonly integrationEnvironmentId: string; readonly endpoint: DeliveryEndpoint; - readonly selectQuery: SelectQuery; + readonly selectQuery: SelectQuery; readonly expectedSchema: ZodMiniType; - readonly rawPayload: TResponsePayload; + readonly rawPayload: TResponsePayload | undefined; + readonly extraTests?: ((response: TResponsePayload) => void) | undefined; }): Promise { const { testType, testName } = createTestMetadata({ clientEnvironmentId: client.config.environmentId, @@ -82,6 +87,7 @@ async function runClientQueryTestsAsync({ registerBaseTests({ testName, endpoint, client, query, response, success, error, expectedSchema, rawPayload, testType }); if (isPagingQuery(query)) { + const pagingResult = await executePagingQueryAsync({ query }); registerPagingTests({ query, testName, @@ -89,12 +95,20 @@ async function runClientQueryTestsAsync({ rawPayload, expectedSchema, response, - ...(await executePagingQueryAsync({ query })), + ...pagingResult, }); + + if (extraTests) { + for (const pagingResponse of pagingResult.pagingResponses ?? []) { + extraTests(pagingResponse.payload); + } + } + } else if (extraTests && response) { + extraTests(response.payload); } } -function createFailingUnitTestClient(): DeliveryClient { +function createFailingUnitTestClient(): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -108,7 +122,9 @@ function createFailingUnitTestClient(): DeliveryClient { }); } -function createUnitTestClient(rawPayload: TResponsePayload): DeliveryClient { +function createUnitTestClient( + rawPayload: TResponsePayload, +): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId: unitEnvironmentId, @@ -122,7 +138,10 @@ function createUnitTestClient(rawPayload: TR }); } -function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: BaseUrl | undefined): DeliveryClient { +function createIntegrationTestClient( + environmentId: string, + deliveryBaseUrl: BaseUrl | undefined, +): DeliveryClient { return createDeliveryClient({ apiMode: "public", environmentId, @@ -133,7 +152,7 @@ function createIntegrationTestClient(environmentId: string, deliveryBaseUrl: Bas }); } -function createTestClients({ +function createTestClients({ rawPayload, environmentId, deliveryBaseUrl, @@ -141,9 +160,11 @@ function createTestClients({ readonly rawPayload: TResponsePayload | undefined; readonly environmentId: string; readonly deliveryBaseUrl: BaseUrl | undefined; -}): readonly DeliveryClient[] { - const integrationClient = createIntegrationTestClient(environmentId, deliveryBaseUrl); - return rawPayload === undefined ? [integrationClient] : [createUnitTestClient(rawPayload), integrationClient]; +}): readonly DeliveryClient[] { + const integrationClient = createIntegrationTestClient(environmentId, deliveryBaseUrl); + return rawPayload === undefined + ? [integrationClient] + : [createUnitTestClient(rawPayload), integrationClient]; } function createTestMetadata({ @@ -165,7 +186,7 @@ function createTestMetadata({ return { isIntegrationTest, testType, testName }; } -function registerBaseTests({ +function registerBaseTests({ testName, endpoint, client, @@ -179,8 +200,8 @@ function registerBaseTests({ }: { readonly testName: string; readonly endpoint: DeliveryEndpoint; - readonly client: DeliveryClient; - readonly query: ReturnType>; + readonly client: DeliveryClient; + readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; readonly error: unknown; @@ -192,16 +213,16 @@ function registerBaseTests({ registerResponseValidationTests({ testName, success, error, expectedSchema, response, testType, rawPayload }); } -function registerQueryStructureTests({ +function registerQueryStructureTests({ testName, query, endpoint, client, }: { readonly testName: string; - readonly query: ReturnType>; + readonly query: ReturnType>; readonly endpoint: DeliveryEndpoint; - readonly client: DeliveryClient; + readonly client: DeliveryClient; }): void { it(`${testName} Expect url to be correct`, () => { expect(query.inspect()?.data?.url).toEqual( @@ -351,14 +372,14 @@ function registerPagingIteratorTests({ } } -async function runFailingClientQueryTestAsync({ +async function runFailingClientQueryTestAsync({ endpoint, selectQuery, }: { readonly endpoint: DeliveryEndpoint; - readonly selectQuery: SelectQuery; + readonly selectQuery: SelectQuery; }): Promise { - const client = createFailingUnitTestClient(); + const client = createFailingUnitTestClient(); const query = selectQuery(client); const { error } = isPagingQuery(query) ? await query.fetchPageSafe() : await query.fetchSafe(); const testName = `Unit[${endpoint}]: `; @@ -368,14 +389,14 @@ async function runFailingClientQueryTestAsync({ +async function executeDefaultQueryAsync({ client, selectQuery, }: { - readonly client: DeliveryClient; - readonly selectQuery: SelectQuery; + readonly client: DeliveryClient; + readonly selectQuery: SelectQuery; }): Promise<{ - readonly query: ReturnType>; + readonly query: ReturnType>; readonly response: { readonly payload: TResponsePayload } | undefined; readonly success: boolean; readonly error: unknown; From 355ca675e7f2ec72aa869eb72687cb8e4fbab380 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 13:50:53 +0200 Subject: [PATCH 178/221] Use types integration test schema, extends items-feed tests --- .../schemas/content-type.schemas.ts | 2 +- .../taxonomies/models/taxonomy.models.ts | 10 ++++-- .../taxonomies/schemas/taxonomy.schemas.ts | 14 ++++---- .../models/integration-test.schema.ts | 3 ++ .../content-items/items-feed-query.payload.ts | 4 +-- .../content-items/items-feed-query.spec.ts | 34 +++++++++++++++---- .../items-referencing-asset-query.payload.ts | 4 +-- .../items-referencing-item-query.payload.ts | 4 +-- .../list-content-items-query.payload.ts | 4 +-- .../fetch-content-type-query.payload.ts | 4 +-- .../fetch-content-type-query.spec.ts | 4 +-- .../list-content-types-query.payload.ts | 4 +-- .../languages/list-languages-query.payload.ts | 4 +-- .../fetch-taxonomy-query.payload.ts | 4 +-- .../list-taxonomies-query.payload.ts | 4 +-- 15 files changed, 64 insertions(+), 39 deletions(-) diff --git a/lib/queries/content-types/schemas/content-type.schemas.ts b/lib/queries/content-types/schemas/content-type.schemas.ts index ca6eb22e..038aebda 100644 --- a/lib/queries/content-types/schemas/content-type.schemas.ts +++ b/lib/queries/content-types/schemas/content-type.schemas.ts @@ -116,7 +116,7 @@ export const contentTypeSchema = () => last_modified: z.iso.datetime(), }), ), - elements: z.record(codenameOf(), contentTypeAnyElementSchema), + elements: z.record(z.string(), contentTypeAnyElementSchema), }), ); diff --git a/lib/queries/taxonomies/models/taxonomy.models.ts b/lib/queries/taxonomies/models/taxonomy.models.ts index 731010cf..dc573c1a 100644 --- a/lib/queries/taxonomies/models/taxonomy.models.ts +++ b/lib/queries/taxonomies/models/taxonomy.models.ts @@ -2,8 +2,12 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "../schemas/taxonomy.schemas.js"; -export type TaxonomyTermPayload = z.infer>>; +export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer>>; +export type TaxonomyPayload = z.infer< + ReturnType> +>; -export type ListTaxonomiesPayload = z.infer>>; +export type ListTaxonomiesPayload = z.infer< + ReturnType> +>; diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index 2aa7a710..364cdc26 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -3,16 +3,16 @@ import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; -export const taxonomyTermSchema = () => +export const taxonomyTermSchema = () => z.object({ name: z.string(), - codename: codenameOf(), + codename: codenameOf(), get terms() { - return z.readonly(z.array(taxonomyTermSchema())); + return z.readonly(z.array(taxonomyTermSchema())); }, }); -export const taxonomySchema = () => +export const taxonomySchema = () => z.readonly( z.object({ system: z.readonly( @@ -23,14 +23,14 @@ export const taxonomySchema = () => last_modified: z.iso.datetime(), }), ), - terms: z.readonly(z.array(taxonomyTermSchema())), + terms: z.readonly(z.array(taxonomyTermSchema())), }), ); -export const listTaxonomiesSchema = () => +export const listTaxonomiesSchema = () => z.readonly( z.object({ - taxonomies: z.readonly(z.array(taxonomySchema())), + taxonomies: z.readonly(z.array(taxonomySchema())), ...paginationSchema.shape, }), ); diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index 19b8ae97..b8a9f552 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -17,6 +17,7 @@ export type IntegrationTestProjectSchema = DeliveryClientSchema<{ "cast", "firstname", "lastname", + "custom", ]; readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; @@ -52,3 +53,5 @@ export function isMovie(item: ContentItemPayload): export function isStar(item: ContentItemPayload): item is Star { return item.system.type === "star"; } + +export type MovieTaxonomyTerms = "action" | "comedy" | "drama" | "thriller" | "sitcom" | "stand_up"; diff --git a/tests/integration/queries/content-items/items-feed-query.payload.ts b/tests/integration/queries/content-items/items-feed-query.payload.ts index eb95033c..133d31e3 100644 --- a/tests/integration/queries/content-items/items-feed-query.payload.ts +++ b/tests/integration/queries/content-items/items-feed-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { items: [ @@ -3156,4 +3156,4 @@ export default { }, ], modular_content: {}, -} satisfies ItemsFeedPayload; +} satisfies ItemsFeedPayload; diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index 595f9857..e29f3d90 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,12 +1,12 @@ -import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ItemsFeedPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { itemsFeedSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { describe, expect, it } from "vitest"; +import type { ItemsFeedPayloadExtended } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { itemsFeedSchema, itemsFeedSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { type IntegrationTestProjectSchema, isMovie, isStar } from "../../models/integration-test.schema.js"; import unitTestPayload from "./items-feed-query.payload.js"; describe("Items feed query", async () => { - await runQueryTestsAsync>({ + await runQueryTestsAsync({ endpoint: "items-feed", rawPayload: unitTestPayload, selectQuery: (client) => client.itemsFeed().raw(), @@ -15,10 +15,30 @@ describe("Items feed query", async () => { }); describe("Items feed query - extended", async () => { - await runQueryTestsAsync({ + await runQueryTestsAsync, IntegrationTestProjectSchema>({ endpoint: "items-feed", rawPayload: undefined, selectQuery: (client) => client.itemsFeed(), - expectedSchema: itemsFeedSchema(), + expectedSchema: itemsFeedSchemaExtended(), + extraTests: (response) => { + const items = response.items; + + it("There should be at > 0 items", () => { + expect(items.length).toBeGreaterThan(0); + }); + + for (const item of items) { + if (isMovie(item)) { + it(`Movie item with codename "${item.system.codename}" of type "${item.system.type}" has casted stars`, () => { + for (const star of item.elements.cast.items) { + expect(star.system.type).toEqual("star"); + expect(isStar(star)).toBe(true); + expect(star.elements.firstname).toBeDefined(); + expect(star.elements.lastname).toBeDefined(); + } + }); + } + } + }, }); }); diff --git a/tests/integration/queries/content-items/items-referencing-asset-query.payload.ts b/tests/integration/queries/content-items/items-referencing-asset-query.payload.ts index 17f89874..252953b7 100644 --- a/tests/integration/queries/content-items/items-referencing-asset-query.payload.ts +++ b/tests/integration/queries/content-items/items-referencing-asset-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsReferencingAssetPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { items: [ @@ -17,4 +17,4 @@ export default { }, }, ], -} satisfies ItemsReferencingAssetPayload; +} satisfies ItemsReferencingAssetPayload; diff --git a/tests/integration/queries/content-items/items-referencing-item-query.payload.ts b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts index 35b3e67d..46e48562 100644 --- a/tests/integration/queries/content-items/items-referencing-item-query.payload.ts +++ b/tests/integration/queries/content-items/items-referencing-item-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ItemsReferencingItemPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { items: [ @@ -17,4 +17,4 @@ export default { }, }, ], -} satisfies ItemsReferencingItemPayload; +} satisfies ItemsReferencingItemPayload; diff --git a/tests/integration/queries/content-items/list-content-items-query.payload.ts b/tests/integration/queries/content-items/list-content-items-query.payload.ts index c8fb9660..b45fbf4f 100644 --- a/tests/integration/queries/content-items/list-content-items-query.payload.ts +++ b/tests/integration/queries/content-items/list-content-items-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { items: [ @@ -350,4 +350,4 @@ export default { count: 2, next_page: "", }, -} satisfies ListContentItemsPayload; +} satisfies ListContentItemsPayload; diff --git a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts index 120e2fd2..bd6d6b67 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.payload.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { system: { @@ -66,4 +66,4 @@ export default { value: null, }, }, -} satisfies ContentTypePayload; +} satisfies ContentTypePayload; diff --git a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts index dbffe3a3..42f04062 100644 --- a/tests/integration/queries/content-types/fetch-content-type-query.spec.ts +++ b/tests/integration/queries/content-types/fetch-content-type-query.spec.ts @@ -1,13 +1,11 @@ import { describe, expect, it } from "vitest"; -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ContentTypePayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; import { contentTypeSchema } from "../../../../lib/queries/content-types/schemas/content-type.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; import rawPayload from "./fetch-content-type-query.payload.js"; describe("Fetch content type query", async () => { const codename = "movie"; - await runQueryTestsAsync>({ + await runQueryTestsAsync({ endpoint: `types/${codename}`, rawPayload, selectQuery: (client) => client.fetchContentType({ codename: codename }), diff --git a/tests/integration/queries/content-types/list-content-types-query.payload.ts b/tests/integration/queries/content-types/list-content-types-query.payload.ts index c74b47a6..a746c36a 100644 --- a/tests/integration/queries/content-types/list-content-types-query.payload.ts +++ b/tests/integration/queries/content-types/list-content-types-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListContentTypesPayload } from "../../../../lib/queries/content-types/models/content-type.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { types: [ @@ -85,4 +85,4 @@ export default { count: 2, next_page: "", }, -} satisfies ListContentTypesPayload; +} satisfies ListContentTypesPayload; diff --git a/tests/integration/queries/languages/list-languages-query.payload.ts b/tests/integration/queries/languages/list-languages-query.payload.ts index c6c0922c..83647f83 100644 --- a/tests/integration/queries/languages/list-languages-query.payload.ts +++ b/tests/integration/queries/languages/list-languages-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListLanguagesPayload } from "../../../../lib/queries/languages/models/language.models.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; export default { languages: [ @@ -17,4 +17,4 @@ export default { count: 1, next_page: "", }, -} satisfies ListLanguagesPayload; +} satisfies ListLanguagesPayload; diff --git a/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts index f45b406b..c10c0fa7 100644 --- a/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts +++ b/tests/integration/queries/taxonomies/fetch-taxonomy-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { TaxonomyPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; +import type { IntegrationTestProjectSchema, MovieTaxonomyTerms } from "../../models/integration-test.schema.js"; export default { system: { @@ -36,4 +36,4 @@ export default { terms: [], }, ], -} satisfies TaxonomyPayload; +} satisfies TaxonomyPayload; diff --git a/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts index 4c30ad9c..42e3d8f6 100644 --- a/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts +++ b/tests/integration/queries/taxonomies/list-taxonomies-query.payload.ts @@ -1,5 +1,5 @@ -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; import type { ListTaxonomiesPayload } from "../../../../lib/queries/taxonomies/models/taxonomy.models.js"; +import type { IntegrationTestProjectSchema, MovieTaxonomyTerms } from "../../models/integration-test.schema.js"; export default { taxonomies: [ @@ -46,4 +46,4 @@ export default { count: 1, next_page: "", }, -} satisfies ListTaxonomiesPayload; +} satisfies ListTaxonomiesPayload; From f529e5d8c66d7a4fa5d986dbdc01d93f1501ce4c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 14:19:08 +0200 Subject: [PATCH 179/221] Extends list content items tests --- .../models/integration-test.extra-tests.ts | 22 ++++++++++++++++ .../content-items/items-feed-query.spec.ts | 26 +++---------------- .../list-content-items-query.spec.ts | 22 +++++++++++----- 3 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 tests/integration/models/integration-test.extra-tests.ts diff --git a/tests/integration/models/integration-test.extra-tests.ts b/tests/integration/models/integration-test.extra-tests.ts new file mode 100644 index 00000000..cb1c812c --- /dev/null +++ b/tests/integration/models/integration-test.extra-tests.ts @@ -0,0 +1,22 @@ +import { expect, it } from "vitest"; +import type { ContentItemPayload } from "../../../lib/public_api.js"; +import { type IntegrationTestProjectSchema, isMovie, isStar } from "./integration-test.schema.js"; + +export function registerMovieCastExtraTests(items: readonly ContentItemPayload[]): void { + it("There should be > 0 items", () => { + expect(items.length).toBeGreaterThan(0); + }); + + for (const item of items) { + if (isMovie(item)) { + it(`Movie item with codename "${item.system.codename}" of type "${item.system.type}" has typed Star cast items`, () => { + for (const star of item.elements.cast.items) { + expect(star.system.type).toEqual("star"); + expect(isStar(star)).toBe(true); + expect(star.elements.firstname).toBeDefined(); + expect(star.elements.lastname).toBeDefined(); + } + }); + } + } +} diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index e29f3d90..c9832aa4 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -1,8 +1,9 @@ -import { describe, expect, it } from "vitest"; +import { describe } from "vitest"; import type { ItemsFeedPayloadExtended } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsFeedSchema, itemsFeedSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import { type IntegrationTestProjectSchema, isMovie, isStar } from "../../models/integration-test.schema.js"; +import { registerMovieCastExtraTests } from "../../models/integration-test.extra-tests.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; import unitTestPayload from "./items-feed-query.payload.js"; describe("Items feed query", async () => { @@ -20,25 +21,6 @@ describe("Items feed query - extended", async () => { rawPayload: undefined, selectQuery: (client) => client.itemsFeed(), expectedSchema: itemsFeedSchemaExtended(), - extraTests: (response) => { - const items = response.items; - - it("There should be at > 0 items", () => { - expect(items.length).toBeGreaterThan(0); - }); - - for (const item of items) { - if (isMovie(item)) { - it(`Movie item with codename "${item.system.codename}" of type "${item.system.type}" has casted stars`, () => { - for (const star of item.elements.cast.items) { - expect(star.system.type).toEqual("star"); - expect(isStar(star)).toBe(true); - expect(star.elements.firstname).toBeDefined(); - expect(star.elements.lastname).toBeDefined(); - } - }); - } - } - }, + extraTests: (response) => registerMovieCastExtraTests(response.items), }); }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 91dc875d..17e99e48 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -1,24 +1,32 @@ import { describe } from "vitest"; -import type { DeliveryClientSchema } from "../../../../lib/models/core.models.js"; -import type { ListContentItemsPayload } from "../../../../lib/queries/content-items/models/content-item.models.js"; -import { listContentItemsSchema } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import type { + ListContentItemsPayload, + ListContentItemsPayloadExtended, +} from "../../../../lib/queries/content-items/models/content-item.models.js"; +import { + listContentItemsSchema, + listContentItemsSchemaExtended, +} from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; +import { registerMovieCastExtraTests } from "../../models/integration-test.extra-tests.js"; +import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; import rawPayload from "./list-content-items-query.payload.js"; describe("List content items query", async () => { - await runQueryTestsAsync>({ + await runQueryTestsAsync, IntegrationTestProjectSchema>({ endpoint: "items", rawPayload, selectQuery: (client) => client.listContentItems().raw(), - expectedSchema: listContentItemsSchema(), + expectedSchema: listContentItemsSchema(), }); }); describe("List content items query - extended", async () => { - await runQueryTestsAsync({ + await runQueryTestsAsync, IntegrationTestProjectSchema>({ endpoint: "items", rawPayload: undefined, selectQuery: (client) => client.listContentItems(), - expectedSchema: listContentItemsSchema(), + expectedSchema: listContentItemsSchemaExtended(), + extraTests: (response) => registerMovieCastExtraTests(response.items), }); }); From 8d3ac138294552307c04747a84c20f237adb90a9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 14:57:00 +0200 Subject: [PATCH 180/221] Update integration-test.extra-tests.ts --- .../models/integration-test.extra-tests.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/tests/integration/models/integration-test.extra-tests.ts b/tests/integration/models/integration-test.extra-tests.ts index cb1c812c..8e7ed2cc 100644 --- a/tests/integration/models/integration-test.extra-tests.ts +++ b/tests/integration/models/integration-test.extra-tests.ts @@ -1,6 +1,7 @@ import { expect, it } from "vitest"; import type { ContentItemPayload } from "../../../lib/public_api.js"; -import { type IntegrationTestProjectSchema, isMovie, isStar } from "./integration-test.schema.js"; +import { contentItemSchemaExtended } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { type IntegrationTestProjectSchema, isMovie } from "./integration-test.schema.js"; export function registerMovieCastExtraTests(items: readonly ContentItemPayload[]): void { it("There should be > 0 items", () => { @@ -9,12 +10,18 @@ export function registerMovieCastExtraTests(items: readonly ContentItemPayload { - for (const star of item.elements.cast.items) { - expect(star.system.type).toEqual("star"); - expect(isStar(star)).toBe(true); - expect(star.elements.firstname).toBeDefined(); - expect(star.elements.lastname).toBeDefined(); + it(`Movie item with codename "${item.system.codename}" has resolved cast items matching extended content-item schema`, () => { + for (const linkedItem of item.elements.cast.items) { + const { success, error } = contentItemSchemaExtended().safeParse(linkedItem); + expect(success, error?.message).toBe(true); + expect(linkedItem.system.type).toBe("star"); + } + }); + + it(`Movie item with codename "${item.system.codename}" has resolved rich-text description items matching extended content-item schema`, () => { + for (const linkedItem of item.elements.description.items) { + const { success, error } = contentItemSchemaExtended().safeParse(linkedItem); + expect(success, error?.message).toBe(true); } }); } From f4e15c430e4514d0686e8fd4ece0a3aea60dc623 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 15:12:14 +0200 Subject: [PATCH 181/221] Use extended schema for validation --- lib/queries/content-items/schemas/element.schemas.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/queries/content-items/schemas/element.schemas.ts b/lib/queries/content-items/schemas/element.schemas.ts index 51ab2f4f..a574f3cd 100644 --- a/lib/queries/content-items/schemas/element.schemas.ts +++ b/lib/queries/content-items/schemas/element.schemas.ts @@ -2,7 +2,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { ContentItemPayload } from "../models/content-item.models.js"; -import { contentItemSchema } from "./content-item.schemas.js"; +import { contentItemSchemaExtended } from "./content-item.schemas.js"; const multipleChoiceOptionSchema = () => z.readonly( @@ -133,7 +133,7 @@ export const elementDef = { z.extend(baseElementSchemas.richText, { items: z.readonly( z.array( - z.custom((item) => contentItemSchema().safeParse(item).success, { + z.custom((item: unknown): boolean => contentItemSchemaExtended().safeParse(item).success, { error: "Invalid referenced linked item", }), ), @@ -161,7 +161,7 @@ export const elementDef = { z.extend(baseElementSchemas.linkedItems, { items: z.readonly( z.array( - z.custom((item) => contentItemSchema().safeParse(item).success, { + z.custom((item: unknown): boolean => contentItemSchemaExtended().safeParse(item).success, { error: "Invalid referenced linked item", }), ), From ddfeeaebe5de70c6b409f13a256c077e7b3d9506 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 15:20:59 +0200 Subject: [PATCH 182/221] Create content-item-schemas.spec.ts --- .../unit/schemas/content-item-schemas.spec.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/unit/schemas/content-item-schemas.spec.ts diff --git a/tests/unit/schemas/content-item-schemas.spec.ts b/tests/unit/schemas/content-item-schemas.spec.ts new file mode 100644 index 00000000..8ea2ab37 --- /dev/null +++ b/tests/unit/schemas/content-item-schemas.spec.ts @@ -0,0 +1,48 @@ +import { describe, expect, it } from "vitest"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import { contentItemSystemWithCodename } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; +import { elementDef } from "../../../lib/queries/content-items/schemas/element.schemas.js"; +import { getFakeUuid } from "../../utils/test.utils.js"; + +type TestSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["default"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly ["movie"]; + readonly elementCodenames: readonly []; + readonly collectionCodenames: readonly ["default"]; + readonly workflowCodenames: readonly ["default"]; + readonly workflowStepCodenames: readonly ["published"]; +}>; + +describe("contentItemSystemWithCodename", () => { + it("parses a system payload whose type matches the literal codename", () => { + const result = contentItemSystemWithCodename("movie").safeParse({ + id: getFakeUuid(), + name: "The Dark Knight", + codename: "the_dark_knight", + language: "default", + type: "movie", + collection: "default", + last_modified: "2026-05-04T10:30:48.5100633Z", + workflow: "default", + workflow_step: "published", + sitemap_locations: [], + }); + expect(result.success).toBe(true); + }); +}); + +describe("elementDef.richText extended items validator", () => { + it("invokes the custom check and rejects an invalid resolved item", () => { + const result = elementDef.richText().safeParse({ + type: "rich_text", + name: "Description", + value: "

x

", + images: {}, + links: {}, + modular_content: ["some_codename"], + items: [{ not: "a valid extended content item" }], + }); + expect(result.success).toBe(false); + }); +}); From e69f5f904c038b563d903e9a662641e327909cfd Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 15:24:39 +0200 Subject: [PATCH 183/221] fixes generics in taxonomy queries --- lib/queries/taxonomies/fetch-taxonomy-query.ts | 7 +++++-- lib/queries/taxonomies/list-taxonomies-query.ts | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index aab129f8..be5ac93e 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -3,7 +3,10 @@ import type { DeliveryRequestWithCodename } from "../../models/request.models.js import { createDeliveryFetchQuery } from "../delivery-queries.js"; import type { TaxonomyPayload } from "./models/taxonomy.models.js"; -export type FetchTaxonomyQuery = DeliveryFetchQuery, DeliveryMetadata>; +export type FetchTaxonomyQuery = DeliveryFetchQuery< + TaxonomyPayload, + DeliveryMetadata +>; export type FetchTaxonomyQueryRequest = DeliveryRequestWithCodename< NonNullable, @@ -18,7 +21,7 @@ export function fetchTaxonomyQuery( return createDeliveryFetchQuery({ config, request, - schema: async () => (await import("./schemas/taxonomy.schemas.js")).taxonomySchema(), + schema: async () => (await import("./schemas/taxonomy.schemas.js")).taxonomySchema(), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 129cc84f..b06c202e 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -5,11 +5,11 @@ import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { ListTaxonomiesPayload, TaxonomyPayload } from "./models/taxonomy.models.js"; export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< - ListTaxonomiesPayload, + ListTaxonomiesPayload, DeliveryMetadata >; -type SystemProperties = keyof TaxonomyPayload["system"]; +type SystemProperties = keyof TaxonomyPayload["system"]; export type ListTaxonomiesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, @@ -24,7 +24,7 @@ export function listTaxonomiesQuery( return createDeliveryPagedByUrlQuery({ config, request, - schema: async () => (await import("./schemas/taxonomy.schemas.js")).listTaxonomiesSchema(), + schema: async () => (await import("./schemas/taxonomy.schemas.js")).listTaxonomiesSchema(), endpoint: "taxonomies", }); } From 4913dc2ee7b5ae5040942b6e43b9a59200a605c5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 18 May 2026 15:24:51 +0200 Subject: [PATCH 184/221] Use correct extended type --- tests/integration/models/integration-test.extra-tests.ts | 4 ++-- tests/integration/models/integration-test.schema.ts | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/integration/models/integration-test.extra-tests.ts b/tests/integration/models/integration-test.extra-tests.ts index 8e7ed2cc..8541c40b 100644 --- a/tests/integration/models/integration-test.extra-tests.ts +++ b/tests/integration/models/integration-test.extra-tests.ts @@ -1,9 +1,9 @@ import { expect, it } from "vitest"; -import type { ContentItemPayload } from "../../../lib/public_api.js"; +import type { ContentItemPayloadExtended } from "../../../lib/queries/content-items/models/content-item.models.js"; import { contentItemSchemaExtended } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { type IntegrationTestProjectSchema, isMovie } from "./integration-test.schema.js"; -export function registerMovieCastExtraTests(items: readonly ContentItemPayload[]): void { +export function registerMovieCastExtraTests(items: readonly ContentItemPayloadExtended[]): void { it("There should be > 0 items", () => { expect(items.length).toBeGreaterThan(0); }); diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index b8a9f552..47d8d1ca 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -1,4 +1,5 @@ -import type { ContentItemOf, ContentItemPayload, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; +import type { ContentItemOf, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; +import type { ContentItemPayloadExtended } from "../../../lib/queries/content-items/models/content-item.models.js"; export type IntegrationTestProjectSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; @@ -46,11 +47,11 @@ export type MovieElements = { export type Movie = ContentItemOf; -export function isMovie(item: ContentItemPayload): item is Movie { +export function isMovie(item: ContentItemPayloadExtended): item is Movie { return item.system.type === "movie"; } -export function isStar(item: ContentItemPayload): item is Star { +export function isStar(item: ContentItemPayloadExtended): item is Star { return item.system.type === "star"; } From 47ec42ae66be48feca99911ce05763254b7eaef9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 21 May 2026 10:58:32 +0200 Subject: [PATCH 185/221] transform optimization & refactoring --- .../content-items/fetch-content-item-query.ts | 25 +- lib/queries/content-items/items-feed-query.ts | 30 +- .../content-items/list-content-items-query.ts | 32 +- lib/transforms/content-item-transforms.ts | 174 ++++--- package.json | 10 +- pnpm-lock.yaml | 441 ++++-------------- .../models/integration-test.extra-tests.ts | 11 +- .../content-items/items-feed-query.spec.ts | 6 +- .../list-content-items-query.spec.ts | 6 +- tests/utils/integration-test.utils.ts | 27 +- 10 files changed, 276 insertions(+), 486 deletions(-) diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 0f391f3d..13ca7265 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,6 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam, WithRaw } from "../../models/request.models.js"; -import { resolveExtendedItem } from "../../transforms/content-item-transforms.js"; +import { mapExtendedItem, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; import type { FetchContentItemPayload, FetchContentItemPayloadExtended } from "./models/content-item.models.js"; @@ -53,15 +53,26 @@ export function fetchContentItemQuery( config, query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), - transform: (payload) => { - const { extendedItem, extendedModularContent } = resolveExtendedItem({ - modularContent: payload.modular_content, - inputItem: payload.item, + transform: (response) => { + const extendedItems = resolveExtendedItems({ + modularContent: [response.payload.modular_content], + inputItems: [response.payload.item], + }); + + const { item: extendedItem, modularContent: extendedModularContent } = mapExtendedItem({ + resolvedItems: extendedItems, + originalItem: response.payload.item, + originalModularContent: response.payload.modular_content, }); return { - item: extendedItem, - modular_content: extendedModularContent, + ...response, + meta: response.meta, + payload: { + ...response.payload, + item: extendedItem, + modular_content: extendedModularContent, + }, }; }, }); diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 92eb58ac..57e16e35 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -12,7 +12,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; -import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; +import { mapExtendedItems, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import type { ContentItemPayload, ItemsFeedPayload, ItemsFeedPayloadExtended } from "./models/content-item.models.js"; @@ -68,15 +68,27 @@ export function itemsFeedQuery( config, query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchemaExtended(), - transform: (payload) => { - const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ - modularContent: payload.modular_content, - inputItems: payload.items, + transform: (responses) => { + const resolvedItems = resolveExtendedItems({ + inputItems: responses.flatMap((m) => m.payload.items), + modularContent: responses.map((m) => m.payload.modular_content), + }); + + return responses.map((m) => { + const { items: extendedItems, modularContent: extendedModularContent } = mapExtendedItems({ + resolvedItems: resolvedItems, + originalItems: m.payload.items, + originalModularContent: m.payload.modular_content, + }); + return { + ...m, + payload: { + ...m.payload, + items: extendedItems, + modular_content: extendedModularContent, + }, + }; }); - return { - items: extendedItems, - modular_content: extendedModularContent, - }; }, }); return { ...extendedQuery, raw: () => rawQuery }; diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 4a2b72b6..5c71518b 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -1,3 +1,4 @@ +import type { QueryResponse } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { @@ -7,7 +8,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; -import { resolveExtendedItemsArray } from "../../transforms/content-item-transforms.js"; +import { mapExtendedItems, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { ContentItemPayload, ListContentItemsPayload, ListContentItemsPayloadExtended } from "./models/content-item.models.js"; @@ -70,16 +71,27 @@ export function listContentItemsQuery( config, query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchemaExtended(), - transform: (payload) => { - const { extendedItems, extendedModularContent } = resolveExtendedItemsArray({ - modularContent: payload.modular_content, - inputItems: payload.items, + transform: (responses) => { + const resolvedItems = resolveExtendedItems({ + inputItems: responses.flatMap((m) => m.payload.items), + modularContent: responses.map((m) => m.payload.modular_content), + }); + + return responses.map, DeliveryMetadata>>((m) => { + const { items: extendedItems, modularContent: extendedModularContent } = mapExtendedItems({ + resolvedItems: resolvedItems, + originalItems: m.payload.items, + originalModularContent: m.payload.modular_content, + }); + return { + ...m, + payload: { + ...m.payload, + items: extendedItems, + modular_content: extendedModularContent, + }, + }; }); - return { - items: extendedItems, - modular_content: extendedModularContent, - pagination: payload.pagination, - }; }, }); return { ...extendedQuery, raw: () => rawQuery }; diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index bcfe8be0..b4a2fddf 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -1,42 +1,51 @@ +import { isDefined } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; -type IntermediateRecord = { - readonly item: ContentItemPayload; - readonly preparedItem: ContentItemPayloadExtended; +type IntermediateItem = ContentItemPayloadExtended & { + $rawElements?: Readonly>; }; -function getIntermediateMap({ +function joinToIntermediateItems({ items, modular_content, }: { readonly items: readonly ContentItemPayload[]; - readonly modular_content: Readonly>>; -}): Map> { + readonly modular_content: readonly Readonly>>[]; +}): Record> { const createIntermediateRecord = ( item: ContentItemPayload, - ): IntermediateRecord => ({ item, preparedItem: { system: item.system, elements: {} } }); - - const modularContentRecords = Object.entries(modular_content).reduce>>( - (map, [key, item]) => map.set(key, createIntermediateRecord(item)), - new Map>(), - ); - return items.reduce>>( - (map, item) => map.set(item.system.codename, createIntermediateRecord(item)), - modularContentRecords, - ); + ): IntermediateItem => ({ + system: item.system, + $rawElements: item.elements, + elements: {}, + }); + + // first prepare map from modular content + const modularContentRecords = modular_content.reduce>>((records, content) => { + Object.entries(content).forEach(([key, item]) => { + records[key] = createIntermediateRecord(item); + }); + return records; + }, {}); + + // then merge input items into the map + return items.reduce>>((records, item) => { + records[item.system.codename] = createIntermediateRecord(item); + return records; + }, modularContentRecords); } function resolveCodenamesToPreparedItems( codenames: readonly string[], - intermediateRecords: Readonly>>, + intermediateRecords: Readonly>>, ): readonly ContentItemPayloadExtended[] { return codenames.reduce[]>((preparedItems, codename) => { - const record = intermediateRecords.get(codename); + const record = intermediateRecords[codename]; if (record) { - preparedItems.push(record.preparedItem); + preparedItems.push(record); } return preparedItems; }, []); @@ -44,7 +53,7 @@ function resolveCodenamesToPreparedItems( function resolveExtendedElement( element: ContentItemElementPayload, - intermediateRecords: Readonly>>, + intermediateRecords: Readonly>>, ): ContentItemElementPayloadExtended { return match(element) .returnType() @@ -59,75 +68,94 @@ function resolveExtendedElement( .otherwise((element) => element); } -function resolveExtendedItems({ - inputItems, - modularContent, +export function mapExtendedItems({ + resolvedItems, + originalItems, + originalModularContent, }: { - readonly inputItems: readonly ContentItemPayload[]; - readonly modularContent: Readonly>>; + readonly resolvedItems: Readonly>>; + readonly originalItems: readonly ContentItemPayload[]; + readonly originalModularContent: Readonly>>; }): { - readonly extendedItems: readonly ContentItemPayloadExtended[]; - readonly extendedModularContent: Readonly>>; + readonly modularContent: Readonly>>; + readonly items: readonly ContentItemPayloadExtended[]; } { - const intermediateRecords = getIntermediateMap({ - items: inputItems, - modular_content: modularContent, - }); - - for (const intermediateRecord of intermediateRecords.values()) { - for (const [key, element] of Object.entries(intermediateRecord.item.elements)) { - intermediateRecord.preparedItem.elements[key] = resolveExtendedElement(element, intermediateRecords); - } - } - return { - extendedItems: inputItems.reduce[]>((items, item) => { - const intermediateRecord = intermediateRecords.get(item.system.codename); - if (intermediateRecord) { - items.push(intermediateRecord.preparedItem); - } - return items; - }, []), - // filter only items that were initially present in the modular_content - extendedModularContent: Object.keys(modularContent).reduce>>( - (extendedModularContent, key) => { - const record = intermediateRecords.get(key); - if (record) { - extendedModularContent[key] = record.preparedItem; + items: originalItems + .map | undefined>((originalItem) => { + return resolvedItems[originalItem.system.codename]; + }) + .filter(isDefined), + modularContent: Object.keys(originalModularContent).reduce>>( + (resolvedModularContent, codename) => { + const extendedItem = resolvedItems[codename]; + + if (!extendedItem) { + throw new Error(`Item with codename "${codename}" not found in resolved items`); } - return extendedModularContent; + resolvedModularContent[codename] = extendedItem; + return resolvedModularContent; }, {}, ), }; } -export function resolveExtendedItemsArray(params: { - readonly inputItems: readonly ContentItemPayload[]; - readonly modularContent: Readonly>>; +export function mapExtendedItem({ + resolvedItems, + originalItem, + originalModularContent, +}: { + readonly resolvedItems: Readonly>>; + readonly originalItem: ContentItemPayload; + readonly originalModularContent: Readonly>>; }): { - readonly extendedItems: readonly ContentItemPayloadExtended[]; - readonly extendedModularContent: Readonly>>; + readonly modularContent: Readonly>>; + readonly item: ContentItemPayloadExtended; } { - return resolveExtendedItems(params); + const extendedItem = resolvedItems[originalItem.system.codename]; + + if (!extendedItem) { + throw new Error(`Item with codename "${originalItem.system.codename}" not found in resolved items`); + } + + return { + item: extendedItem, + modularContent: Object.keys(originalModularContent).reduce>>( + (resolvedModularContent, codename) => { + const extendedItem = resolvedItems[codename]; + + if (!extendedItem) { + throw new Error(`Item with codename "${codename}" not found in resolved items`); + } + resolvedModularContent[codename] = extendedItem; + return resolvedModularContent; + }, + {}, + ), + }; } -export function resolveExtendedItem({ - inputItem, +export function resolveExtendedItems({ + inputItems, modularContent, }: { - readonly inputItem: ContentItemPayload; - readonly modularContent: Readonly>>; -}): { - readonly extendedItem: ContentItemPayloadExtended; - readonly extendedModularContent: Readonly>>; -} { - const { extendedItems, extendedModularContent } = resolveExtendedItems({ - inputItems: [inputItem], - modularContent, + readonly inputItems: readonly ContentItemPayload[]; + readonly modularContent: readonly Readonly>>[]; +}): Readonly>> { + const intermediateRecords = joinToIntermediateItems({ + items: inputItems, + modular_content: modularContent, }); - // We wrapped a single item; the internal helper preserves order and length, - // so extendedItems[0] is guaranteed defined here by construction. - const [extendedItem] = extendedItems as readonly [ContentItemPayloadExtended]; - return { extendedItem, extendedModularContent }; + + for (const intermediateRecord of Object.values(intermediateRecords)) { + for (const [key, element] of Object.entries(intermediateRecord.$rawElements ?? {})) { + intermediateRecord.elements[key] = resolveExtendedElement(element, intermediateRecords); + } + + // delete $rawElement which was used to map extended elements + delete intermediateRecord.$rawElements; + } + + return intermediateRecords; } diff --git a/package.json b/package.json index 3d60e0c6..5795f8d4 100644 --- a/package.json +++ b/package.json @@ -54,20 +54,20 @@ "bundle:create": "tsx scripts/create-bundles.ts" }, "peerDependencies": { - "@kontent-ai/core-sdk": "^12.0.0-preview.39", + "@kontent-ai/core-sdk": "^12.0.0-preview.40", "ts-pattern": "^5", "zod": "^4" }, "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.3.0", + "eslint": "10.4.0", "@biomejs/biome": "2.4.15", - "@types/node": "25.7.0", + "@types/node": "25.9.0", "vitest": "4.1.6", "@vitest/coverage-v8": "4.1.6", - "tsx": "4.21.0", - "@typescript/native-preview": "7.0.0-dev.20260512.1", + "tsx": "4.22.3", + "@typescript/native-preview": "7.0.0-dev.20260519.1", "esbuild": "0.28.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d0e48d6..fbc37759 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@kontent-ai/core-sdk': - specifier: ^12.0.0-preview.39 - version: 12.0.0-preview.39(ts-pattern@5.9.0)(zod@4.3.6) + specifier: ^12.0.0-preview.40 + version: 12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.3.6) ts-pattern: specifier: ^5 version: 5.9.0 @@ -28,11 +28,11 @@ importers: specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.7.0 - version: 25.7.0 + specifier: 25.9.0 + version: 25.9.0 '@typescript/native-preview': - specifier: 7.0.0-dev.20260512.1 - version: 7.0.0-dev.20260512.1 + specifier: 7.0.0-dev.20260519.1 + version: 7.0.0-dev.20260519.1 '@vitest/coverage-v8': specifier: 4.1.6 version: 4.1.6(vitest@4.1.6) @@ -40,14 +40,14 @@ importers: specifier: 0.28.0 version: 0.28.0 eslint: - specifier: 10.3.0 - version: 10.3.0 + specifier: 10.4.0 + version: 10.4.0 tsx: - specifier: 4.21.0 - version: 4.21.0 + specifier: 4.22.3 + version: 4.22.3 vitest: specifier: 4.1.6 - version: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) + version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) packages: @@ -138,312 +138,156 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.0': resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.0': resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.0': resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.0': resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.0': resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.0': resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.0': resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.0': resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.0': resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.0': resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.0': resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.0': resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.0': resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.0': resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.0': resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.0': resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.0': resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.0': resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} engines: {node: '>=18'} @@ -472,8 +316,8 @@ packages: resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@0.17.0': @@ -543,8 +387,8 @@ packages: peerDependencies: '@biomejs/biome': ^2.3.11 - '@kontent-ai/core-sdk@12.0.0-preview.39': - resolution: {integrity: sha512-khSpvc8nWeOg/5r70tdj98YO4zQQiJuPM0Be2f+UDG0YCKv4NaRkOU4fHkt6lQrp+skkriy7uSpgfcaujp/opg==} + '@kontent-ai/core-sdk@12.0.0-preview.40': + resolution: {integrity: sha512-W8k5iijCvknnzHGX7q7VD0zzk2dh7W5elml2P76iroPj48OvxZuscR9Fzyg2W/Scefpe5Yy70ek4k/uw+RN77A==} engines: {node: '>=22'} peerDependencies: ts-pattern: ^5 @@ -681,8 +525,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.7.0': - resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} + '@types/node@25.9.0': + resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} '@typescript-eslint/eslint-plugin@8.59.0': resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} @@ -743,50 +587,50 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-l9AJi/TIVMPx5R1c7fxZCSA7eUaHeA0C9Mxdxx/oQJo1K/GtbI3mzYe/SiKNltko1KSdKUmWVhPwxTOS289REg==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-c9zdG6sGJf25Jpz04JgE23zhYeprqFypDGuqiX94yMTvR8IWXjq3R2oMnim66YLBDon/V1nCEy6cFixeSd/4fg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-oABZLQrfB8JN2Ct2CiLK5PyE28Em3sIJlZsAMD45/A2ymtIaa5826dwv8vapE5Wjp54ao0LXxCSuKFm1A8zzCQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-N16V3wiM0tsNmSSA7nZrxqXXt5OCJxBwiCVn35rnA7fr4WzJw6rJmwf9heNNhZ6Gh4ne3+Pexajf5akzuHR75Q==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-xvbwzpTe+5N6bnBI/t9n4zsGzXxz3V6rVbvDUoJmRLfav5fz+ck0QDkGQGUPrQEEIp0KEzQvx7c+AEZnzdvTQA==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-ltf91vAwKdbu0SlRQbFgi1h5ZrLLrBn6a4qIeN2VILGbtYrCXnARHRznLBv81yUETQ7aVr/LSQcmsWo1ejCK0w==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-0Hs1Gqa/t9cthoPdqHud1pFGUr9DgJivBTjwquTUh8jt/6PI2bQxoMNZLiN/bhqeDFDTzdxoMBfCaytsTMcXqw==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-8v4BExeeuCTrhaSGfeIJqm3qQkTzlZix/Qd/FkPlWoz9f7d7COvXb3Z4qhbaVolL0MMnUvQ7m005Z4kYsZ645A==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-qr5h6FPo74bN/U+EwRuayBhUbxaji8xzFbIbhMOA2oYSc/qozp5ia2g1+9xGw67MXxPPw/IPT+UGvrNK7K1NeQ==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-AVD0tczTtFCHNa4RQRVPvu8Hnw4P3hQ+OlUAjnz/lHowvc6o1pYB46elMqfDuaoWqIpv+EAkAPP4ipFCofJ5IA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-meNWxhNEfaqos2U0JXvfxWvy4JWrKE9fZepCndDZi+t04X+AIiLYp5s6crWnKP67nzVAzMNgTAc8mu8CnGM+/A==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-TM+qatljyejqjHevCta3WIH53i0oGC7K8SoJ6t+mf4cGMTpZTyd7NhC1ts7e6/aydZnG53Bsta2iQi1SMIlQEw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-Hp6vBnxJSKEEAVWgIoWMmfqkZXCdkhm6XTivrwgRzBwWfiTVe2ZyZ7byWegIKeNnBbffg/K2KvoM8JAHl059GQ==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-r9LEsoY7JC/82gXo8hlOmpQaUXcqmngCVOv+mUx1UeMt9f+1S6oNO0W48o75mlBqqC7jfcMHqw8YS4LfVxPRGw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260512.1': - resolution: {integrity: sha512-KIzYPGuxZnyiiYkYrozDT94Af2nwbdLXoY1cgGY66RRa9HSEw13RH9WHg8wA8fZhT4wYzF5uF7WY3hz0QhaxGg==} + '@typescript/native-preview@7.0.0-dev.20260519.1': + resolution: {integrity: sha512-VVER7vFUDdfm5k3jbH5765tVEJa7+0rTUkFeXyGYrXPxpw9BIjA0QDxdtdlRyaU8MCZV9IKZUo6doxeAQRAjPg==} engines: {node: '>=16.20.0'} hasBin: true @@ -1025,11 +869,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} @@ -1065,8 +904,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.3.0: - resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + eslint@10.4.0: + resolution: {integrity: sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1184,9 +1023,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -1628,9 +1464,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@2.0.0-next.6: resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} engines: {node: '>= 0.4'} @@ -1773,8 +1606,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} engines: {node: '>=18.0.0'} hasBin: true @@ -1807,8 +1640,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.21.0: - resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2002,165 +1835,87 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.7': - optional: true - '@esbuild/aix-ppc64@0.28.0': optional: true - '@esbuild/android-arm64@0.27.7': - optional: true - '@esbuild/android-arm64@0.28.0': optional: true - '@esbuild/android-arm@0.27.7': - optional: true - '@esbuild/android-arm@0.28.0': optional: true - '@esbuild/android-x64@0.27.7': - optional: true - '@esbuild/android-x64@0.28.0': optional: true - '@esbuild/darwin-arm64@0.27.7': - optional: true - '@esbuild/darwin-arm64@0.28.0': optional: true - '@esbuild/darwin-x64@0.27.7': - optional: true - '@esbuild/darwin-x64@0.28.0': optional: true - '@esbuild/freebsd-arm64@0.27.7': - optional: true - '@esbuild/freebsd-arm64@0.28.0': optional: true - '@esbuild/freebsd-x64@0.27.7': - optional: true - '@esbuild/freebsd-x64@0.28.0': optional: true - '@esbuild/linux-arm64@0.27.7': - optional: true - '@esbuild/linux-arm64@0.28.0': optional: true - '@esbuild/linux-arm@0.27.7': - optional: true - '@esbuild/linux-arm@0.28.0': optional: true - '@esbuild/linux-ia32@0.27.7': - optional: true - '@esbuild/linux-ia32@0.28.0': optional: true - '@esbuild/linux-loong64@0.27.7': - optional: true - '@esbuild/linux-loong64@0.28.0': optional: true - '@esbuild/linux-mips64el@0.27.7': - optional: true - '@esbuild/linux-mips64el@0.28.0': optional: true - '@esbuild/linux-ppc64@0.27.7': - optional: true - '@esbuild/linux-ppc64@0.28.0': optional: true - '@esbuild/linux-riscv64@0.27.7': - optional: true - '@esbuild/linux-riscv64@0.28.0': optional: true - '@esbuild/linux-s390x@0.27.7': - optional: true - '@esbuild/linux-s390x@0.28.0': optional: true - '@esbuild/linux-x64@0.27.7': - optional: true - '@esbuild/linux-x64@0.28.0': optional: true - '@esbuild/netbsd-arm64@0.27.7': - optional: true - '@esbuild/netbsd-arm64@0.28.0': optional: true - '@esbuild/netbsd-x64@0.27.7': - optional: true - '@esbuild/netbsd-x64@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.27.7': - optional: true - '@esbuild/openbsd-arm64@0.28.0': optional: true - '@esbuild/openbsd-x64@0.27.7': - optional: true - '@esbuild/openbsd-x64@0.28.0': optional: true - '@esbuild/openharmony-arm64@0.27.7': - optional: true - '@esbuild/openharmony-arm64@0.28.0': optional: true - '@esbuild/sunos-x64@0.27.7': - optional: true - '@esbuild/sunos-x64@0.28.0': optional: true - '@esbuild/win32-arm64@0.27.7': - optional: true - '@esbuild/win32-arm64@0.28.0': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - '@esbuild/win32-ia32@0.28.0': optional: true - '@esbuild/win32-x64@0.27.7': - optional: true - '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.0)': dependencies: - eslint: 10.3.0 + eslint: 10.4.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -2190,7 +1945,7 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/config-helpers@0.5.5': + '@eslint/config-helpers@0.6.0': dependencies: '@eslint/core': 1.2.1 @@ -2261,7 +2016,7 @@ snapshots: dependencies: '@biomejs/biome': 2.4.15 - '@kontent-ai/core-sdk@12.0.0-preview.39(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: ts-pattern: 5.9.0 zod: 4.3.6 @@ -2269,7 +2024,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.0(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.4.0)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2357,14 +2112,14 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.7.0': + '@types/node@25.9.0': dependencies: - undici-types: 7.21.0 + undici-types: 7.24.6 '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.4.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) @@ -2377,14 +2132,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@10.3.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.4.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/types': 8.59.0 '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 - eslint: 10.3.0 + eslint: 10.4.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2452,36 +2207,36 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260512.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260512.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260512.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260512.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260512.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260512.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260512.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260519.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260512.1': + '@typescript/native-preview@7.0.0-dev.20260519.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260512.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260512.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260512.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260512.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260512.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260512.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260512.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260519.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260519.1 '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': dependencies: @@ -2495,7 +2250,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) + vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) '@vitest/expect@4.1.6': dependencies: @@ -2506,13 +2261,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0))': + '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3))': dependencies: '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3) '@vitest/pretty-format@4.1.6': dependencies: @@ -2834,35 +2589,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -2934,12 +2660,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.3.0: + eslint@10.4.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 + '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.8 @@ -3110,10 +2836,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -3545,8 +3267,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 @@ -3741,10 +3461,9 @@ snapshots: tslib@2.8.1: optional: true - tsx@4.21.0: + tsx@4.22.3: dependencies: - esbuild: 0.27.7 - get-tsconfig: 4.14.0 + esbuild: 0.28.0 optionalDependencies: fsevents: 2.3.3 @@ -3794,13 +3513,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.21.0: {} + undici-types@7.24.6: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0): + vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3808,15 +3527,15 @@ snapshots: rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.0 esbuild: 0.28.0 fsevents: 2.3.3 - tsx: 4.21.0 + tsx: 4.22.3 - vitest@4.1.6(@types/node@25.7.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)): + vitest@4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)): dependencies: '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0)) + '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) '@vitest/pretty-format': 4.1.6 '@vitest/runner': 4.1.6 '@vitest/snapshot': 4.1.6 @@ -3833,10 +3552,10 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.7.0)(esbuild@0.28.0)(tsx@4.21.0) + vite: 8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.0 '@vitest/coverage-v8': 4.1.6(vitest@4.1.6) transitivePeerDependencies: - msw diff --git a/tests/integration/models/integration-test.extra-tests.ts b/tests/integration/models/integration-test.extra-tests.ts index 8541c40b..df055f1e 100644 --- a/tests/integration/models/integration-test.extra-tests.ts +++ b/tests/integration/models/integration-test.extra-tests.ts @@ -3,12 +3,17 @@ import type { ContentItemPayloadExtended } from "../../../lib/queries/content-it import { contentItemSchemaExtended } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { type IntegrationTestProjectSchema, isMovie } from "./integration-test.schema.js"; -export function registerMovieCastExtraTests(items: readonly ContentItemPayloadExtended[]): void { +export function registerExtendedItemsTests( + items: readonly ContentItemPayloadExtended[], + modularContent: Readonly>>, +): void { + const allItems = [...items, ...Object.values(modularContent)]; + it("There should be > 0 items", () => { - expect(items.length).toBeGreaterThan(0); + expect(allItems.length).toBeGreaterThan(0); }); - for (const item of items) { + for (const item of allItems) { if (isMovie(item)) { it(`Movie item with codename "${item.system.codename}" has resolved cast items matching extended content-item schema`, () => { for (const linkedItem of item.elements.cast.items) { diff --git a/tests/integration/queries/content-items/items-feed-query.spec.ts b/tests/integration/queries/content-items/items-feed-query.spec.ts index c9832aa4..8de2052a 100644 --- a/tests/integration/queries/content-items/items-feed-query.spec.ts +++ b/tests/integration/queries/content-items/items-feed-query.spec.ts @@ -2,7 +2,7 @@ import { describe } from "vitest"; import type { ItemsFeedPayloadExtended } from "../../../../lib/queries/content-items/models/content-item.models.js"; import { itemsFeedSchema, itemsFeedSchemaExtended } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import { registerMovieCastExtraTests } from "../../models/integration-test.extra-tests.js"; +import { registerExtendedItemsTests } from "../../models/integration-test.extra-tests.js"; import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; import unitTestPayload from "./items-feed-query.payload.js"; @@ -21,6 +21,8 @@ describe("Items feed query - extended", async () => { rawPayload: undefined, selectQuery: (client) => client.itemsFeed(), expectedSchema: itemsFeedSchemaExtended(), - extraTests: (response) => registerMovieCastExtraTests(response.items), + extraTests: (payload) => { + registerExtendedItemsTests(payload.items, payload.modular_content); + }, }); }); diff --git a/tests/integration/queries/content-items/list-content-items-query.spec.ts b/tests/integration/queries/content-items/list-content-items-query.spec.ts index 17e99e48..75c63cee 100644 --- a/tests/integration/queries/content-items/list-content-items-query.spec.ts +++ b/tests/integration/queries/content-items/list-content-items-query.spec.ts @@ -8,7 +8,7 @@ import { listContentItemsSchemaExtended, } from "../../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { runQueryTestsAsync } from "../../../utils/integration-test.utils.js"; -import { registerMovieCastExtraTests } from "../../models/integration-test.extra-tests.js"; +import { registerExtendedItemsTests } from "../../models/integration-test.extra-tests.js"; import type { IntegrationTestProjectSchema } from "../../models/integration-test.schema.js"; import rawPayload from "./list-content-items-query.payload.js"; @@ -27,6 +27,8 @@ describe("List content items query - extended", async () => { rawPayload: undefined, selectQuery: (client) => client.listContentItems(), expectedSchema: listContentItemsSchemaExtended(), - extraTests: (response) => registerMovieCastExtraTests(response.items), + extraTests: (response) => { + registerExtendedItemsTests(response.items, response.modular_content); + }, }); }); diff --git a/tests/utils/integration-test.utils.ts b/tests/utils/integration-test.utils.ts index 7a7b6ce7..1b69c948 100644 --- a/tests/utils/integration-test.utils.ts +++ b/tests/utils/integration-test.utils.ts @@ -280,7 +280,6 @@ function registerPagingTests({ pagingSuccess, pagingError, iteratorPayloads, - maxPagesCount, }: { readonly query: PagedFetchQuery; readonly testName: string; @@ -292,7 +291,6 @@ function registerPagingTests({ readonly pagingSuccess: boolean; readonly pagingError: unknown; readonly iteratorPayloads: readonly TResponsePayload[]; - readonly maxPagesCount: number; }): void { registerPagingResponseTests({ testName, @@ -304,7 +302,7 @@ function registerPagingTests({ pagingResponses, rawPayload, }); - registerPagingIteratorTests({ testName, query, iteratorPayloads, maxPagesCount, testType, rawPayload }); + registerPagingIteratorTests({ testName, query, iteratorPayloads, testType, rawPayload }); } function registerPagingResponseTests({ @@ -330,12 +328,21 @@ function registerPagingResponseTests({ expect(pagingError).toBeUndefined(); expect(pagingSuccess).toBeTruthy(); }); - it(`${testName} First paging response payload should match schema`, async () => { + it(`${testName} Response payload should match schema`, async () => { const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(response?.payload); expect(parseError).toBeUndefined(); expect(parseSuccess).toBeTruthy(); }); - if (testType === "Unit") { + + for (const pagingResponse of pagingResponses ?? []) { + it(`${testName} Paging Response payload should match schema`, async () => { + const { error: parseError, success: parseSuccess } = await expectedSchema.safeParseAsync(pagingResponse?.payload); + expect(parseError).toBeUndefined(); + expect(parseSuccess).toBeTruthy(); + }); + } + + if (testType === "Unit" && rawPayload) { const firstResponse = pagingResponses?.[0]; it(`${testName} First paging response payload should match unit test payload`, () => { expect(firstResponse?.payload).toEqual(rawPayload); @@ -347,20 +354,15 @@ function registerPagingIteratorTests({ testName, query, iteratorPayloads, - maxPagesCount, testType, rawPayload, }: { readonly testName: string; readonly query: PagedFetchQuery; readonly iteratorPayloads: readonly TResponsePayload[]; - readonly maxPagesCount: number; readonly testType: TestType; readonly rawPayload: TResponsePayload; }): void { - it(`${testName} Iterator responses should be equal to paging responses`, () => { - expect(iteratorPayloads.length).toEqual(maxPagesCount); - }); it(`${testName} Query should be a paged fetch query with expected functions`, () => { expect(isPagedFetchQueryWithExpectedFunctions(query)).toBeTruthy(); }); @@ -419,12 +421,10 @@ async function executePagingQueryAsync({ readonly pagingSuccess: boolean; readonly pagingError: unknown; readonly iteratorPayloads: readonly TResponsePayload[]; - readonly maxPagesCount: number; }> { const { responses: pagingResponses, success: pagingSuccess, error: pagingError } = await query.fetchAllPagesSafe(); const iteratorPayloads: TResponsePayload[] = []; - const maxPagesCount = 1; - for await (const pageResponse of query.pages({ maxPagesCount })) { + for await (const pageResponse of query.pages()) { iteratorPayloads.push(pageResponse?.payload); } return { @@ -432,6 +432,5 @@ async function executePagingQueryAsync({ pagingSuccess, pagingError, iteratorPayloads, - maxPagesCount, }; } From 6aca2d9129770ece4d3fa54cf6303cfe9baf46fe Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 21 May 2026 13:30:17 +0200 Subject: [PATCH 186/221] optimizations --- .../content-items/fetch-content-item-query.ts | 16 +- lib/queries/content-items/items-feed-query.ts | 25 ++- .../content-items/list-content-items-query.ts | 22 +- lib/transforms/content-item-transforms.ts | 210 ++++++------------ 4 files changed, 103 insertions(+), 170 deletions(-) diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 13ca7265..bbb8eb1a 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,6 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam, WithRaw } from "../../models/request.models.js"; -import { mapExtendedItem, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; +import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; import type { FetchContentItemPayload, FetchContentItemPayloadExtended } from "./models/content-item.models.js"; @@ -54,15 +54,9 @@ export function fetchContentItemQuery( query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchemaExtended(), transform: (response) => { - const extendedItems = resolveExtendedItems({ + const allItems = joinItems({ modularContent: [response.payload.modular_content], - inputItems: [response.payload.item], - }); - - const { item: extendedItem, modularContent: extendedModularContent } = mapExtendedItem({ - resolvedItems: extendedItems, - originalItem: response.payload.item, - originalModularContent: response.payload.modular_content, + items: [response.payload.item], }); return { @@ -70,8 +64,8 @@ export function fetchContentItemQuery( meta: response.meta, payload: { ...response.payload, - item: extendedItem, - modular_content: extendedModularContent, + item: mapToExtendedItem({ allItems, item: response.payload.item }), + modular_content: mapToExtendedModularContent({ allItems, modularContent: response.payload.modular_content }), }, }; }, diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 57e16e35..8f6580dc 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -1,3 +1,4 @@ +import type { QueryResponse } from "@kontent-ai/core-sdk"; import type { DeliveryClientConfig, DeliveryClientSchema, @@ -12,9 +13,14 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; -import { mapExtendedItems, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; +import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ItemsFeedPayload, ItemsFeedPayloadExtended } from "./models/content-item.models.js"; +import type { + ContentItemPayload, + ContentItemPayloadExtended, + ItemsFeedPayload, + ItemsFeedPayloadExtended, +} from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -69,23 +75,18 @@ export function itemsFeedQuery( query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).itemsFeedSchemaExtended(), transform: (responses) => { - const resolvedItems = resolveExtendedItems({ - inputItems: responses.flatMap((m) => m.payload.items), + const allItems = joinItems({ + items: responses.flatMap((m) => m.payload.items), modularContent: responses.map((m) => m.payload.modular_content), }); - return responses.map((m) => { - const { items: extendedItems, modularContent: extendedModularContent } = mapExtendedItems({ - resolvedItems: resolvedItems, - originalItems: m.payload.items, - originalModularContent: m.payload.modular_content, - }); + return responses.map, DeliveryMetadataWithToken>>((m) => { return { ...m, payload: { ...m.payload, - items: extendedItems, - modular_content: extendedModularContent, + items: m.payload.items.map>((item) => mapToExtendedItem({ allItems, item })), + modular_content: mapToExtendedModularContent({ allItems, modularContent: m.payload.modular_content }), }, }; }); diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 5c71518b..7106ffb5 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -8,9 +8,14 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; -import { mapExtendedItems, resolveExtendedItems } from "../../transforms/content-item-transforms.js"; +import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentItemPayload, ListContentItemsPayload, ListContentItemsPayloadExtended } from "./models/content-item.models.js"; +import type { + ContentItemPayload, + ContentItemPayloadExtended, + ListContentItemsPayload, + ListContentItemsPayloadExtended, +} from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = NonNullable[number]; @@ -72,23 +77,18 @@ export function listContentItemsQuery( query: rawQuery, transformSchema: async () => (await import("./schemas/content-item.schemas.js")).listContentItemsSchemaExtended(), transform: (responses) => { - const resolvedItems = resolveExtendedItems({ - inputItems: responses.flatMap((m) => m.payload.items), + const allItems = joinItems({ + items: responses.flatMap((m) => m.payload.items), modularContent: responses.map((m) => m.payload.modular_content), }); return responses.map, DeliveryMetadata>>((m) => { - const { items: extendedItems, modularContent: extendedModularContent } = mapExtendedItems({ - resolvedItems: resolvedItems, - originalItems: m.payload.items, - originalModularContent: m.payload.modular_content, - }); return { ...m, payload: { ...m.payload, - items: extendedItems, - modular_content: extendedModularContent, + items: m.payload.items.map>((item) => mapToExtendedItem({ allItems, item })), + modular_content: mapToExtendedModularContent({ allItems, modularContent: m.payload.modular_content }), }, }; }); diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index b4a2fddf..3cfb8c2f 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -1,161 +1,99 @@ -import { isDefined } from "@kontent-ai/core-sdk"; import { match } from "ts-pattern"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; +import type { LinkedItems, RichText } from "../queries/content-items/models/element-types.js"; -type IntermediateItem = ContentItemPayloadExtended & { - $rawElements?: Readonly>; -}; - -function joinToIntermediateItems({ - items, - modular_content, +export function mapToExtendedItem({ + allItems, + item, }: { - readonly items: readonly ContentItemPayload[]; - readonly modular_content: readonly Readonly>>[]; -}): Record> { - const createIntermediateRecord = ( - item: ContentItemPayload, - ): IntermediateItem => ({ - system: item.system, - $rawElements: item.elements, - elements: {}, - }); - - // first prepare map from modular content - const modularContentRecords = modular_content.reduce>>((records, content) => { - Object.entries(content).forEach(([key, item]) => { - records[key] = createIntermediateRecord(item); - }); - return records; - }, {}); - - // then merge input items into the map - return items.reduce>>((records, item) => { - records[item.system.codename] = createIntermediateRecord(item); - return records; - }, modularContentRecords); -} - -function resolveCodenamesToPreparedItems( - codenames: readonly string[], - intermediateRecords: Readonly>>, -): readonly ContentItemPayloadExtended[] { - return codenames.reduce[]>((preparedItems, codename) => { - const record = intermediateRecords[codename]; - if (record) { - preparedItems.push(record); - } - return preparedItems; - }, []); -} + readonly allItems: Readonly>>; + readonly item: ContentItemPayload; +}): ContentItemPayloadExtended { + // biome-ignore lint/nursery/noForIn: We intentionally want to use "in" for getting properties of elements (perf. reasons) + for (const key in item.elements) { + // biome-ignore lint/style/noNonNullAssertion: The element exists as we iterating through keys of it + item.elements[key] = resolveExtendedElement(item.elements[key]!, allItems); + } -function resolveExtendedElement( - element: ContentItemElementPayload, - intermediateRecords: Readonly>>, -): ContentItemElementPayloadExtended { - return match(element) - .returnType() - .with({ type: "modular_content" }, (linkedItemElement) => ({ - ...linkedItemElement, - items: resolveCodenamesToPreparedItems(linkedItemElement.value, intermediateRecords), - })) - .with({ type: "rich_text" }, (richTextElement) => ({ - ...richTextElement, - items: resolveCodenamesToPreparedItems(richTextElement.modular_content, intermediateRecords), - })) - .otherwise((element) => element); + return item as ContentItemPayloadExtended; } -export function mapExtendedItems({ - resolvedItems, - originalItems, - originalModularContent, +export function mapToExtendedModularContent({ + modularContent, + allItems, }: { - readonly resolvedItems: Readonly>>; - readonly originalItems: readonly ContentItemPayload[]; - readonly originalModularContent: Readonly>>; + modularContent: Readonly>>; + allItems: Readonly>>; }): { - readonly modularContent: Readonly>>; - readonly items: readonly ContentItemPayloadExtended[]; + [key: string]: ContentItemPayloadExtended; } { - return { - items: originalItems - .map | undefined>((originalItem) => { - return resolvedItems[originalItem.system.codename]; - }) - .filter(isDefined), - modularContent: Object.keys(originalModularContent).reduce>>( - (resolvedModularContent, codename) => { - const extendedItem = resolvedItems[codename]; + // biome-ignore lint/nursery/noForIn: We intentionally want to use "in" for getting properties of elements (perf. reasons) + for (const key in modularContent) { + // biome-ignore lint/style/noNonNullAssertion: Item is guaranteed to be here as we iterate over keys in the condition above + mapToExtendedItem({ allItems, item: modularContent[key]! }); + } - if (!extendedItem) { - throw new Error(`Item with codename "${codename}" not found in resolved items`); - } - resolvedModularContent[codename] = extendedItem; - return resolvedModularContent; - }, - {}, - ), - }; + return modularContent as Readonly>>; } -export function mapExtendedItem({ - resolvedItems, - originalItem, - originalModularContent, +export function joinItems({ + items, + modularContent, }: { - readonly resolvedItems: Readonly>>; - readonly originalItem: ContentItemPayload; - readonly originalModularContent: Readonly>>; -}): { - readonly modularContent: Readonly>>; - readonly item: ContentItemPayloadExtended; -} { - const extendedItem = resolvedItems[originalItem.system.codename]; - - if (!extendedItem) { - throw new Error(`Item with codename "${originalItem.system.codename}" not found in resolved items`); + readonly items: readonly ContentItemPayload[]; + readonly modularContent: readonly Readonly>>[]; +}): Readonly>> { + const joinedItems: Record> = {}; + for (const content of modularContent) { + Object.assign(joinedItems, content); } - return { - item: extendedItem, - modularContent: Object.keys(originalModularContent).reduce>>( - (resolvedModularContent, codename) => { - const extendedItem = resolvedItems[codename]; + for (const item of items) { + joinedItems[item.system.codename] = item; + } - if (!extendedItem) { - throw new Error(`Item with codename "${codename}" not found in resolved items`); - } - resolvedModularContent[codename] = extendedItem; - return resolvedModularContent; - }, - {}, - ), - }; + return joinedItems; } -export function resolveExtendedItems({ - inputItems, - modularContent, -}: { - readonly inputItems: readonly ContentItemPayload[]; - readonly modularContent: readonly Readonly>>[]; -}): Readonly>> { - const intermediateRecords = joinToIntermediateItems({ - items: inputItems, - modular_content: modularContent, - }); - - for (const intermediateRecord of Object.values(intermediateRecords)) { - for (const [key, element] of Object.entries(intermediateRecord.$rawElements ?? {})) { - intermediateRecord.elements[key] = resolveExtendedElement(element, intermediateRecords); +function resolveCodenamesToItems( + codenames: readonly string[], + allItems: Readonly>>, +): readonly ContentItemPayload[] { + const result: ContentItemPayload[] = []; + for (const codename of codenames) { + const record = allItems[codename]; + if (record) { + result.push(record); } - - // delete $rawElement which was used to map extended elements - delete intermediateRecord.$rawElements; } - return intermediateRecords; + return result; +} + +/** + * We intentionally use type assertion & mutation here as to avoid immutability overhead by copying values across elements + */ +function resolveExtendedElement( + element: ContentItemElementPayload, + allItems: Readonly>>, +): ContentItemElementPayloadExtended { + return match(element) + .returnType() + .with({ type: "modular_content" }, (linkedItemElement) => { + (linkedItemElement as LinkedItems & { items: readonly ContentItemPayload[] }).items = resolveCodenamesToItems( + linkedItemElement.value, + allItems, + ); + return linkedItemElement as LinkedItems; + }) + .with({ type: "rich_text" }, (richTextElement) => { + (richTextElement as RichText & { items: readonly ContentItemPayload[] }).items = resolveCodenamesToItems( + richTextElement.modular_content, + allItems, + ); + return richTextElement as RichText; + }) + .otherwise((element) => element); } From 7f529f08fbe1c212c0d32f9524b1f711abebec52 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 21 May 2026 13:59:45 +0200 Subject: [PATCH 187/221] Update content-item-transforms.ts --- lib/transforms/content-item-transforms.ts | 46 +++++++++-------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 3cfb8c2f..3eac7931 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -2,7 +2,6 @@ import { match } from "ts-pattern"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; -import type { LinkedItems, RichText } from "../queries/content-items/models/element-types.js"; export function mapToExtendedItem({ allItems, @@ -11,12 +10,11 @@ export function mapToExtendedItem({ readonly allItems: Readonly>>; readonly item: ContentItemPayload; }): ContentItemPayloadExtended { - // biome-ignore lint/nursery/noForIn: We intentionally want to use "in" for getting properties of elements (perf. reasons) - for (const key in item.elements) { - // biome-ignore lint/style/noNonNullAssertion: The element exists as we iterating through keys of it - item.elements[key] = resolveExtendedElement(item.elements[key]!, allItems); + for (const [key, element] of Object.entries(item.elements)) { + item.elements[key] = resolveExtendedElement(element, allItems); } + // we know that for each element we have it's extended version return item as ContentItemPayloadExtended; } @@ -29,12 +27,11 @@ export function mapToExtendedModularContent; } { - // biome-ignore lint/nursery/noForIn: We intentionally want to use "in" for getting properties of elements (perf. reasons) - for (const key in modularContent) { - // biome-ignore lint/style/noNonNullAssertion: Item is guaranteed to be here as we iterate over keys in the condition above - mapToExtendedItem({ allItems, item: modularContent[key]! }); + for (const item of Object.values(modularContent)) { + mapToExtendedItem({ allItems, item }); } + // We know that for each item we have its extended version return modularContent as Readonly>>; } @@ -61,20 +58,15 @@ function resolveCodenamesToItems( codenames: readonly string[], allItems: Readonly>>, ): readonly ContentItemPayload[] { - const result: ContentItemPayload[] = []; - for (const codename of codenames) { + return codenames.reduce[]>((preparedItems, codename) => { const record = allItems[codename]; if (record) { - result.push(record); + preparedItems.push(record); } - } - - return result; + return preparedItems; + }, []); } -/** - * We intentionally use type assertion & mutation here as to avoid immutability overhead by copying values across elements - */ function resolveExtendedElement( element: ContentItemElementPayload, allItems: Readonly>>, @@ -82,18 +74,16 @@ function resolveExtendedElement( return match(element) .returnType() .with({ type: "modular_content" }, (linkedItemElement) => { - (linkedItemElement as LinkedItems & { items: readonly ContentItemPayload[] }).items = resolveCodenamesToItems( - linkedItemElement.value, - allItems, - ); - return linkedItemElement as LinkedItems; + return { + ...linkedItemElement, + items: resolveCodenamesToItems(linkedItemElement.value, allItems), + }; }) .with({ type: "rich_text" }, (richTextElement) => { - (richTextElement as RichText & { items: readonly ContentItemPayload[] }).items = resolveCodenamesToItems( - richTextElement.modular_content, - allItems, - ); - return richTextElement as RichText; + return { + ...richTextElement, + items: resolveCodenamesToItems(richTextElement.modular_content, allItems), + }; }) .otherwise((element) => element); } From 7a7db2b9bc0ee222d7d768c4ef422033ef3593d5 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 21 May 2026 14:22:34 +0200 Subject: [PATCH 188/221] makes elements readonly, minor adjustments --- .../content-items/fetch-content-item-query.ts | 2 +- lib/queries/content-items/items-feed-query.ts | 2 +- .../content-items/list-content-items-query.ts | 2 +- .../content-items/schemas/content-item.schemas.ts | 2 +- lib/transforms/content-item-transforms.ts | 13 +++++++------ 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index bbb8eb1a..0ee42a9a 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -65,7 +65,7 @@ export function fetchContentItemQuery( payload: { ...response.payload, item: mapToExtendedItem({ allItems, item: response.payload.item }), - modular_content: mapToExtendedModularContent({ allItems, modularContent: response.payload.modular_content }), + modular_content: mapToExtendedModularContent({ allItems, modularContents: response.payload.modular_content }), }, }; }, diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 8f6580dc..33f7d3bd 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -86,7 +86,7 @@ export function itemsFeedQuery( payload: { ...m.payload, items: m.payload.items.map>((item) => mapToExtendedItem({ allItems, item })), - modular_content: mapToExtendedModularContent({ allItems, modularContent: m.payload.modular_content }), + modular_content: mapToExtendedModularContent({ allItems, modularContents: m.payload.modular_content }), }, }; }); diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 7106ffb5..75bb81a4 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -88,7 +88,7 @@ export function listContentItemsQuery( payload: { ...m.payload, items: m.payload.items.map>((item) => mapToExtendedItem({ allItems, item })), - modular_content: mapToExtendedModularContent({ allItems, modularContent: m.payload.modular_content }), + modular_content: mapToExtendedModularContent({ allItems, modularContents: m.payload.modular_content }), }, }; }); diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index bec83988..b8dd4105 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -21,7 +21,7 @@ export const contentItemSchema = () => z.readonly( z.object({ system: contentItemSystemSchema(), - elements: z.record(z.string(), contentItemElementSchema), + elements: z.readonly(z.record(z.string(), contentItemElementSchema)), }), ); diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 3eac7931..896c9651 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -11,7 +11,8 @@ export function mapToExtendedItem({ readonly item: ContentItemPayload; }): ContentItemPayloadExtended { for (const [key, element] of Object.entries(item.elements)) { - item.elements[key] = resolveExtendedElement(element, allItems); + // the item.elements is readonly, but we do want to mutate it here rather then creating new object + (item.elements as Record)[key] = resolveExtendedElement(element, allItems); } // we know that for each element we have it's extended version @@ -19,20 +20,20 @@ export function mapToExtendedItem({ } export function mapToExtendedModularContent({ - modularContent, + modularContents, allItems, }: { - modularContent: Readonly>>; + modularContents: Readonly>>; allItems: Readonly>>; }): { [key: string]: ContentItemPayloadExtended; } { - for (const item of Object.values(modularContent)) { - mapToExtendedItem({ allItems, item }); + for (const modularContent of Object.values(modularContents)) { + mapToExtendedItem({ allItems, item: modularContent }); } // We know that for each item we have its extended version - return modularContent as Readonly>>; + return modularContents as Readonly>>; } export function joinItems({ From 7bd541e67a16b4c7f8a110612708cca8826f06fc Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Thu, 21 May 2026 15:43:14 +0200 Subject: [PATCH 189/221] Updates transforms --- lib/transforms/content-item-transforms.ts | 27 +++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 896c9651..5c15fc6d 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -1,4 +1,3 @@ -import { match } from "ts-pattern"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; @@ -68,23 +67,27 @@ function resolveCodenamesToItems( }, []); } +/** + * We intentionally mutate element here rather then creating new object + */ function resolveExtendedElement( element: ContentItemElementPayload, allItems: Readonly>>, ): ContentItemElementPayloadExtended { - return match(element) - .returnType() - .with({ type: "modular_content" }, (linkedItemElement) => { + switch (element.type) { + case "modular_content": { return { - ...linkedItemElement, - items: resolveCodenamesToItems(linkedItemElement.value, allItems), + ...element, + items: resolveCodenamesToItems(element.value, allItems), }; - }) - .with({ type: "rich_text" }, (richTextElement) => { + } + case "rich_text": { return { - ...richTextElement, - items: resolveCodenamesToItems(richTextElement.modular_content, allItems), + ...element, + items: resolveCodenamesToItems(element.modular_content, allItems), }; - }) - .otherwise((element) => element); + } + default: + return element; + } } From fa76b6371ed258ec57db8f49f4bd1afe96c80772 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 22 May 2026 10:06:29 +0200 Subject: [PATCH 190/221] Tests transform functions --- .../transforms/content-item-transform.spec.ts | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 tests/unit/transforms/content-item-transform.spec.ts diff --git a/tests/unit/transforms/content-item-transform.spec.ts b/tests/unit/transforms/content-item-transform.spec.ts new file mode 100644 index 00000000..b361b39e --- /dev/null +++ b/tests/unit/transforms/content-item-transform.spec.ts @@ -0,0 +1,247 @@ +import { describe, expect, it } from "vitest"; +import type { DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { ContentItemPayload } from "../../../lib/queries/content-items/models/content-item.models.js"; +import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../../lib/transforms/content-item-transforms.js"; +import { getFakeUuid } from "../../utils/test.utils.js"; + +type TestSchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["default"]; + readonly taxonomyCodenames: readonly []; + readonly contentTypeCodenames: readonly ["movie", "star"]; + readonly elementCodenames: readonly []; + readonly collectionCodenames: readonly ["default"]; + readonly workflowCodenames: readonly ["default"]; + readonly workflowStepCodenames: readonly ["published"]; +}>; + +const createItem = (codename: string, type: "movie" | "star" = "star"): ContentItemPayload => ({ + system: { + id: getFakeUuid(), + name: codename, + codename, + language: "default", + type, + collection: "default", + last_modified: "2026-05-04T10:30:48.5100633Z", + workflow: "default", + workflow_step: "published", + sitemap_locations: [], + }, + elements: { + firstname: { + type: "text", + name: "Firstname", + value: codename, + }, + }, +}); + +const createItemWithReferences = ( + codename: string, + richTextRefs: readonly string[], + linkedItemRefs: readonly string[], +): ContentItemPayload => ({ + system: { + id: getFakeUuid(), + name: codename, + codename, + language: "default", + type: "movie", + collection: "default", + last_modified: "2026-05-04T10:30:48.5100633Z", + workflow: "default", + workflow_step: "published", + sitemap_locations: [], + }, + elements: { + description: { + type: "rich_text", + name: "Description", + value: "

Some rich text

", + images: {}, + links: {}, + modular_content: richTextRefs, + }, + cast: { + type: "modular_content", + name: "Cast", + value: linkedItemRefs, + }, + }, +}); + +describe("mapToExtendedItem", () => { + it("populates rich text and linked items elements with referenced items from allItems", () => { + const christianBale = createItem("christian_bale"); + const garyOldman = createItem("gary_oldman"); + const heathLedger = createItem("heath_ledger"); + + const allItems = { + christian_bale: christianBale, + gary_oldman: garyOldman, + heath_ledger: heathLedger, + }; + + const item = createItemWithReferences("the_dark_knight", ["heath_ledger"], ["christian_bale", "gary_oldman"]); + + const result = mapToExtendedItem({ allItems, item }); + + const richText = result.elements.description; + const linkedItems = result.elements.cast; + + if (richText?.type !== "rich_text") { + throw new Error("Expected rich_text element"); + } + if (linkedItems?.type !== "modular_content") { + throw new Error("Expected modular_content element"); + } + + expect(richText.items).toHaveLength(1); + expect(richText.items[0]).toBe(heathLedger); + + expect(linkedItems.items).toHaveLength(2); + expect(linkedItems.items[0]).toBe(christianBale); + expect(linkedItems.items[1]).toBe(garyOldman); + }); + + it("skips codenames that are not present in allItems", () => { + const christianBale = createItem("christian_bale"); + const allItems = { christian_bale: christianBale }; + + const item = createItemWithReferences("the_dark_knight", ["missing_codename"], ["christian_bale", "another_missing"]); + + const result = mapToExtendedItem({ allItems, item }); + + const richText = result.elements.description; + const linkedItems = result.elements.cast; + + if (richText?.type !== "rich_text" || linkedItems?.type !== "modular_content") { + throw new Error("Unexpected element types"); + } + + expect(richText.items).toHaveLength(0); + expect(linkedItems.items).toHaveLength(1); + expect(linkedItems.items[0]).toBe(christianBale); + }); + + it("leaves non-referencing elements unchanged", () => { + const item = createItem("plain_star"); + const result = mapToExtendedItem({ allItems: {}, item }); + + const firstname = result.elements.firstname; + if (firstname?.type !== "text") { + throw new Error("Expected text element"); + } + expect(firstname.value).toBe("plain_star"); + }); +}); + +describe("mapToExtendedModularContent", () => { + it("maps every record in modularContents and resolves their referenced items", () => { + const christianBale = createItem("christian_bale"); + const garyOldman = createItem("gary_oldman"); + const heathLedger = createItem("heath_ledger"); + + const movieA = createItemWithReferences("movie_a", ["heath_ledger"], ["christian_bale"]); + const movieB = createItemWithReferences("movie_b", ["christian_bale"], ["gary_oldman", "heath_ledger"]); + + const modularContents = { movie_a: movieA, movie_b: movieB }; + const allItems = { + christian_bale: christianBale, + gary_oldman: garyOldman, + heath_ledger: heathLedger, + movie_a: movieA, + movie_b: movieB, + }; + + const result = mapToExtendedModularContent({ allItems, modularContents }); + + expect(Object.keys(result)).toHaveLength(Object.keys(modularContents).length); + expect(Object.keys(result).sort()).toEqual(["movie_a", "movie_b"]); + + const movieARichText = result.movie_a?.elements.description; + const movieALinkedItems = result.movie_a?.elements.cast; + const movieBRichText = result.movie_b?.elements.description; + const movieBLinkedItems = result.movie_b?.elements.cast; + + if (movieARichText?.type !== "rich_text" || movieALinkedItems?.type !== "modular_content") { + throw new Error("movie_a has unexpected element types"); + } + if (movieBRichText?.type !== "rich_text" || movieBLinkedItems?.type !== "modular_content") { + throw new Error("movie_b has unexpected element types"); + } + + expect(movieARichText.items).toEqual([heathLedger]); + expect(movieALinkedItems.items).toEqual([christianBale]); + + expect(movieBRichText.items).toEqual([christianBale]); + expect(movieBLinkedItems.items).toEqual([garyOldman, heathLedger]); + }); + + it("returns an empty record when modularContents is empty", () => { + const result = mapToExtendedModularContent({ allItems: {}, modularContents: {} }); + expect(Object.keys(result)).toHaveLength(0); + }); +}); + +describe("joinItems", () => { + it("joins items and modularContent into a single record keyed by codename, preserving the source size when codenames are unique", () => { + const itemA = createItem("item_a"); + const itemB = createItem("item_b"); + const modularA = createItem("modular_a"); + const modularB = createItem("modular_b"); + + const result = joinItems({ + items: [itemA, itemB], + modularContent: [{ modular_a: modularA, modular_b: modularB }], + }); + + const sourceSize = 2 + Object.keys({ modular_a: modularA, modular_b: modularB }).length; + + expect(Object.keys(result)).toHaveLength(sourceSize); + expect(result.item_a).toBe(itemA); + expect(result.item_b).toBe(itemB); + expect(result.modular_a).toBe(modularA); + expect(result.modular_b).toBe(modularB); + }); + + it("merges multiple modularContent records and items together", () => { + const itemA = createItem("item_a"); + const modularA = createItem("modular_a"); + const modularB = createItem("modular_b"); + + const result = joinItems({ + items: [itemA], + modularContent: [{ modular_a: modularA }, { modular_b: modularB }], + }); + + expect(Object.keys(result)).toHaveLength(3); + expect(result.item_a).toBe(itemA); + expect(result.modular_a).toBe(modularA); + expect(result.modular_b).toBe(modularB); + }); + + it("deduplicates entries with the same codename, so the result is smaller than the source", () => { + const sharedFromItems = createItem("shared"); + const sharedFromModular = createItem("shared"); + const uniqueItem = createItem("unique_item"); + const uniqueModular = createItem("unique_modular"); + + const modularRecord = { shared: sharedFromModular, unique_modular: uniqueModular }; + const items = [sharedFromItems, uniqueItem]; + + const sourceSize = items.length + Object.keys(modularRecord).length; + + const result = joinItems({ + items, + modularContent: [modularRecord], + }); + + expect(Object.keys(result).length).toBeLessThan(sourceSize); + expect(Object.keys(result)).toHaveLength(3); + expect(Object.keys(result).sort()).toEqual(["shared", "unique_item", "unique_modular"]); + expect(result.shared).toBe(sharedFromItems); + expect(result.unique_item).toBe(uniqueItem); + expect(result.unique_modular).toBe(uniqueModular); + }); +}); From a6c17144aeeeb78af56458027f701980dbba301d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 22 May 2026 10:42:52 +0200 Subject: [PATCH 191/221] Adds support for abortSignal --- lib/models/request.models.ts | 1 + lib/queries/delivery-queries.ts | 2 +- tests/unit/queries/abort-signal.spec.ts | 28 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/unit/queries/abort-signal.spec.ts diff --git a/lib/models/request.models.ts b/lib/models/request.models.ts index a5864b8d..f8e5bee3 100644 --- a/lib/models/request.models.ts +++ b/lib/models/request.models.ts @@ -49,6 +49,7 @@ export type DeliveryRequestConfig = { * Additional headers to be added to the request. */ readonly customHeaders?: readonly Header[]; + readonly abortSignal?: AbortSignal; }; export type OrderDirection = "asc" | "desc"; diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index 1952c3b5..f9813887 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -192,7 +192,7 @@ function getSharedRequestData({ | "mapExtraResponseProps" > { return { - abortSignal: undefined, + abortSignal: request?.config?.abortSignal, config, sdkInfo: deliverySdkInfo, mapExtraResponseProps: () => {}, diff --git a/tests/unit/queries/abort-signal.spec.ts b/tests/unit/queries/abort-signal.spec.ts new file mode 100644 index 00000000..4c04931b --- /dev/null +++ b/tests/unit/queries/abort-signal.spec.ts @@ -0,0 +1,28 @@ +import { AdapterAbortError, type KontentSdkError } from "@kontent-ai/core-sdk"; +import { describe, expect, it } from "vitest"; +import { createDeliveryClient } from "../../../lib/public_api.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +describe("Query cancellation via abortSignal", () => { + it("rejects the in-flight query when the supplied abortSignal is aborted", async () => { + const client = createDeliveryClient({ + apiMode: "public", + environmentId: unitEnvironmentId, + runtimeValidation: { + validateResponses: false, + }, + }); + + const controller = new AbortController(); + const pendingQuery = client.listLanguages({ config: { abortSignal: controller.signal } }).fetchPageSafe(); + + controller.abort(); + + const { error } = await pendingQuery; + expect(error?.details.reason).toEqual("aborted"); + + if (error?.details.reason === "aborted") { + expect(error.details.originalError).toBeInstanceOf(AdapterAbortError); + } + }); +}); From f4bfdef4082649e7bc48947619237e0194a3e661 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 5 Jun 2026 09:43:05 +0200 Subject: [PATCH 192/221] Updates deps --- package.json | 14 +- pnpm-lock.yaml | 322 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 9 ++ 3 files changed, 177 insertions(+), 168 deletions(-) diff --git a/package.json b/package.json index 5795f8d4..eb16cae8 100644 --- a/package.json +++ b/package.json @@ -61,13 +61,13 @@ "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.4.0", - "@biomejs/biome": "2.4.15", - "@types/node": "25.9.0", - "vitest": "4.1.6", - "@vitest/coverage-v8": "4.1.6", - "tsx": "4.22.3", - "@typescript/native-preview": "7.0.0-dev.20260519.1", + "eslint": "10.4.1", + "@biomejs/biome": "2.4.16", + "@types/node": "25.9.1", + "vitest": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "tsx": "4.22.4", + "@typescript/native-preview": "7.0.0-dev.20260604.1", "esbuild": "0.28.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbc37759..4e7dea89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,35 +19,35 @@ importers: version: 4.3.6 devDependencies: '@biomejs/biome': - specifier: 2.4.15 - version: 2.4.15 + specifier: 2.4.16 + version: 2.4.16 '@kontent-ai/biome-config': specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.15) + version: 0.7.0(@biomejs/biome@2.4.16) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.9.0 - version: 25.9.0 + specifier: 25.9.1 + version: 25.9.1 '@typescript/native-preview': - specifier: 7.0.0-dev.20260519.1 - version: 7.0.0-dev.20260519.1 + specifier: 7.0.0-dev.20260604.1 + version: 7.0.0-dev.20260604.1 '@vitest/coverage-v8': - specifier: 4.1.6 - version: 4.1.6(vitest@4.1.6) + specifier: 4.1.8 + version: 4.1.8(vitest@4.1.8) esbuild: specifier: 0.28.0 version: 0.28.0 eslint: - specifier: 10.4.0 - version: 10.4.0 + specifier: 10.4.1 + version: 10.4.1 tsx: - specifier: 4.22.3 - version: 4.22.3 + specifier: 4.22.4 + version: 4.22.4 vitest: - specifier: 4.1.6 - version: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) + specifier: 4.1.8 + version: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) packages: @@ -72,59 +72,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.15': - resolution: {integrity: sha512-j5VH3a/h/HXTKBM50MDMxRCzkeLv9S2XJcW2WgnZT1+xyisi+0bISrXR82gCX+8S9lvK0skEvHJRN+3Ktr2hlw==} + '@biomejs/biome@2.4.16': + resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.15': - resolution: {integrity: sha512-rF3PPqLq1yoST79zaQbDjVJwsuIeci/O+9bgNmC5QpgOqz6aqYuzA4abyAGx+mgyiDXn4A049xAN8gijbuR1Qg==} + '@biomejs/cli-darwin-arm64@2.4.16': + resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.15': - resolution: {integrity: sha512-/5KHXYMfSJs1fNXiX30xFtI8JcCFV6zaVVLxOa0M2sfqBKHkpQhRTv94yxQWxeTY2lzo2OuTlNvPC+hDQt2wcQ==} + '@biomejs/cli-darwin-x64@2.4.16': + resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.15': - resolution: {integrity: sha512-ZPcxznxm0pogHBLZhYntyR3sR+MrZjqJIKEr7ZqVen0Rl+P/4upVmfYXjftizi9RoqZntg33fv/1fbdhbYXpEQ==} + '@biomejs/cli-linux-arm64-musl@2.4.16': + resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.15': - resolution: {integrity: sha512-owaAMZD/T4LrD0ELNCk0Km3qrRHuM0X6EAyVE1FSqGY0rbLoiDLrO4Us2tllm6cAeB2Ioa9C2C08NZPdr8+0Ug==} + '@biomejs/cli-linux-arm64@2.4.16': + resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.15': - resolution: {integrity: sha512-CNq/9W38SYSH023lfcQ4KKU8K0YX8T//FZUhcgtMMRABDojx5XsMV7jlweAvGSl389wJQB29Qo6Zb/a+jdvt+w==} + '@biomejs/cli-linux-x64-musl@2.4.16': + resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.15': - resolution: {integrity: sha512-0jj7THz12GbUOLmMibktK6DZjqz2zV64KFxyBtcFTKPiiOIY0a7vns1elpO1dERvxpsZ5ik0oFfz0oGwFde1+g==} + '@biomejs/cli-linux-x64@2.4.16': + resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.15': - resolution: {integrity: sha512-ouhkYdlhp/1GghEJPdWwD/Vi3gQ1nFxuSpMolWsbq3Lsq3QUR4jl6UdhhscdCugKU5vOEuMiJhvKj66O0OCq+w==} + '@biomejs/cli-win32-arm64@2.4.16': + resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.15': - resolution: {integrity: sha512-zBrGq5mx5wwpnow4+2BxUvleDM+GNd4sLbPaMapsSLQLD0NGRCquqPBTgN+7XkUteHvj7M+BstuI8tmnV7+HgQ==} + '@biomejs/cli-win32-x64@2.4.16': + resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -348,8 +348,8 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.2': @@ -525,8 +525,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.9.0': - resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@typescript-eslint/eslint-plugin@8.59.0': resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} @@ -587,67 +587,67 @@ packages: resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-c9zdG6sGJf25Jpz04JgE23zhYeprqFypDGuqiX94yMTvR8IWXjq3R2oMnim66YLBDon/V1nCEy6cFixeSd/4fg==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-zs616um9UuaODLsNlCu5Aw95rFcTV4u3hVt090r6k0lVvTxfaJOv8HKA6BpIotcEYlZlMQowrMSYCCdedo7iyA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-N16V3wiM0tsNmSSA7nZrxqXXt5OCJxBwiCVn35rnA7fr4WzJw6rJmwf9heNNhZ6Gh4ne3+Pexajf5akzuHR75Q==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-pOdNAf2pwc9JBjo8gUsvLs5uqg7d0AhYXfE8/3zvPKBlIZG+mTcvEWW1hPawlWxXzf/vxnP4dgYwUHAMDghhKA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-ltf91vAwKdbu0SlRQbFgi1h5ZrLLrBn6a4qIeN2VILGbtYrCXnARHRznLBv81yUETQ7aVr/LSQcmsWo1ejCK0w==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-GjIrt6YHP3bbOWBCCE08SlBSDf84Lnjn3Td822/lOX9nm6ODlA/HI7rtGh7KzS/fxehep2Vy4dXU4Il12X1s5A==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-8v4BExeeuCTrhaSGfeIJqm3qQkTzlZix/Qd/FkPlWoz9f7d7COvXb3Z4qhbaVolL0MMnUvQ7m005Z4kYsZ645A==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-IKaZL3i5HKmKqwb2IZEXW1j68fVg1HsvAaXkbrkOIG/J5Eyksu5tEnTzucrIY1oPdzgHT+y2HpDIYp2sGeHFvw==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-AVD0tczTtFCHNa4RQRVPvu8Hnw4P3hQ+OlUAjnz/lHowvc6o1pYB46elMqfDuaoWqIpv+EAkAPP4ipFCofJ5IA==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-twQ7XDjsmaHIevN1MjeRYIVLUPL0fBm8A0jg1FhGYPckhTxEBiHIpJf9E//eFidAdrEHjeTSBP1jJw3GNAensg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-TM+qatljyejqjHevCta3WIH53i0oGC7K8SoJ6t+mf4cGMTpZTyd7NhC1ts7e6/aydZnG53Bsta2iQi1SMIlQEw==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-QBRxaVT3SFiNfOhwYb/56ddpHWPMFdfiJ4zkFJIjaAXeZ/ssWNHM9lH7yR++GrE9VTsUZ4eVSZfOmQbzRERhgw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-r9LEsoY7JC/82gXo8hlOmpQaUXcqmngCVOv+mUx1UeMt9f+1S6oNO0W48o75mlBqqC7jfcMHqw8YS4LfVxPRGw==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-hR7YHoRpm88Q86gK6/IMayWUA+ROdHGzOPKK8EBp1xD/Cg2Bh5AXbut8HcyUDx/bcGQvnuht/XsW47bT3to9mg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260519.1': - resolution: {integrity: sha512-VVER7vFUDdfm5k3jbH5765tVEJa7+0rTUkFeXyGYrXPxpw9BIjA0QDxdtdlRyaU8MCZV9IKZUo6doxeAQRAjPg==} + '@typescript/native-preview@7.0.0-dev.20260604.1': + resolution: {integrity: sha512-A3/9yZTt2V5NlDURcVJ4mN2YjfeQTXCRyLuENKrNdGhO+y59mC/2UDr7UvpB3Li+83TRAuhDN8SBoM+7gkHdzQ==} engines: {node: '>=16.20.0'} hasBin: true - '@vitest/coverage-v8@4.1.6': - resolution: {integrity: sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==} + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: - '@vitest/browser': 4.1.6 - vitest: 4.1.6 + '@vitest/browser': 4.1.8 + vitest: 4.1.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.6': - resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} - '@vitest/mocker@4.1.6': - resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -657,20 +657,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.6': - resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@4.1.6': - resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} - '@vitest/snapshot@4.1.6': - resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} - '@vitest/spy@4.1.6': - resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} - '@vitest/utils@4.1.6': - resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -904,8 +904,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.4.0: - resolution: {integrity: sha512-loXy6bWOoP3EP6JA7jo6p5jMpBJmHmsNZM5SFRHLdh1MGOPurMnNBj4ZlAbaqUAaQWbCr7jHV4P7gzAyryZWkQ==} + eslint@10.4.1: + resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1606,8 +1606,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.3: - resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} engines: {node: '>=18.0.0'} hasBin: true @@ -1689,20 +1689,20 @@ packages: yaml: optional: true - vitest@4.1.6: - resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.6 - '@vitest/browser-preview': 4.1.6 - '@vitest/browser-webdriverio': 4.1.6 - '@vitest/coverage-istanbul': 4.1.6 - '@vitest/coverage-v8': 4.1.6 - '@vitest/ui': 4.1.6 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1784,39 +1784,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.15': + '@biomejs/biome@2.4.16': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.15 - '@biomejs/cli-darwin-x64': 2.4.15 - '@biomejs/cli-linux-arm64': 2.4.15 - '@biomejs/cli-linux-arm64-musl': 2.4.15 - '@biomejs/cli-linux-x64': 2.4.15 - '@biomejs/cli-linux-x64-musl': 2.4.15 - '@biomejs/cli-win32-arm64': 2.4.15 - '@biomejs/cli-win32-x64': 2.4.15 + '@biomejs/cli-darwin-arm64': 2.4.16 + '@biomejs/cli-darwin-x64': 2.4.16 + '@biomejs/cli-linux-arm64': 2.4.16 + '@biomejs/cli-linux-arm64-musl': 2.4.16 + '@biomejs/cli-linux-x64': 2.4.16 + '@biomejs/cli-linux-x64-musl': 2.4.16 + '@biomejs/cli-win32-arm64': 2.4.16 + '@biomejs/cli-win32-x64': 2.4.16 - '@biomejs/cli-darwin-arm64@2.4.15': + '@biomejs/cli-darwin-arm64@2.4.16': optional: true - '@biomejs/cli-darwin-x64@2.4.15': + '@biomejs/cli-darwin-x64@2.4.16': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.15': + '@biomejs/cli-linux-arm64-musl@2.4.16': optional: true - '@biomejs/cli-linux-arm64@2.4.15': + '@biomejs/cli-linux-arm64@2.4.16': optional: true - '@biomejs/cli-linux-x64-musl@2.4.15': + '@biomejs/cli-linux-x64-musl@2.4.16': optional: true - '@biomejs/cli-linux-x64@2.4.15': + '@biomejs/cli-linux-x64@2.4.16': optional: true - '@biomejs/cli-win32-arm64@2.4.15': + '@biomejs/cli-win32-arm64@2.4.16': optional: true - '@biomejs/cli-win32-x64@2.4.15': + '@biomejs/cli-win32-x64@2.4.16': optional: true '@emnapi/core@1.10.0': @@ -1913,9 +1913,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1)': dependencies: - eslint: 10.4.0 + eslint: 10.4.1 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -1982,7 +1982,7 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@eslint/plugin-kit@0.7.1': + '@eslint/plugin-kit@0.7.2': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -2012,9 +2012,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.15)': + '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.16)': dependencies: - '@biomejs/biome': 2.4.15 + '@biomejs/biome': 2.4.16 '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.3.6)': dependencies: @@ -2024,7 +2024,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.0(eslint@10.4.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.4.1)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2112,14 +2112,14 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.9.0': + '@types/node@25.9.1': dependencies: undici-types: 7.24.6 '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@10.4.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@10.4.1)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) @@ -2132,14 +2132,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@10.4.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.0(eslint@10.4.1)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/types': 8.59.0 '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 - eslint: 10.4.0 + eslint: 10.4.1 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2207,41 +2207,41 @@ snapshots: '@typescript-eslint/types': 8.59.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260519.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260519.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260519.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260519.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260519.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260519.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260519.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260519.1': + '@typescript/native-preview@7.0.0-dev.20260604.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260519.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260519.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260519.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260519.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260519.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260519.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260519.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260604.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260604.1 - '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.6 + '@vitest/utils': 4.1.8 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2250,46 +2250,46 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) + vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) - '@vitest/expect@4.1.6': + '@vitest/expect@4.1.8': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.6(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3))': + '@vitest/mocker@4.1.8(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4))': dependencies: - '@vitest/spy': 4.1.6 + '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3) + vite: 8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4) - '@vitest/pretty-format@4.1.6': + '@vitest/pretty-format@4.1.8': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.6': + '@vitest/runner@4.1.8': dependencies: - '@vitest/utils': 4.1.6 + '@vitest/utils': 4.1.8 pathe: 2.0.3 - '@vitest/snapshot@4.1.6': + '@vitest/snapshot@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.6': {} + '@vitest/spy@4.1.8': {} - '@vitest/utils@4.1.6': + '@vitest/utils@4.1.8': dependencies: - '@vitest/pretty-format': 4.1.6 + '@vitest/pretty-format': 4.1.8 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2660,14 +2660,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.4.0: + eslint@10.4.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -3461,7 +3461,7 @@ snapshots: tslib@2.8.1: optional: true - tsx@4.22.3: + tsx@4.22.4: dependencies: esbuild: 0.28.0 optionalDependencies: @@ -3519,7 +3519,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3): + vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3527,20 +3527,20 @@ snapshots: rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.9.0 + '@types/node': 25.9.1 esbuild: 0.28.0 fsevents: 2.3.3 - tsx: 4.22.3 + tsx: 4.22.4 - vitest@4.1.6(@types/node@25.9.0)(@vitest/coverage-v8@4.1.6)(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)): + vitest@4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)): dependencies: - '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3)) - '@vitest/pretty-format': 4.1.6 - '@vitest/runner': 4.1.6 - '@vitest/snapshot': 4.1.6 - '@vitest/spy': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3552,11 +3552,11 @@ snapshots: tinyexec: 1.1.1 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.9.0)(esbuild@0.28.0)(tsx@4.22.3) + vite: 8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.0 - '@vitest/coverage-v8': 4.1.6(vitest@4.1.6) + '@types/node': 25.9.1 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e8875b33..c6a5624a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,12 @@ allowBuilds: esbuild: true ignoredBuiltDependencies: - esbuild +minimumReleaseAgeExclude: + - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1' + - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1' + - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1' + - '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1' + - '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1' + - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1' + - '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1' + - '@typescript/native-preview@7.0.0-dev.20260604.1' From ab83f34819bd4e11f365c60a0b571836b00217dc Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 5 Jun 2026 10:20:16 +0200 Subject: [PATCH 193/221] code improvements --- lib/client/delivery-client.ts | 2 +- lib/models/core.models.ts | 4 ++-- lib/public_api.ts | 2 +- ...ms-referencing-item.ts => items-referencing-item-query.ts} | 0 lib/queries/delivery-queries.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename lib/queries/content-items/{items-referencing-item.ts => items-referencing-item-query.ts} (100%) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 29bd7995..71bcbac5 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -5,7 +5,7 @@ import { type ItemsReferencingAssetQueryRequest, itemsReferencingAssetQuery, } from "../queries/content-items/items-referencing-asset-query.js"; -import { type ItemsReferencingItemQueryRequest, itemsReferencingItemQuery } from "../queries/content-items/items-referencing-item.js"; +import { type ItemsReferencingItemQueryRequest, itemsReferencingItemQuery } from "../queries/content-items/items-referencing-item-query.js"; import { type ListContentItemsQueryRequest, listContentItemsQuery } from "../queries/content-items/list-content-items-query.js"; import { type FetchContentTypeElementQueryRequest, diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 7c8d77be..c7f2310a 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -5,7 +5,7 @@ import type { ItemsReferencingAssetQuery, ItemsReferencingAssetQueryRequest, } from "../queries/content-items/items-referencing-asset-query.js"; -import type { ItemsReferencingItemQuery, ItemsReferencingItemQueryRequest } from "../queries/content-items/items-referencing-item.js"; +import type { ItemsReferencingItemQuery, ItemsReferencingItemQueryRequest } from "../queries/content-items/items-referencing-item-query.js"; import type { ListContentItemsQuery, ListContentItemsQueryRequest } from "../queries/content-items/list-content-items-query.js"; import type { FetchContentTypeElementQuery, @@ -33,7 +33,7 @@ export type DeliveryClientSchema< /** * Placeholder type if extension is needed in future */ -export type DeliveryMetadata = NonNullable; +export type DeliveryMetadata = Record; export type DeliveryMetadataWithToken = { readonly continuationToken: string | undefined; diff --git a/lib/public_api.ts b/lib/public_api.ts index 3c34e904..5975393c 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -29,7 +29,7 @@ export type { export type { ItemsReferencingItemQuery, ItemsReferencingItemQueryRequest, -} from "./queries/content-items/items-referencing-item.js"; +} from "./queries/content-items/items-referencing-item-query.js"; export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; export type { ContentItemOf, diff --git a/lib/queries/content-items/items-referencing-item.ts b/lib/queries/content-items/items-referencing-item-query.ts similarity index 100% rename from lib/queries/content-items/items-referencing-item.ts rename to lib/queries/content-items/items-referencing-item-query.ts diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index f9813887..c65c15a2 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -224,7 +224,7 @@ function getHeaders(request?: AnyDeliveryRequest): readonly Header[] { const configHeaders: readonly Header[] = request.config?.customHeaders ?? []; const requestHeaders: readonly Header[] = Object.entries(request.headers ?? {}).map
(([name, value]) => ({ name, - value: value.toString(), + value: value?.toString(), })); return [...configHeaders, ...requestHeaders]; From cf535c725867a9d8ae957f2f4e0d9a2c4411d4e8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 5 Jun 2026 10:22:43 +0200 Subject: [PATCH 194/221] Update sample-schema.ts --- sample/sample-schema.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index 7dde270b..7bc5b348 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -60,7 +60,7 @@ export type Actor = ContentItemOf; export type MovieElements = { readonly title: ElementType.Text; readonly rating: ElementType.Number; - readonly synopsis: ElementType.RichText; + readonly synopsis: ElementType.RichText; readonly genre: ElementType.MultipleChoice<"genre1" | "genre2">; readonly release_date: ElementType.DateTime; readonly poster: ElementType.Asset; @@ -124,6 +124,7 @@ export function demonstrateMovieAccess(movie: Movie): void { const title: string = movie.elements.title.value; const rating: number | null = movie.elements.rating.value; const synopsis: string = movie.elements.synopsis.value; + const synopsisActors: readonly Actor[] = movie.elements.synopsis.items; const genreCodename: "genre1" | "genre2" | undefined = movie.elements.genre.value[0]?.codename; const releaseDate: string | null = movie.elements.release_date.value; const displayTimezone: string | null = movie.elements.release_date.display_timezone; From 9308a053c96d8f951a8f1e1391bd87f475c956c6 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 5 Jun 2026 10:25:56 +0200 Subject: [PATCH 195/221] Update sample-schema.ts --- sample/sample-schema.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index 7bc5b348..a11063d1 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -44,7 +44,7 @@ export type ActorElements = { readonly first_name: ElementType.Text; readonly last_name: ElementType.Text; readonly role: ElementType.MultipleChoice<"opt1" | "opt2" | "opt3">; - readonly relatedActors: ElementType.LinkedItems; + readonly relatedActors: ElementType.LinkedItems; }; // Fully-typed Actor item payload (system metadata + elements). @@ -133,9 +133,6 @@ export function demonstrateMovieAccess(movie: Movie): void { const urlSlug: string = movie.elements.url_slug.value; const customId: string | null = movie.elements.custom_id.value; const movieActorCodename: string | undefined = movie.elements.actors.value[0]; - - // `LinkedItems` types `items[i]` as `Actor` - full element narrowing on referenced items. const firstMovieActor: Actor | undefined = movie.elements.actors.items[0]; - const actors: readonly Actor[] = movie.elements.actors.items; } From ac6c641ee275ef9c7634199033bf5be1cfcce551 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 8 Jun 2026 11:06:57 +0200 Subject: [PATCH 196/221] Rename taxonomy term generic param --- lib/queries/taxonomies/models/taxonomy.models.ts | 10 +++++----- lib/queries/taxonomies/schemas/taxonomy.schemas.ts | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/queries/taxonomies/models/taxonomy.models.ts b/lib/queries/taxonomies/models/taxonomy.models.ts index dc573c1a..99dafc75 100644 --- a/lib/queries/taxonomies/models/taxonomy.models.ts +++ b/lib/queries/taxonomies/models/taxonomy.models.ts @@ -2,12 +2,12 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "../schemas/taxonomy.schemas.js"; -export type TaxonomyTermPayload = z.infer>>; +export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer< - ReturnType> +export type TaxonomyPayload = z.infer< + ReturnType> >; -export type ListTaxonomiesPayload = z.infer< - ReturnType> +export type ListTaxonomiesPayload = z.infer< + ReturnType> >; diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index 364cdc26..aa6833ee 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -3,16 +3,16 @@ import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; -export const taxonomyTermSchema = () => +export const taxonomyTermSchema = () => z.object({ name: z.string(), - codename: codenameOf(), + codename: codenameOf(), get terms() { - return z.readonly(z.array(taxonomyTermSchema())); + return z.readonly(z.array(taxonomyTermSchema())); }, }); -export const taxonomySchema = () => +export const taxonomySchema = () => z.readonly( z.object({ system: z.readonly( @@ -23,14 +23,14 @@ export const taxonomySchema = ())), + terms: z.readonly(z.array(taxonomyTermSchema())), }), ); -export const listTaxonomiesSchema = () => +export const listTaxonomiesSchema = () => z.readonly( z.object({ - taxonomies: z.readonly(z.array(taxonomySchema())), + taxonomies: z.readonly(z.array(taxonomySchema())), ...paginationSchema.shape, }), ); From 4955034f5c6fe55f8a4ab0b3f2e150139a51825b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 8 Jun 2026 12:28:18 +0200 Subject: [PATCH 197/221] Add safeguard for importing value imports from schemas via eslint rules --- eslint.config.mjs | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 57ff2fc1..5e8fed3b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,6 +1,22 @@ import kontentAiConfig from "@kontent-ai/eslint-config"; import { defineConfig } from "eslint/config"; +const restrictedZodPaths = [ + { + name: "zod", + message: "Import from 'zod/mini' instead to keep the SDK tree-shakeable.", + }, +]; + +const restrictedSchemaPattern = { + regex: "\\.schemas\\.js$", + // Type-only imports are erased by the compiler, so they don't pull schema code into the bundle. + // The model files legitimately `import type` from schemas to derive types via `z.infer`. + allowTypeImports: true, + message: + "Schema modules must be loaded with a dynamic `await import(...)` so they're not bundled into the main entry. For top-level use, import them from the public '@kontent-ai/delivery-sdk/schemas' entry instead.", +}; + export default defineConfig( { // Global ignores @@ -11,15 +27,13 @@ export default defineConfig( files: ["lib/**/*.ts", "tests/**/*.ts", "scripts/**/*.ts", "sample/**/*.ts"], rules: { "no-unused-vars": "off", - "no-restricted-imports": [ + // Switched to the typescript-eslint variant so we can `allowTypeImports` on the schema pattern. + "no-restricted-imports": "off", + "@typescript-eslint/no-restricted-imports": [ "error", { - paths: [ - { - name: "zod", - message: "Import from 'zod/mini' instead to keep the SDK tree-shakeable.", - }, - ], + paths: restrictedZodPaths, + patterns: [restrictedSchemaPattern], }, ], "no-restricted-syntax": [ @@ -32,4 +46,12 @@ export default defineConfig( ], }, }, + { + // Schema files (which import each other), the public `./schemas` barrel, and tests are + // allowed to import schema modules statically as values — they keep only the zod restriction. + files: ["**/*.schemas.ts", "lib/public_schemas.ts", "tests/**/*.ts"], + rules: { + "@typescript-eslint/no-restricted-imports": ["error", { paths: restrictedZodPaths }], + }, + }, ); From 508fcce4a68bfbc5a2ab54213ef685702e0b3e5c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 8 Jun 2026 16:32:41 +0200 Subject: [PATCH 198/221] Adds strongly typed support for taxonomy term codenames --- lib/client/delivery-client.ts | 4 ++- lib/models/core.models.ts | 7 +++-- .../taxonomies/fetch-taxonomy-query.ts | 28 ++++++++--------- .../taxonomies/models/taxonomy.models.ts | 26 ++++++++++++++-- .../taxonomies/schemas/taxonomy.schemas.ts | 3 +- migration.md | 12 ++++++- sample/sample-schema.ts | 31 ++++++++++++++++--- .../models/integration-test.schema.ts | 8 +++-- .../unit/schemas/content-item-schemas.spec.ts | 2 +- .../transforms/content-item-transform.spec.ts | 2 +- .../validation/response-validation.spec.ts | 4 +-- 11 files changed, 93 insertions(+), 34 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 71bcbac5..54d153d5 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -16,6 +16,7 @@ import { type ListContentTypesQueryRequest, listContentTypesQuery } from "../que import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { TaxonomyCodenameOf } from "../queries/taxonomies/models/taxonomy.models.js"; /** * Creates a delivery client. When you supply a `TSchema` type argument, codenames are narrowed for type safety. @@ -32,7 +33,8 @@ export function createDeliveryClient listTaxonomiesQuery(config, request), listLanguages: (request?: ListLanguagesQueryRequest) => listLanguagesQuery(config, request), listContentTypes: (request?: ListContentTypesQueryRequest) => listContentTypesQuery(config, request), - fetchTaxonomy: (request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), + fetchTaxonomy: >(request: FetchTaxonomyQueryRequest) => + fetchTaxonomyQuery(config, request), fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), fetchContentTypeElement: (request: FetchContentTypeElementQueryRequest) => fetchContentTypeElementQuery(config, request), fetchContentItem: (request: FetchContentItemQueryRequest) => fetchContentItemQuery(config, request), diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index c7f2310a..2bf22ba2 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -16,12 +16,13 @@ import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../que import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; +import type { TaxonomyCodenameOf } from "../queries/taxonomies/models/taxonomy.models.js"; import type { DeliverySdkError } from "./error.models.js"; export type DeliveryClientSchema< TSchema extends DeliveryClientSchema = { readonly languageCodenames: readonly string[]; - readonly taxonomyCodenames: readonly string[]; + readonly taxonomies: { readonly [taxonomyCodename: string]: readonly string[] }; readonly contentTypeCodenames: readonly string[]; readonly elementCodenames: readonly string[]; readonly collectionCodenames: readonly string[]; @@ -70,7 +71,9 @@ export type DeliveryClient; listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; listContentTypes(request?: ListContentTypesQueryRequest): ListContentTypesQuery; - fetchTaxonomy(request: FetchTaxonomyQueryRequest): FetchTaxonomyQuery; + fetchTaxonomy>( + request: FetchTaxonomyQueryRequest, + ): FetchTaxonomyQuery; fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; fetchContentItem(request: FetchContentItemQueryRequest): FetchContentItemQuery; diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index be5ac93e..67f828f6 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,27 +1,27 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { TaxonomyPayload } from "./models/taxonomy.models.js"; +import type { TaxonomyCodenameOf, TaxonomyPayload, TaxonomyTermCodenamesOf } from "./models/taxonomy.models.js"; -export type FetchTaxonomyQuery = DeliveryFetchQuery< - TaxonomyPayload, - DeliveryMetadata ->; +export type FetchTaxonomyQuery< + TSchema extends DeliveryClientSchema, + TCodename extends string = TaxonomyCodenameOf, +> = DeliveryFetchQuery>, DeliveryMetadata>; -export type FetchTaxonomyQueryRequest = DeliveryRequestWithCodename< - NonNullable, - never, - never ->; +export type FetchTaxonomyQueryRequest< + TSchema extends DeliveryClientSchema, + TCodename extends TaxonomyCodenameOf = TaxonomyCodenameOf, +> = DeliveryRequestWithCodename; -export function fetchTaxonomyQuery( +export function fetchTaxonomyQuery>( config: DeliveryClientConfig, - request: FetchTaxonomyQueryRequest, -): FetchTaxonomyQuery { + request: FetchTaxonomyQueryRequest, +): FetchTaxonomyQuery { return createDeliveryFetchQuery({ config, request, - schema: async () => (await import("./schemas/taxonomy.schemas.js")).taxonomySchema(), + schema: async () => + (await import("./schemas/taxonomy.schemas.js")).taxonomySchema>(), endpoint: `taxonomies/${request.codename}`, }); } diff --git a/lib/queries/taxonomies/models/taxonomy.models.ts b/lib/queries/taxonomies/models/taxonomy.models.ts index 99dafc75..454d3b39 100644 --- a/lib/queries/taxonomies/models/taxonomy.models.ts +++ b/lib/queries/taxonomies/models/taxonomy.models.ts @@ -2,12 +2,32 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import type { listTaxonomiesSchema, taxonomySchema, taxonomyTermSchema } from "../schemas/taxonomy.schemas.js"; -export type TaxonomyTermPayload = z.infer>>; +export type TaxonomyTermPayload = z.infer>>; -export type TaxonomyPayload = z.infer< +export type TaxonomyPayload = z.infer< ReturnType> >; -export type ListTaxonomiesPayload = z.infer< +export type ListTaxonomiesPayload = z.infer< ReturnType> >; + +/** + * The taxonomy codenames declared in the schema (the keys of the `taxonomies` map). + * Narrows to a literal union for a concrete schema, falling back to `string` for the generic default. + */ +export type TaxonomyCodenameOf = keyof TSchema["taxonomies"] & string; + +/** + * The term codenames belonging to the taxonomy identified by `TCodename`, derived from the schema's + * `taxonomies` map. Covers every nesting depth (the term tree shares one flat codename union). + * Falls back to `string` when the codename is unknown or the schema is the generic default. + */ +export type TaxonomyTermCodenamesOf< + TSchema extends DeliveryClientSchema, + TCodename extends string, +> = TCodename extends keyof TSchema["taxonomies"] + ? [Extract[number], string>] extends [never] + ? string + : Extract[number], string> + : string; diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index aa6833ee..c91a71d5 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -2,6 +2,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; +import type { TaxonomyCodenameOf } from "../models/taxonomy.models.js"; export const taxonomyTermSchema = () => z.object({ @@ -19,7 +20,7 @@ export const taxonomySchema = (), + codename: codenameOf>(), last_modified: z.iso.datetime(), }), ), diff --git a/migration.md b/migration.md index 714eae19..58785aa6 100644 --- a/migration.md +++ b/migration.md @@ -104,7 +104,9 @@ type MySchema = DeliveryClientSchema<{ readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; readonly workflowStepCodenames: readonly ["published", "draft"]; - readonly taxonomyCodenames: readonly ["genre"]; + readonly taxonomies: { + readonly genre: readonly ["action", "comedy", "drama"]; + }; readonly elementCodenames: readonly ["title", "summary"]; }>; @@ -116,6 +118,14 @@ const client = createDeliveryClient({ The schema is type-only — it narrows codenames at compile time and is not passed as a runtime value. +> **Note:** `taxonomyCodenames` is replaced by a `taxonomies` map. Each key is a taxonomy +> codename; its value lists that taxonomy's term codenames. This lets `fetchTaxonomy` narrow the +> returned term codenames to the queried taxonomy — e.g. `client.fetchTaxonomy({ codename: "genre" })` +> types its `terms[].codename` as `"action" | "comedy" | "drama"` at every nesting level. The list of +> taxonomy codenames is derived from the map's keys (`TaxonomyCodenameOf`), so no separate +> `taxonomyCodenames` field is needed. Generated schemas from `@kontent-ai/model-generator` will emit +> this shape. + --- ## Query API diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index a11063d1..e2598e22 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -13,8 +13,10 @@ * so it imports from the in-tree source instead. */ +import type { QueryResponse } from "@kontent-ai/core-sdk"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; -import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType } from "../lib/public_api.js"; +import type { DeliveryMetadata } from "../lib/models/core.models.js"; +import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType, TaxonomyPayload } from "../lib/public_api.js"; /** * 1. Schema declaration @@ -24,7 +26,10 @@ import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType } */ export type SampleProjectSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-us", "es-es"]; - readonly taxonomyCodenames: readonly ["category", "tag"]; + readonly taxonomies: { + readonly category: readonly ["term1", "term2"]; + readonly tag: readonly ["news", "featured"]; + }; readonly contentTypeCodenames: readonly ["movie", "actor"]; readonly elementCodenames: readonly ["title", "first_name", "last_name"]; readonly collectionCodenames: readonly ["movies", "tv-shows"]; @@ -91,7 +96,7 @@ export const client: SampleDeliveryClient = createDeliveryClient { +export async function queries(): Promise { const languageResponse = await client.listLanguages().fetchPage(); // Languages are typed to the schema codenames. @@ -110,7 +115,7 @@ export async function demonstrateQueries(): Promise { * produce a compile error if the public types drift. Narrowed codenames are * TypeScript hints; the runtime value can be any string the API returns. */ -export function demonstrateActorAccess(actor: Actor): void { +export function typedActor(actor: Actor): void { const firstName: string = actor.elements.first_name.value; // `value[0]?.codename` is narrowed to one of the declared literals (or undefined when empty). @@ -120,7 +125,7 @@ export function demonstrateActorAccess(actor: Actor): void { const firstRelatedActorCodename: string | undefined = actor.elements.relatedActors.value[0]; } -export function demonstrateMovieAccess(movie: Movie): void { +export function typedMovie(movie: Movie): void { const title: string = movie.elements.title.value; const rating: number | null = movie.elements.rating.value; const synopsis: string = movie.elements.synopsis.value; @@ -136,3 +141,19 @@ export function demonstrateMovieAccess(movie: Movie): void { const firstMovieActor: Actor | undefined = movie.elements.actors.items[0]; const actors: readonly Actor[] = movie.elements.actors.items; } + +export async function typedTaxonomy(): Promise { + const categoryTaxonomy: QueryResponse, DeliveryMetadata> = await client + .fetchTaxonomy({ codename: "category" }) + .fetch(); + + // Term codenames are narrowed to the terms declared for the "category" taxonomy in the schema. + const termCodename: "term1" | "term2" | undefined = categoryTaxonomy.payload.terms[0]?.codename; + + // Narrowing applies at every nesting level (the term tree shares one flat codename union). + const nestedTermCodename: "term1" | "term2" | undefined = categoryTaxonomy.payload.terms[0]?.terms[0]?.codename; + + // A different taxonomy narrows to its own terms. + const tagTaxonomy = await client.fetchTaxonomy({ codename: "tag" }).fetch(); + const tagCodename: "news" | "featured" | undefined = tagTaxonomy.payload.terms[0]?.codename; +} diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index 47d8d1ca..3f92f067 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -1,9 +1,11 @@ -import type { ContentItemOf, DeliveryClientSchema, ElementType } from "../../../lib/public_api.js"; +import type { ContentItemOf, DeliveryClientSchema, ElementType, TaxonomyTermCodenamesOf } from "../../../lib/public_api.js"; import type { ContentItemPayloadExtended } from "../../../lib/queries/content-items/models/content-item.models.js"; export type IntegrationTestProjectSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; - readonly taxonomyCodenames: readonly ["movie_type"]; + readonly taxonomies: { + readonly movie_type: readonly ["drama", "comedy", "sitcom", "stand_up", "action"]; + }; readonly contentTypeCodenames: readonly ["movie", "star"]; readonly elementCodenames: readonly [ "title", @@ -55,4 +57,4 @@ export function isStar(item: ContentItemPayloadExtended; diff --git a/tests/unit/schemas/content-item-schemas.spec.ts b/tests/unit/schemas/content-item-schemas.spec.ts index 8ea2ab37..a241a1b6 100644 --- a/tests/unit/schemas/content-item-schemas.spec.ts +++ b/tests/unit/schemas/content-item-schemas.spec.ts @@ -6,7 +6,7 @@ import { getFakeUuid } from "../../utils/test.utils.js"; type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; - readonly taxonomyCodenames: readonly []; + readonly taxonomies: Record; readonly contentTypeCodenames: readonly ["movie"]; readonly elementCodenames: readonly []; readonly collectionCodenames: readonly ["default"]; diff --git a/tests/unit/transforms/content-item-transform.spec.ts b/tests/unit/transforms/content-item-transform.spec.ts index b361b39e..45d22e24 100644 --- a/tests/unit/transforms/content-item-transform.spec.ts +++ b/tests/unit/transforms/content-item-transform.spec.ts @@ -6,7 +6,7 @@ import { getFakeUuid } from "../../utils/test.utils.js"; type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; - readonly taxonomyCodenames: readonly []; + readonly taxonomies: Record; readonly contentTypeCodenames: readonly ["movie", "star"]; readonly elementCodenames: readonly []; readonly collectionCodenames: readonly ["default"]; diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index 1a0ec6d0..ee172517 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -12,7 +12,7 @@ describe("Response validation", () => { describe("Codename narrowing", () => { type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; - readonly taxonomyCodenames: readonly []; + readonly taxonomies: Record; readonly contentTypeCodenames: readonly []; readonly elementCodenames: readonly []; readonly collectionCodenames: readonly []; @@ -40,7 +40,7 @@ describe("Response validation", () => { type NarrowSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ"]; - readonly taxonomyCodenames: readonly []; + readonly taxonomies: Record; readonly contentTypeCodenames: readonly []; readonly elementCodenames: readonly []; readonly collectionCodenames: readonly []; From d8b3e821e615ecaff07aa8b6e8914349ef26418c Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 09:57:01 +0200 Subject: [PATCH 199/221] updates deps --- package.json | 10 +- pnpm-lock.yaml | 1061 ++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 24 +- 3 files changed, 566 insertions(+), 529 deletions(-) diff --git a/package.json b/package.json index eb16cae8..915f156b 100644 --- a/package.json +++ b/package.json @@ -61,13 +61,13 @@ "devDependencies": { "@kontent-ai/biome-config": "0.7.0", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.4.1", + "eslint": "10.5.0", "@biomejs/biome": "2.4.16", - "@types/node": "25.9.1", - "vitest": "4.1.8", + "@types/node": "25.9.3", + "vitest": "4.1.9", "@vitest/coverage-v8": "4.1.8", "tsx": "4.22.4", - "@typescript/native-preview": "7.0.0-dev.20260604.1", - "esbuild": "0.28.0" + "@typescript/native-preview": "7.0.0-dev.20260614.1", + "esbuild": "0.28.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e7dea89..96339a08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: dependencies: '@kontent-ai/core-sdk': specifier: ^12.0.0-preview.40 - version: 12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.3.6) + version: 12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.4.3) ts-pattern: specifier: ^5 version: 5.9.0 zod: specifier: ^4 - version: 4.3.6 + version: 4.4.3 devDependencies: '@biomejs/biome': specifier: 2.4.16 @@ -28,44 +28,44 @@ importers: specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.9.1 - version: 25.9.1 + specifier: 25.9.3 + version: 25.9.3 '@typescript/native-preview': - specifier: 7.0.0-dev.20260604.1 - version: 7.0.0-dev.20260604.1 + specifier: 7.0.0-dev.20260614.1 + version: 7.0.0-dev.20260614.1 '@vitest/coverage-v8': specifier: 4.1.8 - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(vitest@4.1.9) esbuild: - specifier: 0.28.0 - version: 0.28.0 + specifier: 0.28.1 + version: 0.28.1 eslint: - specifier: 10.4.1 - version: 10.4.1 + specifier: 10.5.0 + version: 10.5.0 tsx: specifier: 4.22.4 version: 4.22.4 vitest: - specifier: 4.1.8 - version: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) + specifier: 4.1.9 + version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) packages: - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -138,158 +138,158 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -397,118 +397,118 @@ packages: '@kontent-ai/eslint-config@2.4.1': resolution: {integrity: sha512-4tIyNDDIxeYaPK17lMN00Ch1kqNbayLmrV+/tcia62XzCejR/cHcXcsWVGhmxS1RjyVpqhstnTWbUrcvmXge2Q==} - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.127.0': - resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} - '@rolldown/binding-android-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.17': - resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.17': - resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': - resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': - resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': - resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.17': - resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -519,118 +519,118 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + '@types/node@25.9.3': + resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} - '@typescript-eslint/eslint-plugin@8.59.0': - resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} + '@typescript-eslint/eslint-plugin@8.61.0': + resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.0 + '@typescript-eslint/parser': ^8.61.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.0': - resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} + '@typescript-eslint/parser@8.61.0': + resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.0': - resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} + '@typescript-eslint/project-service@8.61.0': + resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.0': - resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} + '@typescript-eslint/scope-manager@8.61.0': + resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.59.0': - resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} + '@typescript-eslint/tsconfig-utils@8.61.0': + resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.59.0': - resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} + '@typescript-eslint/type-utils@8.61.0': + resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.59.0': - resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} + '@typescript-eslint/types@8.61.0': + resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.59.0': - resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} + '@typescript-eslint/typescript-estree@8.61.0': + resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.0': - resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} + '@typescript-eslint/utils@8.61.0': + resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.0': - resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} + '@typescript-eslint/visitor-keys@8.61.0': + resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-zs616um9UuaODLsNlCu5Aw95rFcTV4u3hVt090r6k0lVvTxfaJOv8HKA6BpIotcEYlZlMQowrMSYCCdedo7iyA==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-2JHbdJ00FKTKDR1+NL4zhQBDlFZfZHEXaAarV6kbEjV0P47qKnSrAzzKHuponG0B9FqkPEMHOgu7WGJTBW2rHw==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-pOdNAf2pwc9JBjo8gUsvLs5uqg7d0AhYXfE8/3zvPKBlIZG+mTcvEWW1hPawlWxXzf/vxnP4dgYwUHAMDghhKA==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-/8enyEb1tDsVvUp4rDeA5DernrvWgD6cQ4rY6O6PH6BQK8fqwY+CcHEHmw2xgwfqoswHNYjznLvmQmHBOjHqLw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-GjIrt6YHP3bbOWBCCE08SlBSDf84Lnjn3Td822/lOX9nm6ODlA/HI7rtGh7KzS/fxehep2Vy4dXU4Il12X1s5A==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-jqhqAXqyEUxJpno/wRfWGa72R3VTt7p2LRTOFJ0C1bx5dEKrVosQSOdr2m9+2VhjXFXNvorXsGZPIWqxLOo28Q==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-IKaZL3i5HKmKqwb2IZEXW1j68fVg1HsvAaXkbrkOIG/J5Eyksu5tEnTzucrIY1oPdzgHT+y2HpDIYp2sGeHFvw==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-zYrUKq5oC6fUoHpOmT3B65hFMhbdIlLp7T9RW1/6a+wSYoq9xTRAeFufQ2XZ9cpTJ1tfIvlUmtgJJ5CGE/cOrg==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-twQ7XDjsmaHIevN1MjeRYIVLUPL0fBm8A0jg1FhGYPckhTxEBiHIpJf9E//eFidAdrEHjeTSBP1jJw3GNAensg==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-K2c/DN7Q3a6Z+KIl7bq45xByuuGjacqWO/UPCa/iTBA/m6GDzoMJ/Q/DBLtLRHyROBRiy5kjgEZfyLy3Tp8ygw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-QBRxaVT3SFiNfOhwYb/56ddpHWPMFdfiJ4zkFJIjaAXeZ/ssWNHM9lH7yR++GrE9VTsUZ4eVSZfOmQbzRERhgw==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-C+C25Grr4sCbQIYPT5WfKYIL613ZIN9aGcUwDGMSTmIQ3azIR5MtdkSF4l4vsOC4lF8HwFV83MDa28JuQYhQFg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-hR7YHoRpm88Q86gK6/IMayWUA+ROdHGzOPKK8EBp1xD/Cg2Bh5AXbut8HcyUDx/bcGQvnuht/XsW47bT3to9mg==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-nJBR61NGiCMBJOpdzJ4ZgA/HEd+fqIb99ur39UljSH9xvFKFlRwDosyAQFD8UEwrZsUbXN0VPLJY5MDknug3GA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260604.1': - resolution: {integrity: sha512-A3/9yZTt2V5NlDURcVJ4mN2YjfeQTXCRyLuENKrNdGhO+y59mC/2UDr7UvpB3Li+83TRAuhDN8SBoM+7gkHdzQ==} + '@typescript/native-preview@7.0.0-dev.20260614.1': + resolution: {integrity: sha512-4N1ZBHJUcsjKJQnUCxKUemV3jnm0PKZIZ4xh7dXN/3/AfmckE8Z1llyqOFfDwGOf8oQpdgkwQ6JUm7pqI3bGPg==} engines: {node: '>=16.20.0'} hasBin: true @@ -643,11 +643,11 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@4.1.8': - resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.8': - resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -660,30 +660,36 @@ packages: '@vitest/pretty-format@4.1.8': resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/runner@4.1.8': - resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.8': - resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.8': - resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -724,8 +730,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@1.0.0: - resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + ast-v8-to-istanbul@1.0.4: + resolution: {integrity: sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -742,11 +748,11 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} call-bind-apply-helpers@1.0.2: @@ -846,15 +852,15 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.3.3: + resolution: {integrity: sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -869,8 +875,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} hasBin: true @@ -904,8 +910,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.4.1: - resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + eslint@10.5.0: + resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1000,8 +1006,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -1062,8 +1068,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} html-escaper@2.0.2: @@ -1109,8 +1115,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -1121,6 +1127,10 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1213,8 +1223,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true json-buffer@3.0.1: @@ -1325,8 +1335,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.5.2: - resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -1346,8 +1356,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1386,8 +1396,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -1434,8 +1445,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1464,13 +1475,13 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} hasBin: true - rolldown@1.0.0-rc.17: - resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -1490,8 +1501,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true @@ -1527,8 +1538,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -1555,12 +1566,12 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -1582,12 +1593,12 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinyrainbow@3.1.0: @@ -1627,8 +1638,8 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} typescript@6.0.3: @@ -1646,13 +1657,13 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite@8.0.10: - resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.0 + '@vitejs/devtools': ^0.1.18 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -1689,20 +1700,20 @@ packages: yaml: optional: true - vitest@4.1.8: - resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.8 - '@vitest/browser-preview': 4.1.8 - '@vitest/browser-webdriverio': 4.1.8 - '@vitest/coverage-istanbul': 4.1.8 - '@vitest/coverage-v8': 4.1.8 - '@vitest/ui': 4.1.8 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1742,8 +1753,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -1764,23 +1775,23 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.2': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} @@ -1835,87 +1846,87 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.28.0': + '@esbuild/aix-ppc64@0.28.1': optional: true - '@esbuild/android-arm64@0.28.0': + '@esbuild/android-arm64@0.28.1': optional: true - '@esbuild/android-arm@0.28.0': + '@esbuild/android-arm@0.28.1': optional: true - '@esbuild/android-x64@0.28.0': + '@esbuild/android-x64@0.28.1': optional: true - '@esbuild/darwin-arm64@0.28.0': + '@esbuild/darwin-arm64@0.28.1': optional: true - '@esbuild/darwin-x64@0.28.0': + '@esbuild/darwin-x64@0.28.1': optional: true - '@esbuild/freebsd-arm64@0.28.0': + '@esbuild/freebsd-arm64@0.28.1': optional: true - '@esbuild/freebsd-x64@0.28.0': + '@esbuild/freebsd-x64@0.28.1': optional: true - '@esbuild/linux-arm64@0.28.0': + '@esbuild/linux-arm64@0.28.1': optional: true - '@esbuild/linux-arm@0.28.0': + '@esbuild/linux-arm@0.28.1': optional: true - '@esbuild/linux-ia32@0.28.0': + '@esbuild/linux-ia32@0.28.1': optional: true - '@esbuild/linux-loong64@0.28.0': + '@esbuild/linux-loong64@0.28.1': optional: true - '@esbuild/linux-mips64el@0.28.0': + '@esbuild/linux-mips64el@0.28.1': optional: true - '@esbuild/linux-ppc64@0.28.0': + '@esbuild/linux-ppc64@0.28.1': optional: true - '@esbuild/linux-riscv64@0.28.0': + '@esbuild/linux-riscv64@0.28.1': optional: true - '@esbuild/linux-s390x@0.28.0': + '@esbuild/linux-s390x@0.28.1': optional: true - '@esbuild/linux-x64@0.28.0': + '@esbuild/linux-x64@0.28.1': optional: true - '@esbuild/netbsd-arm64@0.28.0': + '@esbuild/netbsd-arm64@0.28.1': optional: true - '@esbuild/netbsd-x64@0.28.0': + '@esbuild/netbsd-x64@0.28.1': optional: true - '@esbuild/openbsd-arm64@0.28.0': + '@esbuild/openbsd-arm64@0.28.1': optional: true - '@esbuild/openbsd-x64@0.28.0': + '@esbuild/openbsd-x64@0.28.1': optional: true - '@esbuild/openharmony-arm64@0.28.0': + '@esbuild/openharmony-arm64@0.28.1': optional: true - '@esbuild/sunos-x64@0.28.0': + '@esbuild/sunos-x64@0.28.1': optional: true - '@esbuild/win32-arm64@0.28.0': + '@esbuild/win32-arm64@0.28.1': optional: true - '@esbuild/win32-ia32@0.28.0': + '@esbuild/win32-ia32@0.28.1': optional: true - '@esbuild/win32-x64@0.28.0': + '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0)': dependencies: - eslint: 10.4.1 + eslint: 10.5.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -1959,13 +1970,13 @@ snapshots: '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.2.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -2016,15 +2027,15 @@ snapshots: dependencies: '@biomejs/biome': 2.4.16 - '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.3.6)': + '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.4.3)': dependencies: ts-pattern: 5.9.0 - zod: 4.3.6 + zod: 4.4.3 '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.0(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2032,69 +2043,69 @@ snapshots: - supports-color - typescript - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.2 optional: true - '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.133.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.17': + '@rolldown/binding-android-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + '@rolldown/binding-darwin-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.17': + '@rolldown/binding-darwin-x64@1.0.3': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + '@rolldown/binding-freebsd-x64@1.0.3': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-arm64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + '@rolldown/binding-linux-arm64-musl@1.0.3': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-ppc64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-s390x-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-x64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + '@rolldown/binding-linux-x64-musl@1.0.3': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + '@rolldown/binding-openharmony-arm64@1.0.3': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + '@rolldown/binding-wasm32-wasi@1.0.3': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + '@rolldown/binding-win32-arm64-msvc@1.0.3': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + '@rolldown/binding-win32-x64-msvc@1.0.3': optional: true - '@rolldown/pluginutils@1.0.0-rc.17': {} + '@rolldown/pluginutils@1.0.1': {} '@standard-schema/spec@1.1.0': {} - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true @@ -2108,22 +2119,22 @@ snapshots: '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} - '@types/node@25.9.1': + '@types/node@25.9.3': dependencies: undici-types: 7.24.6 - '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@10.4.1)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.61.0 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 @@ -2132,41 +2143,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@10.4.1)(typescript@6.0.3)': + '@typescript-eslint/parser@8.61.0(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.61.0 debug: 4.4.3 - eslint: 10.4.1 + eslint: 10.5.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.61.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) + '@typescript-eslint/types': 8.61.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.59.0': + '@typescript-eslint/scope-manager@8.61.0': dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/visitor-keys': 8.61.0 - '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.61.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.61.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -2174,118 +2185,122 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.0': {} + '@typescript-eslint/types@8.61.0': {} - '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.61.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/project-service': 8.61.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/visitor-keys': 8.61.0 debug: 4.4.3 minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 + semver: 7.8.4 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': + '@typescript-eslint/utils@8.61.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) eslint: 9.39.4 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.59.0': + '@typescript-eslint/visitor-keys@8.61.0': dependencies: - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/types': 8.61.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260604.1': + '@typescript/native-preview@7.0.0-dev.20260614.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260604.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260604.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260604.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260604.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260604.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260604.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260604.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260614.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260614.1 - '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': + '@vitest/coverage-v8@4.1.8(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.8 - ast-v8-to-istanbul: 1.0.0 + ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 - magicast: 0.5.2 - obug: 2.1.1 + magicast: 0.5.3 + obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) + vitest: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) - '@vitest/expect@4.1.8': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4))': + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4))': dependencies: - '@vitest/spy': 4.1.8 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) '@vitest/pretty-format@4.1.8': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.8': + '@vitest/pretty-format@4.1.9': dependencies: - '@vitest/utils': 4.1.8 + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.9': + dependencies: + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.8': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.8 - '@vitest/utils': 4.1.8 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.8': {} + '@vitest/spy@4.1.9': {} '@vitest/utils@4.1.8': dependencies: @@ -2293,13 +2308,19 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - acorn-jsx@5.3.2(acorn@8.16.0): + '@vitest/utils@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -2323,7 +2344,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -2334,7 +2355,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: @@ -2371,7 +2392,7 @@ snapshots: assertion-error@2.0.1: {} - ast-v8-to-istanbul@1.0.0: + ast-v8-to-istanbul@1.0.4: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -2387,12 +2408,12 @@ snapshots: balanced-match@4.0.4: {} - brace-expansion@1.1.14: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -2498,10 +2519,10 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -2510,7 +2531,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -2533,21 +2554,21 @@ snapshots: safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.3.3: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -2566,9 +2587,9 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - es-module-lexer@2.0.0: {} + es-module-lexer@2.1.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -2577,11 +2598,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 es-to-primitive@1.3.0: dependencies: @@ -2589,34 +2610,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.28.0: + esbuild@0.28.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 escape-string-regexp@4.0.0: {} @@ -2627,17 +2648,17 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 + es-iterator-helpers: 1.3.3 eslint: 9.39.4 estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.6 + resolve: 2.0.0-next.7 semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 @@ -2650,7 +2671,7 @@ snapshots: eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2660,9 +2681,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.4.1: + eslint@10.5.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.6.0 @@ -2671,8 +2692,8 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -2708,8 +2729,8 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 + '@types/estree': 1.0.9 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -2736,14 +2757,14 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -2758,7 +2779,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -2799,14 +2820,17 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -2817,18 +2841,18 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-symbol-description@1.1.0: dependencies: @@ -2867,7 +2891,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.3: + hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -2887,8 +2911,8 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 is-array-buffer@3.0.5: dependencies: @@ -2915,9 +2939,9 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -2930,6 +2954,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -2962,7 +2990,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-set@2.0.3: {} @@ -2983,7 +3011,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 is-weakmap@2.0.2: {} @@ -3016,7 +3044,7 @@ snapshots: iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 @@ -3026,7 +3054,7 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.2.0: dependencies: argparse: 2.0.1 @@ -3115,29 +3143,29 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.5.2: + magicast@0.5.3: dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.4 math-intrinsics@1.1.0: {} minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.15 ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -3159,7 +3187,7 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -3168,23 +3196,23 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.fromentries@2.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.values@1.2.1: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 - obug@2.1.1: {} + obug@2.1.3: {} optionator@0.9.4: dependencies: @@ -3227,9 +3255,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.10: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -3251,7 +3279,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -3267,35 +3295,35 @@ snapshots: resolve-from@4.0.0: {} - resolve@2.0.0-next.6: + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rolldown@1.0.0-rc.17: + rolldown@1.0.3: dependencies: - '@oxc-project/types': 0.127.0 - '@rolldown/pluginutils': 1.0.0-rc.17 + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.17 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 - '@rolldown/binding-darwin-x64': 1.0.0-rc.17 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 safe-array-concat@1.1.4: dependencies: @@ -3318,7 +3346,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.4: {} + semver@7.8.4: {} set-function-length@1.2.2: dependencies: @@ -3340,7 +3368,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 shebang-command@2.0.0: dependencies: @@ -3368,7 +3396,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -3396,42 +3424,43 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 strip-json-comments@3.1.1: {} @@ -3443,9 +3472,9 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.1.1: {} + tinyexec@1.2.4: {} - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -3463,7 +3492,7 @@ snapshots: tsx@4.22.4: dependencies: - esbuild: 0.28.0 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 @@ -3495,7 +3524,7 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -3519,44 +3548,44 @@ snapshots: dependencies: punycode: 2.3.1 - vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4): + vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.10 - rolldown: 1.0.0-rc.17 - tinyglobby: 0.2.16 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.1 - esbuild: 0.28.0 + '@types/node': 25.9.3 + esbuild: 0.28.1 fsevents: 2.3.3 tsx: 4.22.4 - vitest@4.1.8(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)): + vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): dependencies: - '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4)) - '@vitest/pretty-format': 4.1.8 - '@vitest/runner': 4.1.8 - '@vitest/snapshot': 4.1.8 - '@vitest/spy': 4.1.8 - '@vitest/utils': 4.1.8 - es-module-lexer: 2.0.0 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.3 pathe: 2.0.3 picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.10(@types/node@25.9.1)(esbuild@0.28.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.1 - '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@types/node': 25.9.3 + '@vitest/coverage-v8': 4.1.8(vitest@4.1.9) transitivePeerDependencies: - msw @@ -3571,7 +3600,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -3582,7 +3611,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -3591,7 +3620,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -3614,4 +3643,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.3.6: {} + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c6a5624a..daf345f6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,11 +3,19 @@ allowBuilds: ignoredBuiltDependencies: - esbuild minimumReleaseAgeExclude: - - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1' - - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1' - - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1' - - '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1' - - '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1' - - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1' - - '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1' - - '@typescript/native-preview@7.0.0-dev.20260604.1' + - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1' + - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1' + - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1' + - '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1' + - '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1' + - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1' + - '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1' + - '@typescript/native-preview@7.0.0-dev.20260614.1' + - '@vitest/expect@4.1.9' + - '@vitest/mocker@4.1.9' + - '@vitest/pretty-format@4.1.9' + - '@vitest/runner@4.1.9' + - '@vitest/snapshot@4.1.9' + - '@vitest/spy@4.1.9' + - '@vitest/utils@4.1.9' + - vitest@4.1.9 From d48d4456ab53b10fd3817e0a0b666c978cc3343b Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 10:46:34 +0200 Subject: [PATCH 200/221] Join content type & element codenames definition and improves type narrowing on content type queries --- lib/client/delivery-client.ts | 9 ++- lib/models/core.models.ts | 12 ++-- lib/public_api.ts | 11 +++- .../content-items/fetch-content-item-query.ts | 5 +- lib/queries/content-items/items-feed-query.ts | 3 +- .../content-items/list-content-items-query.ts | 3 +- .../models/content-item.models.ts | 10 ++-- .../schemas/content-item.schemas.ts | 8 +-- .../fetch-content-type-element-query.ts | 15 +++-- .../content-types/fetch-content-type-query.ts | 17 +++--- .../content-types/list-content-types-query.ts | 4 +- .../models/content-type.models.ts | 27 +++++++++ .../schemas/content-type.schemas.ts | 3 +- migration.md | 17 +++++- sample/sample-schema.ts | 56 ++++++++++++++++++- .../models/integration-test.extra-tests.ts | 3 +- .../models/integration-test.schema.ts | 32 +++++------ .../unit/schemas/content-item-schemas.spec.ts | 5 +- .../transforms/content-item-transform.spec.ts | 6 +- .../validation/response-validation.spec.ts | 6 +- 20 files changed, 184 insertions(+), 68 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 54d153d5..cbb45c0b 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -13,6 +13,7 @@ import { } from "../queries/content-types/fetch-content-type-element-query.js"; import { type FetchContentTypeQueryRequest, fetchContentTypeQuery } from "../queries/content-types/fetch-content-type-query.js"; import { type ListContentTypesQueryRequest, listContentTypesQuery } from "../queries/content-types/list-content-types-query.js"; +import type { ContentTypeCodenameOf } from "../queries/content-types/models/content-type.models.js"; import { type ListLanguagesQueryRequest, listLanguagesQuery } from "../queries/languages/list-languages-query.js"; import { type FetchTaxonomyQueryRequest, fetchTaxonomyQuery } from "../queries/taxonomies/fetch-taxonomy-query.js"; import { type ListTaxonomiesQueryRequest, listTaxonomiesQuery } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -35,8 +36,12 @@ export function createDeliveryClient) => listContentTypesQuery(config, request), fetchTaxonomy: >(request: FetchTaxonomyQueryRequest) => fetchTaxonomyQuery(config, request), - fetchContentType: (request: FetchContentTypeQueryRequest) => fetchContentTypeQuery(config, request), - fetchContentTypeElement: (request: FetchContentTypeElementQueryRequest) => fetchContentTypeElementQuery(config, request), + fetchContentType: >( + request: FetchContentTypeQueryRequest, + ) => fetchContentTypeQuery(config, request), + fetchContentTypeElement: >( + request: FetchContentTypeElementQueryRequest, + ) => fetchContentTypeElementQuery(config, request), fetchContentItem: (request: FetchContentItemQueryRequest) => fetchContentItemQuery(config, request), listContentItems: (request?: ListContentItemsQueryRequest) => listContentItemsQuery(config, request), itemsFeed: (request?: ItemsFeedQueryRequest) => itemsFeedQuery(config, request), diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index 2bf22ba2..d3e0a9f6 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -13,6 +13,7 @@ import type { } from "../queries/content-types/fetch-content-type-element-query.js"; import type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "../queries/content-types/fetch-content-type-query.js"; import type { ListContentTypesQuery, ListContentTypesQueryRequest } from "../queries/content-types/list-content-types-query.js"; +import type { ContentTypeCodenameOf } from "../queries/content-types/models/content-type.models.js"; import type { ListLanguagesQuery, ListLanguagesQueryRequest } from "../queries/languages/list-languages-query.js"; import type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "../queries/taxonomies/fetch-taxonomy-query.js"; import type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "../queries/taxonomies/list-taxonomies-query.js"; @@ -23,8 +24,7 @@ export type DeliveryClientSchema< TSchema extends DeliveryClientSchema = { readonly languageCodenames: readonly string[]; readonly taxonomies: { readonly [taxonomyCodename: string]: readonly string[] }; - readonly contentTypeCodenames: readonly string[]; - readonly elementCodenames: readonly string[]; + readonly contentTypes: { readonly [contentTypeCodename: string]: readonly string[] }; readonly collectionCodenames: readonly string[]; readonly workflowCodenames: readonly string[]; readonly workflowStepCodenames: readonly string[]; @@ -74,8 +74,12 @@ export type DeliveryClient>( request: FetchTaxonomyQueryRequest, ): FetchTaxonomyQuery; - fetchContentType(request: FetchContentTypeQueryRequest): FetchContentTypeQuery; - fetchContentTypeElement(request: FetchContentTypeElementQueryRequest): FetchContentTypeElementQuery; + fetchContentType>( + request: FetchContentTypeQueryRequest, + ): FetchContentTypeQuery; + fetchContentTypeElement>( + request: FetchContentTypeElementQueryRequest, + ): FetchContentTypeElementQuery; fetchContentItem(request: FetchContentItemQueryRequest): FetchContentItemQuery; listContentItems(request?: ListContentItemsQueryRequest): ListContentItemsQuery; itemsFeed(request?: ItemsFeedQueryRequest): ItemsFeedQuery; diff --git a/lib/public_api.ts b/lib/public_api.ts index 5975393c..90dbbdb3 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -51,12 +51,21 @@ export type { export type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; export type { + AllElementCodenamesOf, + ContentTypeCodenameOf, ContentTypeElementPayload, ContentTypePayload, + ElementCodenamesOf, ListContentTypesPayload, } from "./queries/content-types/models/content-type.models.js"; export type { ListLanguagesQuery, ListLanguagesQueryRequest } from "./queries/languages/list-languages-query.js"; export type { LanguagePayload, ListLanguagesPayload } from "./queries/languages/models/language.models.js"; export type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; export type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "./queries/taxonomies/list-taxonomies-query.js"; -export type { ListTaxonomiesPayload, TaxonomyPayload, TaxonomyTermPayload } from "./queries/taxonomies/models/taxonomy.models.js"; +export type { + ListTaxonomiesPayload, + TaxonomyCodenameOf, + TaxonomyPayload, + TaxonomyTermCodenamesOf, + TaxonomyTermPayload, +} from "./queries/taxonomies/models/taxonomy.models.js"; diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 0ee42a9a..8e0f1433 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,5 +1,6 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam, WithRaw } from "../../models/request.models.js"; +import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; import type { FetchContentItemPayload, FetchContentItemPayloadExtended } from "./models/content-item.models.js"; @@ -21,12 +22,12 @@ export type FetchContentItemQueryRequest = /** * Specifies which elements to include in the response. By default, all elements are returned. */ - readonly elements?: ElementSelectionQueryParam[number]>; + readonly elements?: ElementSelectionQueryParam>; /** * Specifies which elements to exclude from the response. By default, no elements are excluded. */ - readonly excludeElements?: ElementSelectionQueryParam[number]>; + readonly excludeElements?: ElementSelectionQueryParam>; /** * Determines the nesting level for linked content items that the API returns. diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 33f7d3bd..8a40ace0 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -13,6 +13,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; +import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import type { @@ -23,7 +24,7 @@ import type { } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; -type ElementProperties = NonNullable[number]; +type ElementProperties = AllElementCodenamesOf; export type ItemsFeedQuery = DeliveryPagedFetchQuery< ItemsFeedPayloadExtended, diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 75bb81a4..1cb4945d 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -8,6 +8,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; +import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { @@ -18,7 +19,7 @@ import type { } from "./models/content-item.models.js"; type SystemProperties = keyof ContentItemPayload["system"]; -type ElementProperties = NonNullable[number]; +type ElementProperties = AllElementCodenamesOf; export type ListContentItemsQuery = DeliveryPagedFetchQuery< ListContentItemsPayloadExtended, diff --git a/lib/queries/content-items/models/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts index ca5b6ffe..02599f84 100644 --- a/lib/queries/content-items/models/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -1,5 +1,6 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; +import type { ContentTypeCodenameOf } from "../../content-types/models/content-type.models.js"; import type { contentItemSchema, contentItemSchemaExtended, @@ -18,14 +19,13 @@ import type { ContentItemElementPayload } from "./element.models.js"; export type ContentItemElementShape = Record; -export type ContentItemSystem< - TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], -> = z.infer>>; +export type ContentItemSystem> = z.infer< + ReturnType> +>; export type ContentItemOf< TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], + TTypeCodename extends ContentTypeCodenameOf, TElements extends ContentItemElementShape, > = { readonly system: ContentItemSystem; diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index b8dd4105..81539de8 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -2,6 +2,7 @@ import { codenameOf, kontentUuidSchema } from "@kontent-ai/core-sdk"; import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationWithTotalCountSchema } from "../../../models/pagination.schemas.js"; +import type { ContentTypeCodenameOf } from "../../content-types/models/content-type.models.js"; import { contentItemElementSchema, contentItemElementSchemaExtended } from "./element.schemas.js"; const baseContentItemSystemSchema = () => @@ -10,7 +11,7 @@ const baseContentItemSystemSchema = () => name: z.string(), codename: codenameOf(), language: codenameOf(), - type: codenameOf(), + type: codenameOf>(), collection: codenameOf(), last_modified: z.iso.datetime(), workflow: codenameOf(), @@ -25,10 +26,7 @@ export const contentItemSchema = () => }), ); -export const contentItemSystemWithCodename = < - TSchema extends DeliveryClientSchema, - TTypeCodename extends TSchema["contentTypeCodenames"][number], ->( +export const contentItemSystemWithCodename = >( type: TTypeCodename, ) => z.readonly( diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 1679cfb6..6c010924 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,18 +1,21 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { ContentTypeElementPayload } from "./models/content-type.models.js"; +import type { ContentTypeCodenameOf, ContentTypeElementPayload, ElementCodenamesOf } from "./models/content-type.models.js"; export type FetchContentTypeElementQuery = DeliveryFetchQuery; -export type FetchContentTypeElementQueryRequest = DeliveryRequest & { - readonly elementCodename: NonNullable[number]; - readonly typeCodename: NonNullable[number]; +export type FetchContentTypeElementQueryRequest< + TSchema extends DeliveryClientSchema, + TCodename extends ContentTypeCodenameOf = ContentTypeCodenameOf, +> = DeliveryRequest & { + readonly typeCodename: TCodename; + readonly elementCodename: ElementCodenamesOf; }; -export function fetchContentTypeElementQuery( +export function fetchContentTypeElementQuery>( config: DeliveryClientConfig, - request: FetchContentTypeElementQueryRequest, + request: FetchContentTypeElementQueryRequest, ): FetchContentTypeElementQuery { return createDeliveryFetchQuery({ config, diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 7eadf0e7..9e034799 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,23 +1,24 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; -import type { ContentTypePayload } from "./models/content-type.models.js"; - -type ElementProperties = NonNullable[number]; +import type { ContentTypeCodenameOf, ContentTypePayload, ElementCodenamesOf } from "./models/content-type.models.js"; export type FetchContentTypeQuery = DeliveryFetchQuery, DeliveryMetadata>; -export type FetchContentTypeQueryRequest = DeliveryRequestWithCodename< - NonNullable, +export type FetchContentTypeQueryRequest< + TSchema extends DeliveryClientSchema, + TCodename extends ContentTypeCodenameOf = ContentTypeCodenameOf, +> = DeliveryRequestWithCodename< + readonly TCodename[], { - readonly elements?: ElementSelectionQueryParam>; + readonly elements?: ElementSelectionQueryParam>; }, never >; -export function fetchContentTypeQuery( +export function fetchContentTypeQuery>( config: DeliveryClientConfig, - request: FetchContentTypeQueryRequest, + request: FetchContentTypeQueryRequest, ): FetchContentTypeQuery { return createDeliveryFetchQuery({ config, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 8149ba80..e55b57f0 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -2,10 +2,10 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, Deli import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; -import type { ContentTypePayload, ListContentTypesPayload } from "./models/content-type.models.js"; +import type { AllElementCodenamesOf, ContentTypePayload, ListContentTypesPayload } from "./models/content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; -type ElementProperties = NonNullable[number]; +type ElementProperties = AllElementCodenamesOf; export type ListContentTypesQuery = DeliveryPagedFetchQuery< ListContentTypesPayload, diff --git a/lib/queries/content-types/models/content-type.models.ts b/lib/queries/content-types/models/content-type.models.ts index cd9e06ce..743c7743 100644 --- a/lib/queries/content-types/models/content-type.models.ts +++ b/lib/queries/content-types/models/content-type.models.ts @@ -7,3 +7,30 @@ export type ContentTypePayload = z.infer>; export type ListContentTypesPayload = z.infer>>; + +/** + * The content type codenames declared in the schema (the keys of the `contentTypes` map). + * Narrows to a literal union for a concrete schema, falling back to `string` for the generic default. + */ +export type ContentTypeCodenameOf = keyof TSchema["contentTypes"] & string; + +/** + * The element codenames belonging to the content type identified by `TCodename`, derived from the + * schema's `contentTypes` map. Falls back to `string` when the codename is unknown, the type declares + * no elements, or the schema is the generic default. + */ +export type ElementCodenamesOf< + TSchema extends DeliveryClientSchema, + TCodename extends string, +> = TCodename extends keyof TSchema["contentTypes"] + ? [Extract[number], string>] extends [never] + ? string + : Extract[number], string> + : string; + +/** + * The union of every element codename across all content types in the schema. Used by cross-type + * queries (items feed, list/fetch items) that aren't scoped to a single content type. + * Falls back to `string` for the generic default. + */ +export type AllElementCodenamesOf = ElementCodenamesOf>; diff --git a/lib/queries/content-types/schemas/content-type.schemas.ts b/lib/queries/content-types/schemas/content-type.schemas.ts index 038aebda..024b2c4d 100644 --- a/lib/queries/content-types/schemas/content-type.schemas.ts +++ b/lib/queries/content-types/schemas/content-type.schemas.ts @@ -2,6 +2,7 @@ import { codenameOf, jsonValueSchema, kontentUuidSchema } from "@kontent-ai/core import * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; +import type { ContentTypeCodenameOf } from "../models/content-type.models.js"; const contentTypeElementOptionSchema = z.readonly( z.object({ @@ -112,7 +113,7 @@ export const contentTypeSchema = () => z.object({ id: kontentUuidSchema, name: z.string(), - codename: codenameOf(), + codename: codenameOf>(), last_modified: z.iso.datetime(), }), ), diff --git a/migration.md b/migration.md index 58785aa6..9fa1e16b 100644 --- a/migration.md +++ b/migration.md @@ -100,14 +100,16 @@ import { createDeliveryClient, type DeliveryClientSchema } from "@kontent-ai/del type MySchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ"]; - readonly contentTypeCodenames: readonly ["article", "movie"]; readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; readonly workflowStepCodenames: readonly ["published", "draft"]; readonly taxonomies: { readonly genre: readonly ["action", "comedy", "drama"]; }; - readonly elementCodenames: readonly ["title", "summary"]; + readonly contentTypes: { + readonly article: readonly ["title", "summary"]; + readonly movie: readonly ["title", "release_date"]; + }; }>; const client = createDeliveryClient({ @@ -126,6 +128,17 @@ The schema is type-only — it narrows codenames at compile time and is not pass > `taxonomyCodenames` field is needed. Generated schemas from `@kontent-ai/model-generator` will emit > this shape. +> **Note:** `contentTypeCodenames` and `elementCodenames` are replaced by a single `contentTypes` map. +> Each key is a content type codename; its value lists that type's element codenames. This connects +> elements to the type they belong to and lets single-type queries narrow elements to the queried type — +> e.g. `client.fetchContentTypeElement({ typeCodename: "article", elementCodename: "title" })` accepts only +> `article`'s element codenames, and `client.fetchContentType({ codename: "article" })` narrows its +> `elements` selection the same way. Cross-type queries (`listContentItems`, `itemsFeed`, +> `fetchContentItem`, `listContentTypes`) accept any element codename across all types. The list of +> content type codenames is derived from the map's keys (`ContentTypeCodenameOf`), so no separate +> `contentTypeCodenames` or `elementCodenames` field is needed. Generated schemas from +> `@kontent-ai/model-generator` will emit this shape. + --- ## Query API diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index e2598e22..f579b96c 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -16,13 +16,26 @@ import type { QueryResponse } from "@kontent-ai/core-sdk"; import { createDeliveryClient } from "../lib/client/delivery-client.js"; import type { DeliveryMetadata } from "../lib/models/core.models.js"; -import type { ContentItemOf, DeliveryClient, DeliveryClientSchema, ElementType, TaxonomyPayload } from "../lib/public_api.js"; +import type { + ContentItemOf, + DeliveryClient, + DeliveryClientSchema, + ElementCodenamesOf, + ElementType, + TaxonomyPayload, +} from "../lib/public_api.js"; /** * 1. Schema declaration * * `DeliveryClientSchema` lists every codename your project uses so queries, * payloads, and element accessors are checked against it. + * + * `contentTypes` is a map: each key is a content type codename, and its value + * lists that type's element codenames. Elements therefore belong to a type, + * which lets single-type queries narrow elements to the queried type (see + * `typedContentTypeElement` below). `taxonomies` follows the same shape, with + * each taxonomy mapping to its term codenames. */ export type SampleProjectSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-us", "es-es"]; @@ -30,8 +43,21 @@ export type SampleProjectSchema = DeliveryClientSchema<{ readonly category: readonly ["term1", "term2"]; readonly tag: readonly ["news", "featured"]; }; - readonly contentTypeCodenames: readonly ["movie", "actor"]; - readonly elementCodenames: readonly ["title", "first_name", "last_name"]; + readonly contentTypes: { + readonly movie: readonly [ + "title", + "rating", + "synopsis", + "genre", + "release_date", + "poster", + "categories", + "url_slug", + "custom_id", + "actors", + ]; + readonly actor: readonly ["first_name", "last_name", "role", "relatedActors"]; + }; readonly collectionCodenames: readonly ["movies", "tv-shows"]; readonly workflowCodenames: readonly ["published", "draft"]; readonly workflowStepCodenames: readonly ["published", "draft"]; @@ -157,3 +183,27 @@ export async function typedTaxonomy(): Promise { const tagTaxonomy = await client.fetchTaxonomy({ codename: "tag" }).fetch(); const tagCodename: "news" | "featured" | undefined = tagTaxonomy.payload.terms[0]?.codename; } + +/** + * 7. Demonstration: per-content-type element codenames + * + * Because elements live under their content type in the schema, single-type + * queries narrow element codenames to the queried type — exactly how + * `fetchTaxonomy` narrows term codenames to the queried taxonomy. + */ +export async function typedContentTypeElement(): Promise { + // `elementCodename` is narrowed to the elements declared for the "movie" type. + await client.fetchContentTypeElement({ typeCodename: "movie", elementCodename: "title" }).fetch(); + + // A different type narrows to its own elements. + await client.fetchContentTypeElement({ typeCodename: "actor", elementCodename: "first_name" }).fetch(); + + // @ts-expect-error "first_name" belongs to "actor", not "movie". + await client.fetchContentTypeElement({ typeCodename: "movie", elementCodename: "first_name" }).fetch(); + + // `fetchContentType` narrows its element selection to the queried type too. + await client.fetchContentType({ codename: "movie", query: { elements: ["title", "rating"] } }).fetch(); + + // The element codenames of a single type can be derived directly from the schema. + const movieElement: ElementCodenamesOf = "synopsis"; +} diff --git a/tests/integration/models/integration-test.extra-tests.ts b/tests/integration/models/integration-test.extra-tests.ts index df055f1e..7feb04d2 100644 --- a/tests/integration/models/integration-test.extra-tests.ts +++ b/tests/integration/models/integration-test.extra-tests.ts @@ -1,4 +1,5 @@ import { expect, it } from "vitest"; +import type { ContentTypeCodenameOf } from "../../../lib/public_api.js"; import type { ContentItemPayloadExtended } from "../../../lib/queries/content-items/models/content-item.models.js"; import { contentItemSchemaExtended } from "../../../lib/queries/content-items/schemas/content-item.schemas.js"; import { type IntegrationTestProjectSchema, isMovie } from "./integration-test.schema.js"; @@ -19,7 +20,7 @@ export function registerExtendedItemsTests( for (const linkedItem of item.elements.cast.items) { const { success, error } = contentItemSchemaExtended().safeParse(linkedItem); expect(success, error?.message).toBe(true); - expect(linkedItem.system.type).toBe("star"); + expect(linkedItem.system.type).toBe>("star"); } }); diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index 3f92f067..2a61ae00 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -6,22 +6,22 @@ export type IntegrationTestProjectSchema = DeliveryClientSchema<{ readonly taxonomies: { readonly movie_type: readonly ["drama", "comedy", "sitcom", "stand_up", "action"]; }; - readonly contentTypeCodenames: readonly ["movie", "star"]; - readonly elementCodenames: readonly [ - "title", - "length_in_minutes", - "description", - "is_blockbuster", - "release_date", - "cover", - "category", - "url", - "metadata__metadata_description", - "cast", - "firstname", - "lastname", - "custom", - ]; + readonly contentTypes: { + readonly movie: readonly [ + "title", + "length_in_minutes", + "description", + "is_blockbuster", + "release_date", + "cover", + "category", + "url", + "metadata__metadata_description", + "cast", + "custom", + ]; + readonly star: readonly ["firstname", "lastname"]; + }; readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; readonly workflowStepCodenames: readonly ["published", "draft"]; diff --git a/tests/unit/schemas/content-item-schemas.spec.ts b/tests/unit/schemas/content-item-schemas.spec.ts index a241a1b6..d677882b 100644 --- a/tests/unit/schemas/content-item-schemas.spec.ts +++ b/tests/unit/schemas/content-item-schemas.spec.ts @@ -7,8 +7,9 @@ import { getFakeUuid } from "../../utils/test.utils.js"; type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; readonly taxonomies: Record; - readonly contentTypeCodenames: readonly ["movie"]; - readonly elementCodenames: readonly []; + readonly contentTypes: { + readonly movie: readonly []; + }; readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; readonly workflowStepCodenames: readonly ["published"]; diff --git a/tests/unit/transforms/content-item-transform.spec.ts b/tests/unit/transforms/content-item-transform.spec.ts index 45d22e24..4462b2c8 100644 --- a/tests/unit/transforms/content-item-transform.spec.ts +++ b/tests/unit/transforms/content-item-transform.spec.ts @@ -7,8 +7,10 @@ import { getFakeUuid } from "../../utils/test.utils.js"; type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["default"]; readonly taxonomies: Record; - readonly contentTypeCodenames: readonly ["movie", "star"]; - readonly elementCodenames: readonly []; + readonly contentTypes: { + readonly movie: readonly []; + readonly star: readonly []; + }; readonly collectionCodenames: readonly ["default"]; readonly workflowCodenames: readonly ["default"]; readonly workflowStepCodenames: readonly ["published"]; diff --git a/tests/unit/validation/response-validation.spec.ts b/tests/unit/validation/response-validation.spec.ts index ee172517..f38a7289 100644 --- a/tests/unit/validation/response-validation.spec.ts +++ b/tests/unit/validation/response-validation.spec.ts @@ -13,8 +13,7 @@ describe("Response validation", () => { type TestSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ", "de-DE"]; readonly taxonomies: Record; - readonly contentTypeCodenames: readonly []; - readonly elementCodenames: readonly []; + readonly contentTypes: Record; readonly collectionCodenames: readonly []; readonly workflowCodenames: readonly []; readonly workflowStepCodenames: readonly []; @@ -41,8 +40,7 @@ describe("Response validation", () => { type NarrowSchema = DeliveryClientSchema<{ readonly languageCodenames: readonly ["en-US", "cs-CZ"]; readonly taxonomies: Record; - readonly contentTypeCodenames: readonly []; - readonly elementCodenames: readonly []; + readonly contentTypes: Record; readonly collectionCodenames: readonly []; readonly workflowCodenames: readonly []; readonly workflowStepCodenames: readonly []; From 9b2021d928bf0266ac81b2bdc718268876d52e82 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 11:21:44 +0200 Subject: [PATCH 201/221] Constrain TElement in ContentItemOf def --- .../content-items/models/content-item.models.ts | 10 ++++++---- sample/sample-schema.ts | 10 ++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/queries/content-items/models/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts index 02599f84..87813aef 100644 --- a/lib/queries/content-items/models/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -1,6 +1,6 @@ import type * as z from "zod/mini"; import type { DeliveryClientSchema } from "../../../models/core.models.js"; -import type { ContentTypeCodenameOf } from "../../content-types/models/content-type.models.js"; +import type { ContentTypeCodenameOf, ElementCodenamesOf } from "../../content-types/models/content-type.models.js"; import type { contentItemSchema, contentItemSchemaExtended, @@ -17,8 +17,6 @@ import type { } from "../schemas/content-item.schemas.js"; import type { ContentItemElementPayload } from "./element.models.js"; -export type ContentItemElementShape = Record; - export type ContentItemSystem> = z.infer< ReturnType> >; @@ -26,7 +24,11 @@ export type ContentItemSystem, - TElements extends ContentItemElementShape, + TElements extends { + readonly [Codename in keyof TElements]: Codename extends ElementCodenamesOf + ? ContentItemElementPayload + : never; + }, > = { readonly system: ContentItemSystem; readonly elements: TElements; diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index f579b96c..88edc29a 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -104,6 +104,16 @@ export type MovieElements = { // Fully-typed Movie item payload. export type Movie = ContentItemOf; +/** + * The element shape is validated against the schema: every key must be an element codename declared + * for the content type. You may type a subset of the type's elements, but unknown codenames are rejected. + */ +// @ts-expect-error "titel" is not an element codename declared for "movie" in the schema. +export type BadMovie = ContentItemOf; + +// A partial shape (only some of the type's elements) is still allowed. +export type PartialMovie = ContentItemOf; + /** * 4. Typed delivery client * From b8f54bc9b43fce30d0815c8b4dfba469b9472c82 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 12:14:22 +0200 Subject: [PATCH 202/221] Removes unnecessary generics from deliveryClientConfig, prepares typeguard sample --- lib/client/delivery-client.ts | 2 +- lib/models/core.models.ts | 15 +++------------ .../content-items/fetch-content-item-query.ts | 2 +- lib/queries/content-items/items-feed-query.ts | 2 +- .../items-referencing-asset-query.ts | 2 +- .../content-items/items-referencing-item-query.ts | 2 +- .../content-items/list-content-items-query.ts | 2 +- .../fetch-content-type-element-query.ts | 2 +- .../content-types/fetch-content-type-query.ts | 2 +- .../content-types/list-content-types-query.ts | 2 +- lib/queries/delivery-queries.ts | 11 +++++------ lib/queries/languages/list-languages-query.ts | 2 +- lib/queries/taxonomies/fetch-taxonomy-query.ts | 2 +- lib/queries/taxonomies/list-taxonomies-query.ts | 2 +- sample/sample-schema.ts | 12 ++++++++++++ .../create-delivery-fetch-query.spec.ts | 4 ++-- .../create-delivery-paged-by-token-query.spec.ts | 4 ++-- .../create-delivery-paged-by-url-query.spec.ts | 4 ++-- 18 files changed, 38 insertions(+), 36 deletions(-) diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index cbb45c0b..5adda987 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -27,7 +27,7 @@ import type { TaxonomyCodenameOf } from "../queries/taxonomies/models/taxonomy.m * and passing it as the type argument for full compile-time safety. */ export function createDeliveryClient( - config: DeliveryClientConfig, + config: DeliveryClientConfig, ): DeliveryClient { return { config, diff --git a/lib/models/core.models.ts b/lib/models/core.models.ts index d3e0a9f6..06e058b9 100644 --- a/lib/models/core.models.ts +++ b/lib/models/core.models.ts @@ -50,23 +50,19 @@ export type UrlPagingDeliveryExtraResponseProps = { export type ApiMode = "public" | "preview" | "secure"; -declare const schemaPhantom: unique symbol; - -export type DeliveryClientConfig = SdkConfig< +export type DeliveryClientConfig = SdkConfig< DeliveryApiConfig & { /** * The environment ID of your Kontent.ai project. Can be found in the Kontent.ai app. */ readonly environmentId: string; } -> & { - readonly [schemaPhantom]?: TSchema; -}; +>; export type DeliveryApiConfig = PublicDeliveryClientConfig | PreviewDeliveryClientConfig | SecureDeliveryClientConfig; export type DeliveryClient = { - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; listLanguages(request?: ListLanguagesQueryRequest): ListLanguagesQuery; listTaxonomies(request?: ListTaxonomiesQueryRequest): ListTaxonomiesQuery; @@ -113,11 +109,6 @@ export type DeliveryEndpoint = export type WaitForLoadingNewContentHeaderName = "X-KC-Wait-For-Loading-New-Content"; -/** - * Readonly array with at least one item. - */ -export type NonEmptyArray = readonly [T, ...T[]]; - type PublicDeliveryClientConfig = { /** * The API mode of the delivery client. Public access is the default mode. diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 8e0f1433..ac0d7080 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -41,7 +41,7 @@ export type FetchContentItemQueryRequest = >; export function fetchContentItemQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: FetchContentItemQueryRequest, ): FetchContentItemQuery { const rawQuery = createDeliveryFetchQuery>({ diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index 8a40ace0..b91ae1d4 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -62,7 +62,7 @@ export type ItemsFeedQueryRequest = Delive >; export function itemsFeedQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request?: ItemsFeedQueryRequest, ): ItemsFeedQuery { const rawQuery = createDeliveryPagedByTokenQuery>({ diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index e6c489c6..45f4227e 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -25,7 +25,7 @@ export type ItemsReferencingAssetQueryRequest( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: ItemsReferencingAssetQueryRequest, ): ItemsReferencingAssetQuery { return createDeliveryPagedByTokenQuery({ diff --git a/lib/queries/content-items/items-referencing-item-query.ts b/lib/queries/content-items/items-referencing-item-query.ts index b7ad2d5c..1031234d 100644 --- a/lib/queries/content-items/items-referencing-item-query.ts +++ b/lib/queries/content-items/items-referencing-item-query.ts @@ -25,7 +25,7 @@ export type ItemsReferencingItemQueryRequest( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: ItemsReferencingItemQueryRequest, ): ItemsReferencingItemQuery { return createDeliveryPagedByTokenQuery({ diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 1cb4945d..40bda5db 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -64,7 +64,7 @@ export type ListContentItemsQueryRequest = >; export function listContentItemsQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request?: ListContentItemsQueryRequest, ): ListContentItemsQuery { const rawQuery = createDeliveryPagedByUrlQuery>({ diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 6c010924..2c48ebe8 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -14,7 +14,7 @@ export type FetchContentTypeElementQueryRequest< }; export function fetchContentTypeElementQuery>( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: FetchContentTypeElementQueryRequest, ): FetchContentTypeElementQuery { return createDeliveryFetchQuery({ diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 9e034799..d9e1d105 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -17,7 +17,7 @@ export type FetchContentTypeQueryRequest< >; export function fetchContentTypeQuery>( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: FetchContentTypeQueryRequest, ): FetchContentTypeQuery { return createDeliveryFetchQuery({ diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index e55b57f0..01079f0d 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -21,7 +21,7 @@ export type ListContentTypesQueryRequest = >; export function listContentTypesQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request?: ListContentTypesQueryRequest, ): ListContentTypesQuery { return createDeliveryPagedByUrlQuery({ diff --git a/lib/queries/delivery-queries.ts b/lib/queries/delivery-queries.ts index c65c15a2..9e83b5ff 100644 --- a/lib/queries/delivery-queries.ts +++ b/lib/queries/delivery-queries.ts @@ -13,7 +13,6 @@ import type { ZodMiniType } from "zod/mini"; import { deliverySdkInfo } from "../delivery-sdk-info.js"; import type { DeliveryClientConfig, - DeliveryClientSchema, DeliveryEndpoint, DeliveryMetadata, DeliveryMetadataWithToken, @@ -37,7 +36,7 @@ export function createDeliveryPagedByUrlQuery; + readonly config: DeliveryClientConfig; readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { @@ -58,7 +57,7 @@ export function createDeliveryPagedByTokenQuery({ request, }: { readonly request: AnyDeliveryRequest | undefined; - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): PagedFetchQuery { @@ -81,7 +80,7 @@ export function createDeliveryFetchQuery({ request, }: { readonly request: AnyDeliveryRequest | undefined; - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; readonly schema: () => Promise>; readonly endpoint: DeliveryEndpoint; }): FetchQuery { @@ -176,7 +175,7 @@ function getSharedRequestData({ request, }: { readonly request: AnyDeliveryRequest | undefined; - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; readonly schema: () => Promise>; }): Pick< @@ -210,7 +209,7 @@ function getUrl({ endpoint, }: { readonly request: AnyDeliveryRequest | undefined; - readonly config: DeliveryClientConfig; + readonly config: DeliveryClientConfig; readonly endpoint: DeliveryEndpoint; }): string { return addQueryParametersToUrl(getDeliveryUrl({ path: endpoint, ...config }), request?.query, request?.filters); diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index cc3762fe..aa64b650 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -18,7 +18,7 @@ export type ListLanguagesQueryRequest = DeliveryRequestWithUrlPaging< >; export function listLanguagesQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request?: ListLanguagesQueryRequest, ): ListLanguagesQuery { return createDeliveryPagedByUrlQuery({ diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 67f828f6..96ae0075 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -14,7 +14,7 @@ export type FetchTaxonomyQueryRequest< > = DeliveryRequestWithCodename; export function fetchTaxonomyQuery>( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request: FetchTaxonomyQueryRequest, ): FetchTaxonomyQuery { return createDeliveryFetchQuery({ diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index b06c202e..28f4016d 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -18,7 +18,7 @@ export type ListTaxonomiesQueryRequest = DeliveryRequestWithUrlPaging< >; export function listTaxonomiesQuery( - config: DeliveryClientConfig, + config: DeliveryClientConfig, request?: ListTaxonomiesQueryRequest, ): ListTaxonomiesQuery { return createDeliveryPagedByUrlQuery({ diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index 88edc29a..a680c562 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -18,6 +18,7 @@ import { createDeliveryClient } from "../lib/client/delivery-client.js"; import type { DeliveryMetadata } from "../lib/models/core.models.js"; import type { ContentItemOf, + ContentItemPayload, DeliveryClient, DeliveryClientSchema, ElementCodenamesOf, @@ -142,6 +143,13 @@ export async function queries(): Promise { // `fetchContentItem` returns a fully typed item payload. const response = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); + + const movieItem = response.payload.item; + if (isMovie(movieItem)) { + const title: string = movieItem.elements.title.value; + const releaseDate: string | null = movieItem.elements.release_date.value; + const actors: readonly Actor[] = movieItem.elements.actors.items; + } } /** @@ -217,3 +225,7 @@ export async function typedContentTypeElement(): Promise { // The element codenames of a single type can be derived directly from the schema. const movieElement: ElementCodenamesOf = "synopsis"; } + +function isMovie(item: ContentItemPayload): item is Movie { + return item.system.codename === ("movie" as keyof SampleProjectSchema["contentTypes"]); +} diff --git a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts index 58fb8b11..9dfa6083 100644 --- a/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-fetch-query.spec.ts @@ -2,14 +2,14 @@ import type { JsonValue } from "@kontent-ai/core-sdk"; import { describe, expect, it } from "vitest"; import type { ZodMiniType } from "zod/mini"; import * as z from "zod/mini"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryFetchQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; diff --git a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts index 73722397..ba6d3ac8 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-token-query.spec.ts @@ -3,14 +3,14 @@ import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { ZodMiniType } from "zod/mini"; import * as z from "zod/mini"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; import { createDeliveryPagedByTokenQuery } from "../../../lib/queries/delivery-queries.js"; import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; diff --git a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts index 35362033..9bbbd2aa 100644 --- a/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts +++ b/tests/unit/delivery-query/create-delivery-paged-by-url-query.spec.ts @@ -1,6 +1,6 @@ import { mockGlobalFetchJsonResponse } from "@kontent-ai/core-sdk/testkit"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { DeliveryClientConfig, DeliveryClientSchema } from "../../../lib/models/core.models.js"; +import type { DeliveryClientConfig } from "../../../lib/models/core.models.js"; import type { Filter } from "../../../lib/models/filter.models.js"; import { paginationSchema } from "../../../lib/models/pagination.schemas.js"; import type { DeliveryRequest } from "../../../lib/models/request.models.js"; @@ -8,7 +8,7 @@ import { createDeliveryPagedByUrlQuery } from "../../../lib/queries/delivery-que import { getDeliveryUrl } from "../../../lib/utils/url.utils.js"; import { isPagedFetchQueryWithExpectedFunctions, unitEnvironmentId } from "../../utils/test.utils.js"; -const clientConfig: DeliveryClientConfig = { +const clientConfig: DeliveryClientConfig = { apiMode: "public", environmentId: unitEnvironmentId, }; From 3ab218078ee46c4f0a53f476822e1e317dd604ce Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 12:28:37 +0200 Subject: [PATCH 203/221] Adds readonly modifier --- lib/queries/content-items/schemas/content-item.schemas.ts | 6 +++--- lib/queries/content-types/schemas/content-type.schemas.ts | 2 +- lib/queries/taxonomies/schemas/taxonomy.schemas.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index 81539de8..593f8756 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -49,7 +49,7 @@ export const listContentItemsSchema = () = z.readonly( z.object({ items: z.readonly(z.array(contentItemSchema())), - modular_content: z.record(z.string(), contentItemSchema()), + modular_content: z.readonly(z.record(z.string(), contentItemSchema())), ...paginationWithTotalCountSchema.shape, }), ); @@ -58,7 +58,7 @@ export const itemsFeedSchema = () => z.readonly( z.object({ items: z.readonly(z.array(contentItemSchema())), - modular_content: z.record(z.string(), contentItemSchema()), + modular_content: z.readonly(z.record(z.string(), contentItemSchema())), }), ); @@ -92,7 +92,7 @@ export const fetchContentItemSchema = () = z.readonly( z.object({ item: contentItemSchema(), - modular_content: z.record(z.string(), contentItemSchema()), + modular_content: z.readonly(z.record(z.string(), contentItemSchema())), }), ); diff --git a/lib/queries/content-types/schemas/content-type.schemas.ts b/lib/queries/content-types/schemas/content-type.schemas.ts index 024b2c4d..10b56014 100644 --- a/lib/queries/content-types/schemas/content-type.schemas.ts +++ b/lib/queries/content-types/schemas/content-type.schemas.ts @@ -117,7 +117,7 @@ export const contentTypeSchema = () => last_modified: z.iso.datetime(), }), ), - elements: z.record(z.string(), contentTypeAnyElementSchema), + elements: z.readonly(z.record(z.string(), contentTypeAnyElementSchema)), }), ); diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index c91a71d5..126b0fd6 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -6,7 +6,7 @@ import type { TaxonomyCodenameOf } from "../models/taxonomy.models.js"; export const taxonomyTermSchema = () => z.object({ - name: z.string(), + name: z.readonly(z.string()), codename: codenameOf(), get terms() { return z.readonly(z.array(taxonomyTermSchema())); From 388c98d37bc7283f7c74d7789b042aea55ade398 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 12:54:36 +0200 Subject: [PATCH 204/221] Update filter.models.ts --- lib/models/filter.models.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/filter.models.ts b/lib/models/filter.models.ts index efe2bb89..94f02ad4 100644 --- a/lib/models/filter.models.ts +++ b/lib/models/filter.models.ts @@ -1,5 +1,5 @@ export const emptyRichTextOperators = ["isEmptyRichText", "isNotEmptyRichText"] as const; -export const emptyRichTextToFilterOperator: Record = { +export const emptyRichTextToFilterOperator: Readonly> = { isEmptyRichText: "eq", isNotEmptyRichText: "neq", }; From 803d72dbb2ffc0e384a7c8e1e5c2d646a5c2eef2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 12:58:26 +0200 Subject: [PATCH 205/221] Migrates script to pnpm --- .github/workflows/build.yml | 6 ++++-- .github/workflows/release.yml | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20165e74..1505086a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,9 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 - name: Use Node.js from .nvmrc file uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' - - run: npm ci - - run: npm run build + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d8c4f413..1cc6ea93 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,19 +9,21 @@ jobs: steps: - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v4 with: node-version-file: '.nvmrc' registry-url: 'https://registry.npmjs.org' + cache: 'pnpm' - - run: npm ci - - - run: npm publish --access=public + - run: pnpm install --frozen-lockfile + + - run: pnpm publish --access=public --no-git-checks if: ${{!github.event.release.prerelease}} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} - - run: npm publish --tag prerelease + - run: pnpm publish --tag prerelease --no-git-checks if: ${{github.event.release.prerelease}} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} \ No newline at end of file From f4313ecf290f08d737ec8f7e75d7b82adda7e136 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 13:20:32 +0200 Subject: [PATCH 206/221] Use dedicated type annotation for recursive terms schema --- .../schemas/content-item.schemas.ts | 8 ++--- .../taxonomies/schemas/taxonomy.schemas.ts | 30 ++++++++++++++----- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index 593f8756..08cbe458 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -100,7 +100,7 @@ export const contentItemSchemaExtended = ( z.readonly( z.object({ system: contentItemSystemSchema(), - elements: z.record(z.string(), contentItemElementSchemaExtended), + elements: z.readonly(z.record(z.string(), contentItemElementSchemaExtended)), }), ); @@ -108,7 +108,7 @@ export const listContentItemsSchemaExtended = ())), - modular_content: z.record(z.string(), contentItemSchemaExtended()), + modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), ...paginationWithTotalCountSchema.shape, }), ); @@ -117,7 +117,7 @@ export const itemsFeedSchemaExtended = () z.readonly( z.object({ items: z.readonly(z.array(contentItemSchemaExtended())), - modular_content: z.record(z.string(), contentItemSchemaExtended()), + modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), }), ); @@ -125,6 +125,6 @@ export const fetchContentItemSchemaExtended = (), - modular_content: z.record(z.string(), contentItemSchemaExtended()), + modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), }), ); diff --git a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts index 126b0fd6..85595144 100644 --- a/lib/queries/taxonomies/schemas/taxonomy.schemas.ts +++ b/lib/queries/taxonomies/schemas/taxonomy.schemas.ts @@ -4,14 +4,28 @@ import type { DeliveryClientSchema } from "../../../models/core.models.js"; import { paginationSchema } from "../../../models/pagination.schemas.js"; import type { TaxonomyCodenameOf } from "../models/taxonomy.models.js"; -export const taxonomyTermSchema = () => - z.object({ - name: z.readonly(z.string()), - codename: codenameOf(), - get terms() { - return z.readonly(z.array(taxonomyTermSchema())); - }, - }); +/** + * Output shape of {@link taxonomyTermSchema}. Hand-written purely because a *recursive* Zod schema + * cannot be wrapped in `z.readonly()` while staying inferrable — `z.readonly`'s `[P in keyof T]` + * mapped type circularly references the recursive `terms` getter. Annotating the schema's return type + * breaks that cycle; this annotation is the source of truth for the deeply-readonly recursive term tree. + */ +export type TaxonomyTermShape = { + readonly name: string; + readonly codename: TTermCodenames; + readonly terms: readonly TaxonomyTermShape[]; +}; + +export const taxonomyTermSchema = (): z.ZodMiniType> => + z.readonly( + z.object({ + name: z.string(), + codename: codenameOf(), + get terms() { + return z.readonly(z.array(taxonomyTermSchema())); + }, + }), + ); export const taxonomySchema = () => z.readonly( From 39a1b64587f12a0e266cc57cc1b9294799e931f8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Mon, 15 Jun 2026 15:52:21 +0200 Subject: [PATCH 207/221] Create alias response types --- lib/models/response.models.ts | 12 ++++++ lib/public_api.ts | 43 +++++++++++++++---- .../content-items/fetch-content-item-query.ts | 10 ++++- lib/queries/content-items/items-feed-query.ts | 10 ++++- .../items-referencing-asset-query.ts | 8 +++- .../items-referencing-item-query.ts | 8 +++- .../content-items/list-content-items-query.ts | 10 ++++- .../fetch-content-type-element-query.ts | 8 +++- .../content-types/fetch-content-type-query.ts | 11 ++++- .../content-types/list-content-types-query.ts | 8 +++- lib/queries/languages/list-languages-query.ts | 8 +++- .../taxonomies/fetch-taxonomy-query.ts | 8 +++- .../taxonomies/list-taxonomies-query.ts | 8 +++- sample/sample-schema.ts | 6 ++- 14 files changed, 134 insertions(+), 24 deletions(-) create mode 100644 lib/models/response.models.ts diff --git a/lib/models/response.models.ts b/lib/models/response.models.ts new file mode 100644 index 00000000..f1d2c229 --- /dev/null +++ b/lib/models/response.models.ts @@ -0,0 +1,12 @@ +import type { JsonValue, QueryResponse } from "@kontent-ai/core-sdk"; +import type { DeliveryMetadata, DeliveryMetadataWithToken } from "./core.models.js"; + +/** + * A resolved delivery query response — what `await query.fetch()` / `.fetchPage()` returns. + * Response-side counterpart to {@link DeliveryFetchQuery}; wraps core-sdk's `QueryResponse` so query + * modules and consumers don't depend on `@kontent-ai/core-sdk` directly. + */ +export type DeliveryResponse = QueryResponse< + TPayload, + TMeta +>; diff --git a/lib/public_api.ts b/lib/public_api.ts index 90dbbdb3..bf68efd5 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -20,17 +20,27 @@ export type { OrderDirection, SystemOrderQueryParam, } from "./models/request.models.js"; -export type { FetchContentItemQuery, FetchContentItemQueryRequest } from "./queries/content-items/fetch-content-item-query.js"; -export type { ItemsFeedQuery, ItemsFeedQueryRequest } from "./queries/content-items/items-feed-query.js"; +export type { + FetchContentItemQuery, + FetchContentItemQueryRequest, + FetchContentItemResponse, +} from "./queries/content-items/fetch-content-item-query.js"; +export type { ItemsFeedQuery, ItemsFeedQueryRequest, ItemsFeedResponse } from "./queries/content-items/items-feed-query.js"; export type { ItemsReferencingAssetQuery, ItemsReferencingAssetQueryRequest, + ItemsReferencingAssetResponse, } from "./queries/content-items/items-referencing-asset-query.js"; export type { ItemsReferencingItemQuery, ItemsReferencingItemQueryRequest, + ItemsReferencingItemResponse, } from "./queries/content-items/items-referencing-item-query.js"; -export type { ListContentItemsQuery, ListContentItemsQueryRequest } from "./queries/content-items/list-content-items-query.js"; +export type { + ListContentItemsQuery, + ListContentItemsQueryRequest, + ListContentItemsResponse, +} from "./queries/content-items/list-content-items-query.js"; export type { ContentItemOf, ContentItemPayload, @@ -47,9 +57,18 @@ export type * as ElementType from "./queries/content-items/models/element-types. export type { FetchContentTypeElementQuery, FetchContentTypeElementQueryRequest, + FetchContentTypeElementResponse, } from "./queries/content-types/fetch-content-type-element-query.js"; -export type { FetchContentTypeQuery, FetchContentTypeQueryRequest } from "./queries/content-types/fetch-content-type-query.js"; -export type { ListContentTypesQuery, ListContentTypesQueryRequest } from "./queries/content-types/list-content-types-query.js"; +export type { + FetchContentTypeQuery, + FetchContentTypeQueryRequest, + FetchContentTypeResponse, +} from "./queries/content-types/fetch-content-type-query.js"; +export type { + ListContentTypesQuery, + ListContentTypesQueryRequest, + ListContentTypesResponse, +} from "./queries/content-types/list-content-types-query.js"; export type { AllElementCodenamesOf, ContentTypeCodenameOf, @@ -58,10 +77,18 @@ export type { ElementCodenamesOf, ListContentTypesPayload, } from "./queries/content-types/models/content-type.models.js"; -export type { ListLanguagesQuery, ListLanguagesQueryRequest } from "./queries/languages/list-languages-query.js"; +export type { + ListLanguagesQuery, + ListLanguagesQueryRequest, + ListLanguagesResponse, +} from "./queries/languages/list-languages-query.js"; export type { LanguagePayload, ListLanguagesPayload } from "./queries/languages/models/language.models.js"; -export type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest } from "./queries/taxonomies/fetch-taxonomy-query.js"; -export type { ListTaxonomiesQuery, ListTaxonomiesQueryRequest } from "./queries/taxonomies/list-taxonomies-query.js"; +export type { FetchTaxonomyQuery, FetchTaxonomyQueryRequest, FetchTaxonomyResponse } from "./queries/taxonomies/fetch-taxonomy-query.js"; +export type { + ListTaxonomiesQuery, + ListTaxonomiesQueryRequest, + ListTaxonomiesResponse, +} from "./queries/taxonomies/list-taxonomies-query.js"; export type { ListTaxonomiesPayload, TaxonomyCodenameOf, diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index ac0d7080..9bd5e334 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -1,15 +1,21 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam, WithRaw } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryFetchQuery, transformDeliveryFetchQuery } from "../delivery-queries.js"; import type { FetchContentItemPayload, FetchContentItemPayloadExtended } from "./models/content-item.models.js"; -export type FetchContentItemQuery = DeliveryFetchQuery< +export type FetchContentItemResponse = DeliveryResponse< FetchContentItemPayloadExtended, DeliveryMetadata +>; + +export type FetchContentItemQuery = DeliveryFetchQuery< + FetchContentItemResponse["payload"], + FetchContentItemResponse["meta"] > & - WithRaw, DeliveryMetadata>>; + WithRaw, FetchContentItemResponse["meta"]>>; export type FetchContentItemQueryRequest = DeliveryRequestWithCodename< readonly string[], diff --git a/lib/queries/content-items/items-feed-query.ts b/lib/queries/content-items/items-feed-query.ts index b91ae1d4..0246a0d6 100644 --- a/lib/queries/content-items/items-feed-query.ts +++ b/lib/queries/content-items/items-feed-query.ts @@ -13,6 +13,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByTokenQuery, transformDeliveryPagedByTokenQuery } from "../delivery-queries.js"; @@ -26,11 +27,16 @@ import type { type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = AllElementCodenamesOf; -export type ItemsFeedQuery = DeliveryPagedFetchQuery< +export type ItemsFeedResponse = DeliveryResponse< ItemsFeedPayloadExtended, DeliveryMetadataWithToken +>; + +export type ItemsFeedQuery = DeliveryPagedFetchQuery< + ItemsFeedResponse["payload"], + ItemsFeedResponse["meta"] > & - WithRaw, DeliveryMetadataWithToken>>; + WithRaw, ItemsFeedResponse["meta"]>>; export type ItemsFeedQueryRequest = DeliveryRequestWithTokenPaging< { diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index 45f4227e..c790bbca 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -6,14 +6,20 @@ import type { } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import type { ContentItemSystemPayload, ItemsReferencingAssetPayload } from "./models/content-item.models.js"; -export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< +export type ItemsReferencingAssetResponse = DeliveryResponse< ItemsReferencingAssetPayload, DeliveryMetadataWithToken >; +export type ItemsReferencingAssetQuery = DeliveryPagedFetchQuery< + ItemsReferencingAssetResponse["payload"], + ItemsReferencingAssetResponse["meta"] +>; + export type ItemsReferencingAssetQueryRequest = DeliveryRequestWithTokenPaging< never, readonly Filter, never>[] diff --git a/lib/queries/content-items/items-referencing-item-query.ts b/lib/queries/content-items/items-referencing-item-query.ts index 1031234d..e6f10433 100644 --- a/lib/queries/content-items/items-referencing-item-query.ts +++ b/lib/queries/content-items/items-referencing-item-query.ts @@ -6,14 +6,20 @@ import type { } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithTokenPaging } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryPagedByTokenQuery } from "../delivery-queries.js"; import type { ContentItemSystemPayload, ItemsReferencingItemPayload } from "./models/content-item.models.js"; -export type ItemsReferencingItemQuery = DeliveryPagedFetchQuery< +export type ItemsReferencingItemResponse = DeliveryResponse< ItemsReferencingItemPayload, DeliveryMetadataWithToken >; +export type ItemsReferencingItemQuery = DeliveryPagedFetchQuery< + ItemsReferencingItemResponse["payload"], + ItemsReferencingItemResponse["meta"] +>; + export type ItemsReferencingItemQueryRequest = DeliveryRequestWithTokenPaging< never, readonly Filter, never>[] diff --git a/lib/queries/content-items/list-content-items-query.ts b/lib/queries/content-items/list-content-items-query.ts index 40bda5db..0bfe11dc 100644 --- a/lib/queries/content-items/list-content-items-query.ts +++ b/lib/queries/content-items/list-content-items-query.ts @@ -8,6 +8,7 @@ import type { SystemOrderQueryParam, WithRaw, } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import type { AllElementCodenamesOf } from "../../queries/content-types/models/content-type.models.js"; import { joinItems, mapToExtendedItem, mapToExtendedModularContent } from "../../transforms/content-item-transforms.js"; import { createDeliveryPagedByUrlQuery, transformDeliveryPagedByUrlQuery } from "../delivery-queries.js"; @@ -21,11 +22,16 @@ import type { type SystemProperties = keyof ContentItemPayload["system"]; type ElementProperties = AllElementCodenamesOf; -export type ListContentItemsQuery = DeliveryPagedFetchQuery< +export type ListContentItemsResponse = DeliveryResponse< ListContentItemsPayloadExtended, DeliveryMetadata +>; + +export type ListContentItemsQuery = DeliveryPagedFetchQuery< + ListContentItemsResponse["payload"], + ListContentItemsResponse["meta"] > & - WithRaw, DeliveryMetadata>>; + WithRaw, ListContentItemsResponse["meta"]>>; export type ListContentItemsQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam | ElementOrderQueryParam>, diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 2c48ebe8..07f27e40 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -1,9 +1,15 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequest } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import type { ContentTypeCodenameOf, ContentTypeElementPayload, ElementCodenamesOf } from "./models/content-type.models.js"; -export type FetchContentTypeElementQuery = DeliveryFetchQuery; +export type FetchContentTypeElementResponse = DeliveryResponse; + +export type FetchContentTypeElementQuery = DeliveryFetchQuery< + FetchContentTypeElementResponse["payload"], + FetchContentTypeElementResponse["meta"] +>; export type FetchContentTypeElementQueryRequest< TSchema extends DeliveryClientSchema, diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index d9e1d105..4f54c9bc 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -1,9 +1,18 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename, ElementSelectionQueryParam } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import type { ContentTypeCodenameOf, ContentTypePayload, ElementCodenamesOf } from "./models/content-type.models.js"; -export type FetchContentTypeQuery = DeliveryFetchQuery, DeliveryMetadata>; +export type FetchContentTypeResponse = DeliveryResponse< + ContentTypePayload, + DeliveryMetadata +>; + +export type FetchContentTypeQuery = DeliveryFetchQuery< + FetchContentTypeResponse["payload"], + FetchContentTypeResponse["meta"] +>; export type FetchContentTypeQueryRequest< TSchema extends DeliveryClientSchema, diff --git a/lib/queries/content-types/list-content-types-query.ts b/lib/queries/content-types/list-content-types-query.ts index 01079f0d..f3a2be3a 100644 --- a/lib/queries/content-types/list-content-types-query.ts +++ b/lib/queries/content-types/list-content-types-query.ts @@ -1,17 +1,23 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, ElementSelectionQueryParam, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { AllElementCodenamesOf, ContentTypePayload, ListContentTypesPayload } from "./models/content-type.models.js"; type SystemProperties = keyof ContentTypePayload["system"]; type ElementProperties = AllElementCodenamesOf; -export type ListContentTypesQuery = DeliveryPagedFetchQuery< +export type ListContentTypesResponse = DeliveryResponse< ListContentTypesPayload, DeliveryMetadata >; +export type ListContentTypesQuery = DeliveryPagedFetchQuery< + ListContentTypesResponse["payload"], + ListContentTypesResponse["meta"] +>; + export type ListContentTypesQueryRequest = DeliveryRequestWithUrlPaging< SystemOrderQueryParam, { diff --git a/lib/queries/languages/list-languages-query.ts b/lib/queries/languages/list-languages-query.ts index aa64b650..d8b3f24b 100644 --- a/lib/queries/languages/list-languages-query.ts +++ b/lib/queries/languages/list-languages-query.ts @@ -1,14 +1,20 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { LanguagePayload, ListLanguagesPayload } from "./models/language.models.js"; -export type ListLanguagesQuery = DeliveryPagedFetchQuery< +export type ListLanguagesResponse = DeliveryResponse< ListLanguagesPayload, DeliveryMetadata >; +export type ListLanguagesQuery = DeliveryPagedFetchQuery< + ListLanguagesResponse["payload"], + ListLanguagesResponse["meta"] +>; + type SystemProperties = keyof LanguagePayload["system"]; export type ListLanguagesQueryRequest = DeliveryRequestWithUrlPaging< diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 96ae0075..95b09958 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -1,12 +1,18 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryFetchQuery, DeliveryMetadata } from "../../models/core.models.js"; import type { DeliveryRequestWithCodename } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryFetchQuery } from "../delivery-queries.js"; import type { TaxonomyCodenameOf, TaxonomyPayload, TaxonomyTermCodenamesOf } from "./models/taxonomy.models.js"; +export type FetchTaxonomyResponse< + TSchema extends DeliveryClientSchema = DeliveryClientSchema, + TCodename extends string = TaxonomyCodenameOf, +> = DeliveryResponse>, DeliveryMetadata>; + export type FetchTaxonomyQuery< TSchema extends DeliveryClientSchema, TCodename extends string = TaxonomyCodenameOf, -> = DeliveryFetchQuery>, DeliveryMetadata>; +> = DeliveryFetchQuery["payload"], FetchTaxonomyResponse["meta"]>; export type FetchTaxonomyQueryRequest< TSchema extends DeliveryClientSchema, diff --git a/lib/queries/taxonomies/list-taxonomies-query.ts b/lib/queries/taxonomies/list-taxonomies-query.ts index 28f4016d..2a00bea1 100644 --- a/lib/queries/taxonomies/list-taxonomies-query.ts +++ b/lib/queries/taxonomies/list-taxonomies-query.ts @@ -1,14 +1,20 @@ import type { DeliveryClientConfig, DeliveryClientSchema, DeliveryMetadata, DeliveryPagedFetchQuery } from "../../models/core.models.js"; import type { Filter } from "../../models/filter.models.js"; import type { DeliveryRequestWithUrlPaging, SystemOrderQueryParam } from "../../models/request.models.js"; +import type { DeliveryResponse } from "../../models/response.models.js"; import { createDeliveryPagedByUrlQuery } from "../delivery-queries.js"; import type { ListTaxonomiesPayload, TaxonomyPayload } from "./models/taxonomy.models.js"; -export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< +export type ListTaxonomiesResponse = DeliveryResponse< ListTaxonomiesPayload, DeliveryMetadata >; +export type ListTaxonomiesQuery = DeliveryPagedFetchQuery< + ListTaxonomiesResponse["payload"], + ListTaxonomiesResponse["meta"] +>; + type SystemProperties = keyof TaxonomyPayload["system"]; export type ListTaxonomiesQueryRequest = DeliveryRequestWithUrlPaging< diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index a680c562..2cf3f321 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -23,6 +23,7 @@ import type { DeliveryClientSchema, ElementCodenamesOf, ElementType, + FetchContentItemResponse, TaxonomyPayload, } from "../lib/public_api.js"; @@ -141,8 +142,9 @@ export async function queries(): Promise { (language) => language.system.codename, ); - // `fetchContentItem` returns a fully typed item payload. - const response = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); + // `fetchContentItem` returns a fully typed item payload. Annotate it with `FetchContentItemResponse` + // instead of hand-assembling the response type from `@kontent-ai/core-sdk`. + const response: FetchContentItemResponse = await client.fetchContentItem({ codename: "itemCodename" }).fetch(); const movieItem = response.payload.item; if (isMovie(movieItem)) { From f1df231d8ba109deee877e8ca0f48c7c4f9095db Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 09:29:32 +0200 Subject: [PATCH 208/221] updates biome & makes modular content item optional --- .../content-items/models/element.models.ts | 2 - .../schemas/content-item.schemas.ts | 16 +- lib/transforms/content-item-transforms.ts | 50 +++-- package.json | 8 +- pnpm-lock.yaml | 194 ++++++++---------- pnpm-workspace.yaml | 18 +- 6 files changed, 137 insertions(+), 151 deletions(-) diff --git a/lib/queries/content-items/models/element.models.ts b/lib/queries/content-items/models/element.models.ts index a1806cb4..f87b6a3a 100644 --- a/lib/queries/content-items/models/element.models.ts +++ b/lib/queries/content-items/models/element.models.ts @@ -2,7 +2,5 @@ import type * as z from "zod/mini"; import type { assetValueSchema, contentItemElementSchema, contentItemElementSchemaExtended } from "../schemas/element.schemas.js"; export type Asset = z.infer; - export type ContentItemElementPayload = z.infer; - export type ContentItemElementPayloadExtended = z.infer; diff --git a/lib/queries/content-items/schemas/content-item.schemas.ts b/lib/queries/content-items/schemas/content-item.schemas.ts index 08cbe458..86e96a0a 100644 --- a/lib/queries/content-items/schemas/content-item.schemas.ts +++ b/lib/queries/content-items/schemas/content-item.schemas.ts @@ -5,6 +5,10 @@ import { paginationWithTotalCountSchema } from "../../../models/pagination.schem import type { ContentTypeCodenameOf } from "../../content-types/models/content-type.models.js"; import { contentItemElementSchema, contentItemElementSchemaExtended } from "./element.schemas.js"; +const modularContentItem = () => z.union([contentItemSchema(), z.undefined()]); +const modularContentItemExtended = () => + z.union([contentItemSchemaExtended(), z.undefined()]); + const baseContentItemSystemSchema = () => z.object({ id: kontentUuidSchema, @@ -49,7 +53,7 @@ export const listContentItemsSchema = () = z.readonly( z.object({ items: z.readonly(z.array(contentItemSchema())), - modular_content: z.readonly(z.record(z.string(), contentItemSchema())), + modular_content: z.readonly(z.record(z.string(), modularContentItem())), ...paginationWithTotalCountSchema.shape, }), ); @@ -58,7 +62,7 @@ export const itemsFeedSchema = () => z.readonly( z.object({ items: z.readonly(z.array(contentItemSchema())), - modular_content: z.readonly(z.record(z.string(), contentItemSchema())), + modular_content: z.readonly(z.record(z.string(), modularContentItem())), }), ); @@ -92,7 +96,7 @@ export const fetchContentItemSchema = () = z.readonly( z.object({ item: contentItemSchema(), - modular_content: z.readonly(z.record(z.string(), contentItemSchema())), + modular_content: z.readonly(z.record(z.string(), modularContentItem())), }), ); @@ -108,7 +112,7 @@ export const listContentItemsSchemaExtended = ())), - modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), + modular_content: z.readonly(z.record(z.string(), modularContentItemExtended())), ...paginationWithTotalCountSchema.shape, }), ); @@ -117,7 +121,7 @@ export const itemsFeedSchemaExtended = () z.readonly( z.object({ items: z.readonly(z.array(contentItemSchemaExtended())), - modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), + modular_content: z.readonly(z.record(z.string(), modularContentItemExtended())), }), ); @@ -125,6 +129,6 @@ export const fetchContentItemSchemaExtended = (), - modular_content: z.readonly(z.record(z.string(), contentItemSchemaExtended())), + modular_content: z.readonly(z.record(z.string(), modularContentItemExtended())), }), ); diff --git a/lib/transforms/content-item-transforms.ts b/lib/transforms/content-item-transforms.ts index 5c15fc6d..99c88e08 100644 --- a/lib/transforms/content-item-transforms.ts +++ b/lib/transforms/content-item-transforms.ts @@ -1,3 +1,4 @@ +import { isDefined } from "@kontent-ai/core-sdk"; import type { DeliveryClientSchema } from "../models/core.models.js"; import type { ContentItemPayload, ContentItemPayloadExtended } from "../queries/content-items/models/content-item.models.js"; import type { ContentItemElementPayload, ContentItemElementPayloadExtended } from "../queries/content-items/models/element.models.js"; @@ -6,7 +7,7 @@ export function mapToExtendedItem({ allItems, item, }: { - readonly allItems: Readonly>>; + readonly allItems: Readonly | undefined>>; readonly item: ContentItemPayload; }): ContentItemPayloadExtended { for (const [key, element] of Object.entries(item.elements)) { @@ -22,17 +23,15 @@ export function mapToExtendedModularContent>>; - allItems: Readonly>>; -}): { - [key: string]: ContentItemPayloadExtended; -} { - for (const modularContent of Object.values(modularContents)) { + readonly modularContents: Readonly | undefined>>; + readonly allItems: Readonly | undefined>>; +}): Readonly | undefined>> { + for (const modularContent of Object.values(modularContents).filter(isDefined)) { mapToExtendedItem({ allItems, item: modularContent }); } // We know that for each item we have its extended version - return modularContents as Readonly>>; + return modularContents as Readonly | undefined>>; } export function joinItems({ @@ -40,7 +39,7 @@ export function joinItems({ modularContent, }: { readonly items: readonly ContentItemPayload[]; - readonly modularContent: readonly Readonly>>[]; + readonly modularContent: readonly Readonly | undefined>>[]; }): Readonly>> { const joinedItems: Record> = {}; for (const content of modularContent) { @@ -56,7 +55,7 @@ export function joinItems({ function resolveCodenamesToItems( codenames: readonly string[], - allItems: Readonly>>, + allItems: Readonly | undefined>>, ): readonly ContentItemPayload[] { return codenames.reduce[]>((preparedItems, codename) => { const record = allItems[codename]; @@ -72,22 +71,21 @@ function resolveCodenamesToItems( */ function resolveExtendedElement( element: ContentItemElementPayload, - allItems: Readonly>>, + allItems: Readonly | undefined>>, ): ContentItemElementPayloadExtended { - switch (element.type) { - case "modular_content": { - return { - ...element, - items: resolveCodenamesToItems(element.value, allItems), - }; - } - case "rich_text": { - return { - ...element, - items: resolveCodenamesToItems(element.modular_content, allItems), - }; - } - default: - return element; + // Note - intentionally not using ts-pattern here for perf. reasons + // also intentionally not using switch because biome cant infer the source types correctly here and reports false positives + if (element.type === "modular_content") { + return { + ...element, + items: resolveCodenamesToItems(element.value, allItems), + }; + } + if (element.type === "rich_text") { + return { + ...element, + items: resolveCodenamesToItems(element.modular_content, allItems), + }; } + return element; } diff --git a/package.json b/package.json index 915f156b..8c917a64 100644 --- a/package.json +++ b/package.json @@ -59,15 +59,15 @@ "zod": "^4" }, "devDependencies": { - "@kontent-ai/biome-config": "0.7.0", + "@kontent-ai/biome-config": "0.7.3", "@kontent-ai/eslint-config": "2.4.1", "eslint": "10.5.0", - "@biomejs/biome": "2.4.16", + "@biomejs/biome": "2.5.0", "@types/node": "25.9.3", "vitest": "4.1.9", - "@vitest/coverage-v8": "4.1.8", + "@vitest/coverage-v8": "4.1.9", "tsx": "4.22.4", - "@typescript/native-preview": "7.0.0-dev.20260614.1", + "@typescript/native-preview": "7.0.0-dev.20260615.1", "esbuild": "0.28.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96339a08..59e71771 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,11 +19,11 @@ importers: version: 4.4.3 devDependencies: '@biomejs/biome': - specifier: 2.4.16 - version: 2.4.16 + specifier: 2.5.0 + version: 2.5.0 '@kontent-ai/biome-config': - specifier: 0.7.0 - version: 0.7.0(@biomejs/biome@2.4.16) + specifier: 0.7.3 + version: 0.7.3(@biomejs/biome@2.5.0) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) @@ -31,11 +31,11 @@ importers: specifier: 25.9.3 version: 25.9.3 '@typescript/native-preview': - specifier: 7.0.0-dev.20260614.1 - version: 7.0.0-dev.20260614.1 + specifier: 7.0.0-dev.20260615.1 + version: 7.0.0-dev.20260615.1 '@vitest/coverage-v8': - specifier: 4.1.8 - version: 4.1.8(vitest@4.1.9) + specifier: 4.1.9 + version: 4.1.9(vitest@4.1.9) esbuild: specifier: 0.28.1 version: 0.28.1 @@ -47,7 +47,7 @@ importers: version: 4.22.4 vitest: specifier: 4.1.9 - version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) packages: @@ -72,59 +72,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.4.16': - resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==} + '@biomejs/biome@2.5.0': + resolution: {integrity: sha512-4kURkd9hAPrdDM3C9n82ycYgx8hvQcW6MjKTEejruj8rK0N8P3OPpdy8BvI8kt3KWY4ycF5XtDOrktetEfhfuw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.4.16': - resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==} + '@biomejs/cli-darwin-arm64@2.5.0': + resolution: {integrity: sha512-Mn3Fwi3SA5fgmfCPqmzpWF2DLZnms3BVAhM088nTnGrTZmHS3wwIjcoZPqpXeNgd3DrrLH6xp8vTLIBuJoZiXw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.4.16': - resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==} + '@biomejs/cli-darwin-x64@2.5.0': + resolution: {integrity: sha512-rg3VPL5P8mYro6pqlXYXuJWph21slVp3SZtAqWSrkZs40d2gTzYmHF8E/X1iTID25btmNKltNDJ926sqVBp7DQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.4.16': - resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==} + '@biomejs/cli-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-vQdM4oSGaf7ZNeGO9w5+Y8SBtyser9M6znxYbm7Ec8wInxJu1WiKxFYZW5Auj2d80bcVvefuGGRxoFOE0eee8g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.4.16': - resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==} + '@biomejs/cli-linux-arm64@2.5.0': + resolution: {integrity: sha512-tl+LW8fdD96/xdeWtWwc82LIOc5CoY7N2AsogLTp5R4ECErYt+8Jl/N68ezN9vzSiqPTxw6vjcihoLPYKZHrlw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.4.16': - resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==} + '@biomejs/cli-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-+9hIcMngJ+yGUahXqZuZ8CoWKJE9SAZsFsM3QDvXpNsLbXZ9lqVzgBhOk/jTSYkOA0GLP9eu3teukqpLUojHMg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.4.16': - resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==} + '@biomejs/cli-linux-x64@2.5.0': + resolution: {integrity: sha512-zpEGf4RQbFEh8Vt7OmavLyyOzRbtcE9osCqrS1kfvt8jDvxwhKXLSf7n0ebr/ov0RJ9ssP+lhs6C8a9WwFvrQA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.4.16': - resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==} + '@biomejs/cli-win32-arm64@2.5.0': + resolution: {integrity: sha512-jB0wAvTLI4itx5VidqVUejPQFhRUxiZ9l9FvZ26D5fl6t3qme+ZB4PD3bTSeL1vZ8NI2Rx/zj6H9zcESuGHKGw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.4.16': - resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==} + '@biomejs/cli-win32-x64@2.5.0': + resolution: {integrity: sha512-VT/lF+GId+67j8aDfLkxdxNoVApsPSTbyAtB3jJq0IWTrY77WXfbPfpngxq0bA6JCEv/7k8C9qWjDRKRznDlyw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -382,10 +382,10 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@kontent-ai/biome-config@0.7.0': - resolution: {integrity: sha512-/dnPAq6QFCuGzdste5dqV0sTa1mBaHP7gLXrNaSzpa3HOGBYYJnKO7kfMD7YUknjoAsOSJyoQ9aAQ7FFB2Yvzg==} + '@kontent-ai/biome-config@0.7.3': + resolution: {integrity: sha512-4Gi29ZkI4+F3e0+haJi4oBY7vy08ajb991LY+wNrBC5D+0Wc4RJheHRRrutrVUt5TfIEj1YG0p2Lc5V40gb1vg==} peerDependencies: - '@biomejs/biome': ^2.3.11 + '@biomejs/biome': ^2.5.0 '@kontent-ai/core-sdk@12.0.0-preview.40': resolution: {integrity: sha512-W8k5iijCvknnzHGX7q7VD0zzk2dh7W5elml2P76iroPj48OvxZuscR9Fzyg2W/Scefpe5Yy70ek4k/uw+RN77A==} @@ -587,58 +587,58 @@ packages: resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-2JHbdJ00FKTKDR1+NL4zhQBDlFZfZHEXaAarV6kbEjV0P47qKnSrAzzKHuponG0B9FqkPEMHOgu7WGJTBW2rHw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-EHrtoVGEEhIhsnGe+b8w0FoM9JfIw5SkoPwO8ifaU0PrYm2UbyPbj2I2hOTxtk458t0irvGz2+8cshylBRbKng==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-/8enyEb1tDsVvUp4rDeA5DernrvWgD6cQ4rY6O6PH6BQK8fqwY+CcHEHmw2xgwfqoswHNYjznLvmQmHBOjHqLw==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-BcDA56hkk6mrUpysaOVvrdACoX5d2SF1JTwHMoNjT1KysBicExS2wlH0eN0L01iDeqtB73XHl7A4zrKFmKzrBg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-jqhqAXqyEUxJpno/wRfWGa72R3VTt7p2LRTOFJ0C1bx5dEKrVosQSOdr2m9+2VhjXFXNvorXsGZPIWqxLOo28Q==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-TDAlBpyYCF7Z+ELTH+1tabDE6W3shl+H+Z+nmzaQio1I8pFvbwt2iLlE0Rc9CpRdIeaqr0ppMEgXHoeV3fZFWA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-zYrUKq5oC6fUoHpOmT3B65hFMhbdIlLp7T9RW1/6a+wSYoq9xTRAeFufQ2XZ9cpTJ1tfIvlUmtgJJ5CGE/cOrg==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-YRXRS/7ZqrDKXBJhFQcZiOdnHRuRbWoL/QkggpoGfhIuSAh4HvTU0WEUnPM+jRnH2kUMfsSgd8EAnPvmuP7/VA==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-K2c/DN7Q3a6Z+KIl7bq45xByuuGjacqWO/UPCa/iTBA/m6GDzoMJ/Q/DBLtLRHyROBRiy5kjgEZfyLy3Tp8ygw==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-/QDmRWt6abB7fw3yMchjlyDXej/7Dr8mYG4wvGGf6c1hc5Il5UpDQWNHejatdeKvAu+sszz8JhTuL8et47fTTg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-C+C25Grr4sCbQIYPT5WfKYIL613ZIN9aGcUwDGMSTmIQ3azIR5MtdkSF4l4vsOC4lF8HwFV83MDa28JuQYhQFg==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-WTJOLoe2rxT0W1i8ndWk2MKrakxRFNki537JZxvKAmSTbyOZznHlW3O3dbryUtTBYA716DDqS3ci24kuIfvBdg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-nJBR61NGiCMBJOpdzJ4ZgA/HEd+fqIb99ur39UljSH9xvFKFlRwDosyAQFD8UEwrZsUbXN0VPLJY5MDknug3GA==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-4cSCpXG7um18nwmLdU/SjoTv3OcO38/ufTiy1oWVccgGHLJqppiOP9/o+ElKIWhvrp78IaGy8+h3YqEjQ4/pcQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260614.1': - resolution: {integrity: sha512-4N1ZBHJUcsjKJQnUCxKUemV3jnm0PKZIZ4xh7dXN/3/AfmckE8Z1llyqOFfDwGOf8oQpdgkwQ6JUm7pqI3bGPg==} + '@typescript/native-preview@7.0.0-dev.20260615.1': + resolution: {integrity: sha512-JJ8X1l7H1GrnseK1k30qfQqB8Pz6jw3IALZVIj5oXQeRbUCe0Wx3ljkJEmOpunogdhEfA8IlOggskbUjVsXKBQ==} engines: {node: '>=16.20.0'} hasBin: true - '@vitest/coverage-v8@4.1.8': - resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} + '@vitest/coverage-v8@4.1.9': + resolution: {integrity: sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==} peerDependencies: - '@vitest/browser': 4.1.8 - vitest: 4.1.8 + '@vitest/browser': 4.1.9 + vitest: 4.1.9 peerDependenciesMeta: '@vitest/browser': optional: true @@ -657,9 +657,6 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.8': - resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} - '@vitest/pretty-format@4.1.9': resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} @@ -672,9 +669,6 @@ packages: '@vitest/spy@4.1.9': resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@4.1.8': - resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} - '@vitest/utils@4.1.9': resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} @@ -1795,39 +1789,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.4.16': + '@biomejs/biome@2.5.0': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.16 - '@biomejs/cli-darwin-x64': 2.4.16 - '@biomejs/cli-linux-arm64': 2.4.16 - '@biomejs/cli-linux-arm64-musl': 2.4.16 - '@biomejs/cli-linux-x64': 2.4.16 - '@biomejs/cli-linux-x64-musl': 2.4.16 - '@biomejs/cli-win32-arm64': 2.4.16 - '@biomejs/cli-win32-x64': 2.4.16 + '@biomejs/cli-darwin-arm64': 2.5.0 + '@biomejs/cli-darwin-x64': 2.5.0 + '@biomejs/cli-linux-arm64': 2.5.0 + '@biomejs/cli-linux-arm64-musl': 2.5.0 + '@biomejs/cli-linux-x64': 2.5.0 + '@biomejs/cli-linux-x64-musl': 2.5.0 + '@biomejs/cli-win32-arm64': 2.5.0 + '@biomejs/cli-win32-x64': 2.5.0 - '@biomejs/cli-darwin-arm64@2.4.16': + '@biomejs/cli-darwin-arm64@2.5.0': optional: true - '@biomejs/cli-darwin-x64@2.4.16': + '@biomejs/cli-darwin-x64@2.5.0': optional: true - '@biomejs/cli-linux-arm64-musl@2.4.16': + '@biomejs/cli-linux-arm64-musl@2.5.0': optional: true - '@biomejs/cli-linux-arm64@2.4.16': + '@biomejs/cli-linux-arm64@2.5.0': optional: true - '@biomejs/cli-linux-x64-musl@2.4.16': + '@biomejs/cli-linux-x64-musl@2.5.0': optional: true - '@biomejs/cli-linux-x64@2.4.16': + '@biomejs/cli-linux-x64@2.5.0': optional: true - '@biomejs/cli-win32-arm64@2.4.16': + '@biomejs/cli-win32-arm64@2.5.0': optional: true - '@biomejs/cli-win32-x64@2.4.16': + '@biomejs/cli-win32-x64@2.5.0': optional: true '@emnapi/core@1.10.0': @@ -2023,9 +2017,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.0(@biomejs/biome@2.4.16)': + '@kontent-ai/biome-config@0.7.3(@biomejs/biome@2.5.0)': dependencies: - '@biomejs/biome': 2.4.16 + '@biomejs/biome': 2.5.0 '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.4.3)': dependencies: @@ -2218,41 +2212,41 @@ snapshots: '@typescript-eslint/types': 8.61.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260615.1': optional: true - '@typescript/native-preview@7.0.0-dev.20260614.1': + '@typescript/native-preview@7.0.0-dev.20260615.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260614.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260614.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260614.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260614.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260614.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260614.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260614.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260615.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260615.1 - '@vitest/coverage-v8@4.1.8(vitest@4.1.9)': + '@vitest/coverage-v8@4.1.9(vitest@4.1.9)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.8 + '@vitest/utils': 4.1.9 ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2261,7 +2255,7 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + vitest: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) '@vitest/expect@4.1.9': dependencies: @@ -2280,10 +2274,6 @@ snapshots: optionalDependencies: vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) - '@vitest/pretty-format@4.1.8': - dependencies: - tinyrainbow: 3.1.0 - '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 @@ -2302,12 +2292,6 @@ snapshots: '@vitest/spy@4.1.9': {} - '@vitest/utils@4.1.8': - dependencies: - '@vitest/pretty-format': 4.1.8 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - '@vitest/utils@4.1.9': dependencies: '@vitest/pretty-format': 4.1.9 @@ -3561,7 +3545,7 @@ snapshots: fsevents: 2.3.3 tsx: 4.22.4 - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.8)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): + vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): dependencies: '@vitest/expect': 4.1.9 '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) @@ -3585,7 +3569,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.3 - '@vitest/coverage-v8': 4.1.8(vitest@4.1.9) + '@vitest/coverage-v8': 4.1.9(vitest@4.1.9) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index daf345f6..c3bb3d58 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,14 +3,16 @@ allowBuilds: ignoredBuiltDependencies: - esbuild minimumReleaseAgeExclude: - - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260614.1' - - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260614.1' - - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260614.1' - - '@typescript/native-preview-linux-arm@7.0.0-dev.20260614.1' - - '@typescript/native-preview-linux-x64@7.0.0-dev.20260614.1' - - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260614.1' - - '@typescript/native-preview-win32-x64@7.0.0-dev.20260614.1' - - '@typescript/native-preview@7.0.0-dev.20260614.1' + - '@kontent-ai/biome-config@0.7.3' + - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260615.1' + - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260615.1' + - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260615.1' + - '@typescript/native-preview-linux-arm@7.0.0-dev.20260615.1' + - '@typescript/native-preview-linux-x64@7.0.0-dev.20260615.1' + - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260615.1' + - '@typescript/native-preview-win32-x64@7.0.0-dev.20260615.1' + - '@typescript/native-preview@7.0.0-dev.20260615.1' + - '@vitest/coverage-v8@4.1.9' - '@vitest/expect@4.1.9' - '@vitest/mocker@4.1.9' - '@vitest/pretty-format@4.1.9' From 9dd621f9ee6c0bd094f35406e4e8de2b09c01919 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 10:26:33 +0200 Subject: [PATCH 209/221] Update migration.md --- migration.md | 480 ++++++++++++++++++++++++++++----------------------- 1 file changed, 264 insertions(+), 216 deletions(-) diff --git a/migration.md b/migration.md index 9fa1e16b..60f1a260 100644 --- a/migration.md +++ b/migration.md @@ -1,31 +1,65 @@ # Migration Guide: v16 → v17 -This guide covers all breaking changes when upgrading from `@kontent-ai/delivery-sdk` v16 to v17. +This guide covers the breaking changes when upgrading from `@kontent-ai/delivery-sdk` v16 to v17, with +side-by-side v16/v17 examples for every part of the API. + +v17 is a ground-up rewrite. The biggest conceptual shifts: + +- The fluent query builder (`.items().type().limitParameter()...toPromise()`) is replaced by **request + objects** passed to renamed methods (`client.listContentItems({ query, filters })`). +- Queries no longer throw by default — they expose **safe** execution methods that return + `{ success, response, error }` alongside throwing ones. +- Responses are the **raw API payload** (snake_case), wrapped as `{ payload, meta }`. Linked items are + still resolved for you, but onto each element's `items` array rather than a separate `linkedItems` bag. +- Strong typing moves from the `ClientTypes` generic + `IContentItem` to a `DeliveryClientSchema` + + `ContentItemOf`, and responses can be validated at runtime with Zod schemas. + +## At a glance + +| Concept | v16 | v17 | +|---|---|---| +| Create client | `createDeliveryClient({ environmentId, previewApiKey })` | `createDeliveryClient({ apiMode, environmentId, deliveryApiKey })` | +| List items | `client.items().type("movie").toPromise()` | `client.listContentItems({ filters: [...] }).fetchPageSafe()` | +| Single item | `client.item("x").toPromise()` | `client.fetchContentItem({ codename: "x" }).fetchSafe()` | +| Strong typing | `ClientTypes` generic + `IContentItem<{...Elements.*}>` | `DeliveryClientSchema` + `ContentItemOf` | +| Response data | `response.data.items` | `response.payload.items` | +| Linked items | `element.linkedItems` | `element.items` (resolved) | +| Errors | `try/catch` (`DeliveryError`) | `{ success, error }` (`DeliverySdkError`) | --- ## Installation -v17 requires Node.js ≥ 22 and three peer dependencies that were previously bundled: +v17 requires Node.js ≥ 22 and has three peer dependencies that were previously bundled: +`@kontent-ai/core-sdk`, `zod`, and `ts-pattern`. + +**npm** installs peer dependencies automatically: ```bash -npm install @kontent-ai/delivery-sdk @kontent-ai/core-sdk zod ts-pattern +npm install @kontent-ai/delivery-sdk +``` + +**pnpm** does not, so install them explicitly alongside the package: + +```bash +pnpm add @kontent-ai/delivery-sdk @kontent-ai/core-sdk zod ts-pattern ``` --- ## Client creation -The config object has been redesigned. API access mode is now an explicit `apiMode` discriminant instead of optional API key fields, and several options have been removed. +API access mode is now an explicit `apiMode` discriminant instead of optional API-key fields. **v16** ```typescript import { createDeliveryClient } from "@kontent-ai/delivery-sdk"; const client = createDeliveryClient({ - environmentId: "your-environment-id", - previewApiKey: "your-preview-key", // preview mode - // secureApiKey: "your-secure-key", // OR secure mode + environmentId: "", + previewApiKey: "", // preview mode + // secureApiKey: "", // OR secure mode + defaultQueryConfig: { usePreviewMode: true }, }); ``` @@ -34,48 +68,47 @@ const client = createDeliveryClient({ import { createDeliveryClient } from "@kontent-ai/delivery-sdk"; // Public -const client = createDeliveryClient({ - apiMode: "public", - environmentId: "your-environment-id", -}); +const client = createDeliveryClient({ apiMode: "public", environmentId: "" }); // Preview const client = createDeliveryClient({ apiMode: "preview", - environmentId: "your-environment-id", - deliveryApiKey: "your-preview-key", + environmentId: "", + deliveryApiKey: "", }); // Secure const client = createDeliveryClient({ apiMode: "secure", - environmentId: "your-environment-id", - deliveryApiKey: "your-secure-key", + environmentId: "", + deliveryApiKey: "", }); ``` -### Removed config options +`usePreviewMode`/`useSecuredMode` query config is gone — the mode is fixed when the client is created. -The following v16 config properties have no v17 equivalent and should be removed: +### Removed / relocated config options -| Removed property | Notes | +| v16 property | v17 | |---|---| | `previewApiKey` / `secureApiKey` | Replaced by `apiMode` + `deliveryApiKey` | -| `elementResolver` | Elements are no longer auto-mapped | -| `linkedItemsReferenceHandler` | `modular_content` is now a plain record | -| `proxy` / `basePreviewUrl` | Use `baseUrl` from `@kontent-ai/core-sdk` config | -| `globalHeaders` | Pass headers per-request via `config.customHeaders` | -| `defaultLanguage` | Pass `query.language` per-request | -| `defaultQueryConfig` | No equivalent | +| `defaultQueryConfig` (`usePreviewMode` / `useSecuredMode`) | Decided by `apiMode` at client creation | +| `elementResolver` | Removed — elements are returned as typed discriminated-union values, not remapped | +| `linkedItemsReferenceHandler` | Removed — linked items are resolved onto `element.items` (see [Linked items](#linked-items--rich-text)) | +| `proxy` / `basePreviewUrl` | Use `baseUrl` from the `@kontent-ai/core-sdk` config | +| `globalHeaders` | Pass headers per request (`config.customHeaders`) | +| `defaultLanguage` | Pass `query.language` per request | | `retryStrategy` | Configured in `@kontent-ai/core-sdk` | -| `assetsDomain` / `defaultRenditionPreset` | No equivalent | -| `excludeArchivedItems` | No equivalent | +| `httpService` | Still supported (from `@kontent-ai/core-sdk`) | +| `assetsDomain` / `defaultRenditionPreset` | Removed | +| `excludeArchivedItems` | Removed | --- -## TypeScript schema (replaces `ClientTypes` generic) +## TypeScript schema (replaces the `ClientTypes` generic) -v16 used a generic type parameter to narrow codenames. v17 keeps a generic type parameter, but the shape is provided through `DeliveryClientSchema<...>`. +v16 narrowed codenames with a `ClientTypes` generic. v17 uses `DeliveryClientSchema<...>`, where content +types and taxonomies are **maps** (so elements/terms are tied to their parent). **v16** ```typescript @@ -112,38 +145,99 @@ type MySchema = DeliveryClientSchema<{ }; }>; -const client = createDeliveryClient({ - apiMode: "public", - environmentId: "...", -}); +const client = createDeliveryClient({ apiMode: "public", environmentId: "..." }); ``` The schema is type-only — it narrows codenames at compile time and is not passed as a runtime value. -> **Note:** `taxonomyCodenames` is replaced by a `taxonomies` map. Each key is a taxonomy -> codename; its value lists that taxonomy's term codenames. This lets `fetchTaxonomy` narrow the -> returned term codenames to the queried taxonomy — e.g. `client.fetchTaxonomy({ codename: "genre" })` -> types its `terms[].codename` as `"action" | "comedy" | "drama"` at every nesting level. The list of -> taxonomy codenames is derived from the map's keys (`TaxonomyCodenameOf`), so no separate -> `taxonomyCodenames` field is needed. Generated schemas from `@kontent-ai/model-generator` will emit -> this shape. - -> **Note:** `contentTypeCodenames` and `elementCodenames` are replaced by a single `contentTypes` map. -> Each key is a content type codename; its value lists that type's element codenames. This connects -> elements to the type they belong to and lets single-type queries narrow elements to the queried type — -> e.g. `client.fetchContentTypeElement({ typeCodename: "article", elementCodename: "title" })` accepts only -> `article`'s element codenames, and `client.fetchContentType({ codename: "article" })` narrows its +> **`taxonomyCodenames` → `taxonomies` map.** Each key is a taxonomy codename; its value lists that +> taxonomy's term codenames. This lets `fetchTaxonomy` narrow the returned term codenames to the queried +> taxonomy — `client.fetchTaxonomy({ codename: "genre" })` types `terms[].codename` as +> `"action" | "comedy" | "drama"` at every nesting level. The taxonomy codenames are derived from the map's +> keys, so no separate `taxonomyCodenames` field is needed. + +> **`contentTypeCodenames` + `elementCodenames` → `contentTypes` map.** Each key is a content type +> codename; its value lists that type's element codenames. Single-type queries narrow elements to the +> queried type — `client.fetchContentTypeElement({ typeCodename: "article", elementCodename: "title" })` +> accepts only `article`'s elements, and `client.fetchContentType({ codename: "article" })` narrows its > `elements` selection the same way. Cross-type queries (`listContentItems`, `itemsFeed`, -> `fetchContentItem`, `listContentTypes`) accept any element codename across all types. The list of -> content type codenames is derived from the map's keys (`ContentTypeCodenameOf`), so no separate -> `contentTypeCodenames` or `elementCodenames` field is needed. Generated schemas from -> `@kontent-ai/model-generator` will emit this shape. +> `fetchContentItem`, `listContentTypes`) accept any element codename across all types. + +> Generated schemas from `@kontent-ai/model-generator` emit this shape, so you normally won't hand-write it. --- -## Query API +## Typed content models + +v16 modeled an item with `IContentItem<{...}>` and the `Elements.*` wrapper types. v17 uses +`ContentItemOf` with the `ElementType.*` namespace. The element shape's +keys are validated against the type's element codenames in your schema. + +**v16** +```typescript +import type { IContentItem, Elements } from "@kontent-ai/delivery-sdk"; + +type Actor = IContentItem<{ + readonly first_name: Elements.TextElement; + readonly last_name: Elements.TextElement; +}>; + +type Movie = IContentItem<{ + readonly title: Elements.TextElement; + readonly plot: Elements.RichTextElement; + readonly released: Elements.DateTimeElement; + readonly length: Elements.NumberElement; + readonly poster: Elements.AssetsElement; + readonly category: Elements.MultipleChoiceElement; + readonly stars: Elements.LinkedItemsElement; + readonly seoname: Elements.UrlSlugElement; + readonly releasecategory: Elements.TaxonomyElement; +}>; +``` + +**v17** +```typescript +import type { ContentItemOf, ElementType } from "@kontent-ai/delivery-sdk"; + +type Actor = ContentItemOf; + +type Movie = ContentItemOf; + readonly released: ElementType.DateTime; + readonly length: ElementType.Number; + readonly poster: ElementType.Asset; + readonly category: ElementType.MultipleChoice<"action" | "drama">; + readonly stars: ElementType.LinkedItems; + readonly seoname: ElementType.UrlSlug; + readonly releasecategory: ElementType.Taxonomy<"action" | "comedy" | "drama">; +}>; +``` -### Method names +### Element type mapping + +| v16 | v17 | +|---|---| +| `Elements.TextElement` | `ElementType.Text` | +| `Elements.NumberElement` | `ElementType.Number` | +| `Elements.RichTextElement` | `ElementType.RichText` | +| `Elements.MultipleChoiceElement` | `ElementType.MultipleChoice` | +| `Elements.DateTimeElement` | `ElementType.DateTime` | +| `Elements.AssetsElement` | `ElementType.Asset` | +| `Elements.TaxonomyElement` | `ElementType.Taxonomy` | +| `Elements.UrlSlugElement` | `ElementType.UrlSlug` | +| `Elements.CustomElement` | `ElementType.Custom` | +| `Elements.LinkedItemsElement` | `ElementType.LinkedItems` | + +The generic arguments (``, `<"action" | "drama">`, …) are compile-time hints that power +autocomplete and narrowing; at runtime the value is whatever the API returns. + +--- + +## Query methods | v16 | v17 | |---|---| @@ -158,23 +252,28 @@ The schema is type-only — it narrows codenames at compile time and is not pass | `client.element(type, element)` | `client.fetchContentTypeElement({ typeCodename, elementCodename })` | | `client.assetUsedIn(codename)` | `client.itemsReferencingAsset({ codename })` | | `client.itemUsedIn(codename)` | `client.itemsReferencingItem({ codename })` | +| `client.mappingService` | Removed (see [Removed APIs](#removed-apis)) | +| `client.initializeSync()` / `client.syncChanges()` | Removed (see [Removed APIs](#removed-apis)) | -### Method chaining → request objects +### Fluent builder → request object -v16 built queries with a fluent builder. v17 passes a single request object when constructing the query. +v16 chained builder methods; v17 passes a single request object. Query parameters live under `query`, +content filtering under `filters`. **v16** ```typescript const response = await client - .items() + .items() .type("movie") .languageParameter("en-US") + .depthParameter(2) .limitParameter(10) .skipParameter(20) + .elementsParameter(["title", "plot"]) .orderByAscending("system.name") .toPromise(); -console.log(response.items); +console.log(response.data.items); ``` **v17** @@ -183,8 +282,10 @@ const { response } = await client .listContentItems({ query: { language: "en-US", + depth: 2, limit: 10, skip: 20, + elements: ["title", "plot"], order: "system.name[asc]", }, filters: [{ property: "system.type", operator: "eq", value: "movie" }], @@ -194,127 +295,125 @@ const { response } = await client console.log(response?.payload.items); ``` +| v16 builder method | v17 | +|---|---| +| `.type(c)` / `.types([...])` | `filters: [{ property: "system.type", operator: "eq" / "in", value }]` | +| `.collection(c)` / `.collections([...])` | `filters: [{ property: "system.collection", operator: "eq" / "in", value }]` | +| `.languageParameter(c)` | `query.language` | +| `.depthParameter(n)` | `query.depth` | +| `.limitParameter(n)` / `.skipParameter(n)` | `query.limit` / `query.skip` | +| `.elementsParameter([...])` / `.excludeElementsParameter([...])` | `query.elements` / `query.excludeElements` | +| `.includeTotalCountParameter()` | `query.includeTotalCount: true` | +| `.orderByAscending(x)` / `.orderByDescending(x)` / `.orderParameter(x, dir)` | `query.order: "[asc|desc]"` | + ### Execution methods | v16 | v17 | Behaviour | |---|---|---| -| `.toPromise()` | `.fetchSafe()` (fetch query) or `.fetchPageSafe()` (paged query) | Returns `{ success, response, error }`, never throws | +| `.toPromise()` | `.fetchSafe()` (single) / `.fetchPageSafe()` (paged) | Returns `{ success, response, error }`, never throws | | `.toPromise()` | `.fetch()` / `.fetchPage()` | Throws on error | -| `.toAllPromise()` | `.fetchAllPagesSafe()` | Fetches all pages, returns `{ success, responses, error }` | -| `.toAllPromise()` | `.fetchAllPages()` | Throws on error | +| `.toAllPromise()` | `.fetchAllPagesSafe()` | All pages, returns `{ success, responses, error }` | +| `.toAllPromise()` | `.fetchAllPages()` | All pages, throws on error | +| — | `.pages()` / `.pagesSafe()` | Async iterators over pages | --- ## Error handling -v16 queries always throw. v17 provides safe variants that return a result object instead. +v16 queries threw `DeliveryError`. v17 prefers the safe variants, which return a result object with a +`DeliverySdkError` instead of throwing (the throwing `fetch()`/`fetchPage()` variants still exist). **v16** ```typescript +import { DeliveryError } from "@kontent-ai/delivery-sdk"; + try { - const response = await client.items().toPromise(); - console.log(response.items); + const response = await client.item("invalid").toPromise(); + console.log(response.data.item); } catch (error) { - console.error(error); // DeliveryError + if (error instanceof DeliveryError) { + console.error(error.message, error.errorCode); + } } ``` **v17** ```typescript -const { success, response, error } = await client.listContentItems().fetchPageSafe(); +const { success, response, error } = await client.fetchContentItem({ codename: "invalid" }).fetchSafe(); if (!success) { - console.error(error.details.reason); // DeliverySdkError + console.error(error.message); + console.error(error.details.reason); // e.g. "parsingFailed" return; } -console.log(response.payload.items); +console.log(response.payload.item); ``` ---- - -## Response shape - -v16 resolved linked items automatically and exposed them alongside the main payload. v17 returns the raw API payload — `modular_content` is a plain record keyed by codename. - -**v16** -```typescript -const response = await client.items().toPromise(); +Every query exports a matching response type for annotating results: +`FetchContentItemResponse`, `ListContentItemsResponse`, `ItemsFeedResponse`, `FetchContentTypeResponse`, +`ListContentTypesResponse`, `FetchContentTypeElementResponse`, `FetchTaxonomyResponse`, +`ListTaxonomiesResponse`, `ListLanguagesResponse`, `ItemsReferencingAssetResponse`, +`ItemsReferencingItemResponse`. -for (const item of response.items) { - console.log(item.system.name); - console.log(item.elements.title.value); -} +> `modular_content` is a record keyed by codename whose values are `item | undefined` — index access can +> return `undefined`, so guard before use. -// Automatically resolved linked items -for (const linked of response.linkedItems) { ... } -``` +### System property names -**v17** -```typescript -const { response } = await client.listContentItems().fetchPageSafe(); -const { items, modular_content, pagination } = response!.payload; +System properties are now snake_case to match the raw API: -for (const item of items) { - console.log(item.system.name); +| v16 | v17 | +|---|---| +| `system.lastModified` | `system.last_modified` | +| `system.workflowStep` | `system.workflow_step` | +| `system.sitemapLocations` | `system.sitemap_locations` | +| `system.id` / `name` / `codename` / `type` / `language` / `collection` / `workflow` | unchanged | - const title = item.elements?.["title"]; - if (title?.type === "text") { - console.log(title.value); - } -} +--- -// Linked items are a plain record — resolve manually -const linked = modular_content["some_codename"]; -``` +## Linked items & rich text -### Fetch single item +This is the biggest behavioural change to be aware of. v16 resolved linked items into a separate +`linkedItems` bag and onto `element.linkedItems`. **v17 still resolves them for you** — but onto each +element's **`items`** array, directly on the default (resolved) response. Call `.raw()` on the query if you +want the unresolved payload instead. **v16** ```typescript -const response = await client.item("my_article").toPromise(); -console.log(response.item.elements.title.value); +const movie = response.data.item; +const stars = movie.elements.stars.linkedItems; // resolved Actor[] +const plotItems = movie.elements.plot.linkedItems; // items referenced from rich text ``` **v17** ```typescript -const { response } = await client.fetchContentItem({ codename: "my_article" }).fetchSafe(); -const item = response?.payload.item; +// Linked-items element: `.value` holds codenames, `.items` holds the resolved items +const stars = movie.elements.stars.items; // resolved Actor[] +const starCodenames = movie.elements.stars.value; // string[] -if (item?.elements?.["title"]?.type === "text") { - console.log(item.elements["title"].value); -} -``` - ---- +// Rich-text element: `.value` is the HTML string, `.modular_content` is codenames, `.items` is resolved +const plotHtml = movie.elements.plot.value; // string (HTML) +const plotItems = movie.elements.plot.items; // resolved items +const plotItemCodenames = movie.elements.plot.modular_content; -## System property names +// Need the raw, unresolved payload? Use .raw() +const raw = await client.fetchContentItem({ codename: "warrior" }).raw().fetch(); +``` -Several system properties are now snake_case to match the raw API: - -| v16 | v17 | -|---|---| -| `system.lastModified` | `system.last_modified` | -| `system.workflowStep` | `system.workflow_step` | -| `system.sitemapLocations` | `system.sitemap_locations` | -| `system.id` | `system.id` (unchanged) | -| `system.name` | `system.name` (unchanged) | -| `system.codename` | `system.codename` (unchanged) | -| `system.type` | `system.type` (unchanged) | -| `system.language` | `system.language` (unchanged) | -| `system.collection` | `system.collection` (unchanged) | -| `system.workflow` | `system.workflow` (unchanged) | +> v17 does **not** ship a rich-text-to-HTML resolver or portable-text transformer. `element.value` is the +> raw HTML the API returns; resolve embedded components/links yourself from `modular_content` / `links`. --- ## Filters -v16 exposed filters as builder methods. v17 uses an explicit `filters` array on the request object. +v16 exposed filters as builder methods; v17 uses an explicit `filters` array. **v16** ```typescript const response = await client - .items() + .items() .equalsFilter("system.type", "movie") .allFilter("elements.genre", ["action", "drama"]) .greaterThanOrEqualFilter("elements.release_date", "2020-01-01") @@ -334,12 +433,7 @@ const { response } = await client .fetchPageSafe(); ``` -Filters can also be passed as raw query strings: -```typescript -filters: ["system.type[eq]=movie", "elements.genre[all]=action,drama"] -``` - -### Filter operator mapping +Filters may also be raw query strings: `filters: ["system.type[eq]=movie", "elements.genre[all]=action,drama"]`. | v16 method | v17 operator | |---|---| @@ -366,14 +460,12 @@ filters: ["system.type[eq]=movie", "elements.genre[all]=action,drama"] ```typescript client.items().orderByAscending("system.name").toPromise(); client.items().orderByDescending("elements.release_date").toPromise(); +client.items().orderParameter("elements.title", "desc").toPromise(); ``` **v17** ```typescript -// System property client.listContentItems({ query: { order: "system.name[asc]" } }).fetchPageSafe(); - -// Element property client.listContentItems({ query: { order: "elements.release_date[desc]" } }).fetchPageSafe(); ``` @@ -381,7 +473,7 @@ client.listContentItems({ query: { order: "elements.release_date[desc]" } }).fet ## Paging -### URL-based paging (skip/limit) +### URL paging (skip / limit) **v16** ```typescript @@ -392,22 +484,19 @@ const response = await client .includeTotalCountParameter() .toPromise(); -console.log(response.pagination.skip); -console.log(response.pagination.total_count); +console.log(response.data.pagination.skip, response.data.pagination.totalCount); ``` **v17** ```typescript const { response } = await client - .listContentItems({ - query: { limit: 10, skip: 20 }, - }) + .listContentItems({ query: { limit: 10, skip: 20, includeTotalCount: true } }) .fetchPageSafe(); -console.log(response?.payload.pagination.skip); +console.log(response?.payload.pagination.skip, response?.payload.pagination.total_count); ``` -### Continuation token paging (items feed) +### Continuation-token paging (items feed) **v16** ```typescript @@ -420,90 +509,30 @@ const response = await client **v17** ```typescript const { response } = await client - .itemsFeed({ - headers: { "X-Continuation": "token-from-previous-response" }, - }) + .itemsFeed({ headers: { "X-Continuation": "token-from-previous-response" } }) .fetchPageSafe(); -// The next token is available on the page response meta -console.log(response?.meta.continuationToken); +console.log(response?.meta.continuationToken); // next token ``` ### Fetching all pages **v16** ```typescript -const response = await client - .items() - .toAllPromise({ - responseFetched: (res, nextUrl, token) => { - console.log(`Fetched page, next: ${nextUrl}`); - }, - }); - -console.log(response.responses.flatMap((r) => r.data.items)); +const response = await client.items().limitParameter(5).toAllPromise({ pages: 3 }); +console.log(response.data.items); ``` **v17** ```typescript -const { success, responses, nextContinuationToken } = await client - .itemsFeed() - .fetchAllPagesSafe(); - +const { success, responses } = await client.listContentItems({ query: { limit: 5 } }).fetchAllPagesSafe(); if (success) { const allItems = responses.flatMap((r) => r.payload.items); - // Resume later using nextContinuationToken } -``` - ---- - -## Content item elements - -v16 automatically mapped elements to typed wrappers (`Elements.TextElement`, etc.). v17 returns raw discriminated-union values — check `element.type` before accessing `element.value`. -**v16** -```typescript -import type { Elements } from "@kontent-ai/delivery-sdk"; - -interface ArticleElements { - title: Elements.TextElement; - body: Elements.RichTextElement; - thumbnail: Elements.AssetsElement; - tags: Elements.TaxonomyElement<"tag_1" | "tag_2", "tags">; -} - -const article = response.item as IContentItem; - -console.log(article.elements.title.value); -console.log(article.elements.body.linkedItems); // auto-resolved -console.log(article.elements.thumbnail.value[0].url); -console.log(article.elements.tags.value.map((t) => t.codename)); -``` - -**v17** -```typescript -const item = response?.payload.item; -const elements = item?.elements ?? {}; - -const title = elements["title"]; -if (title?.type === "text") console.log(title.value); - -const body = elements["body"]; -if (body?.type === "rich_text") { - console.log(body.value); // HTML string - console.log(body.modular_content); // string[] of linked item codenames - // Resolve from modular_content record manually -} - -const thumbnail = elements["thumbnail"]; -if (thumbnail?.type === "asset") { - console.log(thumbnail.value[0]?.url); -} - -const tags = elements["tags"]; -if (tags?.type === "taxonomy") { - console.log(tags.value.map((t) => t.codename)); +// or iterate page-by-page +for await (const page of client.itemsFeed().pages()) { + console.log(page.payload.items.length); } ``` @@ -511,21 +540,24 @@ if (tags?.type === "taxonomy") { ## Runtime validation (new in v17) -v17 can validate API responses against Zod schemas at runtime, catching unexpected payload shapes immediately. +v17 can validate API responses against the Zod schemas the types are derived from, catching unexpected +payload shapes immediately. It is opt-in: ```typescript const client = createDeliveryClient({ apiMode: "public", environmentId: "...", + runtimeValidation: { validateResponses: true }, }); ``` -When parsing fails, it returns a `parsingFailed` error reason with the underlying `ZodError`: +When validation fails, the safe result carries a `parsingFailed` error reason with the underlying +`ZodError`: ```typescript const { success, error } = await client.listLanguages().fetchPageSafe(); -if (!success && error?.details.reason === "parsingFailed") { +if (!success && error.details.reason === "parsingFailed") { console.error(error.details.zodError); } ``` @@ -536,18 +568,34 @@ if (!success && error?.details.reason === "parsingFailed") { ### `mappingService` -The `client.mappingService` property for remapping stored JSON responses has been removed. Parse responses using the exported Zod schemas directly: +The `client.mappingService` property for remapping stored JSON responses is removed. Parse responses with +the exported Zod schemas directly. The schemas live on the dedicated `@kontent-ai/delivery-sdk/schemas` +subpath — a separate entry point that is **not** part of the main bundle, so it's only pulled in when you +import from it: ```typescript -import { listContentItemsSchema } from "@kontent-ai/delivery-sdk"; +import { listContentItemsSchema } from "@kontent-ai/delivery-sdk/schemas"; -const result = await listContentItemsSchema(schema).safeParseAsync(storedJson); +const result = await listContentItemsSchema().safeParseAsync(storedJson); ``` ### `transformImageUrl` -The image transformation builder has been removed. Use the [Kontent.ai Image Transformation API](https://kontent.ai/learn/docs/apis/image-transformation) URL parameters directly or a third-party image URL builder. +The image-transformation builder is removed. Use the +[Kontent.ai Image Transformation API](https://kontent.ai/learn/docs/apis/image-transformation) URL +parameters directly, or a third-party image URL builder. + +### `.getUrl()` / `.withUrl()` + +Query URL inspection/override builder methods are removed. Inspect a query's request via `query.inspect()`, +set a custom host through the `baseUrl` config, and express ad-hoc query strings via raw-string `filters`. ### Sync API -`client.initializeSync()` and `client.syncChanges()` have been removed. Use the [Sync API](https://kontent.ai/learn/docs/apis/sync-api) directly via the REST API or a dedicated SDK. +`client.initializeSync()` and `client.syncChanges()` are removed. Use the dedicated +[`@kontent-ai/sync-sdk`](https://github.com/kontent-ai/sync-sdk-js) package, which provides type-safe +synchronization with the Kontent.ai Sync API v2: + +```bash +npm install @kontent-ai/sync-sdk +``` From be6ac785580796bdbd2d269e2848a37c71769344 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 10:49:05 +0200 Subject: [PATCH 210/221] Renames elementTypes & updates migration --- lib/public_api.ts | 2 +- migration.md | 82 +++++++++++++------ sample/sample-schema.ts | 34 ++++---- .../models/integration-test.schema.ts | 26 +++--- 4 files changed, 89 insertions(+), 55 deletions(-) diff --git a/lib/public_api.ts b/lib/public_api.ts index bf68efd5..7ce62a67 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -53,7 +53,7 @@ export type { ListContentItemsPayload, } from "./queries/content-items/models/content-item.models.js"; export type { ContentItemElementPayload } from "./queries/content-items/models/element.models.js"; -export type * as ElementType from "./queries/content-items/models/element-types.js"; +export type * as Elements from "./queries/content-items/models/element-types.js"; export type { FetchContentTypeElementQuery, FetchContentTypeElementQueryRequest, diff --git a/migration.md b/migration.md index 60f1a260..fb43a447 100644 --- a/migration.md +++ b/migration.md @@ -21,7 +21,7 @@ v17 is a ground-up rewrite. The biggest conceptual shifts: | Create client | `createDeliveryClient({ environmentId, previewApiKey })` | `createDeliveryClient({ apiMode, environmentId, deliveryApiKey })` | | List items | `client.items().type("movie").toPromise()` | `client.listContentItems({ filters: [...] }).fetchPageSafe()` | | Single item | `client.item("x").toPromise()` | `client.fetchContentItem({ codename: "x" }).fetchSafe()` | -| Strong typing | `ClientTypes` generic + `IContentItem<{...Elements.*}>` | `DeliveryClientSchema` + `ContentItemOf` | +| Strong typing | `ClientTypes` generic + `IContentItem<{...Elements.*}>` | `DeliveryClientSchema` + `ContentItemOf` | | Response data | `response.data.items` | `response.payload.items` | | Linked items | `element.linkedItems` | `element.items` (resolved) | | Errors | `try/catch` (`DeliveryError`) | `{ success, error }` (`DeliverySdkError`) | @@ -170,7 +170,7 @@ The schema is type-only — it narrows codenames at compile time and is not pass ## Typed content models v16 modeled an item with `IContentItem<{...}>` and the `Elements.*` wrapper types. v17 uses -`ContentItemOf` with the `ElementType.*` namespace. The element shape's +`ContentItemOf` with the `Elements.*` namespace. The element shape's keys are validated against the type's element codenames in your schema. **v16** @@ -197,23 +197,23 @@ type Movie = IContentItem<{ **v17** ```typescript -import type { ContentItemOf, ElementType } from "@kontent-ai/delivery-sdk"; +import type { ContentItemOf, Elements } from "@kontent-ai/delivery-sdk"; type Actor = ContentItemOf; type Movie = ContentItemOf; - readonly released: ElementType.DateTime; - readonly length: ElementType.Number; - readonly poster: ElementType.Asset; - readonly category: ElementType.MultipleChoice<"action" | "drama">; - readonly stars: ElementType.LinkedItems; - readonly seoname: ElementType.UrlSlug; - readonly releasecategory: ElementType.Taxonomy<"action" | "comedy" | "drama">; + readonly title: Elements.Text; + readonly plot: Elements.RichText; + readonly released: Elements.DateTime; + readonly length: Elements.Number; + readonly poster: Elements.Asset; + readonly category: Elements.MultipleChoice<"action" | "drama">; + readonly stars: Elements.LinkedItems; + readonly seoname: Elements.UrlSlug; + readonly releasecategory: Elements.Taxonomy<"action" | "comedy" | "drama">; }>; ``` @@ -221,16 +221,16 @@ type Movie = ContentItemOf` | -| `Elements.MultipleChoiceElement` | `ElementType.MultipleChoice` | -| `Elements.DateTimeElement` | `ElementType.DateTime` | -| `Elements.AssetsElement` | `ElementType.Asset` | -| `Elements.TaxonomyElement` | `ElementType.Taxonomy` | -| `Elements.UrlSlugElement` | `ElementType.UrlSlug` | -| `Elements.CustomElement` | `ElementType.Custom` | -| `Elements.LinkedItemsElement` | `ElementType.LinkedItems` | +| `Elements.TextElement` | `Elements.Text` | +| `Elements.NumberElement` | `Elements.Number` | +| `Elements.RichTextElement` | `Elements.RichText` | +| `Elements.MultipleChoiceElement` | `Elements.MultipleChoice` | +| `Elements.DateTimeElement` | `Elements.DateTime` | +| `Elements.AssetsElement` | `Elements.Asset` | +| `Elements.TaxonomyElement` | `Elements.Taxonomy` | +| `Elements.UrlSlugElement` | `Elements.UrlSlug` | +| `Elements.CustomElement` | `Elements.Custom` | +| `Elements.LinkedItemsElement` | `Elements.LinkedItems` | The generic arguments (``, `<"action" | "drama">`, …) are compile-time hints that power autocomplete and narrowing; at runtime the value is whatever the API returns. @@ -406,6 +406,40 @@ const raw = await client.fetchContentItem({ codename: "warrior" }).raw().fetch() --- +## Content item type guards + +When a query returns items of mixed types (e.g. `listContentItems`), narrow each item to its typed model +with a type guard on `system.type`. This replaces v16's `response.item as Movie` casting and gives you +fully-typed `elements` inside the branch. + +```typescript +import type { ContentItemPayload } from "@kontent-ai/delivery-sdk"; + +function isMovie(item: ContentItemPayload): item is Movie { + return item.system.type === "movie"; +} + +function isActor(item: ContentItemPayload): item is Actor { + return item.system.type === "actor"; +} + +const { response } = await client.listContentItems().fetchPageSafe(); + +for (const item of response?.payload.items ?? []) { + if (isMovie(item)) { + const title: string = item.elements.title.value; + const stars = item.elements.stars.items; // resolved Actor[] + } else if (isActor(item)) { + const name: string = item.elements.first_name.value; + } +} +``` + +> You don't need to write these by hand — `@kontent-ai/model-generator` emits a type guard +> (`isMovie`, `isActor`, …) for every content type alongside the typed models and schema. + +--- + ## Filters v16 exposed filters as builder methods; v17 uses an explicit `filters` array. diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index 2cf3f321..6f102ab6 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -22,7 +22,7 @@ import type { DeliveryClient, DeliveryClientSchema, ElementCodenamesOf, - ElementType, + Elements, FetchContentItemResponse, TaxonomyPayload, } from "../lib/public_api.js"; @@ -74,10 +74,10 @@ export type SampleProjectSchema = DeliveryClientSchema<{ * still accepts any string codename the API returns. */ export type ActorElements = { - readonly first_name: ElementType.Text; - readonly last_name: ElementType.Text; - readonly role: ElementType.MultipleChoice<"opt1" | "opt2" | "opt3">; - readonly relatedActors: ElementType.LinkedItems; + readonly first_name: Elements.Text; + readonly last_name: Elements.Text; + readonly role: Elements.MultipleChoice<"opt1" | "opt2" | "opt3">; + readonly relatedActors: Elements.LinkedItems; }; // Fully-typed Actor item payload (system metadata + elements). @@ -91,16 +91,16 @@ export type Actor = ContentItemOf; * `Actor`, so consumers get full element narrowing on referenced items. */ export type MovieElements = { - readonly title: ElementType.Text; - readonly rating: ElementType.Number; - readonly synopsis: ElementType.RichText; - readonly genre: ElementType.MultipleChoice<"genre1" | "genre2">; - readonly release_date: ElementType.DateTime; - readonly poster: ElementType.Asset; - readonly categories: ElementType.Taxonomy<"term1" | "term2">; - readonly url_slug: ElementType.UrlSlug; - readonly custom_id: ElementType.Custom; - readonly actors: ElementType.LinkedItems; + readonly title: Elements.Text; + readonly rating: Elements.Number; + readonly synopsis: Elements.RichText; + readonly genre: Elements.MultipleChoice<"genre1" | "genre2">; + readonly release_date: Elements.DateTime; + readonly poster: Elements.Asset; + readonly categories: Elements.Taxonomy<"term1" | "term2">; + readonly url_slug: Elements.UrlSlug; + readonly custom_id: Elements.Custom; + readonly actors: Elements.LinkedItems; }; // Fully-typed Movie item payload. @@ -111,10 +111,10 @@ export type Movie = ContentItemOf; * for the content type. You may type a subset of the type's elements, but unknown codenames are rejected. */ // @ts-expect-error "titel" is not an element codename declared for "movie" in the schema. -export type BadMovie = ContentItemOf; +export type BadMovie = ContentItemOf; // A partial shape (only some of the type's elements) is still allowed. -export type PartialMovie = ContentItemOf; +export type PartialMovie = ContentItemOf; /** * 4. Typed delivery client diff --git a/tests/integration/models/integration-test.schema.ts b/tests/integration/models/integration-test.schema.ts index 2a61ae00..0a779286 100644 --- a/tests/integration/models/integration-test.schema.ts +++ b/tests/integration/models/integration-test.schema.ts @@ -1,4 +1,4 @@ -import type { ContentItemOf, DeliveryClientSchema, ElementType, TaxonomyTermCodenamesOf } from "../../../lib/public_api.js"; +import type { ContentItemOf, DeliveryClientSchema, Elements, TaxonomyTermCodenamesOf } from "../../../lib/public_api.js"; import type { ContentItemPayloadExtended } from "../../../lib/queries/content-items/models/content-item.models.js"; export type IntegrationTestProjectSchema = DeliveryClientSchema<{ @@ -28,23 +28,23 @@ export type IntegrationTestProjectSchema = DeliveryClientSchema<{ }>; export type StarElements = { - readonly firstname: ElementType.Text; - readonly lastname: ElementType.Text; + readonly firstname: Elements.Text; + readonly lastname: Elements.Text; }; export type Star = ContentItemOf; export type MovieElements = { - readonly title: ElementType.Text; - readonly length_in_minutes: ElementType.Number; - readonly description: ElementType.RichText; - readonly is_blockbuster: ElementType.MultipleChoice<"yes">; - readonly release_date: ElementType.DateTime; - readonly cover: ElementType.Asset; - readonly category: ElementType.Taxonomy; - readonly url: ElementType.UrlSlug; - readonly metadata__metadata_description: ElementType.Text; - readonly cast: ElementType.LinkedItems; + readonly title: Elements.Text; + readonly length_in_minutes: Elements.Number; + readonly description: Elements.RichText; + readonly is_blockbuster: Elements.MultipleChoice<"yes">; + readonly release_date: Elements.DateTime; + readonly cover: Elements.Asset; + readonly category: Elements.Taxonomy; + readonly url: Elements.UrlSlug; + readonly metadata__metadata_description: Elements.Text; + readonly cast: Elements.LinkedItems; }; export type Movie = ContentItemOf; From 6a83ffdd80b37da110a71bc95b84e445f3448ad2 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 11:22:18 +0200 Subject: [PATCH 211/221] Update README.md --- README.md | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/README.md b/README.md index e48aa35c..d18b224b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,224 @@ # Kontent.ai Delivery SDK for JavaScript +A TypeScript/JavaScript SDK for the [Kontent.ai Delivery API](https://kontent.ai/learn/docs/apis/openapi/delivery-api/). +It fetches content items, types, taxonomies, and languages, with first-class TypeScript typing and optional +runtime validation. + +> **Upgrading from v16?** See the [migration guide](./migration.md). + +## Installation + +The SDK has three peer dependencies: `@kontent-ai/core-sdk`, `zod`, and `ts-pattern`. + +```bash +# npm installs peer dependencies automatically +npm install @kontent-ai/delivery-sdk + +# pnpm needs them listed explicitly +pnpm add @kontent-ai/delivery-sdk @kontent-ai/core-sdk zod ts-pattern +``` + +Requires Node.js ≥ 22. + +## Quick start + +```typescript +import { createDeliveryClient } from "@kontent-ai/delivery-sdk"; + +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "", +}); + +// Fetch a single content item +const { response } = await client.fetchContentItem({ codename: "my_article" }).fetchSafe(); +``` + +Every query returns `{ payload, meta }`. The `payload` is the raw API response (content lives in +`payload.items` / `payload.item`); `meta` holds response metadata such as the continuation token. + +## Configuration + +The API mode is set once, when you create the client: + +```typescript +// Public — published content +createDeliveryClient({ apiMode: "public", environmentId: "" }); + +// Preview — unpublished content +createDeliveryClient({ apiMode: "preview", environmentId: "", deliveryApiKey: "" }); + +// Secure — published content with Secured access enabled +createDeliveryClient({ apiMode: "secure", environmentId: "", deliveryApiKey: "" }); +``` + +| Option | Required | Description | +|---|---|---| +| `apiMode` | yes | `"public"`, `"preview"`, or `"secure"` | +| `environmentId` | yes | Your Kontent.ai environment ID | +| `deliveryApiKey` | for preview/secure | The preview or secure access API key | +| `baseUrl`, `httpService`, `retryStrategy` | no | Advanced options from [`@kontent-ai/core-sdk`](https://github.com/kontent-ai/core-sdk-js) | +| `runtimeValidation` | no | Opt-in Zod validation of responses (see [Runtime validation](#runtime-validation)) | + +## Safe vs. throwing queries + +Every query offers two execution styles: + +- **Safe** (`fetchSafe` / `fetchPageSafe` / `fetchAllPagesSafe`) — never throws; returns + `{ success, response, error }`. +- **Throwing** (`fetch` / `fetchPage` / `fetchAllPages`) — returns the response directly and throws on + failure. + +```typescript +// Safe — handle the result object +const { success, response, error } = await client.listContentItems().fetchPageSafe(); +if (success) { + console.log(response.payload.items); +} + +// Throwing — use try/catch +try { + const response = await client.listContentItems().fetchPage(); + console.log(response.payload.items); +} catch (error) { + // error is a DeliverySdkError +} +``` + +Use single-item queries with `fetch` / `fetchSafe`; paged queries (`listContentItems`, `listContentTypes`, +`listTaxonomies`, `listLanguages`, `itemsFeed`, …) with `fetchPage` / `fetchPageSafe` / +`fetchAllPages` / `fetchAllPagesSafe`. + +## Error handling + +Failures are reported as a `DeliverySdkError`. With safe queries, inspect `error` on the result; with +throwing queries, catch it. + +```typescript +const { success, error } = await client.fetchContentItem({ codename: "missing" }).fetchSafe(); + +if (!success) { + console.error(error.message); + console.error(error.details.reason); // e.g. "parsingFailed" +} +``` + +## Paging + +```typescript +// One page +const { response } = await client + .listContentItems({ query: { limit: 10, skip: 0 } }) + .fetchPageSafe(); + +console.log(response?.payload.items); + +// All pages at once +const { success, responses } = await client.listContentItems().fetchAllPagesSafe(); +if (success) { + const allItems = responses.flatMap((r) => r.payload.items); +} + +// Or iterate page-by-page +for await (const page of client.listContentItems().pages()) { + console.log(page.payload.items.length); +} +``` + +The `itemsFeed` query pages with a continuation token instead of skip/limit — pass it via the request +headers and read the next token from `response.meta.continuationToken`: + +```typescript +const { response } = await client + .itemsFeed({ headers: { "X-Continuation": "" } }) + .fetchPageSafe(); + +console.log(response?.meta.continuationToken); +``` + +## Strong typing + +Pass a `DeliveryClientSchema` to `createDeliveryClient` to narrow every codename, then describe each +content type with `ContentItemOf` and the `Elements` namespace. (We recommend generating both with +[`@kontent-ai/model-generator`](https://github.com/kontent-ai/model-generator-js) rather than writing them +by hand.) + +```typescript +import { createDeliveryClient, type ContentItemOf, type DeliveryClientSchema, type Elements } from "@kontent-ai/delivery-sdk"; + +type MySchema = DeliveryClientSchema<{ + readonly languageCodenames: readonly ["en-US"]; + readonly collectionCodenames: readonly ["default"]; + readonly workflowCodenames: readonly ["default"]; + readonly workflowStepCodenames: readonly ["published"]; + readonly taxonomies: { readonly genre: readonly ["action", "comedy"] }; + readonly contentTypes: { + readonly movie: readonly ["title", "stars"]; + readonly actor: readonly ["first_name"]; + }; +}>; + +type Actor = ContentItemOf; + +type Movie = ContentItemOf; +}>; + +const client = createDeliveryClient({ apiMode: "public", environmentId: "" }); +``` + +Codenames are now checked at compile time, and linked items are resolved onto each element's `items` +array (e.g. `movie.elements.stars.items` is `Actor[]`). + +## Type guards + +When a query returns items of mixed types, narrow each one to its typed model with a guard on +`system.type`: + +```typescript +import type { ContentItemPayload } from "@kontent-ai/delivery-sdk"; + +function isMovie(item: ContentItemPayload): item is Movie { + return item.system.type === "movie"; +} + +const { response } = await client.listContentItems().fetchPageSafe(); + +for (const item of response?.payload.items ?? []) { + if (isMovie(item)) { + console.log(item.elements.title.value); // typed as string + const stars = item.elements.stars.items; // resolved Actor[] + } +} +``` + +`@kontent-ai/model-generator` generates one of these guards (`isMovie`, `isActor`, …) per content type. + +## Runtime validation + +Optionally validate responses against the SDK's Zod schemas at runtime — handy for catching unexpected +payload shapes early: + +```typescript +const client = createDeliveryClient({ + apiMode: "public", + environmentId: "", + runtimeValidation: { validateResponses: true }, +}); +``` + +The schemas are also exported on their own subpath for standalone use: + +```typescript +import { listContentItemsSchema } from "@kontent-ai/delivery-sdk/schemas"; + +const result = await listContentItemsSchema().safeParseAsync(storedJson); +``` + ## License MIT From 1ab6cfa4b8d99d87a7a30b15af36735168b10900 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 11:41:18 +0200 Subject: [PATCH 212/221] Update README.md --- README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/README.md b/README.md index d18b224b..685e4647 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,36 @@ import { listContentItemsSchema } from "@kontent-ai/delivery-sdk/schemas"; const result = await listContentItemsSchema().safeParseAsync(storedJson); ``` +## Resolved linked items & serialization + +By default, content-item queries (`fetchContentItem`, `listContentItems`, `itemsFeed`) return an +**extended** response: every rich-text and linked-items (modular content) element is augmented with a +mapped `items` property holding the fully-resolved referenced items. This lets you traverse the content +tree directly instead of looking codenames up in `modular_content` yourself — `element.value` still holds +the referenced codenames, while `element.items` holds the resolved items. + +```typescript +const { response } = await client.listContentItems().fetchPageSafe(); +const movie = response?.payload.items[0]; + +const starCodenames = movie?.elements.stars.value; // string[] of codenames +const stars = movie?.elements.stars.items; // resolved items +``` + +Because resolved items can reference one another — possibly in a **circular** way — the extended response +is **not** safe to `JSON.stringify`. When you need to serialize the response (caching, SSR payloads, +sending it over the wire), use the query's `raw()` variant. It returns the plain API payload with **no** +resolved `items`; linked items remain referenced by codename in `modular_content`. + +```typescript +// Raw payload — safe to serialize (no resolved `items`, so no circular references) +const { response } = await client.listContentItems().raw().fetchPageSafe(); + +const json = JSON.stringify(response?.payload); // safe + +// In the raw payload, resolve linked items yourself from `payload.modular_content` when needed. +``` + ## License MIT From 3714d272b30ba364d3bd570f0965db8d23dbe7c9 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 13:54:11 +0200 Subject: [PATCH 213/221] deletes legacy code --- _legacy/.github/CODEOWNERS | 4 - _legacy/.github/workflows/test.yml | 16 - _legacy/.gitignore | 46 - _legacy/.npmignore | 15 - _legacy/.prettierrc | 11 - _legacy/.vscode/settings.json | 3 - _legacy/CHANGELOG.md | 1030 -- _legacy/LICENSE.md | 9 - _legacy/clean.ts | 10 - _legacy/eslint.config.mjs | 23 - _legacy/karma-gh-actions.conf.js | 56 - _legacy/karma.conf.js | 50 - _legacy/lib/client/delivery-client.factory.ts | 9 - _legacy/lib/client/delivery-client.ts | 163 - .../lib/client/idelivery-client.interface.ts | 110 - _legacy/lib/client/index.ts | 3 - _legacy/lib/config/delivery-configs.ts | 98 - _legacy/lib/config/index.ts | 1 - _legacy/lib/contracts/contracts.ts | 265 - _legacy/lib/contracts/index.ts | 1 - _legacy/lib/elements/element-models.ts | 89 - _legacy/lib/elements/element-resolver.ts | 3 - _legacy/lib/elements/element-type.ts | 16 - _legacy/lib/elements/elements.ts | 70 - _legacy/lib/elements/index.ts | 4 - ...mage-url-transformation-builder.factory.ts | 5 - .../image-url-transformation-builder.ts | 181 - _legacy/lib/images/image.models.ts | 4 - _legacy/lib/images/index.ts | 3 - _legacy/lib/index.ts | 12 - _legacy/lib/mappers/element.mapper.ts | 504 - _legacy/lib/mappers/generic-element.mapper.ts | 20 - _legacy/lib/mappers/index.ts | 8 - _legacy/lib/mappers/item.mapper.ts | 181 - _legacy/lib/mappers/language.mapper.ts | 24 - _legacy/lib/mappers/sync.mapper.ts | 32 - _legacy/lib/mappers/taxonomy.mapper.ts | 77 - _legacy/lib/mappers/type.mapper.ts | 76 - _legacy/lib/mappers/used-in.mapper.ts | 20 - _legacy/lib/models/common/base-responses.ts | 13 - _legacy/lib/models/common/common-models.ts | 118 - _legacy/lib/models/common/filters.ts | 280 - _legacy/lib/models/common/headers.ts | 5 - _legacy/lib/models/common/index.ts | 7 - _legacy/lib/models/common/pagination.class.ts | 7 - _legacy/lib/models/common/parameters.ts | 189 - _legacy/lib/models/common/sort-order.ts | 1 - _legacy/lib/models/content-type-models.ts | 42 - _legacy/lib/models/element-models.ts | 51 - _legacy/lib/models/index.ts | 9 - _legacy/lib/models/item-models.ts | 192 - _legacy/lib/models/language-models.ts | 17 - _legacy/lib/models/responses.ts | 137 - _legacy/lib/models/sync-models.ts | 18 - _legacy/lib/models/taxonomy-models.ts | 25 - .../common/base-item-listing-query.class.ts | 274 - .../query/common/base-listing-query.class.ts | 95 - _legacy/lib/query/common/base-query.class.ts | 148 - .../lib/query/element/element-query.class.ts | 45 - _legacy/lib/query/index.ts | 13 - .../query/item/multiple-items-query.class.ts | 183 - .../lib/query/item/single-item-query.class.ts | 106 - .../items-feed/items-feed-query.class.ts | 191 - .../query/language/languages-query.class.ts | 91 - .../query/sync/initialize-sync-query.class.ts | 83 - .../query/sync/sync-changes-query.class.ts | 56 - .../query/taxonomy/taxonomies-query.class.ts | 82 - .../query/taxonomy/taxonomy-query.class.ts | 50 - .../query/type/multiple-type-query.class.ts | 95 - .../lib/query/type/single-type-query.class.ts | 45 - .../lib/query/used-in/used-in-query.class.ts | 126 - _legacy/lib/sdk-info.generated.ts | 7 - .../services/base-delivery-query.service.ts | 375 - .../lib/services/delivery-query.service.ts | 336 - _legacy/lib/services/index.ts | 2 - _legacy/lib/services/mapping.service.ts | 223 - _legacy/lib/utilities/codename.helper.ts | 10 - _legacy/lib/utilities/delivery-url.helper.ts | 11 - _legacy/lib/utilities/enum.helper.ts | 38 - _legacy/lib/utilities/index.ts | 3 - _legacy/misc/set-sdk-version.ts | 4 - _legacy/misc/verify-sdk-version.ts | 5 - _legacy/misc/version-helper.ts | 31 - _legacy/package-lock.json | 11524 ---------------- _legacy/package.json | 95 - _legacy/readme.md | 531 - .../browser/client/delivery-client.spec.ts | 8 - .../isolated-tests/core/base-url.spec.ts | 42 - .../isolated-tests/core/core-headers.spec.ts | 25 - .../core/global-headers.spec.ts | 55 - .../core/global-query-headers.spec.ts | 49 - .../core/preview-headers.spec.ts | 49 - .../isolated-tests/core/preview-url.spec.ts | 23 - .../core/preview-with-secured-mode.spec.ts | 18 - .../isolated-tests/core/proxy-url-spec.ts | 41 - .../core/secured-api-headers.spec.ts | 49 - ...ait-for-loading-new-content-header.spec.ts | 58 - .../elements/assets/asset-rendition.spec.json | 81 - .../elements/assets/asset-rendition.spec.ts | 136 - .../assets/custom-assets-domain.spec.ts | 52 - .../custom-element-with-custom-model.spec.ts | 83 - .../custom-element/custom-element.spec.json | 48 - .../custom-element/custom-element.spec.ts | 30 - .../elements/rich-text/rich-text.spec.json | 160 - .../elements/rich-text/rich-text.spec.ts | 40 - .../unknown-element/unknown-element.spec.json | 30 - .../unknown-element/unknown-element.spec.ts | 22 - .../items-feed/items-feed-all.spec.json | 245 - .../items-feed/items-feed-all.spec.ts | 34 - .../endpoints/items-feed/items-feed.spec.json | 245 - .../endpoints/items-feed/items-feed.spec.ts | 33 - ...-referenced-linked-items-mapping.spec.json | 91 - ...ar-referenced-linked-items-mapping.spec.ts | 76 - .../items/items-list-response.spec.json | 40 - .../items/items-list-response.spec.ts | 45 - ...d-names-in-linked-items-response.spec.json | 65 - ...ved-names-in-linked-items-response.spec.ts | 45 - ...ist-with-reserved-names-response.spec.json | 41 - ...-list-with-reserved-names-response.spec.ts | 45 - .../items/items-with-total-count.spec.json | 41 - .../items/items-with-total-count.spec.ts | 34 - .../items/items-without-total-count.spec.json | 40 - .../items/items-without-total-count.spec.ts | 34 - .../languages/list-languages.spec.json | 423 - .../languages/list-languages.spec.ts | 30 - .../endpoints/sync/initialize-sync.spec.json | 45 - .../endpoints/sync/initialize-sync.spec.ts | 44 - .../endpoints/sync/sync-changes.spec.json | 45 - .../endpoints/sync/sync-changes.spec.ts | 44 - .../endpoints/used-in/used-in-all.spec.json | 17 - .../endpoints/used-in/used-in-all.spec.ts | 49 - .../endpoints/used-in/used-in.spec.json | 17 - .../endpoints/used-in/used-in.spec.ts | 59 - .../fake-data/fake-warrior-response.json | 255 - ...warrior-without-modular-data-response.json | 120 - .../http/custom-http-service.spec.ts | 80 - .../images/image-url-builder.spec.ts | 111 - .../query/custom-headers.spec.ts | 30 - .../isolated-tests/query/query-config.spec.ts | 29 - .../query/query-custom-parameter.spec.ts | 24 - .../query/query-initialization.spec.ts | 29 - .../query/query-url-debug.spec.ts | 44 - .../wait-for-loading-new-content.spec.ts | 57 - .../isolated-tests/response/item.spec.ts | 151 - .../linked-items-mapping-disabled.spec.ts | 72 - .../linked-items-mapping-enabled.spec.ts | 72 - .../linked-items-mapping.json | 93 - .../services/generic-element-mapper.spec.ts | 12 - .../services/mapping-service.spec.json | 143 - .../services/mapping-service.spec.ts | 26 - .../services/taxonomy-mapper.spec.ts | 23 - .../services/type-mapper.spec.ts | 17 - .../isolated-tests/url/item-filters.ts | 274 - .../url/item-url-parameters.spec.ts | 152 - .../isolated-tests/url/item-url.spec.ts | 26 - .../isolated-tests/url/taxonomies-url.spec.ts | 14 - .../isolated-tests/url/type-url.spec.ts | 29 - .../live-tests/custom-url/custom-url.spec.ts | 19 - .../live-tests/element/live-element.spec.ts | 40 - .../live-tests/errors/kontent-error.spec.ts | 37 - .../item/live-item-base-linked-items.spec.ts | 23 - .../browser/live-tests/item/live-item.spec.ts | 93 - .../items-feed/live-items-feed-all.spec.ts | 33 - .../items-feed/live-items-feed.spec.ts | 25 - .../live-tests/items/live-items-all.spec.ts | 46 - .../live-tests/items/live-items.spec.ts | 30 - .../localization-default-language.spec.ts | 33 - .../localization/localized-item.spec.ts | 24 - .../mapping/live-mapping.service.spec.ts | 30 - .../network-response/network-response.spec.ts | 25 - .../live-tests/pagination/pagination.spec.ts | 36 - .../promise/response-by-promise.spec.ts | 26 - _legacy/test/browser/live-tests/readme.md | 3 - .../taxonomy/live-taxonomies.spec.ts | 74 - .../live-tests/taxonomy/live-taxonomy.spec.ts | 50 - .../live-tests/types/live-type.spec.ts | 54 - .../live-tests/types/live-types.spec.ts | 37 - _legacy/test/browser/setup/context.ts | 54 - .../browser/setup/delivery-test-client.ts | 76 - _legacy/test/browser/setup/index.ts | 4 - _legacy/test/browser/setup/models.ts | 55 - _legacy/test/browser/setup/setup.ts | 54 - _legacy/test/node/base/base-node-test.js | 30 - _legacy/tsconfig.json | 30 - _legacy/tsconfig.prod.json | 6 - _legacy/tsconfig.webpack.json | 6 - _legacy/webpack.config.js | 58 - 187 files changed, 25261 deletions(-) delete mode 100644 _legacy/.github/CODEOWNERS delete mode 100644 _legacy/.github/workflows/test.yml delete mode 100644 _legacy/.gitignore delete mode 100644 _legacy/.npmignore delete mode 100644 _legacy/.prettierrc delete mode 100644 _legacy/.vscode/settings.json delete mode 100644 _legacy/CHANGELOG.md delete mode 100644 _legacy/LICENSE.md delete mode 100644 _legacy/clean.ts delete mode 100644 _legacy/eslint.config.mjs delete mode 100644 _legacy/karma-gh-actions.conf.js delete mode 100644 _legacy/karma.conf.js delete mode 100644 _legacy/lib/client/delivery-client.factory.ts delete mode 100644 _legacy/lib/client/delivery-client.ts delete mode 100644 _legacy/lib/client/idelivery-client.interface.ts delete mode 100644 _legacy/lib/client/index.ts delete mode 100644 _legacy/lib/config/delivery-configs.ts delete mode 100644 _legacy/lib/config/index.ts delete mode 100644 _legacy/lib/contracts/contracts.ts delete mode 100644 _legacy/lib/contracts/index.ts delete mode 100644 _legacy/lib/elements/element-models.ts delete mode 100644 _legacy/lib/elements/element-resolver.ts delete mode 100644 _legacy/lib/elements/element-type.ts delete mode 100644 _legacy/lib/elements/elements.ts delete mode 100644 _legacy/lib/elements/index.ts delete mode 100644 _legacy/lib/images/image-url-transformation-builder.factory.ts delete mode 100644 _legacy/lib/images/image-url-transformation-builder.ts delete mode 100644 _legacy/lib/images/image.models.ts delete mode 100644 _legacy/lib/images/index.ts delete mode 100644 _legacy/lib/index.ts delete mode 100644 _legacy/lib/mappers/element.mapper.ts delete mode 100644 _legacy/lib/mappers/generic-element.mapper.ts delete mode 100644 _legacy/lib/mappers/index.ts delete mode 100644 _legacy/lib/mappers/item.mapper.ts delete mode 100644 _legacy/lib/mappers/language.mapper.ts delete mode 100644 _legacy/lib/mappers/sync.mapper.ts delete mode 100644 _legacy/lib/mappers/taxonomy.mapper.ts delete mode 100644 _legacy/lib/mappers/type.mapper.ts delete mode 100644 _legacy/lib/mappers/used-in.mapper.ts delete mode 100644 _legacy/lib/models/common/base-responses.ts delete mode 100644 _legacy/lib/models/common/common-models.ts delete mode 100644 _legacy/lib/models/common/filters.ts delete mode 100644 _legacy/lib/models/common/headers.ts delete mode 100644 _legacy/lib/models/common/index.ts delete mode 100644 _legacy/lib/models/common/pagination.class.ts delete mode 100644 _legacy/lib/models/common/parameters.ts delete mode 100644 _legacy/lib/models/common/sort-order.ts delete mode 100644 _legacy/lib/models/content-type-models.ts delete mode 100644 _legacy/lib/models/element-models.ts delete mode 100644 _legacy/lib/models/index.ts delete mode 100644 _legacy/lib/models/item-models.ts delete mode 100644 _legacy/lib/models/language-models.ts delete mode 100644 _legacy/lib/models/responses.ts delete mode 100644 _legacy/lib/models/sync-models.ts delete mode 100644 _legacy/lib/models/taxonomy-models.ts delete mode 100644 _legacy/lib/query/common/base-item-listing-query.class.ts delete mode 100644 _legacy/lib/query/common/base-listing-query.class.ts delete mode 100644 _legacy/lib/query/common/base-query.class.ts delete mode 100644 _legacy/lib/query/element/element-query.class.ts delete mode 100644 _legacy/lib/query/index.ts delete mode 100644 _legacy/lib/query/item/multiple-items-query.class.ts delete mode 100644 _legacy/lib/query/item/single-item-query.class.ts delete mode 100644 _legacy/lib/query/items-feed/items-feed-query.class.ts delete mode 100644 _legacy/lib/query/language/languages-query.class.ts delete mode 100644 _legacy/lib/query/sync/initialize-sync-query.class.ts delete mode 100644 _legacy/lib/query/sync/sync-changes-query.class.ts delete mode 100644 _legacy/lib/query/taxonomy/taxonomies-query.class.ts delete mode 100644 _legacy/lib/query/taxonomy/taxonomy-query.class.ts delete mode 100644 _legacy/lib/query/type/multiple-type-query.class.ts delete mode 100644 _legacy/lib/query/type/single-type-query.class.ts delete mode 100644 _legacy/lib/query/used-in/used-in-query.class.ts delete mode 100644 _legacy/lib/sdk-info.generated.ts delete mode 100644 _legacy/lib/services/base-delivery-query.service.ts delete mode 100644 _legacy/lib/services/delivery-query.service.ts delete mode 100644 _legacy/lib/services/index.ts delete mode 100644 _legacy/lib/services/mapping.service.ts delete mode 100644 _legacy/lib/utilities/codename.helper.ts delete mode 100644 _legacy/lib/utilities/delivery-url.helper.ts delete mode 100644 _legacy/lib/utilities/enum.helper.ts delete mode 100644 _legacy/lib/utilities/index.ts delete mode 100644 _legacy/misc/set-sdk-version.ts delete mode 100644 _legacy/misc/verify-sdk-version.ts delete mode 100644 _legacy/misc/version-helper.ts delete mode 100644 _legacy/package-lock.json delete mode 100644 _legacy/package.json delete mode 100644 _legacy/readme.md delete mode 100644 _legacy/test/browser/client/delivery-client.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/base-url.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/core-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/global-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/preview-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/preview-url.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/proxy-url-spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json delete mode 100644 _legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json delete mode 100644 _legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/custom-headers.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/query-config.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/query-initialization.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/response/item.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json delete mode 100644 _legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/services/mapping-service.spec.json delete mode 100644 _legacy/test/browser/isolated-tests/services/mapping-service.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/services/type-mapper.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/url/item-filters.ts delete mode 100644 _legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/url/item-url.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts delete mode 100644 _legacy/test/browser/isolated-tests/url/type-url.spec.ts delete mode 100644 _legacy/test/browser/live-tests/custom-url/custom-url.spec.ts delete mode 100644 _legacy/test/browser/live-tests/element/live-element.spec.ts delete mode 100644 _legacy/test/browser/live-tests/errors/kontent-error.spec.ts delete mode 100644 _legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts delete mode 100644 _legacy/test/browser/live-tests/item/live-item.spec.ts delete mode 100644 _legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts delete mode 100644 _legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts delete mode 100644 _legacy/test/browser/live-tests/items/live-items-all.spec.ts delete mode 100644 _legacy/test/browser/live-tests/items/live-items.spec.ts delete mode 100644 _legacy/test/browser/live-tests/localization/localization-default-language.spec.ts delete mode 100644 _legacy/test/browser/live-tests/localization/localized-item.spec.ts delete mode 100644 _legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts delete mode 100644 _legacy/test/browser/live-tests/network-response/network-response.spec.ts delete mode 100644 _legacy/test/browser/live-tests/pagination/pagination.spec.ts delete mode 100644 _legacy/test/browser/live-tests/promise/response-by-promise.spec.ts delete mode 100644 _legacy/test/browser/live-tests/readme.md delete mode 100644 _legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts delete mode 100644 _legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts delete mode 100644 _legacy/test/browser/live-tests/types/live-type.spec.ts delete mode 100644 _legacy/test/browser/live-tests/types/live-types.spec.ts delete mode 100644 _legacy/test/browser/setup/context.ts delete mode 100644 _legacy/test/browser/setup/delivery-test-client.ts delete mode 100644 _legacy/test/browser/setup/index.ts delete mode 100644 _legacy/test/browser/setup/models.ts delete mode 100644 _legacy/test/browser/setup/setup.ts delete mode 100644 _legacy/test/node/base/base-node-test.js delete mode 100644 _legacy/tsconfig.json delete mode 100644 _legacy/tsconfig.prod.json delete mode 100644 _legacy/tsconfig.webpack.json delete mode 100644 _legacy/webpack.config.js diff --git a/_legacy/.github/CODEOWNERS b/_legacy/.github/CODEOWNERS deleted file mode 100644 index e6444fd6..00000000 --- a/_legacy/.github/CODEOWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths. -# See https://help.github.com/articles/about-code-owners/ - -* @IvanKiral @Enngage @kontent-ai/javascript-maintainers diff --git a/_legacy/.github/workflows/test.yml b/_legacy/.github/workflows/test.yml deleted file mode 100644 index a0ec0cc2..00000000 --- a/_legacy/.github/workflows/test.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Test -on: [pull_request] -jobs: - build: - runs-on: windows-latest - strategy: - matrix: - node-version: [14.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/_legacy/.gitignore b/_legacy/.gitignore deleted file mode 100644 index 45b8a0ae..00000000 --- a/_legacy/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# Custom -.editorconfig - -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/coverage -/out-tsc - -# dependencies -/node_modules - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -testem.log -/typings - -# e2e -/e2e/*.js -/e2e/*.map - -# System Files -.DS_Store -Thumbs.db diff --git a/_legacy/.npmignore b/_legacy/.npmignore deleted file mode 100644 index 79e1373f..00000000 --- a/_legacy/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -# Ignore everything -* - -# But descend into directories - -# Recursively allow files under subtree -!/lib/** -!/dist/** -!package.json -!.npmignore -!README.md -!LICENSE.md - - - diff --git a/_legacy/.prettierrc b/_legacy/.prettierrc deleted file mode 100644 index 71f32090..00000000 --- a/_legacy/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "singleQuote": true, - "printWidth": 120, - "proseWrap": "always", - "tabWidth": 4, - "requireConfig": false, - "useTabs": false, - "trailingComma": "none", - "bracketSpacing": true, - "semi": true -} \ No newline at end of file diff --git a/_legacy/.vscode/settings.json b/_legacy/.vscode/settings.json deleted file mode 100644 index 3fa5069d..00000000 --- a/_legacy/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules\\typescript\\lib", -} \ No newline at end of file diff --git a/_legacy/CHANGELOG.md b/_legacy/CHANGELOG.md deleted file mode 100644 index f67e36c7..00000000 --- a/_legacy/CHANGELOG.md +++ /dev/null @@ -1,1030 +0,0 @@ -# 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. - -## [16.4.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.3.0...v16.4.0) (2025-11-11) - - -### Features - -* updates deps ([3815581](https://github.com/kontent-ai/delivery-sdk-js/commit/3815581bd075aad53e934078d118fb6580bb13d9)) - -## [16.3.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.2.1...v16.3.0) (2025-08-05) - - -### Features - -* updates deps ([f4b306b](https://github.com/kontent-ai/delivery-sdk-js/commit/f4b306bd79f9088b64635a81002572a514bc0236)) - -### [16.2.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.2.0...v16.2.1) (2025-07-03) - -## [16.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.1.0...v16.2.0) (2025-04-30) - - -### Features - -* updates deps ([0d72545](https://github.com/kontent-ai/delivery-sdk-js/commit/0d72545bf8d3aea85731ae279f63d0937fbabff1)) - - -### Bug Fixes - -* **models:** correct typo in workflowStepCodenames property ([58428fd](https://github.com/kontent-ai/delivery-sdk-js/commit/58428fdc16cccd94e4ec84c93b8e2bd0cb68762c)) - -## [16.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.0.0...v16.1.0) (2025-04-10) - - -### Features - -* Adds delivery client types to items feed query ([f834b31](https://github.com/kontent-ai/delivery-sdk-js/commit/f834b3171b3f0c51c54bf90a343ba33fcca8b279)) -* Adds support for asset/item used queries ([a321d40](https://github.com/kontent-ai/delivery-sdk-js/commit/a321d40f2ff9f1848f98750750fa0c200259bbb1)) -* updates deps ([5e52ac6](https://github.com/kontent-ai/delivery-sdk-js/commit/5e52ac63bc8d6171fd003f74d0ee2c5418a82b1e)) - -## [16.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v16.0.0-0...v16.0.0) (2025-03-11) - - -### Features - -* adds support for client generics, improving type safety ([89cbc39](https://github.com/kontent-ai/delivery-sdk-js/commit/89cbc3972af5b9d38648afb47b933cb11b2e21e1)) -* updates deps ([7f957d0](https://github.com/kontent-ai/delivery-sdk-js/commit/7f957d0d868e758eda03efed979a926c401d03a1)) - -## [16.0.0-0](https://github.com/kontent-ai/delivery-sdk-js/compare/v15.2.0...v16.0.0-0) (2025-02-13) - - -### Features - -* adds support for client generics, improving type safety in combination with model generator ([d45a0e3](https://github.com/kontent-ai/delivery-sdk-js/commit/d45a0e385e3ddc2b88805ef7c69725c5fdf84f18)) -* removes url-parse package in favor of native URL class ([34bfe8f](https://github.com/kontent-ai/delivery-sdk-js/commit/34bfe8f93df1f801948f4f948f6de0671d4cc524)) -* updates deps ([6335bba](https://github.com/kontent-ai/delivery-sdk-js/commit/6335bbaa49e92a75ae34bfda22844c217b36d31a)) - - -### Bug Fixes - -* package.json & package-lock.json to reduce vulnerabilities ([da3b536](https://github.com/kontent-ai/delivery-sdk-js/commit/da3b536e4b1c99344f3ecb7135257136f07c587c)) - -## [15.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v15.1.1...v15.2.0) (2024-09-27) - - -### Features - -* exports optional 'Snippet' type used for strongly typed modelling ([96ef2d5](https://github.com/kontent-ai/delivery-sdk-js/commit/96ef2d5b708a83006917bdd9d985035cae079445)) - -### [15.1.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v15.1.0...v15.1.1) (2024-09-27) - - -### Bug Fixes - -* re-exports IContentItemElements type ([ddc570f](https://github.com/kontent-ai/delivery-sdk-js/commit/ddc570f9d34bcc7db555cd093f98d9144b67ce94)) - -## [15.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v15.0.0...v15.1.0) (2024-09-26) - - -### Features - -* Adds support for constraining item element properties using pre-defined codenames type ([c7b16b7](https://github.com/kontent-ai/delivery-sdk-js/commit/c7b16b7e70c4ea223e432a76bc059ba94916bc58)) -* updates deps ([03fdc22](https://github.com/kontent-ai/delivery-sdk-js/commit/03fdc22f153d573fc4b0d8bc483795cbafb9a1b5)) - -## [15.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v15.0.0-0...v15.0.0) (2024-09-16) - -### Features - -- updates deps - ([7d0618c](https://github.com/kontent-ai/delivery-sdk-js/commit/7d0618c708530d161fc1febc4e6b89e7819e48cd)) - -## [15.0.0-0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.11.0...v15.0.0-0) (2024-09-10) - -### ⚠ BREAKING CHANGES - -- Removes parser & rich text resolver. To work with RTE use the newer and better `@kontent-ai/rich-text-resolver` - library instead. -- Removes `propertyName` resolver configuration. All elements are now referenced only by their codenames present in - Kontent.ai - -### Features - -- Adds narrowing types for Taxonomy & Multiple choice elements - ([3118752](https://github.com/kontent-ai/delivery-sdk-js/commit/3118752e05fe27f09b72c7bab21804b114fa057e)) -- Adds optional generic types to `IContentItem` narrowing down available values of system attributes - ([8c894af](https://github.com/kontent-ai/delivery-sdk-js/commit/8c894afde62ee2ed40b44fbebc9dd9b8891115c5)) -- Makes `RichTextElement` take generic parameter narrowing down allowed types of linked items - ([68b31a8](https://github.com/kontent-ai/delivery-sdk-js/commit/68b31a81431646a7ab06647652592b81d075527b)) -- Removes `propertyName` resolver configuration. All elements are now referenced only by their codenames present in - Kontent.ai - ([7ef5951](https://github.com/kontent-ai/delivery-sdk-js/commit/7ef5951c505b1acf2424c99255f435aa1a26a53e)) -- Removes parser & rich text resolver. To work with RTE use the newer and better `@kontent-ai/rich-text-resolver` - library instead. - ([2bd30c3](https://github.com/kontent-ai/delivery-sdk-js/commit/2bd30c3d4527b470848984d70e03136c2e01885e)) -- updates deps - ([82c2c11](https://github.com/kontent-ai/delivery-sdk-js/commit/82c2c115482b0ee5ab74e3a94d9e8ebb55112532)) - -### Upgrading to new RTE parser - -In `< 15.0.0` versions of this SDK you were able to resolve RTE elements like this: - -```typescript -import { createRichTextHtmlResolver, createDeliveryClient, linkedItemsHelper } from '@kontent-ai/delivery-sdk'; - -export type Movie = IContentItem<{ - plot: Elements.RichTextElement; -}>; - -export type Actor = IContentItem<{ - firstName: Elements.RichTextElement; -}>; - -// get content item with rich text element -const response = ( - await createDeliveryClient({ environmentId: '' }).item('itemCodename').toPromise() -).data; - -// get rich text element -const richTextElement = response.item.plot; - -// resolve HTML -const resolvedRichText = createRichTextHtmlResolver().resolveRichText({ - element: richTextElement, - linkedItems: linkedItemsHelper.convertLinkedItemsToArray(response.data.linkedItems), - imageResolver: (imageId, image) => { - return { - imageHtml: ``, - // alternatively you may return just url - imageUrl: 'customUrl' - }; - }, - urlResolver: (linkId, linkText, link) => { - return { - linkHtml: `${link?.link?.urlSlug}`, - // alternatively you may return just url - linkUrl: 'customUrl' - }; - }, - contentItemResolver: (itemId, contentItem) => { - if (contentItem && contentItem.system.type === 'actor') { - const actor = contentItem as Actor; - return { - contentItemHtml: `
${actor.elements.firstName.value}
` - }; - } - - return { - contentItemHtml: '' - }; - } -}); - -const resolvedHtml = resolvedRichText.html; -``` - -But since this resolver is now removed in `>= 15.0.0` you need to resolve RTE using the `@kontent-ai/rich-text-resolver` -package: - -```typescript -import { createDeliveryClient, Elements, IContentItem } from '@kontent-ai/delivery-sdk'; -import { PortableTextOptions, toHTML } from '@portabletext/to-html'; -import { nodeParse, transformToPortableText, resolveTable, resolveImage } from '@kontent-ai/rich-text-resolver'; - -type Movie = IContentItem<{ - title: Elements.TextElement; - plot: Elements.RichTextElement; -}>; - -type Actor = IContentItem<{ - first_name: Elements.RichTextElement; -}>; - -const itemResponse = await createDeliveryClient({ - environmentId: 'da5abe9f-fdad-4168-97cd-b3464be2ccb9' -}) - .item('warrior') - .toPromise(); - -const richTextElement = itemResponse.data.item.elements.plot; - -const linkedItems = Object.values(itemResponse.data.linkedItems); -const parsedTree = nodeParse(richTextElement.value); -const portableText = transformToPortableText(parsedTree); - -const portableTextComponents: PortableTextOptions = { - components: { - types: { - image: ({ value }) => { - return resolveImage(value, (image) => { - return ``; - }); - }, - component: ({ value }) => { - const linkedItem = linkedItems.find((item) => item.system.codename === value.component._ref); - switch (linkedItem?.system.type) { - case 'actor': { - const actor = linkedItem as Actor; - return `
${actor.elements.first_name.value}
`; - } - default: { - return `Resolver for type ${linkedItem?.system.type} not implemented.`; - } - } - }, - table: ({ value }) => { - // default impl - return resolveTable(value, toHTML); - } - }, - marks: { - internalLink: ({ children, value }) => { - return `${children}`; - } - } - } -}; - -const resolvedHtml = toHTML(portableText, portableTextComponents); -``` - -## [14.11.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.10.0...v14.11.0) (2024-08-15) - -### Features - -- updates deps (& fixes Axios vulnerability), updates eslint config - ([ba49770](https://github.com/kontent-ai/delivery-sdk-js/commit/ba497700f460c43d2ea18db9b669cdd246112049)) - -## [14.10.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.9.0...v14.10.0) (2024-06-28) - -### Features - -- updates deps - ([769173b](https://github.com/kontent-ai/delivery-sdk-js/commit/769173b6c6b30d3524d5b065cc20b2b1eb3ac7c5)) - -## [14.9.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.8.0...v14.9.0) (2024-04-29) - -### Features - -- updates deps - ([f6c2a2f](https://github.com/kontent-ai/delivery-sdk-js/commit/f6c2a2f44a7830b300c65440f9139e44f5fa5ae8)) - -## [14.8.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.7.0...v14.8.0) (2024-03-06) - -### Features - -- adds support for 'excludeElements' parameter (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/389) - ([64a2b17](https://github.com/kontent-ai/delivery-sdk-js/commit/64a2b17c9c461a0e0a58e96860a111e3dec20e5d)) -- updates deps, adds clean script, updates engine version to >= v18 - ([6135b03](https://github.com/kontent-ai/delivery-sdk-js/commit/6135b035d59f05bb41e9208ca9c02a81d61700c2)) - -## [14.7.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.6.0...v14.7.0) (2024-02-29) - -### Features - -- updates deps (and fixes https://github.com/kontent-ai/delivery-sdk-js/issues/387) - ([4d9df4b](https://github.com/kontent-ai/delivery-sdk-js/commit/4d9df4b30ac897448ed762311c887e58b5fb6f20)) - -### Bug Fixes - -- escapes codenames to prevent collisions with javascript constructs (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/388) - ([c5ea589](https://github.com/kontent-ai/delivery-sdk-js/commit/c5ea58924fd0113003999432e15a82f46ac88e6b)) - -## [14.6.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.5.0...v14.6.0) (2023-12-19) - -### Features - -- Adds 'workflow' to system attributes - ([6a0bf11](https://github.com/kontent-ai/delivery-sdk-js/commit/6a0bf11f45de93f87774f1d1b1b682c0df2b5c35)) - -## [14.5.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.4.0...v14.5.0) (2023-11-16) - -### Features - -- updates deps (core-sdk with updated axios) (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/382) - ([df83fdd](https://github.com/kontent-ai/delivery-sdk-js/commit/df83fdde6c730702f7567d5b1d43a59b9a463045)) - -## [14.4.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.3.1...v14.4.0) (2023-08-21) - -### Features - -- Adds 'excludeArchivedItems' client configuration & fixes element endpoint mapping due to API change - ([19f3fff](https://github.com/kontent-ai/delivery-sdk-js/commit/19f3fff6ae50ccf81d7dcf49a81329ad3c7c8a09)) -- updates deps & increases required node version - ([4b0dee3](https://github.com/kontent-ai/delivery-sdk-js/commit/4b0dee3f8c3050d3283c12038dad0755a2d5aa98)) - -### [14.3.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.3.0...v14.3.1) (2023-08-02) - -### Bug Fixes - -- Reverts language codename check (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/372) - ([227ec5f](https://github.com/kontent-ai/delivery-sdk-js/commit/227ec5f5c3b58784f612672b57676b34bd240bda)) - -## [14.3.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.2.0...v14.3.0) (2023-07-31) - -### Features - -- updates deps, migrates to eslint, adds migrate related code fixes - ([288cbb7](https://github.com/kontent-ai/delivery-sdk-js/commit/288cbb7ed6a853fce11383ab5f7475fe45758233)) - -### Bug Fixes - -- typos ([3702502](https://github.com/kontent-ai/delivery-sdk-js/commit/3702502f6519e499f51ed2bf09f362d1667cc6ec)) - -## [14.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.1.0...v14.2.0) (2023-06-02) - -### Features - -- adds support for linking items across responses when using toAllPromise items endpoint - ([67e8e16](https://github.com/kontent-ai/delivery-sdk-js/commit/67e8e1653194b0b1e425ff390a094b29e7d4c1ff)) -- updates dependencies - ([b83b3bd](https://github.com/kontent-ai/delivery-sdk-js/commit/b83b3bdbfb799857e1b2804d3afebd3b4693cb20)) - -## [14.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.0.1...v14.1.0) (2023-05-16) - -### Features - -- rangeFilter now accepts strings, other comparison filters now accept numbers - ([14e53e8](https://github.com/kontent-ai/delivery-sdk-js/commit/14e53e86c93625faaa955e7570bdf8bf6c5f609b)) -- updates deps - ([3723aa0](https://github.com/kontent-ai/delivery-sdk-js/commit/3723aa020f4b83420883ba36dda0188c6fc1268a)) - -### Bug Fixes - -- Preserves linked items order when using items-feed with item mapping - ([e62d261](https://github.com/kontent-ai/delivery-sdk-js/commit/e62d261356112a6378d09399ed2b8cf67e866f1c)) - -### [14.0.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v14.0.0...v14.0.1) (2023-04-12) - -### Bug Fixes - -- fixes sync endpoint URL (removes early-access) - ([0fa47b1](https://github.com/kontent-ai/delivery-sdk-js/commit/0fa47b1580380cc0ad27faadc77140d152e37628)) - -## [14.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v13.0.0...v14.0.0) (2023-04-12) - -### âš  BREAKING CHANGES - -- Renames `project_id` to `environment_id` across entire library - -## [13.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.4.3...v13.0.0) (2023-04-12) - -### âš  BREAKING CHANGES - -- Implements new Sync API models (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/363) -- Uses new URL for Sync API endpoints - -### Features - -- adds automatic object linking for linked items / rich text elements in items feed query - ([c246d31](https://github.com/kontent-ai/delivery-sdk-js/commit/c246d31161d1a058f6f81a131eb3907ecc5d9b34)) -- Implements new Sync API models (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/363) - ([28e6f11](https://github.com/kontent-ai/delivery-sdk-js/commit/28e6f11d74f858d6ab14c53b5768eb9e58873d4e)) -- updates all dependencies - ([4bde5e1](https://github.com/kontent-ai/delivery-sdk-js/commit/4bde5e1cea18549dbb1341b1761e7e8c480242e1)) -- updates dev dependencies - ([1c5cc70](https://github.com/kontent-ai/delivery-sdk-js/commit/1c5cc707ebb519f8eeec5bd62c00034ebd042c41)) -- Uses new URL for Sync API endpoints - ([55fbc11](https://github.com/kontent-ai/delivery-sdk-js/commit/55fbc11b1cd519cf9b1e6c92ca3d2c6a57a16959)) - -### [12.4.3](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.4.2...v12.4.3) (2023-02-20) - -### Bug Fixes - -- Handles '+' sign in name resolvers - ([e30f235](https://github.com/kontent-ai/delivery-sdk-js/commit/e30f23558b790b8c046e26e37889d29a03bd2422)) - -### [12.4.2](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.4.1...v12.4.2) (2022-11-21) - -- Adds support for timezone in date elements - -### [12.4.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.4.0...v12.4.1) (2022-11-01) - -### Bug Fixes - -- fixes query configuration for initialize sync POST request - ([42f317c](https://github.com/kontent-ai/delivery-sdk-js/commit/42f317cf3828b421188bccfb102a0a89077d4cea)) - -## [12.4.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.3.0...v12.4.0) (2022-10-27) - -### Features - -- Adds support for 'Sync API' - Initialize sync & sync changes endpoints - ([60d4198](https://github.com/kontent-ai/delivery-sdk-js/commit/60d41980e9d4babd3e9f613135f48185915103b1)) -- updates dev dependencies - ([b6b3d16](https://github.com/kontent-ai/delivery-sdk-js/commit/b6b3d16855e2ffc40d1a64c1d80da1068e64e0f0)) - -### Bug Fixes - -- fixes mapping of view content type element query - ([8c14c39](https://github.com/kontent-ai/delivery-sdk-js/commit/8c14c393de78a920570de4e0f37694b49df78615)) - -## [12.3.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.2.0...v12.3.0) (2022-10-05) - -### Features - -- updates dependencies - ([b8b85e3](https://github.com/kontent-ai/delivery-sdk-js/commit/b8b85e32b09880fa994b4f97f66c62f33eac0e5c)) - -## [12.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.1.0...v12.2.0) (2022-09-23) - -### Features - -- Preservers the order of mapped linkedItems in RTE - ([5d9db00](https://github.com/kontent-ai/delivery-sdk-js/commit/5d9db0079b1ea87f6225fe225eb1e772ad79743b)) -- Updates dependencies - ([0a4d0bf](https://github.com/kontent-ai/delivery-sdk-js/commit/0a4d0bf83863a2acb453b48ef34a5a4a7cf08a97)) - -## [12.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.0.2...v12.1.0) (2022-09-01) - -### Features - -- Handle commas & semicolons in name resolvers - ([d990dcf](https://github.com/kontent-ai/delivery-sdk-js/commit/d990dcf8f976408efeca7692d05a9ad1f77a4279)) - -### [12.0.2](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.0.1...v12.0.2) (2022-07-21) - -### Bug Fixes - -- Handle '/' character in property name resolvers - ([9ed6c77](https://github.com/kontent-ai/delivery-sdk-js/commit/9ed6c771129fb97e5e68708295fe9277be728380)) - -### [12.0.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.0.0...v12.0.1) (2022-07-15) - -### Bug Fixes - -- escapes property name regex to prevent unintended escaping caused by angular CLI - ([0913986](https://github.com/kontent-ai/delivery-sdk-js/commit/0913986809a73fc09cda47a1acffe2352e3415cc)) - -## [12.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v12.0.0-0...v12.0.0) (2022-07-14) - -## [12.0.0-0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.13.0...v12.0.0-0) (2022-07-14) - -## [11.13.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.7.0...v11.13.0) (2022-05-23) - -### Features - -- Adds underscore to name resolver when it starts with a number - ([5a624e3](https://github.com/kontent-ai/delivery-sdk-js/commit/5a624e3f59626f7b6c6bb94b9730f1c3edf2f721)) -- Automatically removes zero width characters from name resolvers - ([fbf07aa](https://github.com/kontent-ai/delivery-sdk-js/commit/fbf07aab776050ba006d1bc8a8d562679ce2dcfe)) -- convert snake case name resolver to lowercase only text - ([df39537](https://github.com/kontent-ai/delivery-sdk-js/commit/df395375f679a893b2d29b5409c4a0a3c2e6576d)) -- Handles '&' in property name resolver - ([e82ae6d](https://github.com/kontent-ai/delivery-sdk-js/commit/e82ae6d82662fda9786d26b6cebc6480fb95bc98)) -- Handles brackets in property name resolver - ([946db34](https://github.com/kontent-ai/delivery-sdk-js/commit/946db349de6a4add3a614e44daaab17720281011)) -- Improves property name resolvers by handling more special characters and unifies the regex across all name resolvers - ([d153e81](https://github.com/kontent-ai/delivery-sdk-js/commit/d153e81ff2d3114d31ae016bc9d8c3073571da94)) -- updates dependencies - ([5830491](https://github.com/kontent-ai/delivery-sdk-js/commit/5830491080767f22b49763051fda89c86f500b47)) -- updates dependencies - ([a373528](https://github.com/kontent-ai/delivery-sdk-js/commit/a373528b6f6167ebcf9b6c2e5395b1ba0d061bd2)) - -### Bug Fixes - -- fixes property name resolver to cover cases with mixed upper/lower case strings - ([66918c9](https://github.com/kontent-ai/delivery-sdk-js/commit/66918c99b6da2d94d7115baa581669ccb7fd048c)) -- Properly sets query headers (some headers were not applied which caused issues especially in combination with - paging) ([59af6c4](https://github.com/kontent-ai/delivery-sdk-js/commit/59af6c404846d71e52810813d837a8ea4c26c802)) - -## [11.12.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.11.0...v11.12.0) (2022-04-20) - -### Features - -- Handles '&' in property name resolver - ([e82ae6d](https://github.com/kontent-ai/delivery-sdk-js/commit/e82ae6d82662fda9786d26b6cebc6480fb95bc98)) - -## [11.11.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.10.0...v11.11.0) (2022-04-20) - -### Features - -- convert snake case name resolver to lowercase only text - ([df39537](https://github.com/kontent-ai/delivery-sdk-js/commit/df395375f679a893b2d29b5409c4a0a3c2e6576d)) -- Handles brackets in property name resolver - ([946db34](https://github.com/kontent-ai/delivery-sdk-js/commit/946db349de6a4add3a614e44daaab17720281011)) - -## [11.10.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.9.0...v11.10.0) (2022-04-20) - -### Features - -- Adds underscore to name resolver when it starts with a number - ([5a624e3](https://github.com/kontent-ai/delivery-sdk-js/commit/5a624e3f59626f7b6c6bb94b9730f1c3edf2f721)) - -## [11.9.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.8.1...v11.9.0) (2022-04-20) - -### Features - -- Automatically removes zero width characters from name resolvers - ([fbf07aa](https://github.com/kontent-ai/delivery-sdk-js/commit/fbf07aab776050ba006d1bc8a8d562679ce2dcfe)) - -### [11.8.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.8.0...v11.8.1) (2022-04-20) - -### Bug Fixes - -- fixes property name resolver to cover cases with mixed upper/lower case strings - ([66918c9](https://github.com/kontent-ai/delivery-sdk-js/commit/66918c99b6da2d94d7115baa581669ccb7fd048c)) - -## [11.8.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.6.0...v11.8.0) (2022-04-20) - -### Features - -- Adds support for strongly typed taxonomy element - ([c3d85ee](https://github.com/kontent-ai/delivery-sdk-js/commit/c3d85eecfd7fa3ced980d741195207596a3e44b8)) -- Improves property name resolvers by handling more special characters and unifies the regex across all name resolvers - ([d153e81](https://github.com/kontent-ai/delivery-sdk-js/commit/d153e81ff2d3114d31ae016bc9d8c3073571da94)) -- updates dependencies - ([a373528](https://github.com/kontent-ai/delivery-sdk-js/commit/a373528b6f6167ebcf9b6c2e5395b1ba0d061bd2)) - -## [11.7.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.5.0...v11.7.0) (2022-03-28) - -### Features - -- Adds support for strongly typed taxonomy element - ([c3d85ee](https://github.com/kontent-ai/delivery-sdk-js/commit/c3d85eecfd7fa3ced980d741195207596a3e44b8)) -- updates deps - ([d899b0b](https://github.com/kontent-ai/delivery-sdk-js/commit/d899b0ba4eb4b52032657f6909eae1a833d2ec38)) - -## [11.6.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.5.0...v11.6.0) (2022-03-23) - -### Features - -- updates deps - ([d899b0b](https://github.com/kontent-ai/delivery-sdk-js/commit/d899b0ba4eb4b52032657f6909eae1a833d2ec38)) - -## [11.5.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.5.0-1...v11.5.0) (2022-03-14) - -## [11.5.0-1](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.5.0-0...v11.5.0-1) (2022-03-10) - -## [11.5.0-0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.4.0...v11.5.0-0) (2022-03-07) - -### Features - -- Adds 'linkedItems' property to Rich text element that contains array or mapped linked items included in the element - (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/338) - ([9a48ae5](https://github.com/kontent-ai/delivery-sdk-js/commit/9a48ae53c1c2075a313207e6d7bba6a57c72d193)) -- adds ability to preserve 'object' tags in RTE Html - ([6034f89](https://github.com/kontent-ai/delivery-sdk-js/commit/6034f89da4a7df046e5c6d514780c96fa5ed228c)) -- adds ability to set custom wrap tag for object & json Rich text resolvers (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/339) - ([a6899ff](https://github.com/kontent-ai/delivery-sdk-js/commit/a6899ff06a7edb6256b3c7675d7a4ff635cefe7d)) -- Removes 'object' wrapper tag from resolved Rich text element HTML (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/332) - ([d9f9f74](https://github.com/kontent-ai/delivery-sdk-js/commit/d9f9f741f5bc7fbaec44c54c7703627af1b032b4)) -- updates deps ( fixes https://github.com/kontent-ai/delivery-sdk-js/issues/342) - ([517501e](https://github.com/kontent-ai/delivery-sdk-js/commit/517501e3228c59679adfbc22c42c9feb7f4e6904)) - -## [11.4.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.4.0-0...v11.4.0) (2022-02-04) - -### Features - -- updates deps - ([dbb0474](https://github.com/kontent-ai/delivery-sdk-js/commit/dbb0474c551088257a71c7200d5ce2a28ea05a5a)) -- adds ability to configure default asset rendition - -## [11.3.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.3.0-0...v11.3.0) (2021-12-16) - -### Features - -- Adds support for custom asset domains (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/333) - ([c8e70e4](https://github.com/kontent-ai/delivery-sdk-js/commit/c8e70e402a3b81fcdf965c68fd51842e39958bef)) - -### [11.2.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.2.1-0...v11.2.1) (2021-12-09) - -### Bug Fixes - -- use null instead of undefined for asset model properties - ([da7ff46](https://github.com/kontent-ai/delivery-sdk-js/commit/da7ff461aad6dbf04c31dabdbcd4c9a11cdf743e)) - -## [11.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.2.0-0...v11.2.0) (2021-12-02) - -### Features - -- adds absolute url to rendition record - ([a6a0ece](https://github.com/kontent-ai/delivery-sdk-js/commit/a6a0ece29e001fc4c892d54ca816bb75d494176a)) - -## [11.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.1.0-0...v11.1.0) (2021-11-29) - -### Features - -- updates dependencies - ([b0b3ff5](https://github.com/kontent-ai/delivery-sdk-js/commit/b0b3ff564fd3d35691a2b9b92d6b3e6fb04fe5af)) - -## [11.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-11...v11.0.0) (2021-11-16) - -### Features - -- renames INetworkResponse interface to IDeliveryNetworkResponse - ([e566537](https://github.com/kontent-ai/delivery-sdk-js/commit/e5665372563b485dc050ae1919910612b00c4bf2)) -- updates deps - ([42a6ff9](https://github.com/kontent-ai/delivery-sdk-js/commit/42a6ff9bbc070133f8f3e52f02c0f3e5d3cd9939)) - -## [11.0.0-11](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-10...v11.0.0-11) (2021-10-27) - -## [11.0.0-10](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-9...v11.0.0-10) (2021-10-27) - -### Features - -- updates readme, creates base rich text resolvers and uses function to create each and every available resolver - ([1cf140c](https://github.com/kontent-ai/delivery-sdk-js/commit/1cf140ce98074d2e590e5eefad5fed7fac3afe39)) - -## [11.0.0-9](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-8...v11.0.0-9) (2021-10-27) - -### Features - -- updates names rich text related async models - ([231f4f6](https://github.com/kontent-ai/delivery-sdk-js/commit/231f4f684fe81982b1f5c8c5956dc55aae4fdbc5)) - -## [11.0.0-8](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-7...v11.0.0-8) (2021-10-26) - -### Features - -- removes remaning usage of browser API in rich text resolver - ([74d1922](https://github.com/kontent-ai/delivery-sdk-js/commit/74d1922451d4350778587b9f2a183c34dccfe87d)) - -## [11.0.0-7](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-6...v11.0.0-7) (2021-10-26) - -### Bug Fixes - -- fixes object / json resolver result - ([dc03d75](https://github.com/kontent-ai/delivery-sdk-js/commit/dc03d757b08c74187a17104f9ab5ee1451903ea0)) - -## [11.0.0-6](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-5...v11.0.0-6) (2021-10-26) - -### Features - -- adds experimental json / object rich text resolvers, simplifies filter classes - ([326dff6](https://github.com/kontent-ai/delivery-sdk-js/commit/326dff69ebf6e2ab8932f60048118527377f1d17)) -- refactors rich text processing by separating parser & rich text resolvers - ([48b49da](https://github.com/kontent-ai/delivery-sdk-js/commit/48b49dac077ff91f89f5e959bb29b37f33909e5d)) -- separates parser from resolvers and makes resolvers independent on parser implementation, adds experimental json / - object rich text element resolvers - ([24082ec](https://github.com/kontent-ai/delivery-sdk-js/commit/24082ec9c1d8d1ff0a4ea6212c52f23ee015cd1b)) -- updates deps - ([f3ccfb9](https://github.com/kontent-ai/delivery-sdk-js/commit/f3ccfb9f6af5f659c20f9d0825e404aa5b4bf0e3)) - -## [11.0.0-5](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-4...v11.0.0-5) (2021-10-19) - -### Bug Fixes - -- fixes value type for LinkedItemsElement - ([b6cfc8e](https://github.com/kontent-ai/delivery-sdk-js/commit/b6cfc8e765ec90c475e87ba25ddc3c69c284f4b1)) - -## [11.0.0-4](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-3...v11.0.0-4) (2021-10-14) - -### Features - -- removes log message when content item is not in response - ([b60f36b](https://github.com/kontent-ai/delivery-sdk-js/commit/b60f36b9b50cefbb2e7e5f8340c58143740698ee)) -- use null for instead of undefined for some response models - ([ff27a93](https://github.com/kontent-ai/delivery-sdk-js/commit/ff27a9346b9d1dcd587c337d37f629eddf933855)) - -### Bug Fixes - -- use null for response models - ([53792f1](https://github.com/kontent-ai/delivery-sdk-js/commit/53792f1cf2edc205f7270bdd6c9d361681fd8676)) - -## [11.0.0-3](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-2...v11.0.0-3) (2021-10-14) - -### âš  BREAKING CHANGES - -- use "string" type for all "Date" properties to support more serialization scenarios - -### Features - -- updates deps, removes duplicate license - ([035335f](https://github.com/kontent-ai/delivery-sdk-js/commit/035335f050782091932a70cab6a8ba4ceb76e990)) -- use "string" type for all "Date" properties to support more serialization scenarios - ([909102f](https://github.com/kontent-ai/delivery-sdk-js/commit/909102fa8dc804a44d3480e166112232b98f2c39)) - -## [11.0.0-2](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-1...v11.0.0-2) (2021-10-04) - -### Features - -- adds ability to disable mapping of content items in linked items & rich text elements - ([f67661c](https://github.com/kontent-ai/delivery-sdk-js/commit/f67661c2cc36a1d19d42a4036ac8ee67c7fd365a)) -- adds came case, pascal case & snake case property name resolvers - ([b422697](https://github.com/kontent-ai/delivery-sdk-js/commit/b42269721a930a83442d5842b2c31076e8ef6a92)) - -## [11.0.0-1](https://github.com/kontent-ai/delivery-sdk-js/compare/v11.0.0-0...v11.0.0-1) (2021-10-01) - -### âš  BREAKING CHANGES - -- makes rich text resolver generic, uninstalls unused packages, better organizes browser rich text parser code - -### Features - -- makes rich text resolver generic, uninstalls unused packages, better organizes browser rich text parser code - ([29042b8](https://github.com/kontent-ai/delivery-sdk-js/commit/29042b8459c4ad5dedd357cc7a2f43c81da3bf3c)) - -## [11.0.0-0](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.4.1...v11.0.0-0) (2021-09-30) - -### âš  BREAKING CHANGES - -- unifies contracts under a shared 'Contracts' namespace -- unifies all response models under common 'Responses' namespace -- converts image transformation enums (ImageFitModeEnum, ImageCompressionEnum, ImageFormatEnum) to types and removes - the 'enum' suffix. -- renames 'ImageUrlBuilder' to 'ImageTransformationUrlBuilder' -- converts elements to types instead of interfaces (also removes the 'I' in the type names), adds - 'createDeliveryClient' factory function, improves custom element sample -- renames 'IKontentNetworkResponse' and 'IGroupedKontentNetworkResponse' interfaces to 'INetworkResponse' and - 'IGroupedNetworkResponse' -- removes query config from mapping service as its no longer necessary due to rich text resolver being separated -- refactors rich text resolver, removes parse5 and default html resolver for node, creates new html resolver for use - in browsers and export it with the library -- removes 'itemCodenames' property from LinkedItemsElement because this data is already available in the value - property -- `globalQueryConfig` configuration option was renamed to `defaultQueryConfig` -- removes \_raw properties from content item & element to reduce the size of mapped response & to avoid data - duplication -- uses interface for all remaining models & responses -- uses interfaces instead of classes for all responses -- refactors element models by using interfaces instead of classes, changes the ElementResolver to resolve only value - instead of the whole custom element -- removes ItemResolver, refactors ContentItem from strongly types class to interface (removes ability to define - resolvers on the class level) -- moves elements to 'elements' property within the content item (they were on the content item previously), removes - property mapping with reflect metadata, removes collision resolver -- introduces new "IKontentNetworkResponse" model that wraps responses with network related data and separates response - specific data for improved mapping of stored json data -- introduces BaseListingQuery for all endpoint with pagination, removes itemsFeedAll method & query, refactors queries - to improve their readability, adds missing filter methods, unifies query config and some other minor improvements & - changes -- renames withUrl query extension method to withCustomUrl -- renames query extension method 'withParameter' to 'withCustomParameter'. Adds new 'withParameter' method which takes - IQueryParameter object similarly as 'withParameters' does for array parameters -- makes SortOrder type instead of enum -- updates kontent-core, removes rxjs from repository in favor of Promises and async based approach -- updates build process (puts all output to "dist" folder), consolidates tests, updates tsconfig - -### Features - -- `globalQueryConfig` configuration option was renamed to `defaultQueryConfig` - ([8817105](https://github.com/kontent-ai/delivery-sdk-js/commit/881710530e4009defec3e7da9cc7763e18257a84)) -- adds 'createUrlBuilder' factory function - ([54b5085](https://github.com/kontent-ai/delivery-sdk-js/commit/54b5085a8dc0748f088b0b4ba894e403bb79bf42)) -- adds 'withContinuationToken' extension method to all listing queries - ([a28ddb3](https://github.com/kontent-ai/delivery-sdk-js/commit/a28ddb3e18162c8b80dabbf8967e64a23b40fbb1)) -- adds 'withHeader' query extension method, improves docs of some extension methods - ([20b9334](https://github.com/kontent-ai/delivery-sdk-js/commit/20b9334f22c2186a1b7276e5dbffbce05140fb36)) -- adds ability to define number of pages to fetch in 'toAllPromise' method - ([d5d8c2c](https://github.com/kontent-ai/delivery-sdk-js/commit/d5d8c2c2634d5d9f40718ab323184d6bf9c79ad7)) -- adds ability to map raw json data with 'map' query extension method - ([dab3618](https://github.com/kontent-ai/delivery-sdk-js/commit/dab3618a542692d67be18d8380b4d917e827d01f)) -- adds network response tests - ([0e8b690](https://github.com/kontent-ai/delivery-sdk-js/commit/0e8b6904af2b6205f6fb6426dabec9b6bf387539)) -- adds support for 'workflow_step' in content item system attributes (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/309) - ([ad2d965](https://github.com/kontent-ai/delivery-sdk-js/commit/ad2d965dc55742209b0715efabb0ea96cbc51638)) -- adds support for async browser rich text resolver - ([ece99b7](https://github.com/kontent-ai/delivery-sdk-js/commit/ece99b764013f6d6fd2663ae23eba68c4ad11c5e)) -- converts elements to types instead of interfaces (also removes the 'I' in the type names), adds - 'createDeliveryClient' factory function, improves custom element sample - ([2ccb97c](https://github.com/kontent-ai/delivery-sdk-js/commit/2ccb97cd2f952bf20509956bf63832c0d39dee35)) -- converts image transformation enums (ImageFitModeEnum, ImageCompressionEnum, ImageFormatEnum) to types and removes - the 'enum' suffix. - ([d44573a](https://github.com/kontent-ai/delivery-sdk-js/commit/d44573a472fce2baeadef25283a881e1b9ae094b)) -- improves typings of raw response data by providing contract types for each query - ([be654f1](https://github.com/kontent-ai/delivery-sdk-js/commit/be654f186cf1e62e7de8160bcf6adc4e73b85b48)) -- introduces BaseListingQuery for all endpoint with pagination, removes itemsFeedAll method & query, refactors queries - to improve their readability, adds missing filter methods, unifies query config and some other minor improvements & - changes ([7c68b8f](https://github.com/kontent-ai/delivery-sdk-js/commit/7c68b8f910a1bf55c1ec6954c560d6e9f912c3c3)) -- introduces new "IKontentNetworkResponse" model that wraps responses with network related data and separates response - specific data for improved mapping of stored json data - ([ba4c265](https://github.com/kontent-ai/delivery-sdk-js/commit/ba4c2657e70ab205fb776463170f2a1ab8fe7455)) -- makes SortOrder type instead of enum - ([1d61369](https://github.com/kontent-ai/delivery-sdk-js/commit/1d6136970b92f119c51612397a461603c0656a4c)) -- moves elements to 'elements' property within the content item (they were on the content item previously), removes - property mapping with reflect metadata, removes collision resolver - ([8f6ed55](https://github.com/kontent-ai/delivery-sdk-js/commit/8f6ed55eb6d716d09edefcf30756ffe582d579ea)) -- refactors element models by using interfaces instead of classes, changes the ElementResolver to resolve only value - instead of the whole custom element - ([c3fbd51](https://github.com/kontent-ai/delivery-sdk-js/commit/c3fbd51ccdba1ec15943f4ff31436696ef406d4f)) -- refactors internal use of headers (stores headers in a single location) - ([9c0fe73](https://github.com/kontent-ai/delivery-sdk-js/commit/9c0fe73cbf09de13593096bfdadf82abbd5effcd)) -- refactors rich text resolver, removes parse5 and default html resolver for node, creates new html resolver for use - in browsers and export it with the library - ([04633a9](https://github.com/kontent-ai/delivery-sdk-js/commit/04633a94cbd1757166fc50450ee9ac0e529887ad)) -- removes \_raw properties from content item & element to reduce the size of mapped response & to avoid data - duplication - ([5c4eb8c](https://github.com/kontent-ai/delivery-sdk-js/commit/5c4eb8cf6dd2c1d9f2d6dcb3401c8afdb02af8b7)) -- removes 'itemCodenames' property from LinkedItemsElement because this data is already available in the value - property ([acefbe8](https://github.com/kontent-ai/delivery-sdk-js/commit/acefbe80bec23b788d659de827250d4fb0ac9a73)) -- removes ItemResolver, refactors ContentItem from strongly types class to interface (removes ability to define - resolvers on the class level) - ([039ed29](https://github.com/kontent-ai/delivery-sdk-js/commit/039ed29b43870f3e7ee949106d85c7c49fe03c53)) -- removes query config from mapping service as its no longer necessary due to rich text resolver being separated - ([748b2f7](https://github.com/kontent-ai/delivery-sdk-js/commit/748b2f7c374e3e6c99a9d0d54c6dbd7dbcbe537b)) -- renames 'IKontentNetworkResponse' and 'IGroupedKontentNetworkResponse' interfaces to 'INetworkResponse' and - 'IGroupedNetworkResponse' - ([9000c14](https://github.com/kontent-ai/delivery-sdk-js/commit/9000c141c6185ee0adc57cf902f47dc46af7b6ec)) -- renames 'ImageUrlBuilder' to 'ImageTransformationUrlBuilder' - ([8124cfe](https://github.com/kontent-ai/delivery-sdk-js/commit/8124cfe9ad62153832197883f053132b60a95b47)) -- renames query extension method 'withParameter' to 'withCustomParameter'. Adds new 'withParameter' method which takes - IQueryParameter object similarly as 'withParameters' does for array parameters - ([a518694](https://github.com/kontent-ai/delivery-sdk-js/commit/a51869401f33a471829f648f93bd773006c98814)) -- renames withUrl query extension method to withCustomUrl - ([dbe6b77](https://github.com/kontent-ai/delivery-sdk-js/commit/dbe6b77efb9cf49f3ef26e57c59fc8fec8d9ce6b)) -- unifies all response models under common 'Responses' namespace - ([ad28631](https://github.com/kontent-ai/delivery-sdk-js/commit/ad286313d80a2683fd9100c79def21e0269cf0e8)) -- unifies contracts under a shared 'Contracts' namespace - ([41ddd98](https://github.com/kontent-ai/delivery-sdk-js/commit/41ddd98b31f4d54f90a7de97be8a0c96bd5ffd52)) -- updates build process (puts all output to "dist" folder), consolidates tests, updates tsconfig - ([c2946f7](https://github.com/kontent-ai/delivery-sdk-js/commit/c2946f7ce0d94d9b6365a42f5c04ea7e5c01126e)) -- updates deps - ([a18d770](https://github.com/kontent-ai/delivery-sdk-js/commit/a18d770c077620305be5b9b46254baf38a5ab42b)) -- updates deps - ([320d2df](https://github.com/kontent-ai/delivery-sdk-js/commit/320d2df3c00fcf71a76bb43fa4859cb13ed374af)) -- updates deps - ([67da9df](https://github.com/kontent-ai/delivery-sdk-js/commit/67da9dfb0184797909e0c78022653cf32a5a0951)) -- updates kontent-core, removes rxjs from repository in favor of Promises and async based approach - ([b213a7d](https://github.com/kontent-ai/delivery-sdk-js/commit/b213a7d2a520c3c9f395ce909d71f15802fc6581)) -- uses interface for all remaining models & responses - ([ad7b18d](https://github.com/kontent-ai/delivery-sdk-js/commit/ad7b18dcaa52b5fcdb9d7392da8e246567615796)) -- uses interfaces instead of classes for all responses - ([2cd8cb2](https://github.com/kontent-ai/delivery-sdk-js/commit/2cd8cb2684e54a7ad14292865b2adf5cf92c40df)) - -### [10.4.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.4.0...v10.4.1) (2021-03-31) - -## [10.4.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.3.0...v10.4.0) (2021-03-18) - -### Features - -- adds resolved attribute to BrowserRichTextParser, adds index to every resolved linked item & component within rich - text element values - ([b81d523](https://github.com/kontent-ai/delivery-sdk-js/commit/b81d523bb375b249e7ff44aec2df069890dfaba4)) -- use switchMap instead of deprecated flatMap operator - ([59bd752](https://github.com/kontent-ai/delivery-sdk-js/commit/59bd752dc7a1288218d5a2b9e63a682a773833c9)) - -## [10.3.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.2.0...v10.3.0) (2021-02-05) - -### Features - -- adds languages support (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/303) - ([c145d93](https://github.com/kontent-ai/delivery-sdk-js/commit/c145d93ca8f293ec4fc99eb79fe1fa5a2c85cc60)) - -## [10.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.1.0...v10.2.0) (2021-01-08) - -### Features - -- updates dependencies - ([651ccb4](https://github.com/kontent-ai/delivery-sdk-js/commit/651ccb44626c2542bf1caee83fc31ee4fd0b53a5)) - -### Bug Fixes - -- updates internal types of parse5 parser adapter - ([83109f7](https://github.com/kontent-ai/delivery-sdk-js/commit/83109f73003e233938c753d6795899f1b55e8ce4)) - -## [10.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v10.0.0...v10.1.0) (2020-11-26) - -### Features - -- adds support for collections -- updates all dependencies, uses axios models directly for request interceptors - ([5aa5f8b](https://github.com/kontent-ai/delivery-sdk-js/commit/5aa5f8b4529ecfb8c3a9763db3755a36fa385267)) - -## [10.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v9.2.1...v10.0.0) (2020-08-25) - -### âš  BREAKING CHANGES - -- Refactors IQueryParameter to allows value-less parameters which are required by new filtering operators (empty / - nempty), adds support for new filter options (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/297) - -### Features - -- Refactors IQueryParameter to allows value-less parameters which are required by new filtering operators (empty / - nempty), adds support for new filter options (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/297) - ([b2ae46f](https://github.com/kontent-ai/delivery-sdk-js/commit/b2ae46f615c6db7465125e09f8527fcfd49084a2)) - -### Bug Fixes - -- fixes url resolving test for node.js - ([212d343](https://github.com/kontent-ai/delivery-sdk-js/commit/212d34355104eb0201a3768d2bd198fc4b537176)) - -### [9.2.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v9.2.0...v9.2.1) (2020-08-11) - -### Bug Fixes - -- fixes automatic format for image transformation api (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/296) - ([42204ff](https://github.com/kontent-ai/delivery-sdk-js/commit/42204ff31a5f7cdbfcb684cb724ca6f24298f36c)) - -## [9.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v9.1.1...v9.2.0) (2020-07-30) - -### Features - -- updates dependencies, moves error handling logic from core package to sdk + fixes error mapping after recent error - response change which now allows null in request_id property - ([a11e745](https://github.com/kontent-ai/delivery-sdk-js/commit/a11e745d4148ac93dafa038f09bd6cd3b6b41a35)) - -### Bug Fixes - -- improves handling of image resolving in rich text element and fixes parse5 parsing in nested component rich text - resolver (https://github.com/kontent-ai/delivery-sdk-js/issues/294) - ([9b82718](https://github.com/kontent-ai/delivery-sdk-js/commit/9b82718220c6affe62dfe8b79380323858db9e71)) - -### [9.1.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v9.1.0...v9.1.1) (2020-04-02) - -### Bug Fixes - -- fixes missing attributes in parse5 resolved links with custom html - ([2e2f8c1](https://github.com/kontent-ai/delivery-sdk-js/commit/2e2f8c1d1c92d15395a0bfb646c32781ae06fdbf)) - -## [9.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v9.0.0...v9.1.0) (2020-03-26) - -### Features - -- exposes richTextParserAdapter via config - ([62659a6](https://github.com/kontent-ai/delivery-sdk-js/commit/62659a688661b5e786b853e7dd0e59aac2eeb02c)) - -### Bug Fixes - -- fixes https://github.com/kontent-ai/delivery-sdk-js/issues/286 & unifies parse5 / browser tests - ([2a787f4](https://github.com/kontent-ai/delivery-sdk-js/commit/2a787f4ec237528a55ae3df7676ed348cf502e87)) - -## [9.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v8.2.0...v9.0.0) (2020-01-20) - -### âš  BREAKING CHANGES - -- updates deps, refactors retry-strategy which enables specifying either maximum number of attemps or wait time and - allows retry of any error even when response is not received (e.g. timeout which could not be retried previously) - -### Features - -- distributes library in esNext format - ([bd9ea6f](https://github.com/kontent-ai/delivery-sdk-js/commit/bd9ea6f5f7dd81277d59c8a85e9952bde0ed74f6)) -- refactors item mappers and adds full mapping support to items-feed endpoints (e.g. rich text resolver, url slug - resolver, image resolver ..) - ([6e30485](https://github.com/kontent-ai/delivery-sdk-js/commit/6e304856fda0a7d9c55e2910dac2578014cedc37)) -- updates deps, refactors retry-strategy which enables specifying either maximum number of attemps or wait time and - allows retry of any error even when response is not received (e.g. timeout which could not be retried previously) - ([b7cf414](https://github.com/kontent-ai/delivery-sdk-js/commit/b7cf414bc2da0f4fc42368fd5ab44a555bf36afc)) - -## [8.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v8.1.0...v8.2.0) (2019-11-25) - -### Features - -- adds helper method to return linked items as array (fixes https://github.com/kontent-ai/delivery-sdk-js/issues/240) - ([b832f7b](https://github.com/kontent-ai/delivery-sdk-js/commit/b832f7b67c85fce0d80e763a2207afb859855fc8)) -- extends ContentItem with ability to get all elements in an array (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/241) - ([120918b](https://github.com/kontent-ai/delivery-sdk-js/commit/120918bc9d724efd765cf320e676bbd56a6f9fa4)) -- updates all dependencies (including dev depencies such as the use of latest TypeScript..) - ([62a9ffc](https://github.com/kontent-ai/delivery-sdk-js/commit/62a9ffc1b8ead493b6adc891fbb9bd05ed629070)) - -### Bug Fixes - -- fixes github repo url in package.json & fixes changelog links (fixes - https://github.com/kontent-ai/delivery-sdk-js/issues/268) - ([a4132e7](https://github.com/kontent-ai/delivery-sdk-js/commit/a4132e7d95a6c99ade17c487b68721fb0bafc58c)) - -## [8.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v8.0.0...v8.1.0) (2019-11-18) - -### Features - -- adds support for 'includeTotalCount| parameter - ([c39a301](https://github.com/kontent-ai/delivery-sdk-js/commit/c39a301bf73c72b4e87db071a4293c7f45ef0c8e)) - -### Bug Fixes - -- updates kontent-core package which fixes http retry requests - ([53a4318](https://github.com/kontent-ai/delivery-sdk-js/commit/53a43184a708c0c36fbe611d99a6298f24ad097a)) - -## [8.0.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v7.2.0...v8.0.0) (2019-10-25) - -### âš  BREAKING CHANGES - -- Updates @kentico/kontent-core to v4 and uses new and improved retry strategy. 'retryAttempts' configuration option - was removed in favor of 'retryStrategy' object. - -### Features - -- adds 'itemsFeedAll' method to get all items from a project. This method may execute multiple HTTP requests. Reworks - base responses & debug to allow different debug types per response. - ([72e03fd](https://github.com/kontent-ai/delivery-sdk-js/commit/72e03fd3587573d82d665e0010c696e122e73248)) -- adds support for 'items-feed' endpoint - ([29913c9](https://github.com/kontent-ai/delivery-sdk-js/commit/29913c984b073166a8f0ddc12f69106c7d476efd)) -- Updates @kentico/kontent-core to v4 and uses new and improved retry strategy. 'retryAttempts' configuration option - was removed in favor of 'retryStrategy' object. - ([e2abd02](https://github.com/kontent-ai/delivery-sdk-js/commit/e2abd02a233f78f9c9152397f5eb915d73ba1189)) - -### Bug Fixes - -- prepares instances of all items before resolving occurs to prevent some items from being skipped - ([5559cb6](https://github.com/kontent-ai/delivery-sdk-js/commit/5559cb608668f608f759256f0a35486fb7397d9c)) - -## [7.2.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v7.1.0...v7.2.0) (2019-10-21) - -### Features - -- Enables resolving links without content item representation in response - ([6472265](https://github.com/kontent-ai/delivery-sdk-js/commit/6472265867d8b6dc200ff756032a75a848b0d92c)) -- takes 'isDeveloperMode' settings into account when displaying root debug element - (https://github.com/kontent-ai/delivery-sdk-js/issues/255] - ([7ab56cb](https://github.com/kontent-ai/delivery-sdk-js/commit/7ab56cb64703e7481ea02433ad5aca95bd9b8b51)) -- updates @kentico/kontent-core dependency which enables configuring axios request - (https://github.com/kontent-ai/delivery-sdk-js/issues/256) - ([ea3a504](https://github.com/kontent-ai/delivery-sdk-js/commit/ea3a504e3a2eb37a06d40daf5a40ea11dfbe517f)) - -## 7.1.0 (2019-10-14) - -## [7.1.0](https://github.com/kontent-ai/delivery-sdk-js/compare/v7.0.1...v7.1.0) (2019-10-14) - -### Features - -- adds hasStaleContent property to all responses and uses new BaseDeliveryResponse base class - ([3dc5046](https://github.com/kontent-ai/delivery-sdk-js/commit/3dc50463a70a3f70e3f0920ed11758f62efdb236)) - -### [7.0.1](https://github.com/kontent-ai/delivery-sdk-js/compare/v1.1.0...v7.0.1) (2019-10-14) diff --git a/_legacy/LICENSE.md b/_legacy/LICENSE.md deleted file mode 100644 index ac4d0f70..00000000 --- a/_legacy/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2023 Kontent s.r.o. - -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. diff --git a/_legacy/clean.ts b/_legacy/clean.ts deleted file mode 100644 index 6e89e5bc..00000000 --- a/_legacy/clean.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { existsSync, rmSync } from 'fs'; -import { yellow } from 'colors'; - -const paths = ['dist']; -for (const path of paths) { - if (existsSync(path)) { - rmSync(path, { recursive: true }); - console.log(`Path '${yellow(path)}' has been deleted`); - } -} diff --git a/_legacy/eslint.config.mjs b/_legacy/eslint.config.mjs deleted file mode 100644 index 21cb16dd..00000000 --- a/_legacy/eslint.config.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, { - languageOptions: { - parserOptions: { - project: true, - tsconfigRootDir: import.meta.dirname - } - }, - rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-empty-object-type': 'off', - '@typescript-eslint/restrict-template-expressions': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/prefer-promise-reject-errors': 'off' - } -}); diff --git a/_legacy/karma-gh-actions.conf.js b/_legacy/karma-gh-actions.conf.js deleted file mode 100644 index d013c92c..00000000 --- a/_legacy/karma-gh-actions.conf.js +++ /dev/null @@ -1,56 +0,0 @@ -module.exports = function (config) { - config.set({ - frameworks: ["jasmine", "karma-typescript"], - plugins: [ - require("karma-jasmine"), - require("karma-typescript"), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - ], - files: [ - { pattern: "lib/**/*.ts" }, - { pattern: "test/browser/**/*.ts" } - ], - exclude: [ - ], - preprocessors: { - "lib/**/*.ts": ["karma-typescript"], - "test/browser/**/*.ts": ["karma-typescript"] - }, - reporters: ["kjhtml", "progress", "karma-typescript"], - browsers: ["Chrome"], - karmaTypescriptConfig: { - compilerOptions: { - emitDecoratorMetadata: true, - experimentalDecorators: true, - resolveJsonModule: true, - module: "commonjs", - sourceMap: true, - target: "ES5" - }, - exclude: ["node_modules"], - bundlerOptions: { - transforms: [ - require("karma-typescript-es6-transform")() - ] - } - }, - coverageReporter: { - reporters: [ - { type: 'html', subdir: 'html' }, - { type: 'lcov', subdir: 'lcov' }, - { type: 'lcovonly', subdir: '.', file: 'report-lcovonly.txt' } - ] - }, - port: 9669, - colors: true, - autoWatch: false, - singleRun: true, - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - logLevel: config.DEBUG, - browserDisconnectTolerance: 2, - browserNoActivityTimeout: 5000000 - }); -}; diff --git a/_legacy/karma.conf.js b/_legacy/karma.conf.js deleted file mode 100644 index 32c6c092..00000000 --- a/_legacy/karma.conf.js +++ /dev/null @@ -1,50 +0,0 @@ -module.exports = function (config) { - config.set({ - frameworks: ['jasmine', 'karma-typescript'], - plugins: [ - require('karma-jasmine'), - require('karma-typescript'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter') - ], - files: [{ pattern: 'lib/**/*.ts' }, { pattern: 'test/browser/**/*.ts' }], - exclude: [], - preprocessors: { - 'lib/**/*.ts': ['karma-typescript'], - 'test/browser/**/*.ts': ['karma-typescript'] - }, - reporters: ['kjhtml', 'progress', 'karma-typescript'], - browsers: ['Chrome'], - karmaTypescriptConfig: { - compilerOptions: { - emitDecoratorMetadata: true, - experimentalDecorators: true, - resolveJsonModule: true, - module: 'commonjs', - sourceMap: true, - target: 'ES5' - }, - exclude: ['node_modules'], - bundlerOptions: { - transforms: [require('karma-typescript-es6-transform')()] - } - }, - coverageReporter: { - reporters: [ - { type: 'html', subdir: 'html' }, - { type: 'lcov', subdir: 'lcov' }, - { type: 'lcovonly', subdir: '.', file: 'report-lcovonly.txt' } - ] - }, - port: 9669, - colors: true, - autoWatch: true, - singleRun: false, - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - logLevel: config.DEBUG, - browserDisconnectTolerance: 2, - browserNoActivityTimeout: 5000000 - }); -}; diff --git a/_legacy/lib/client/delivery-client.factory.ts b/_legacy/lib/client/delivery-client.factory.ts deleted file mode 100644 index 861343f0..00000000 --- a/_legacy/lib/client/delivery-client.factory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ClientTypes } from '../models'; -import { IDeliveryClientConfig } from '../config/delivery-configs'; -import { DeliveryClient } from './delivery-client'; - -export function createDeliveryClient( - config: IDeliveryClientConfig -): DeliveryClient { - return new DeliveryClient(config); -} diff --git a/_legacy/lib/client/delivery-client.ts b/_legacy/lib/client/delivery-client.ts deleted file mode 100644 index 10ff1ac0..00000000 --- a/_legacy/lib/client/delivery-client.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { HttpService } from '@kontent-ai/core-sdk'; -import { IDeliveryClientConfig } from '../config'; -import { ClientTypes, IContentItem } from '../models'; -import { - ElementQuery, - ItemsFeedQuery, - MultipleItemsQuery, - MultipleTypeQuery, - SingleItemQuery, - SingleTypeQuery, - TaxonomiesQuery, - TaxonomyQuery, - LanguagesQuery, - InitializeSyncQuery, - SyncChangesQuery, - UsedInQuery -} from '../query'; -import { sdkInfo } from '../sdk-info.generated'; -import { IMappingService, MappingService, QueryService } from '../services'; -import { IDeliveryClient } from './idelivery-client.interface'; - -export class DeliveryClient implements IDeliveryClient { - private queryService: QueryService; - public mappingService: IMappingService; - - /** - * Delivery client used to fetch data from Kontent.ai - * @constructor - * @param {IDeliveryClientConfig} config - The client configuration - */ - constructor(protected config: IDeliveryClientConfig) { - if (!config) { - throw Error(`Delivery client configuration is not set`); - } - - this.mappingService = new MappingService(config); - this.queryService = new QueryService( - config, - config.httpService ? config.httpService : new HttpService(), - { - host: sdkInfo.host, - name: sdkInfo.name, - version: sdkInfo.version - }, - this.mappingService - ); - } - - /** - * Gets query for multiple languages - */ - languages(): LanguagesQuery { - return new LanguagesQuery(this.config, this.queryService); - } - - /** - * Gets query for multiple types - */ - types(): MultipleTypeQuery { - return new MultipleTypeQuery(this.config, this.queryService); - } - - /** - * Gets query for single type - * @param {string} typeCodename - Codename of the type to fetch - */ - type(typeCodename: TClientTypes['contentTypeCodenames']): SingleTypeQuery { - return new SingleTypeQuery(this.config, this.queryService, typeCodename); - } - - /** - * Gets query for multiple items - */ - items(): MultipleItemsQuery< - TClientTypes, - TContentItem - > { - return new MultipleItemsQuery(this.config, this.queryService); - } - - /** - * Gets query for single item - * @param {string} codename - Codename of item to fetch - */ - item( - codename: string - ): SingleItemQuery { - return new SingleItemQuery(this.config, this.queryService, codename); - } - - /** - * Gets query for items feed. Executes single HTTP request only - */ - itemsFeed(): ItemsFeedQuery< - TClientTypes, - TContentItem - > { - return new ItemsFeedQuery(this.config, this.queryService); - } - - /** - * Gets query for single taxonomy - * @param {string} codename - Codename of taxonomy to fetch - */ - taxonomy(codename: TClientTypes['taxonomyCodenames']): TaxonomyQuery { - return new TaxonomyQuery(this.config, this.queryService, codename); - } - - /** - * Gets query for multiple taxonomies - */ - taxonomies(): TaxonomiesQuery { - return new TaxonomiesQuery(this.config, this.queryService); - } - - /** - * Gets query for an element within a type - * @param {string} typeCodename - Codename of the type - * @param {string} elementCodename - Codename of the element - */ - element( - typeCodename: TClientTypes['contentTypeCodenames'], - elementCodename: TClientTypes['elementCodenames'] - ): ElementQuery { - return new ElementQuery(this.config, this.queryService, typeCodename, elementCodename); - } - - /** - * @deprecated Sync API v1 is deprecated and will be shut down by the end of this year. - * Please migrate to Sync API v2 using the `@kontent-ai/sync-sdk` package. - * - * For migration guidance and full documentation, visit: - * https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/ - */ - initializeSync(): InitializeSyncQuery { - return new InitializeSyncQuery(this.config, this.queryService); - } - - /** - * @deprecated Sync API v1 is deprecated and will be shut down by the end of this year. - * Please migrate to Sync API v2 using the `@kontent-ai/sync-sdk` package. - * - * For migration guidance and full documentation, visit: - * https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/ - */ - syncChanges(): SyncChangesQuery { - return new SyncChangesQuery(this.config, this.queryService); - } - - /** - * Item listing of where an asset is used - */ - assetUsedIn(assetCodename: string): UsedInQuery { - return new UsedInQuery(this.config, this.queryService, { entity: 'asset', codename: assetCodename }); - } - - /** - * Item listing of where a content item is used - */ - itemUsedIn(itemCodename: string): UsedInQuery { - return new UsedInQuery(this.config, this.queryService, { entity: 'contentItem', codename: itemCodename }); - } -} diff --git a/_legacy/lib/client/idelivery-client.interface.ts b/_legacy/lib/client/idelivery-client.interface.ts deleted file mode 100644 index 4f1ee49c..00000000 --- a/_legacy/lib/client/idelivery-client.interface.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ClientTypes, IContentItem } from '../models'; -import { - ElementQuery, - ItemsFeedQuery, - MultipleItemsQuery, - MultipleTypeQuery, - SingleItemQuery, - SingleTypeQuery, - TaxonomiesQuery, - TaxonomyQuery, - LanguagesQuery, - InitializeSyncQuery, - SyncChangesQuery, - UsedInQuery -} from '../query'; -import { IMappingService } from '../services'; - -export interface IDeliveryClient { - /** - * Mapping service - can be used to get strongly typed responses from json result - */ - mappingService: IMappingService; - - /** - * Gets query for languages - */ - languages(): LanguagesQuery; - - /** - * Gets query for multiple types - */ - types(): MultipleTypeQuery; - - /** - * Gets query for single type - * @param {string} typeCodename - Codename of the type to retrieve - */ - type(typeCodename: TClientTypes['contentTypeCodenames']): SingleTypeQuery; - - /** - * Gets query for multiple items - */ - items(): MultipleItemsQuery< - TClientTypes, - TContentItem - >; - - /** - * Gets query for items feed. Executes single HTTP request only - */ - itemsFeed(): ItemsFeedQuery< - TClientTypes, - TContentItem - >; - - /** - * Gets query for single item - * @param {string} codename - Codename of item to retrieve - */ - item( - codename: string - ): SingleItemQuery; - - /** - * Gets query for multiple taxonomies - */ - taxonomies(): TaxonomiesQuery; - - /** - * Gets query for single item - * @param {string} codename - Codename of taxonomy to retrieve - */ - taxonomy(codename: TClientTypes['taxonomyCodenames']): TaxonomyQuery; - - /** - * Gets query for an element within a type - */ - element( - typeCodename: TClientTypes['contentTypeCodenames'], - elementCodename: TClientTypes['elementCodenames'] - ): ElementQuery; - - /** - * @deprecated Sync API v1 is deprecated and will be shut down by the end of this year. - * Please migrate to Sync API v2 using the `@kontent-ai/sync-sdk` package. - * - * For migration guidance and full documentation, visit: - * https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/ - */ - initializeSync(): InitializeSyncQuery; - - /** - * @deprecated Sync API v1 is deprecated and will be shut down by the end of this year. - * Please migrate to Sync API v2 using the `@kontent-ai/sync-sdk` package. - * - * For migration guidance and full documentation, visit: - * https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/ - */ - syncChanges(): SyncChangesQuery; - - /** - * Item listing of where an asset is used - */ - assetUsedIn(assetCodename: string): UsedInQuery; - - /** - * Item listing of where a content item is used - */ - itemUsedIn(itemCodename: string): UsedInQuery; -} diff --git a/_legacy/lib/client/index.ts b/_legacy/lib/client/index.ts deleted file mode 100644 index fd0ce3d7..00000000 --- a/_legacy/lib/client/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './delivery-client'; -export * from './idelivery-client.interface'; -export * from './delivery-client.factory'; diff --git a/_legacy/lib/config/delivery-configs.ts b/_legacy/lib/config/delivery-configs.ts deleted file mode 100644 index 77a531fc..00000000 --- a/_legacy/lib/config/delivery-configs.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { IHeader, IHttpService, IRetryStrategyOptions } from '@kontent-ai/core-sdk'; - -import { ElementResolver } from '../elements'; -import { IProxyUrlData, IQueryConfig, LinkedItemsReferenceHandler } from '../models'; - -export interface IDeliveryClientProxyConfig { - /** - * Base url used for preview reqeusts. Defaults to 'preview-deliver.kontent.ai' - */ - basePreviewUrl?: string; - - /** - * Can be used to generate custom request urls. - * Useful when you have a proxy server and need to transform url to a specific format - * and setting 'baseUrl' is not sufficient. - */ - advancedProxyUrlResolver?: (data: IProxyUrlData) => string; - - /** - * Base url used for all requests. Defaults to 'deliver.kontent.ai' - */ - baseUrl?: string; -} - -export interface IDeliveryClientConfig { - /** - * EnvironmentId - */ - environmentId: string; - - /** - * Preview API key - */ - previewApiKey?: string; - - /** - * Secure API key - * Important: Use secured API only when running on Node.JS server, otherwise - * your key would be exposed in browsers - */ - secureApiKey?: string; - - /** - * Resolver used for using custom models for custom elements. - */ - elementResolver?: ElementResolver; - - /** - * Proxy configuration - */ - proxy?: IDeliveryClientProxyConfig; - - /** - * Default language of content items - */ - defaultLanguage?: string; - - /** - * Retry policy configuration - */ - retryStrategy?: IRetryStrategyOptions; - - /** - * Can be used to inject custom Http service to perform requests - */ - httpService?: IHttpService; - - /** - * Extra headers added to each http request - */ - globalHeaders?: (queryConfig: IQueryConfig) => IHeader[]; - - /** - * Default query configuration. Can be overriden by individual queries. - */ - defaultQueryConfig?: IQueryConfig; - - /** - * Indicates how linked item references are handled (can be used to disable refence mapping when you encounter an issue - * with circular refences) - */ - linkedItemsReferenceHandler?: LinkedItemsReferenceHandler; - - /** - * Sets custom domain for assets - */ - assetsDomain?: string; - - /** - * Codename of rendition preset to be applied by default to the base asset URL path. - */ - defaultRenditionPreset?: string; - - /** - * Can be used to exclude archived items from all queries by default. Only applicable when preview API is used - */ - excludeArchivedItems?: boolean; -} diff --git a/_legacy/lib/config/index.ts b/_legacy/lib/config/index.ts deleted file mode 100644 index a6e72ace..00000000 --- a/_legacy/lib/config/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './delivery-configs'; diff --git a/_legacy/lib/contracts/contracts.ts b/_legacy/lib/contracts/contracts.ts deleted file mode 100644 index 0e033e0b..00000000 --- a/_legacy/lib/contracts/contracts.ts +++ /dev/null @@ -1,265 +0,0 @@ -export namespace Contracts { - export interface IPaginationContract { - skip: number; - limit: number; - count: number; - next_page: string; - total_count?: number; - } - - export interface IContentTypeElementContract { - codename?: string; - type: string; - name: string; - taxonomy_group?: string; - options?: IElementOptionContract[]; - } - - export interface IContentTypeElementsContainer { - [key: string]: IContentTypeElementContract; - } - - export interface IElementOptionContract { - name: string; - codename: string; - } - - export interface IListLanguagesContract { - languages: ILanguageContract[]; - pagination: IPaginationContract; - } - - export interface IContentItemDeltaContract { - data: { - system: IContentItemSystemAttributesContract; - elements: IContentItemElementsContracts | undefined; - }; - change_type: 'changed_item' | 'deleted_item'; - timestamp: string; - } - - export interface IInitializeSyncContract { - items: IContentItemDeltaContract[]; - } - - export interface ISyncChangesContract { - items: IContentItemDeltaContract[]; - } - - export interface ILanguageContract { - system: { - id: string; - name: string; - codename: string; - }; - } - - export interface IViewContentTypeElementContract { - codename?: string; - type: string; - name: string; - taxonomy_group?: string; - options?: IElementOptionContract[]; - } - - export interface IElementContract { - codename?: string; - name: string; - type: string; - value: any; - taxonomy_group?: string; - } - - export interface IDateTimeElementContract extends IElementContract { - /** - * Display time zone - */ - display_timezone: string; - } - - export interface IAsssetRenditionContract { - rendition_id: string; - preset_id: string; - width: number; - height: number; - query: string; - } - - export interface IAssetContract { - name: string; - type: string; - size: number; - description: string; - url: string; - width: number | null; - height: number | null; - renditions?: { [renditionPresetCodename: string]: IAsssetRenditionContract }; - } - - export interface IMultipleChoiceOptionContract { - name: string; - codename: string; - } - - export interface ITaxonomyTerm { - name: string; - codename: string; - } - - export interface IRichTextElementLinkWrapperContract { - [key: string]: IRichTextElementLinkContract; - } - - export interface IRichTextElementLinkContract { - type: string; - codename: string; - url_slug: string; - } - - export interface IRichTextElementImageWrapperContract { - [key: string]: IRichTextElementImageContract; - } - - export interface IRichTextElementImageContract { - image_id: string; - url: string; - description: string | null; - height: number | null; - width: number | null; - } - - export interface IRichTextElementContract extends IElementContract { - /** - * Modular content items - */ - modular_content: string[]; - - /** - * Json with links - */ - links: IRichTextElementLinkWrapperContract; - - /** - * Json with images - */ - images: IRichTextElementImageWrapperContract; - } - - export interface IContentItemElementsContracts { - [key: string]: IElementContract; - } - - export interface ILinkContract { - codename: string; - type: string; - url_slug: string; - } - - export interface IModularContentContract { - [key: string]: IModularContentContentItemContract; - } - - export interface IModularContentContentItemContract { - system: IContentItemSystemAttributesContract; - elements: IContentItemElementsContracts; - } - - export interface IContentItemContract { - system: IContentItemSystemAttributesContract; - elements: IContentItemElementsContracts; - } - - export interface IContentItemSystemAttributesContract { - id: string; - name: string; - codename: string; - type: string; - last_modified: string; - language: string; - sitemap_locations: string[]; - collection: string; - workflow_step: string | null; - workflow: string | null; - } - - export interface IItemsWithModularContentContract { - items: IContentItemContract[]; - modular_content: IModularContentContract; - } - - export interface IItemsFeedContract extends IItemsWithModularContentContract {} - - export interface IUsedInItemsContract { - items: IUsedInItemContract[]; - } - - export interface IUsedInItemContract { - system: { - id: string; - name: string; - codename: string; - language: string; - type: string; - collection: string; - workflow: string; - workflow_step: string; - last_modified: string; - }; - } - - export interface IListContentItemsContract extends IItemsWithModularContentContract { - pagination: IPaginationContract; - } - - export interface IViewContentItemContract { - item: IContentItemContract; - modular_content: IModularContentContract; - } - - export interface ITaxonomyTermsContract { - name: string; - codename: string; - terms: ITaxonomyTermsContract[]; - } - - export interface ITaxonomySystemAttributesContract { - id: string; - name: string; - codename: string; - last_modified: Date; - } - - export interface ITaxonomyGroupContract { - system: ITaxonomySystemAttributesContract; - terms: ITaxonomyTermsContract[]; - } - - export interface IViewTaxonomyGroupContract { - system: ITaxonomySystemAttributesContract; - terms: ITaxonomyTermsContract[]; - } - - export interface IListTaxonomyGroupsContract { - taxonomies: ITaxonomyGroupContract[]; - pagination: IPaginationContract; - } - - export interface IContentTypeSystemAttributesContract { - id: string; - name: string; - codename: string; - last_modified: Date; - } - - export interface IContentTypeContract { - system: IContentTypeSystemAttributesContract; - elements: IContentTypeElementsContainer; - } - - export interface IListContentTypeContract { - types: IContentTypeContract[]; - pagination: IPaginationContract; - } - - export interface IViewContentTypeContract extends IContentTypeContract {} -} diff --git a/_legacy/lib/contracts/index.ts b/_legacy/lib/contracts/index.ts deleted file mode 100644 index c7041c4c..00000000 --- a/_legacy/lib/contracts/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './contracts'; diff --git a/_legacy/lib/elements/element-models.ts b/_legacy/lib/elements/element-models.ts deleted file mode 100644 index bd40c7f0..00000000 --- a/_legacy/lib/elements/element-models.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Contracts } from '../contracts'; -import { IContentItemSystemAttributes } from '../models/item-models'; -import { ElementType } from './element-type'; - -export namespace ElementModels { - export interface IElementWrapper { - element: string; - system: IContentItemSystemAttributes; - rawElement: Contracts.IElementContract; - } - - export interface IElement { - /** - * Name of the element - */ - name: string; - - /** - * Element type - */ - type: ElementType; - - /** - * Element value - */ - value: TValue; - } - - export interface AssetModel { - /** - * Name of the asset - */ - name: string; - - /** - * Type of the asset - */ - type: string; - - /** - * Size of the asset - */ - size: number; - - /** - * Description of the asset - */ - description: string | null; - - /** - * Url of the asset - */ - url: string; - - /** - * Width in pixels for image assets - */ - width: number | null; - - /** - * Height in pixels for image assets - */ - height: number | null; - - /** - * Dictionary with rendition preset codenames as keys and respective renditions as values. - */ - renditions: { [renditionPresetCodename: string]: Rendition } | null; - } - - export interface Rendition { - rendition_id: string; - preset_id: string; - width: number; - height: number; - query: string; - url: string; - } - - export interface MultipleChoiceOption { - name: string; - codename: TOptionCodename; - } - - export interface TaxonomyTerm { - name: string; - codename: TTaxonomyCodename; - } -} diff --git a/_legacy/lib/elements/element-resolver.ts b/_legacy/lib/elements/element-resolver.ts deleted file mode 100644 index a9906f0b..00000000 --- a/_legacy/lib/elements/element-resolver.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { ElementModels } from './element-models'; - -export type ElementResolver = (element: ElementModels.IElementWrapper) => any; diff --git a/_legacy/lib/elements/element-type.ts b/_legacy/lib/elements/element-type.ts deleted file mode 100644 index 2c2c5818..00000000 --- a/_legacy/lib/elements/element-type.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** -* Represents codename of Kontent.ai element types -*/ -export enum ElementType { - Text = 'text', - Number = 'number', - ModularContent = 'modular_content', - Asset = 'asset', - DateTime = 'date_time', - RichText = 'rich_text', - MultipleChoice = 'multiple_choice', - UrlSlug = 'url_slug', - Taxonomy = 'taxonomy', - Custom = 'custom', - Unknown = 'unknown' -} diff --git a/_legacy/lib/elements/elements.ts b/_legacy/lib/elements/elements.ts deleted file mode 100644 index 79824d11..00000000 --- a/_legacy/lib/elements/elements.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { IContentItem, ILink, IRichTextImage } from '../models'; -import { ElementModels } from './element-models'; - -export namespace Elements { - export type TextElement = ElementModels.IElement; - - export type LinkedItemsElement = ElementModels.IElement< - string[] - > & { - /** - * Linked items - */ - linkedItems: TContentItem[]; - }; - - export type MultipleChoiceElement = ElementModels.IElement< - ElementModels.MultipleChoiceOption[] - >; - - export type DateTimeElement = ElementModels.IElement & { - /** - * Display time zone - */ - displayTimeZone: string | null; - }; - - export type RichTextElement = ElementModels.IElement & { - /** - * Links - */ - links: ILink[]; - - /** - * Images included within rich text element - */ - images: IRichTextImage[]; - - /** - * Array of linked item codenames - */ - linkedItemCodenames: string[]; - - /** - * Array of linked items retrieved from `modular_content` part of the response. Not all items might be here - * as it depends on the `depth` parameter of query. - * The `linkedItemsReferenceHandler` configuration can be used to disable mapping of linked items - */ - linkedItems: TContentItem[]; - }; - - export type NumberElement = ElementModels.IElement; - - export type AssetsElement = ElementModels.IElement; - - export type UrlSlugElement = ElementModels.IElement; - - export type TaxonomyElement< - TaxonomyCodenames extends string = string, - TaxonomyGroupCodename extends string = string - > = ElementModels.IElement[]> & { - /** - * Taxonomy group - */ - taxonomyGroup: TaxonomyGroupCodename; - }; - - export type UnknownElement = ElementModels.IElement; - - export type CustomElement = ElementModels.IElement; -} diff --git a/_legacy/lib/elements/index.ts b/_legacy/lib/elements/index.ts deleted file mode 100644 index 16bcf153..00000000 --- a/_legacy/lib/elements/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './element-models'; -export * from './element-type'; -export * from './elements'; -export * from './element-resolver'; diff --git a/_legacy/lib/images/image-url-transformation-builder.factory.ts b/_legacy/lib/images/image-url-transformation-builder.factory.ts deleted file mode 100644 index 143d1d09..00000000 --- a/_legacy/lib/images/image-url-transformation-builder.factory.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ImageUrlTransformationBuilder } from './image-url-transformation-builder'; - -export function transformImageUrl(url: string): ImageUrlTransformationBuilder { - return new ImageUrlTransformationBuilder(url); -} diff --git a/_legacy/lib/images/image-url-transformation-builder.ts b/_legacy/lib/images/image-url-transformation-builder.ts deleted file mode 100644 index 7582c4e8..00000000 --- a/_legacy/lib/images/image-url-transformation-builder.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Parameters } from '../models'; -import { ImageCompression, ImageFitMode, ImageFormat } from './image.models'; - -export class ImageUrlTransformationBuilder { - private queryParams: IQueryParameter[] = []; - private readonly automaticFormatValue: string = 'format'; - - constructor( - /** Image url */ - public imageUrl: string - ) { } - - /** - * Used to add custom parameters to existing query string - * @param param Parameter (may or may not include value) - */ - withCustomParam(param: string): this { - this.queryParams.push( - new Parameters.CustomParameter(param) - ); - return this; - } - - /** - * The dpr transformation is used to serve correctly sized images for devices that expose a device pixel ratio. - * @param dpr A required DPR value. - */ - withDpr(dpr: number): this { - this.queryParams.push( - new Parameters.QueryParameter('dpr', dpr.toString()) - ); - - return this; - } - - /** - * Applies the crop transformation that removes pixels from an image outside the specified rectangle. - * @param x Rectangle offset on the X-axis. - * @param y Rectangle offset on the Y-axis. - * @param width Rectangle width. - * @param height Rectangle height. - */ - withRectangleCrop(x: number, y: number, width: number, height: number): this { - this.queryParams.push( - new Parameters.QueryParameter('rect', [x, y, width, height].join(',')) - ); - return this; - } - - /** - * Applies the crop transformation centered on the specified point. - * @param x Focal point X coordinate. - * @param y Focal point Y coordinate. - * @param z Zoom of the transformation. - */ - withFocalPointCrop(x: number, y: number, z: number): this { - this.withFitMode('crop'); - - this.queryParams.push(new Parameters.QueryParameter('crop', 'focalpoint')); - this.queryParams.push(new Parameters.QueryParameter('fp-x', x.toString())); - this.queryParams.push(new Parameters.QueryParameter('fp-y', y.toString())); - this.queryParams.push(new Parameters.QueryParameter('fp-z', z.toString())); - - return this; - } - - /** - * Enables WebP image support. - * @param compression Specifies the lossy or lossless compression. - */ - withAutomaticFormat(backupFormat?: ImageFormat): this { - this.queryParams.push( - new Parameters.QueryParameter('auto', this.automaticFormatValue) - ); - - if (backupFormat) { - this.withFormat(backupFormat); - } - - return this; - } - - /** - * The fit transformation controls how the output image is fit to its target dimensions after resizing. - * @param fitMode Specifies the mode for the transformation. - */ - withFitMode(fitMode: ImageFitMode): this { - this.queryParams.push(new Parameters.QueryParameter('fit', fitMode)); - return this; - } - - /** - * Specifies the compression mode for the WebP image transformations. - * @param compression Specifies the lossy or lossless compression. - */ - withCompression(compression: ImageCompression): this { - this.queryParams.push( - new Parameters.QueryParameter( - 'lossless', - compression === 'lossless' ? 'true' : 'false' - ) - ); - return this; - } - - /** - * Applies the quality parameter that enables control over the compression level for lossy file-formatted images. - * @param quality The required quality of the image. - */ - withQuality(quality: number): this { - this.queryParams.push( - new Parameters.QueryParameter('q', quality.toString()) - ); - return this; - } - - /** - * The format transformation enables the source image to be converted (a.k.a., "transcoded") from - * one encoded format to another. This is very useful when the source image has been saved in a sub-optimal - * file format that hinders performance. - * @param format Target image file type. - */ - withFormat(format: ImageFormat): this { - this.queryParams.push( - new Parameters.QueryParameter('fm', format) - ); - return this; - } - - /** - * The height transformation enables dynamic height resizing based on pixels and percent values. - * @param height A required image height. - */ - withHeight(height: number): this { - this.queryParams.push( - new Parameters.QueryParameter('h', height.toString()) - ); - return this; - } - - /** - * The width transformation enables dynamic width resizing based on pixels and percent values. - * @param width A required image width. - */ - withWidth(width: number): this { - this.queryParams.push(new Parameters.QueryParameter('w', width.toString())); - return this; - } - - /** - * Gets params applied to image - */ - getParams(): IQueryParameter[] { - return this.queryParams; - } - - /** - * Gets query string part of the image URL - */ - getQueryString(): string { - let query: string = ''; - this.queryParams.forEach(filter => { - if (query.indexOf('?') > -1) { - query = query + '&' + filter.getParam(); - } else { - query = query + '?' + filter.getParam(); - } - }); - - return query; - } - - /** - * Gets full transformed url to image with parameters - */ - getUrl(): string { - return this.imageUrl + this.getQueryString(); - } -} diff --git a/_legacy/lib/images/image.models.ts b/_legacy/lib/images/image.models.ts deleted file mode 100644 index 0181e969..00000000 --- a/_legacy/lib/images/image.models.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type ImageFitMode = 'clip' | 'scale' | 'crop'; -export type ImageFormat = 'gif' | 'png' |'png8' | 'jpg' | 'pjpg' |'webp'| 'mp4'; -export type ImageCompression = 'lossless' | 'lossy'; - diff --git a/_legacy/lib/images/index.ts b/_legacy/lib/images/index.ts deleted file mode 100644 index 77c422db..00000000 --- a/_legacy/lib/images/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './image-url-transformation-builder'; -export * from './image.models'; -export * from './image-url-transformation-builder.factory'; diff --git a/_legacy/lib/index.ts b/_legacy/lib/index.ts deleted file mode 100644 index 9305851b..00000000 --- a/_legacy/lib/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Public API -export * from './client'; -export * from './config'; -export * from './contracts'; -export * from './elements'; -export * from './images'; -export * from './mappers'; -export * from './models'; -export * from './query'; -export * from './sdk-info.generated'; -export * from './services'; -export * from './utilities'; diff --git a/_legacy/lib/mappers/element.mapper.ts b/_legacy/lib/mappers/element.mapper.ts deleted file mode 100644 index 66eb5d75..00000000 --- a/_legacy/lib/mappers/element.mapper.ts +++ /dev/null @@ -1,504 +0,0 @@ -import { codenameHelper, deliveryUrlHelper, enumHelper } from '../utilities'; - -import { IDeliveryClientConfig } from '../config'; -import { Contracts } from '../contracts'; -import { ElementModels, Elements, ElementType } from '../elements'; -import { - IContentItem, - IContentItemsContainer, - IContentItemWithRawDataContainer, - IContentItemWithRawElements, - ILink, - IMapElementsResult, - IRichTextImage -} from '../models'; - -interface IRichTextImageUrlRecord { - originalUrl: string; - newUrl: string; -} - -export class ElementMapper { - constructor(private readonly config: IDeliveryClientConfig) {} - - mapElements(data: { - dataToMap: IContentItemWithRawElements; - processedItems: IContentItemsContainer; - processingStartedForCodenames: string[]; - preparedItems: IContentItemWithRawDataContainer; - }): IMapElementsResult | undefined { - // return processed item to avoid infinite recursion - const processedItem = - data.processedItems[codenameHelper.escapeCodenameInCodenameIndexer(data.dataToMap.item.system.codename)]; - if (processedItem) { - // item was already resolved - return { - item: processedItem, - processedItems: data.processedItems, - preparedItems: data.preparedItems, - processingStartedForCodenames: data.processingStartedForCodenames - }; - } - - const preparedItem = - data.preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(data.dataToMap.item.system.codename)]; - - const itemInstance = preparedItem?.item; - - if (!itemInstance) { - // item is not present in response - return undefined; - } - - // mapp elements - const elementCodenames = Object.getOwnPropertyNames(data.dataToMap.rawItem.elements); - - for (const elementCodename of elementCodenames) { - const elementWrapper: ElementModels.IElementWrapper = { - system: data.dataToMap.item.system, - rawElement: data.dataToMap.rawItem.elements[elementCodename], - element: elementCodename - }; - - const mappedElement = this.mapElement({ - elementWrapper: elementWrapper, - item: itemInstance, - preparedItems: data.preparedItems, - processingStartedForCodenames: data.processingStartedForCodenames, - processedItems: data.processedItems - }); - - // set mapped elements - itemInstance.elements[elementCodename] = mappedElement; - } - - return { - item: itemInstance as TContentItem, - processedItems: data.processedItems, - preparedItems: data.preparedItems, - processingStartedForCodenames: data.processingStartedForCodenames - }; - } - - private mapElement(data: { - elementWrapper: ElementModels.IElementWrapper; - item: IContentItem; - processedItems: IContentItemsContainer; - processingStartedForCodenames: string[]; - preparedItems: IContentItemWithRawDataContainer; - }): ElementModels.IElement { - const elementType = enumHelper.getEnumFromValue(ElementType, data.elementWrapper.rawElement.type); - if (elementType) { - if (elementType === ElementType.ModularContent) { - return this.mapLinkedItemsElement({ - elementWrapper: data.elementWrapper, - preparedItems: data.preparedItems, - processingStartedForCodenames: data.processingStartedForCodenames, - processedItems: data.processedItems - }); - } - - if (elementType === ElementType.Text) { - return this.mapTextElement(data.elementWrapper); - } - if (elementType === ElementType.Asset) { - return this.mapAssetsElement(data.elementWrapper); - } - - if (elementType === ElementType.Number) { - return this.mapNumberElement(data.elementWrapper); - } - if (elementType === ElementType.MultipleChoice) { - return this.mapMultipleChoiceElement(data.elementWrapper); - } - - if (elementType === ElementType.DateTime) { - return this.mapDateTimeElement(data.elementWrapper); - } - - if (elementType === ElementType.RichText) { - // add to parent items - return this.mapRichTextElement( - data.elementWrapper, - data.processedItems, - data.processingStartedForCodenames, - data.preparedItems - ); - } - - if (elementType === ElementType.UrlSlug) { - return this.mapUrlSlugElement(data.elementWrapper); - } - - if (elementType === ElementType.Taxonomy) { - return this.mapTaxonomyElement(data.elementWrapper); - } - - if (elementType === ElementType.Custom) { - return this.mapCustomElement(data.elementWrapper); - } - } - console.warn( - `Could not map element '${data.elementWrapper.rawElement.name}' of type '${data.elementWrapper.rawElement.type}'. Returning unknown element instead.` - ); - return this.mapUnknowElement(data.elementWrapper); - } - - private mapRichTextElement( - elementWrapper: ElementModels.IElementWrapper, - processedItems: IContentItemsContainer, - processingStartedForCodenames: string[], - preparedItems: IContentItemWithRawDataContainer - ): Elements.RichTextElement { - const rawElement = elementWrapper.rawElement as Contracts.IRichTextElementContract; - - // get all linked items and linked items codenames nested in rich text - const richTextLinkedItems: IContentItem[] = []; - const richTextLinkedItemsCodenames: string[] = []; - - // The Kontent Delivery API is not guaranteed to return rich-text modular_content array items in the same order in which they appear inside the `value` property. - // We extract the modular_content codenames in the rich-text value and sort the raw modular_content based on that order instead. - const rawModularContentCodenamesMatches = (rawElement.value as string).matchAll( - /]+data-codename="(?[a-z0-9_]*)".*?>/g - ); - const rawModularContentCodenamesSorted = Array.from(rawModularContentCodenamesMatches).reduce( - (acc, match) => { - if (match.groups && match.groups.codename) { - acc.push(match.groups.codename); - } - return acc; - }, - [] as string[] - ); - const rawModularContentCodenames = [...rawElement.modular_content].sort(function (a, b) { - return rawModularContentCodenamesSorted.indexOf(a) - rawModularContentCodenamesSorted.indexOf(b); - }); - - for (const codename of rawModularContentCodenames) { - richTextLinkedItemsCodenames.push(codename); - // get linked item and check if it exists (it might not be included in response due to 'Depth' parameter) - const preparedData = preparedItems[codename]; - - // first try to get existing item - if (this.canMapLinkedItems()) { - const existingLinkedItem = this.getOrSaveLinkedItemForElement( - codename, - rawElement, - processedItems, - processingStartedForCodenames, - preparedItems - ); - - if (existingLinkedItem) { - // item was found, add it to linked items - richTextLinkedItems.push(existingLinkedItem); - } else { - // item was not found or not yet resolved - if (preparedData) { - const mappedLinkedItemResult = this.mapElements({ - dataToMap: preparedData, - preparedItems: preparedItems, - processingStartedForCodenames: processingStartedForCodenames, - processedItems: processedItems - }); - - // add mapped linked item to result - if (mappedLinkedItemResult) { - richTextLinkedItems.push(mappedLinkedItemResult.item); - } - } - } - } - } - - // get rich text images - const richTextImagesResult = this.getRichTextImages(rawElement.images); - - // extract and map links & images - const links: ILink[] = this.mapRichTextLinks(rawElement.links); - const images: IRichTextImage[] = richTextImagesResult.richTextImages; - - // replace asset urls in html - const richTextHtml: string = this.getRichTextHtml(rawElement.value, richTextImagesResult.imageUrlRecords); - - return { - images: images, - linkedItemCodenames: richTextLinkedItemsCodenames, - linkedItems: richTextLinkedItems, - links: links, - name: rawElement.name, - type: ElementType.RichText, - value: richTextHtml - }; - } - - private mapDateTimeElement(elementWrapper: ElementModels.IElementWrapper): Elements.DateTimeElement { - const rawElement = elementWrapper.rawElement as Contracts.IDateTimeElementContract; - return { - ...this.buildElement(elementWrapper, ElementType.DateTime, () => rawElement.value), - displayTimeZone: rawElement.display_timezone ?? null - }; - } - - private mapMultipleChoiceElement(elementWrapper: ElementModels.IElementWrapper): Elements.MultipleChoiceElement { - return this.buildElement(elementWrapper, ElementType.MultipleChoice, () => elementWrapper.rawElement.value); - } - - private mapNumberElement(elementWrapper: ElementModels.IElementWrapper): Elements.NumberElement { - return this.buildElement(elementWrapper, ElementType.Number, () => { - if (elementWrapper.rawElement.value === 0) { - return 0; - } else if (elementWrapper.rawElement.value) { - return +elementWrapper.rawElement.value; - } - return null; - }); - } - - private mapTextElement(elementWrapper: ElementModels.IElementWrapper): Elements.TextElement { - return this.buildElement(elementWrapper, ElementType.Text, () => elementWrapper.rawElement.value); - } - - private mapAssetsElement(elementWrapper: ElementModels.IElementWrapper): Elements.AssetsElement { - return this.buildElement(elementWrapper, ElementType.Asset, () => { - const assetContracts = elementWrapper.rawElement.value as Contracts.IAssetContract[]; - - const assets: ElementModels.AssetModel[] = []; - - for (const assetContract of assetContracts) { - let renditions: { [renditionPresetCodename: string]: ElementModels.Rendition } | null = null; - - // get asset url (custom domain may be configured) - const assetUrl: string = this.config.assetsDomain - ? deliveryUrlHelper.replaceAssetDomain(assetContract.url, this.config.assetsDomain) - : assetContract.url; - - if (assetContract.renditions) { - renditions = {}; - - for (const renditionPresetKey of Object.keys(assetContract.renditions)) { - const rendition = assetContract.renditions[renditionPresetKey]; - - renditions[renditionPresetKey] = { - ...rendition, - url: `${assetUrl}?${rendition.query}` // enhance rendition with absolute url - }; - } - } - - const renditionToBeApplied: ElementModels.Rendition | null = - (this.config.defaultRenditionPreset && renditions?.[this.config.defaultRenditionPreset]) || null; - - const finalUrl = renditionToBeApplied?.url ?? assetUrl; - - const asset: ElementModels.AssetModel = { - ...assetContract, - url: finalUrl, // use custom url of asset which may contain custom domain and applied rendition - renditions - }; - - assets.push(asset); - } - - return assets; - }); - } - - private mapTaxonomyElement(elementWrapper: ElementModels.IElementWrapper): Elements.TaxonomyElement { - return { - ...this.buildElement(elementWrapper, ElementType.Taxonomy, () => elementWrapper.rawElement.value), - taxonomyGroup: elementWrapper.rawElement.taxonomy_group ?? '' - }; - } - - private mapUnknowElement(elementWrapper: ElementModels.IElementWrapper): Elements.UnknownElement { - return this.buildElement(elementWrapper, ElementType.Unknown, () => elementWrapper.rawElement.value); - } - - private mapCustomElement( - elementWrapper: ElementModels.IElementWrapper - ): Elements.CustomElement | ElementModels.IElement { - // try to find element resolver - if (this.config.elementResolver) { - const elementResolverValue = this.config.elementResolver(elementWrapper); - - if (elementResolverValue) { - return this.buildElement(elementWrapper, ElementType.Custom, () => elementResolverValue); - } - } - - return this.buildElement(elementWrapper, ElementType.Custom, () => elementWrapper.rawElement.value); - } - - private mapUrlSlugElement(elementWrapper: ElementModels.IElementWrapper): Elements.UrlSlugElement { - return this.buildElement(elementWrapper, ElementType.UrlSlug, () => elementWrapper.rawElement.value); - } - - private mapLinkedItemsElement(data: { - elementWrapper: ElementModels.IElementWrapper; - processedItems: IContentItemsContainer; - processingStartedForCodenames: string[]; - preparedItems: IContentItemWithRawDataContainer; - }): Elements.LinkedItemsElement { - // prepare linked items - const linkedItems: IContentItem[] = []; - - // value = array of item codenames - const linkedItemCodenames = data.elementWrapper.rawElement.value as string[]; - - for (const codename of linkedItemCodenames) { - if (this.canMapLinkedItems()) { - const linkedItem = this.getOrSaveLinkedItemForElement( - codename, - data.elementWrapper.rawElement, - data.processedItems, - data.processingStartedForCodenames, - data.preparedItems - ); - if (linkedItem) { - // add item to result - linkedItems.push(linkedItem); - } - } - } - - return { - ...this.buildElement(data.elementWrapper, ElementType.ModularContent, () => linkedItemCodenames), - linkedItems: linkedItems - }; - } - - private getOrSaveLinkedItemForElement( - codename: string, - element: Contracts.IElementContract, - processedItems: IContentItemsContainer, - mappingStartedForCodenames: string[], - preparedItems: IContentItemWithRawDataContainer - ): IContentItem | undefined { - const escapedCodename = codenameHelper.escapeCodenameInCodenameIndexer(codename); - - // first check if item was already resolved and return it if it was - const processedItem = processedItems[escapedCodename]; - - if (processedItem) { - // item was already resolved - return processedItem; - } - - const preparedItem = preparedItems[escapedCodename]; - - if (mappingStartedForCodenames.includes(codename)) { - return preparedItem?.item; - } - - mappingStartedForCodenames.push(codename); - - // throw error if item is not in response and errors are not skipped - if (!preparedItem) { - return undefined; - } - - let mappedLinkedItem: TContentItemType | undefined; - - // original resolving if item is still undefined - const mappedLinkedItemResult = this.mapElements({ - dataToMap: preparedItem, - preparedItems: preparedItems, - processingStartedForCodenames: mappingStartedForCodenames, - processedItems: processedItems - }); - - if (mappedLinkedItemResult) { - mappedLinkedItem = mappedLinkedItemResult.item; - - // add to processed items - processedItems[escapedCodename] = mappedLinkedItem; - } - - return mappedLinkedItem; - } - - private mapRichTextLinks(linksJson: Contracts.IRichTextElementLinkWrapperContract): ILink[] { - const links: ILink[] = []; - - for (const linkId of Object.keys(linksJson)) { - const linkRaw = linksJson[linkId]; - links.push({ - codename: linkRaw.codename, - linkId: linkId, - urlSlug: linkRaw.url_slug, - type: linkRaw.type - }); - } - - return links; - } - - private getRichTextHtml(richTextHtml: string, richTextImageRecords: IRichTextImageUrlRecord[]): string { - for (const richTextImageRecord of richTextImageRecords) { - // replace rich text image url if it differs - if (richTextImageRecord.newUrl !== richTextImageRecord.originalUrl) { - richTextHtml = richTextHtml.replace( - new RegExp(richTextImageRecord.originalUrl, 'g'), - richTextImageRecord.newUrl - ); - } - } - - return richTextHtml; - } - - private getRichTextImages(imagesJson: Contracts.IRichTextElementImageWrapperContract): { - richTextImages: IRichTextImage[]; - imageUrlRecords: IRichTextImageUrlRecord[]; - } { - const images: IRichTextImage[] = []; - const imageUrlRecords: IRichTextImageUrlRecord[] = []; - - for (const imageId of Object.keys(imagesJson)) { - const imageRaw = imagesJson[imageId]; - - // image may contain custom asset domain - const imageUrl: string = this.config.assetsDomain - ? deliveryUrlHelper.replaceAssetDomain(imageRaw.url, this.config.assetsDomain) - : imageRaw.url; - - images.push({ - description: imageRaw.description ?? null, - imageId: imageRaw.image_id, - url: imageUrl, - height: imageRaw.height ?? null, - width: imageRaw.width ?? null - }); - - imageUrlRecords.push({ - originalUrl: imageRaw.url, - newUrl: imageUrl - }); - } - - return { - imageUrlRecords: imageUrlRecords, - richTextImages: images - }; - } - - private buildElement( - elementWrapper: ElementModels.IElementWrapper, - type: ElementType, - valueFactory: () => TValue - ): ElementModels.IElement { - return { - name: elementWrapper.rawElement.name, - type: type, - value: valueFactory() - }; - } - - private canMapLinkedItems(): boolean { - if (!this.config.linkedItemsReferenceHandler) { - return true; - } - return this.config.linkedItemsReferenceHandler === 'map'; - } -} diff --git a/_legacy/lib/mappers/generic-element.mapper.ts b/_legacy/lib/mappers/generic-element.mapper.ts deleted file mode 100644 index 05a70fe0..00000000 --- a/_legacy/lib/mappers/generic-element.mapper.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Contracts } from '../contracts'; -import { IGenericElement } from '../models'; - -export class GenericElementMapper { - mapElement(response: Contracts.IViewContentTypeElementContract): IGenericElement { - if (!response) { - throw Error(`Invalid response for mapping element`); - } - - const element = response; - - return { - codename: element.codename, - name: element.name, - type: element.type, - options: element.options ? element.options : [], - taxonomyGroup: element.taxonomy_group - }; - } -} diff --git a/_legacy/lib/mappers/index.ts b/_legacy/lib/mappers/index.ts deleted file mode 100644 index 562654df..00000000 --- a/_legacy/lib/mappers/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './element.mapper'; -export * from './item.mapper'; -export * from './taxonomy.mapper'; -export * from './type.mapper'; -export * from './generic-element.mapper'; -export * from './language.mapper'; -export * from './used-in.mapper'; -export * from './sync.mapper'; diff --git a/_legacy/lib/mappers/item.mapper.ts b/_legacy/lib/mappers/item.mapper.ts deleted file mode 100644 index 6abc259c..00000000 --- a/_legacy/lib/mappers/item.mapper.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { codenameHelper } from '../utilities'; -import { IDeliveryClientConfig } from '../config'; -import { Contracts } from '../contracts'; -import { - IContentItem, - IContentItemsContainer, - IContentItemWithRawDataContainer, - IContentItemWithRawElements -} from '../models'; -import { ElementMapper } from './element.mapper'; - -export interface IMapItemResult< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem -> { - item: TContentItem; - processedItems: IContentItemsContainer; - preparedItems: IContentItemWithRawDataContainer; - processingStartedForCodenames: string[]; -} - -export interface IMultipleItemsMapResult< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem -> { - items: TContentItem[]; - linkedItems: IContentItemsContainer; -} - -export interface ISingleItemMapResult< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem -> { - item: TContentItem; - linkedItems: IContentItemsContainer; -} - -export class ItemMapper { - private readonly elementMapper: ElementMapper; - - constructor(readonly config: IDeliveryClientConfig) { - this.elementMapper = new ElementMapper(config); - } - - /** - * Maps single item to its proper strongly typed model from the given response - * @param response Response used to map the item - * @param queryConfig Query configuration - */ - mapSingleItemFromResponse( - response: Contracts.IViewContentItemContract - ): ISingleItemMapResult { - const mapResult = this.mapItems({ - mainItems: [response.item], - linkedItems: Object.values(response.modular_content) - }); - - return { - item: mapResult.items[0], - linkedItems: mapResult.linkedItems - }; - } - - /** - * Maps multiple items to their strongly typed model from the given response - * @param response Response used to map the item - * @param queryConfig Query configuration - */ - mapMultipleItemsFromResponse( - response: Contracts.IItemsWithModularContentContract - ): IMultipleItemsMapResult { - const mapResult = this.mapItems({ - mainItems: response.items, - linkedItems: Object.values(response.modular_content) - }); - - return mapResult; - } - - /** - * Maps item contracts to full models - */ - mapItems(data: { - mainItems: Contracts.IContentItemContract[]; - linkedItems: Contracts.IContentItemContract[]; - }): IMultipleItemsMapResult { - const processedItems: IContentItemsContainer = {}; - const preparedItems: IContentItemWithRawDataContainer = {}; - const processingStartedForCodenames: string[] = []; - const mappedMainItems: TContentItem[] = []; - const mappedLinkedItems: IContentItemsContainer = {}; - const itemsToResolve: Contracts.IContentItemContract[] = [...data.mainItems, ...data.linkedItems]; - - // first prepare reference for all items - for (const item of itemsToResolve) { - preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)] = { - item: this.createContentItem(item), - rawItem: item - }; - } - - // then resolve main items - for (const item of data.mainItems) { - const itemResult = this.mapItem({ - item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)], - processedItems: processedItems, - preparedItems: preparedItems, - processingStartedForCodenames: processingStartedForCodenames - }); - mappedMainItems.push(itemResult.item); - } - - // and linked items - for (const item of data.linkedItems) { - const itemResult = this.mapItem({ - item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)], - processedItems: processedItems, - preparedItems: preparedItems, - processingStartedForCodenames: processingStartedForCodenames - }); - - mappedLinkedItems[item.system.codename] = itemResult.item; - } - - return { - items: mappedMainItems, - linkedItems: mappedLinkedItems - }; - } - - /** - * Maps item contract to full model - */ - private mapItem(data: { - item: IContentItemWithRawElements; - processedItems: IContentItemsContainer; - processingStartedForCodenames: string[]; - preparedItems: IContentItemWithRawDataContainer; - }): IMapItemResult { - if (!data.item) { - throw Error(`Could not map item because its undefined`); - } - - const result = this.elementMapper.mapElements({ - dataToMap: data.item, - preparedItems: data.preparedItems, - processingStartedForCodenames: [], - processedItems: data.processedItems - }); - - if (!result) { - throw Error(`Mapping of content item '${data.item.item.system.codename}' failed`); - } - return { - item: result.item, - processedItems: result.processedItems, - preparedItems: result.preparedItems, - processingStartedForCodenames: result.processingStartedForCodenames - }; - } - - private createContentItem(item: Contracts.IContentItemContract): IContentItem { - const contentItem: IContentItem = { - elements: {}, - system: { - codename: item.system.codename, - collection: item.system.collection, - id: item.system.id, - language: item.system.language, - lastModified: item.system.last_modified, - name: item.system.name, - sitemapLocations: item.system.sitemap_locations, - type: item.system.type, - workflowStep: item.system.workflow_step ?? null, - workflow: item.system.workflow ?? null - } - }; - - return contentItem; - } -} diff --git a/_legacy/lib/mappers/language.mapper.ts b/_legacy/lib/mappers/language.mapper.ts deleted file mode 100644 index a3e17e4f..00000000 --- a/_legacy/lib/mappers/language.mapper.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Contracts } from '../contracts'; -import { ILanguage } from '../models'; - -export class LanguageMapper { - mapMultipleLanguages(response: Contracts.IListLanguagesContract): ILanguage[] { - return response.languages.map((language) => { - return this.mapLanguage(language); - }); - } - - private mapLanguage(language: Contracts.ILanguageContract): ILanguage { - if (!language) { - throw Error(`Cannot map language`); - } - - return { - system: { - codename: language.system.codename as TLanguageCodenames, - id: language.system.id, - name: language.system.name - } - }; - } -} diff --git a/_legacy/lib/mappers/sync.mapper.ts b/_legacy/lib/mappers/sync.mapper.ts deleted file mode 100644 index 0ed7dbfb..00000000 --- a/_legacy/lib/mappers/sync.mapper.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Contracts } from '../contracts'; -import { IContentItemDelta } from '../models'; - -export class SyncMapper { - mapContentItemDelta(itemDeltaContract: Contracts.IContentItemDeltaContract): IContentItemDelta { - const systemContract = itemDeltaContract.data.system; - - const elements: Contracts.IContentItemElementsContracts = itemDeltaContract.data.elements - ? itemDeltaContract.data.elements - : {}; - - return { - changeType: itemDeltaContract.change_type, - timestamp: itemDeltaContract.timestamp, - data: { - elements: elements, - system: { - codename: systemContract.codename, - collection: systemContract.collection, - id: systemContract.id, - language: systemContract.language, - lastModified: systemContract.last_modified, - name: systemContract.name, - sitemapLocations: systemContract.sitemap_locations, - type: systemContract.type, - workflowStep: systemContract.workflow_step ?? null, - workflow: systemContract.workflow ?? null - } - } - }; - } -} diff --git a/_legacy/lib/mappers/taxonomy.mapper.ts b/_legacy/lib/mappers/taxonomy.mapper.ts deleted file mode 100644 index 7371f5be..00000000 --- a/_legacy/lib/mappers/taxonomy.mapper.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Contracts } from '../contracts'; -import { ITaxonomyGroup, ITaxonomySystemAttributes, ITaxonomyTerms } from '../models'; - -export class TaxonomyMapper { - mapTaxonomy( - taxonomySystem: Contracts.ITaxonomySystemAttributesContract, - taxonomyTerms: Contracts.ITaxonomyTermsContract[] - ): ITaxonomyGroup { - if (!taxonomySystem) { - throw Error(`Cannot map taxonomy due to missing 'system' property`); - } - - if (!taxonomyTerms) { - throw Error(`Cannot map taxonomy due to missing 'terms' property`); - } - - if (!Array.isArray(taxonomyTerms)) { - throw Error(`Cannot map terms because no terms array was provided`); - } - - const mappedSystemAttributes: ITaxonomySystemAttributes = { - name: taxonomySystem.name, - codename: taxonomySystem.codename as TaxonomyCodenames, - id: taxonomySystem.id, - lastModified: taxonomySystem.last_modified - }; - - const mappedTerms: ITaxonomyTerms[] = this.mapTaxonomyTerms(taxonomyTerms); - - return { - system: mappedSystemAttributes, - terms: mappedTerms - }; - } - - mapTaxonomies(taxonomies: Contracts.ITaxonomyGroupContract[]): ITaxonomyGroup[] { - if (!taxonomies) { - throw Error(`Cannot map taxonomy due to missing 'taxonomies' property`); - } - - if (!Array.isArray(taxonomies)) { - throw Error(`Cannot map taxonomies because the 'taxonomies' property is not an array `); - } - - const mappedTaxonomies: ITaxonomyGroup[] = []; - - taxonomies.forEach((taxonomy) => { - mappedTaxonomies.push(this.mapTaxonomy(taxonomy.system, taxonomy.terms)); - }); - - return mappedTaxonomies; - } - - /** - * Recursively map array of taxonomy terms - * @param termsArray Terms array to map - */ - private mapTaxonomyTerms(termsArray: Contracts.ITaxonomyTermsContract[]): ITaxonomyTerms[] { - if (termsArray.length === 0) { - return []; - } - - const mappedTermsArray: ITaxonomyTerms[] = []; - - termsArray.forEach((terms) => { - const mappedTerms: ITaxonomyTerms = { - codename: terms.codename, - name: terms.name, - terms: this.mapTaxonomyTerms(terms.terms) - }; - - mappedTermsArray.push(mappedTerms); - }); - - return mappedTermsArray; - } -} diff --git a/_legacy/lib/mappers/type.mapper.ts b/_legacy/lib/mappers/type.mapper.ts deleted file mode 100644 index 75bdc12a..00000000 --- a/_legacy/lib/mappers/type.mapper.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Contracts } from '../contracts'; -import { IContentType, IContentTypeSystemAttributes, IGenericElement } from '../models'; - -export class TypeMapper { - mapSingleType(response: Contracts.IViewContentTypeContract): IContentType { - return this.mapType(response); - } - - mapMultipleTypes(response: Contracts.IListContentTypeContract): IContentType[] { - return response.types.map((type) => { - return this.mapType(type); - }); - } - - private mapType(type: Contracts.IContentTypeContract): IContentType { - if (!type) { - throw Error(`Cannot map type`); - } - - if (!type.elements) { - throw Error(`Cannot map type elements`); - } - - const system: IContentTypeSystemAttributes = { - codename: type.system.codename as TContentTypeCodenames, - id: type.system.id, - name: type.system.name, - lastModified: type.system.last_modified - }; - - const elements: IGenericElement[] = []; - - const elementNames = Object.getOwnPropertyNames(type.elements); - elementNames.forEach((elementName: string) => { - const typeElement = type.elements[elementName]; - - if (!typeElement) { - throw Error(`Cannot find element '${elementName}' on type '${type.system.codename}'`); - } - - // use json property as a codename of the type element - const elementCodename = elementName; - - // extra properties for certain element types - const options: Contracts.IElementOptionContract[] = []; - - // some elements can contain options - const rawOptions = typeElement.options; - if (rawOptions) { - if (!Array.isArray(rawOptions)) { - throw Error(`Content type 'options' property has to be an array`); - } - - rawOptions.forEach((rawOption) => { - options.push({ - codename: rawOption.codename, - name: rawOption.name - }); - }); - } - - elements.push({ - codename: elementCodename, - taxonomyGroup: typeElement.taxonomy_group, - options: options, - name: typeElement.name, - type: typeElement.type - }); - }); - - return { - elements: elements, - system: system - }; - } -} diff --git a/_legacy/lib/mappers/used-in.mapper.ts b/_legacy/lib/mappers/used-in.mapper.ts deleted file mode 100644 index d06633c2..00000000 --- a/_legacy/lib/mappers/used-in.mapper.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Contracts } from '../contracts'; -import { ClientTypes, IUsedInItemRecord } from '../models'; - -export class UsedInMapper { - mapUsedInItem(response: Contracts.IUsedInItemContract): IUsedInItemRecord { - return { - system: { - id: response.system.id, - name: response.system.name, - codename: response.system.codename, - language: response.system.language, - type: response.system.type, - collection: response.system.collection, - workflow: response.system.workflow, - workflowStep: response.system.workflow_step, - lastModified: response.system.last_modified - } - }; - } -} diff --git a/_legacy/lib/models/common/base-responses.ts b/_legacy/lib/models/common/base-responses.ts deleted file mode 100644 index e9f598f0..00000000 --- a/_legacy/lib/models/common/base-responses.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IResponse } from '@kontent-ai/core-sdk'; - -export interface IDeliveryNetworkResponse { - data: TData; - response: IResponse; - xContinuationToken?: string; - hasStaleContent: boolean; -} - -export interface IGroupedNetworkResponse { - data: TData; - responses: IDeliveryNetworkResponse[]; -} diff --git a/_legacy/lib/models/common/common-models.ts b/_legacy/lib/models/common/common-models.ts deleted file mode 100644 index 9df9958e..00000000 --- a/_legacy/lib/models/common/common-models.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { IHeader, IHttpCancelRequestToken, IQueryParameter } from '@kontent-ai/core-sdk'; -import { IDeliveryNetworkResponse } from './base-responses'; -import { IPagination } from './pagination.class'; - -export type LinkedItemsReferenceHandler = 'map' | 'ignore'; - -export interface IProxyUrlData { - action: string; - domain: string; - queryParameters: IQueryParameter[]; - queryString: string; - queryConfig: IQueryConfig; - environmentId: string; -} - -export interface ISDKInfo { - /** - * Name of SDK - */ - name: string; - /** - * Version SDK - */ - version: string; - /** - * Host of SDK - */ - host: string; -} - -export interface IKontentResponse {} - -export interface IKontentListWithHeaderResponse extends IKontentResponse { - items: any[]; -} - -export interface IKontentListResponse extends IKontentResponse { - pagination?: IPagination; - items: any[]; -} - -export interface IKontentListAllResponse extends IKontentResponse { - responses: any[]; - items: any[]; -} - -export interface IListAllQueryConfig { - /** - * Number of pages to get. If not set, all available pages are fetched. - */ - pages?: number; - - /** - * Delay between each HTTP requests - */ - delayBetweenRequests?: number; - - /** - * Executed when a list response is loaded - */ - responseFetched?: ( - response: IDeliveryNetworkResponse, - nextPageUrl?: string, - continuationToken?: string - ) => void; -} - -export interface IQueryConfig { - /** - * Indicates if query should use preview mode. Overrides default configuration - */ - usePreviewMode?: boolean; - - /** - * Indicates if query should use secured delivery API mode. Overrides default configuration - */ - useSecuredMode?: boolean; - - /** - * If the requested content has changed since the last request, the header determines whether - * to wait while fetching content. This can be useful when retrieving changed content - * in reaction to a webhook call. By default, when the header is not set, the API - * serves old content (if cached by the CDN) while it's fetching the new content - * to minimize wait time. - */ - waitForLoadingNewContent?: boolean; - - /** - * Extra headers added to request - */ - customHeaders?: IHeader[]; - - /** - * Cancel token - */ - cancelToken?: IHttpCancelRequestToken; -} - -export interface IDeliveryErrorRaw { - message: string; - request_id: string | null; - error_code: number; - specific_code: number; -} - -export class DeliveryError { - public message: string; - public requestId: string | null; - public errorCode: number; - public specificCode: number; - - constructor(data: { message: string; requestId: string | null; errorCode: number; specificCode: number }) { - this.message = data.message; - this.requestId = data.requestId; - this.errorCode = data.errorCode; - this.specificCode = data.specificCode; - } -} diff --git a/_legacy/lib/models/common/filters.ts b/_legacy/lib/models/common/filters.ts deleted file mode 100644 index 2877eec9..00000000 --- a/_legacy/lib/models/common/filters.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -export namespace Filters { - const valueSeparator: string = ','; - const defaultValue: string = ''; - - const getParamValueForSystemFilter = (param: string | string[]): string | undefined => { - if (!param) { - return defaultValue; - } - - if (Array.isArray(param)) { - let value = ''; - // use [in] filter - for (let i = 0; i < param.length; i++) { - value = value + param[i].toString(); - - if (i !== param.length - 1) { - // append separator if its not last item - value = value + valueSeparator; - } - } - - return value; - } - - // single param was given - return param.toString(); - }; - - export class TypeFilter implements IQueryParameter { - constructor(public type: string | string[]) {} - - getParam(): string { - if (Array.isArray(this.type)) { - // multiple types - return `system.type[in]=${getParamValueForSystemFilter(this.type)}`; - } - - // single type - return `system.type=${getParamValueForSystemFilter(this.type)}`; - } - } - - export class CollectionFilter implements IQueryParameter { - constructor(public collection: string | string[]) {} - - getParam(): string { - if (Array.isArray(this.collection)) { - // multiple collections - return `system.collection[in]=${getParamValueForSystemFilter(this.collection)}`; - } - - // single collection - return `system.collection=${getParamValueForSystemFilter(this.collection)}`; - } - } - - export class EmptyFilter implements IQueryParameter { - constructor(public element: string) {} - - getParam(): string { - return `${this.element.trim()}[empty]`; - } - } - - export class NotEmptyFilter implements IQueryParameter { - constructor(public element: string) {} - - getParam(): string { - return `${this.element.trim()}[nempty]`; - } - } - - export class EqualsFilter implements IQueryParameter { - constructor(public element: string, public value: string) {} - - getParam(): string { - return `${this.element.trim()}[eq]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.value) { - return defaultValue; - } - - return this.value; - } - } - - export class NotEqualsFilter implements IQueryParameter { - constructor(public element: string, public value: string) {} - - getParam(): string { - return `${this.element.trim()}[neq]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.value) { - return defaultValue; - } - - return this.value; - } - } - - export class AllFilter implements IQueryParameter { - constructor(public element: string, public values: string[]) {} - - getParam(): string { - return `${this.element.trim()}[all]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.values || !Array.isArray(this.values)) { - return defaultValue; - } - - return this.values.map((m) => m.trim()).join(','); - } - } - - export class AnyFilter implements IQueryParameter { - constructor(public element: string, public values: string[]) {} - - getParam(): string { - return `${this.element.trim()}[any]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.values || !Array.isArray(this.values)) { - return defaultValue; - } - - return this.values.map((m) => m.trim()).join(','); - } - } - - export class ContainsFilter implements IQueryParameter { - constructor(public element: string, public values: string[]) {} - - getParam(): string { - return `${this.element.trim()}[contains]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.values || !Array.isArray(this.values)) { - return defaultValue; - } - - return this.values.map((m) => m.trim()).join(','); - } - } - - export class GreaterThanFilter implements IQueryParameter { - constructor(public element: string, public value: string | number) {} - - getParam(): string { - return `${this.element.trim()}[gt]=${this.getParamValue()}`; - } - - private getParamValue(): string | number | undefined { - if (!this.value) { - return defaultValue; - } - - return this.value; - } - } - - export class GreaterThanOrEqualFilter implements IQueryParameter { - constructor(public element: string, public value: string | number) {} - - getParam(): string { - return `${this.element.trim()}[gte]=${this.getParamValue()}`; - } - - getParamValue(): string | number | undefined { - if (!this.value) { - return defaultValue; - } - - return this.value; - } - } - - export class InFilter implements IQueryParameter { - constructor(public element: string, public values: string[]) {} - - getParam(): string { - return `${this.element.trim()}[in]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.values || !Array.isArray(this.values)) { - return defaultValue; - } - - return this.values - .map((m) => { - return m.trim(); - }) - .join(','); - } - } - - export class NotInFilter implements IQueryParameter { - constructor(public element: string, public values: string[]) {} - - getParam(): string { - return `${this.element.trim()}[nin]=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.values || !Array.isArray(this.values)) { - return defaultValue; - } - - return this.values - .map((m) => { - return m.trim(); - }) - .join(','); - } - } - - export class LessThanFilter implements IQueryParameter { - constructor(public element: string, public value: string | number) {} - - getParam(): string { - return `${this.element.trim()}[lt]=${this.getParamValue()}`; - } - - private getParamValue(): string | number | undefined { - if (!this.value) { - return defaultValue; - } - return this.value; - } - } - - export class LessThanOrEqualFilter implements IQueryParameter { - constructor(public element: string, public value: string | number) {} - - getParam(): string { - return `${this.element.trim()}[lte]=${this.getParamValue()}`; - } - - private getParamValue(): string | number | undefined { - if (!this.value) { - return defaultValue; - } - - return this.value; - } - } - - export class RangeFilter implements IQueryParameter { - constructor(public element: string, public lowerValue: number | string, public higherValue: number | string) {} - - getParam(): string { - return `${this.element.trim()}[range]=${this.getParamValue()}`; - } - - private getParamValue(): string | number | undefined { - let lowerVal = defaultValue; - let higherVal = defaultValue; - - if (this.lowerValue) { - lowerVal = this.lowerValue.toString(); - } - - if (this.higherValue) { - higherVal = this.higherValue.toString(); - } - - return `${lowerVal},${higherVal}`; - } - } -} diff --git a/_legacy/lib/models/common/headers.ts b/_legacy/lib/models/common/headers.ts deleted file mode 100644 index 01041a7a..00000000 --- a/_legacy/lib/models/common/headers.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const continuationTokenHeaderName: string = 'X-Continuation'; -export const waitForLoadingNewContentHeader: string = 'X-KC-Wait-For-Loading-New-Content'; -export const sdkVersionHeader: string = 'X-KC-SDKID'; -export const staleContentHeaderName: string = 'X-Stale-Content'; - diff --git a/_legacy/lib/models/common/index.ts b/_legacy/lib/models/common/index.ts deleted file mode 100644 index 332cc006..00000000 --- a/_legacy/lib/models/common/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './filters'; -export * from './pagination.class'; -export * from './parameters'; -export * from './sort-order'; -export * from './common-models'; -export * from './base-responses'; -export * from './headers'; diff --git a/_legacy/lib/models/common/pagination.class.ts b/_legacy/lib/models/common/pagination.class.ts deleted file mode 100644 index 421d842a..00000000 --- a/_legacy/lib/models/common/pagination.class.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface IPagination { - skip: number; - limit: number; - count: number; - nextPage: string; - totalCount: number | null; -} diff --git a/_legacy/lib/models/common/parameters.ts b/_legacy/lib/models/common/parameters.ts deleted file mode 100644 index cbaa7a9f..00000000 --- a/_legacy/lib/models/common/parameters.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { SortOrder } from './sort-order'; - -export namespace Parameters { - const defaultValue: string = ''; - - export class QueryParameter implements IQueryParameter { - /** - * Parameter - * @constructor - * @param {string} name - Name of the parameter - * @param {string} value - Value of the parameter - */ - constructor(public name: string, public value: string) { - if (!name) { - throw Error(`Name of the parameter is not specified`); - } - } - - getParam(): string { - return `${this.name}=${this.value}`; - } - } - - export class ElementsParameter implements IQueryParameter { - /** - * Sets elements (projection) so that only certain elements from a content item are returned - * @constructor - * @param {string[]} elementCodenames - Array of element codenames to include in response. - */ - constructor(public elementCodenames: string[]) {} - - getParam(): string { - return `elements=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.elementCodenames) { - return defaultValue; - } - - return this.elementCodenames - .map((m) => { - if (!m) { - throw Error(`Codename of 'ElementsParameter' cannot be null or empty`); - } - return m.trim(); - }) - .join(','); - } - } - - export class ExcludeElementsParameter implements IQueryParameter { - /** - * Sets elements (projection) so that only certain elements are excluded from API response - * @constructor - * @param {string[]} elementCodenames - Array of element codenames to exclude from API response. - */ - constructor(public elementCodenames: string[]) {} - - getParam(): string { - return `excludeElements=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - if (!this.elementCodenames) { - return defaultValue; - } - - return this.elementCodenames - .map((m) => { - if (!m) { - throw Error(`Codename of 'ExcludeElementsParameter' cannot be null or empty`); - } - return m.trim(); - }) - .join(','); - } - } - - export class LimitParameter implements IQueryParameter { - /** - * Limits the number of items that are returned from response - * @constructor - * @param {number} limit - Number of elements that will be returned - */ - constructor(public limit: number) { - if (limit <= 0) { - throw Error(`'LimitParameter' must specify a positive integer`); - } - } - - getParam(): string { - return `limit=${this.limit}`; - } - } - - export class IncludeTotalCountParameter implements IQueryParameter { - /** - * Adds 'includeTotalCount' query parameter to query - * @constructor - */ - constructor() {} - - getParam(): string { - return `includeTotalCount=true`; - } - } - - export class SkipParameter implements IQueryParameter { - /** - * Configures response to skip certain number of items - * @constructor - * @param {number} skip - Number of content items that will be skipped - */ - constructor(public skip: number) { - if (skip < 0) { - throw Error(`'SkipParameter' must specify a positive integer number or zero."`); - } - } - - getParam(): string { - return `skip=${this.skip}`; - } - } - - export class OrderParameter implements IQueryParameter { - /** - * Sorts the response based on given element. - * @constructor - * @param {string} element - Element that will be used for sorting (can be both elements. or system.) - * @param {SortOrder} sortOrder - Order type (desc/asc). Defaults to 'asc' if SortOrder is null or invalid. - */ - constructor(public element: string, public sortOrder: SortOrder) { - if (!element) { - throw Error(`Element specified in 'OrderParameter' is null or empty`); - } - } - - getParam(): string { - return `order=${this.getParamValue()}`; - } - - private getParamValue(): string | undefined { - return `${this.element.trim()}[${this.sortOrder}]`; - } - } - - export class CustomParameter implements IQueryParameter { - constructor(public param: string) {} - - getParam(): string { - return this.param; - } - } - - export class DepthParameter implements IQueryParameter { - /** - * Configures the depth of the response. Content items might reference another 'linked items' using the Linked items element. - * Recursively, these linked items can reference another linked items. - * By default, only one level of linked content is returned. - * @constructor - * @param {number} depth - Depth fo the response - */ - constructor(public depth: number) { - if (depth < 0) { - throw Error(`'DepthParameter' must specify a positive integer or zero`); - } - } - - getParam(): string { - return `depth=${this.depth}`; - } - } - - export class LanguageParameter implements IQueryParameter { - /** - * Specifies language version to fetch - * @constructor - * @param {string} languageCodename - Codename of the language - */ - constructor(public languageCodename: string) {} - - getParam(): string { - return `language=${this.languageCodename}`; - } - } -} diff --git a/_legacy/lib/models/common/sort-order.ts b/_legacy/lib/models/common/sort-order.ts deleted file mode 100644 index 31f824b6..00000000 --- a/_legacy/lib/models/common/sort-order.ts +++ /dev/null @@ -1 +0,0 @@ -export type SortOrder = 'asc' | 'desc'; diff --git a/_legacy/lib/models/content-type-models.ts b/_legacy/lib/models/content-type-models.ts deleted file mode 100644 index 6a88fff7..00000000 --- a/_legacy/lib/models/content-type-models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { IQueryConfig } from './common/common-models'; -import { IGenericElement } from './element-models'; - -export interface IContentTypeSystemAttributes { - /** - * Id of the type - */ - id: string; - - /** - * Name of the type - */ - name: string; - - /** - * Codename of the type - */ - codename: TContentTypeCodename; - - /** - * Date of last modification - */ - lastModified: Date; -} - -export interface IContentType { - /** - * Content type system attributes - */ - system: IContentTypeSystemAttributes; - - /** - * Elements (elements) assigned to content type - */ - elements: IGenericElement[]; -} - -export interface IContentTypeQueryConfig extends IQueryConfig { - /** - * No dedicated properties required at this moment - */ -} diff --git a/_legacy/lib/models/element-models.ts b/_legacy/lib/models/element-models.ts deleted file mode 100644 index 70107807..00000000 --- a/_legacy/lib/models/element-models.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { IQueryConfig } from './common/common-models'; - -export interface IElementQueryConfig extends IQueryConfig { - /** - * No dedicated properties required at this moment - */ -} - -export interface IGenericElementOption { - /** - * Name of the option - */ - name: string; - - /** - * Value of the option - */ - codename: string; -} - -export interface IGenericElement { - /** - * Indexer - */ - [key: string]: any; - - /** - * Codename of the element - */ - codename?: string; - - /** - * Type of the element - */ - type: string; - - /** - * Name of the element - */ - name: string; - - /** - * Taxonomy group in case the element is a taxonomy - */ - taxonomyGroup?: string; - - /** - * Array of options if the element has some - */ - options: IGenericElementOption[]; -} diff --git a/_legacy/lib/models/index.ts b/_legacy/lib/models/index.ts deleted file mode 100644 index bb64e783..00000000 --- a/_legacy/lib/models/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from './common'; -export * from './element-models'; -export * from './item-models'; -export * from './taxonomy-models'; -export * from './content-type-models'; -export * from './language-models'; -export * from './responses'; -export * from './sync-models'; - diff --git a/_legacy/lib/models/item-models.ts b/_legacy/lib/models/item-models.ts deleted file mode 100644 index c00d76c2..00000000 --- a/_legacy/lib/models/item-models.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { Contracts } from '../contracts'; -import { ElementModels } from '../elements/element-models'; -import { IQueryConfig } from './common/common-models'; - -export interface IMapElementsResult< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem -> { - item: TContentItem; - processedItems: IContentItemsContainer; - preparedItems: IContentItemWithRawDataContainer; - processingStartedForCodenames: string[]; -} - -export interface IContentItemSystemAttributes< - TTypeCodename extends string = string, - TLanguageCodenames extends string = string, - TCollectionCodenames extends string = string, - TWorkflowCodenames extends string = string, - TWorkflowStepCodenames extends string = string -> { - /** - * Id of the item - */ - id: string; - - /** - * Name of the item - */ - name: string; - - /** - * Codename of the item - */ - codename: string; - - /** - * Codename of the type this item is using - */ - type: TTypeCodename; - - /** - * Date when the item was last modified - */ - lastModified: string; - - /** - * Codename of the language - */ - language: TLanguageCodenames; - - /** - * Array of sitemap locations (obsolete) - */ - sitemapLocations: string[]; - - /** - * Codename of the collection this item belongs to - */ - collection: TCollectionCodenames; - - /** - * Workflow step of the item - */ - workflowStep: TWorkflowStepCodenames | null; - - /** - * Workflow of the item - */ - workflow: TWorkflowCodenames | null; -} - -/** - * Indexer for elements within content item - */ -export type ContentItemElementsIndexer = ElementModels.IElement> = - TElement; - -export type ContentItemType = 'component' | 'linkedItem'; - -/** - * Prefix with I to keep the name consistent and prevent releasing major version - */ -export type IContentItemElements = Record< - TElementCodenames, - ContentItemElementsIndexer ->; - -export type Snippet< - TElementCodenames extends string, - TElements extends IContentItemElements -> = TElements; - -export interface IContentItem< - TElements extends IContentItemElements = IContentItemElements, - TTypeCodename extends string = string, - TLanguageCodenames extends string = string, - TCollectionCodenames extends string = string, - TWorkflowCodenames extends string = string, - TWorkflowStepCodenames extends string = string, - TTypeElementCodenames extends string = string -> { - /** - * Elements of the content item - */ - elements: TElements; - - /** - * System data of the content item - */ - system: IContentItemSystemAttributes< - TTypeCodename, - TLanguageCodenames, - TCollectionCodenames, - TWorkflowCodenames, - TWorkflowStepCodenames - >; -} - -export interface ILink { - /** - * Id of the link - */ - linkId: string; - - /** - * Codename of the content item - */ - codename: string; - - /** - * Type codename of the content item - */ - type: string; - - /** - * Url slug defined for the content item - */ - urlSlug: string; -} - -export interface IContentItemWithRawElements { - item: IContentItem; - rawItem: Contracts.IContentItemContract; -} - -export interface IContentItemWithRawDataContainer { - [key: string]: IContentItemWithRawElements; -} - -export interface IContentItemsContainer { - [key: string]: TContentItem | undefined; -} - -export interface IRichTextImage { - imageId: string; - url: string; - description: string | null; - width: number | null; - height: number | null; -} - -export interface IItemQueryConfig extends IQueryConfig {} - -export interface IItemFeedQueryConfig extends IQueryConfig { - disableItemLinking?: boolean; -} - -export interface IUsedInItemRecord { - readonly system: { - readonly id: string; - readonly name: string; - readonly codename: string; - readonly language: TClientTypes['languageCodenames']; - readonly type: TClientTypes['contentTypeCodenames']; - readonly collection: TClientTypes['collectionCodenames']; - readonly workflow: TClientTypes['workflowCodenames']; - readonly workflowStep: TClientTypes['workflowStepCodenames']; - readonly lastModified: string; - }; -} - -export type ClientTypes = { - readonly contentItemType: IContentItem; - readonly contentTypeCodenames: string; - readonly workflowCodenames: string; - readonly workflowStepCodenames: string; - readonly collectionCodenames: string; - readonly taxonomyCodenames: string; - readonly languageCodenames: string; - readonly elementCodenames: string; -}; diff --git a/_legacy/lib/models/language-models.ts b/_legacy/lib/models/language-models.ts deleted file mode 100644 index 7736c90c..00000000 --- a/_legacy/lib/models/language-models.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IQueryConfig } from './common'; - -export interface ILanguageSystem { - id: string; - name: string; - codename: TLanguageCodenames; -} - -export interface ILanguage { - system: ILanguageSystem; -} - -export interface ILanguagesQueryConfig extends IQueryConfig { - /** - * No dedicated properties required at this moment - */ -} diff --git a/_legacy/lib/models/responses.ts b/_legacy/lib/models/responses.ts deleted file mode 100644 index d320821a..00000000 --- a/_legacy/lib/models/responses.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { Contracts } from '../contracts'; -import { IDeliveryNetworkResponse } from './common/base-responses'; -import { IKontentListAllResponse, IKontentListResponse, IKontentResponse } from './common/common-models'; -import { IPagination } from './common/pagination.class'; -import { IContentType } from './content-type-models'; -import { IGenericElementOption } from './element-models'; -import { IContentItem, IContentItemsContainer, IUsedInItemRecord } from './item-models'; -import { ILanguage } from './language-models'; -import { IContentItemDelta } from './sync-models'; -import { ITaxonomyGroup } from './taxonomy-models'; -import { ClientTypes } from './item-models'; - -export namespace Responses { - export interface IListContentTypesResponse extends IKontentListResponse { - items: IContentType[]; - pagination: IPagination; - } - - export interface IListContentTypesAllResponse extends IKontentListAllResponse { - items: IContentType[]; - responses: IDeliveryNetworkResponse< - IListContentTypesResponse, - Contracts.IListContentTypeContract - >[]; - } - - export interface IViewContentTypeResponse extends IKontentResponse { - type: IContentType; - } - - export interface IViewContentTypeElementResponse extends IKontentResponse { - codename?: string; - type: string; - name: string; - taxonomyGroup?: string; - options: IGenericElementOption[]; - } - - export interface IUsedInResponse extends IKontentListResponse { - items: IUsedInItemRecord[]; - } - - export interface IUsedInAllResponse extends IKontentListAllResponse { - items: IUsedInItemRecord[]; - responses: IDeliveryNetworkResponse, Contracts.IUsedInItemsContract>[]; - } - - export interface IListItemsFeedResponse< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem - > extends IKontentListResponse { - items: TContentItem[]; - linkedItems: IContentItemsContainer; - } - - export interface IListItemsFeedAllResponse< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem - > extends IKontentListAllResponse { - items: TContentItem[]; - responses: IDeliveryNetworkResponse< - IListItemsFeedResponse, - Contracts.IItemsFeedContract - >[]; - } - - export interface IListContentItemsResponse< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem - > extends IKontentListResponse { - items: TContentItem[]; - pagination: IPagination; - linkedItems: IContentItemsContainer; - } - - export interface IListContentItemsAllResponse< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem - > extends IKontentListAllResponse { - items: TContentItem[]; - responses: IDeliveryNetworkResponse< - IListContentItemsResponse, - Contracts.IListContentItemsContract - >[]; - } - - export interface IViewContentItemResponse< - TContentItem extends IContentItem = IContentItem, - TLinkedItemType extends IContentItem = IContentItem - > extends IKontentResponse { - item: TContentItem; - linkedItems: IContentItemsContainer; - } - - export interface IInitializeSyncResponse extends IKontentResponse { - items: IContentItemDelta[]; - } - - export interface ISyncChangesResponse extends IKontentResponse { - items: IContentItemDelta[]; - } - - export interface ISyncChangesAllResponse extends IKontentListAllResponse { - items: IContentItemDelta[]; - responses: IDeliveryNetworkResponse[]; - } - - export interface IListLanguagesResponse extends IKontentListResponse { - items: ILanguage[]; - pagination: IPagination; - } - - export interface IListLanguagesAllResponse extends IKontentListAllResponse { - items: ILanguage[]; - responses: IDeliveryNetworkResponse< - IListLanguagesResponse, - Contracts.IListLanguagesContract - >[]; - } - - export interface IViewTaxonomyResponse extends IKontentResponse { - taxonomy: ITaxonomyGroup; - } - - export interface IListTaxonomiesResponse extends IKontentListResponse { - items: ITaxonomyGroup[]; - pagination: IPagination; - } - - export interface IListTaxonomiesAllResponse extends IKontentListAllResponse { - items: ITaxonomyGroup[]; - responses: IDeliveryNetworkResponse< - IListTaxonomiesResponse, - Contracts.IListTaxonomyGroupsContract - >[]; - } -} diff --git a/_legacy/lib/models/sync-models.ts b/_legacy/lib/models/sync-models.ts deleted file mode 100644 index 06d44150..00000000 --- a/_legacy/lib/models/sync-models.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Contracts } from '../contracts'; -import { IQueryConfig } from './common/common-models'; -import { IContentItemSystemAttributes } from './item-models'; - -export interface ISyncInitQueryConfig extends IQueryConfig { - /** - * No dedicated properties required at this moment - */ -} - -export interface IContentItemDelta { - data: { - system: IContentItemSystemAttributes; - elements: Contracts.IContentItemElementsContracts; - }; - changeType: 'deleted_item' | 'changed_item'; - timestamp: string; -} diff --git a/_legacy/lib/models/taxonomy-models.ts b/_legacy/lib/models/taxonomy-models.ts deleted file mode 100644 index ff6c67a4..00000000 --- a/_legacy/lib/models/taxonomy-models.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IQueryConfig } from './common/common-models'; - -export interface ITaxonomyGroup { - system: ITaxonomySystemAttributes; - terms: ITaxonomyTerms[]; -} - -export interface ITaxonomySystemAttributes { - id: string; - name: string; - codename: TaxonomyCodename; - lastModified: Date; -} - -export interface ITaxonomyTerms { - name: string; - codename: string; - terms: ITaxonomyTerms[]; -} - -export interface ITaxonomyQueryConfig extends IQueryConfig { - /** - * No dedicated properties required at this moment - */ -} diff --git a/_legacy/lib/query/common/base-item-listing-query.class.ts b/_legacy/lib/query/common/base-item-listing-query.class.ts deleted file mode 100644 index be9fcdde..00000000 --- a/_legacy/lib/query/common/base-item-listing-query.class.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { ElementType, Elements } from '../../elements'; -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - Filters, - IContentItem, - IKontentListAllResponse, - IKontentListResponse, - IQueryConfig, - Parameters, - SortOrder -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from './base-listing-query.class'; - -export abstract class BaseItemListingQuery< - TClientTypes extends ClientTypes, - TResponse extends IKontentListResponse, - TAllResponse extends IKontentListAllResponse, - TQueryConfig extends IQueryConfig, - TContract -> extends BaseListingQuery { - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Empty filter condition - * @param element Element with empty value - */ - emptyFilter(element: string): this { - this.parameters.push(new Filters.EmptyFilter(element)); - return this; - } - - /** - * Not empty filter condition - * @param element Element with non-empty value - */ - notEmptyFilter(element: string): this { - this.parameters.push(new Filters.NotEmptyFilter(element)); - return this; - } - - /** - * Equals filter condition - * @param element Element to filter. Example: 'elements.movie' - * @param value Value to match. Example: 'Kingsman' - */ - equalsFilter(element: string, value: string): this { - this.parameters.push(new Filters.EqualsFilter(element, value)); - return this; - } - - /** - * Not equals filter condition - * @param element Element to filter. Example: 'elements.movie' - * @param value Value to match. Example: 'Kingsman' - */ - notEqualsFilter(element: string, value: string): this { - this.parameters.push(new Filters.NotEqualsFilter(element, value)); - return this; - } - - /** - * All filter - * @param element Element to filter. - * @param values Values - */ - allFilter(element: string, values: string[]): this { - this.parameters.push(new Filters.AllFilter(element, values)); - return this; - } - - /** - * Any filter - * @param element Element to filter. - * @param values Values - */ - anyFilter(element: string, values: string[]): this { - this.parameters.push(new Filters.AnyFilter(element, values)); - return this; - } - - /** - * Contains filter - * @param element Element to filter. - * @param values Values - */ - containsFilter(element: string, values: string[]): this { - this.parameters.push(new Filters.ContainsFilter(element, values)); - return this; - } - - /** - * Greater then filter - * @param element Element to filter. - * @param value Value - */ - greaterThanFilter(element: string, value: string | number): this { - this.parameters.push(new Filters.GreaterThanFilter(element, value)); - return this; - } - - /** - * Greater then or equals filter - * @param element Element to filter. - * @param value Value - */ - greaterThanOrEqualFilter(element: string, value: string | number): this { - this.parameters.push(new Filters.GreaterThanOrEqualFilter(element, value)); - return this; - } - - /** - * In filter - * @param element Element to filter. - * @param values Values - */ - inFilter(element: string, values: string[]): this { - this.parameters.push(new Filters.InFilter(element, values)); - return this; - } - - /** - * Not in filter - * @param element Element to filter. - * @param values Values - */ - notInFilter(element: string, values: string[]): this { - this.parameters.push(new Filters.NotInFilter(element, values)); - return this; - } - - /** - * Less then filter - * @param element Element to filter. - * @param value Value - */ - lessThanFilter(element: string, value: string | number): this { - this.parameters.push(new Filters.LessThanFilter(element, value)); - return this; - } - - /** - * @param element Element to filter. - * @param value Value - */ - lessThanOrEqualFilter(element: string, value: string | number): this { - this.parameters.push(new Filters.LessThanOrEqualFilter(element, value)); - return this; - } - - /** - * @param element Element to filter. - * @param lowerValue Lower value of range (e.g. 2) - * @param higherValue Higher value of range (e.g. 10) - */ - rangeFilter(element: string, lowerValue: number | string, higherValue: number | string): this { - this.parameters.push(new Filters.RangeFilter(element, lowerValue, higherValue)); - return this; - } - - /** - * Limits the number of items returned by query - * @param limit Number of items to load - */ - limitParameter(limit: number): this { - this.parameters.push(new Parameters.LimitParameter(limit)); - return this; - } - - /** - * Orders query based on given element and sort order - * @param element Element by which to order - * @param sortOrder Asc/Desc order type - */ - orderParameter(element: string, sortOrder: SortOrder): this { - this.parameters.push(new Parameters.OrderParameter(element, sortOrder)); - return this; - } - - /** - * Sets descending order on given element - * @param element Element by which to order - */ - orderByDescending(element: string): this { - this.parameters.push(new Parameters.OrderParameter(element, 'desc')); - return this; - } - - /** - * Sets Ascending order on given element - * @param element Element by which to order - */ - orderByAscending(element: string): this { - this.parameters.push(new Parameters.OrderParameter(element, 'asc')); - return this; - } - - /** - * Skips the selected number of items - * @param skip Number of items to skip - */ - skipParameter(skip: number): this { - this.parameters.push(new Parameters.SkipParameter(skip)); - return this; - } - - protected linkItemsInRte(allContentItems: IContentItem[]): void { - for (const item of allContentItems) { - for (const elementKey of Object.keys(item.elements)) { - const element = item.elements[elementKey]; - - if (element.type === ElementType.ModularContent) { - const linkedItemElement = element as Elements.LinkedItemsElement; - - // We create separate array for ordered items because the 'linkedItems' from response might be incomplete - // e.g. If 4 items are linked, only 2 might be available in the response. Rest needs to be mapped from all available items - const orderedLinkedItems: IContentItem[] = []; - - for (const linkedItemCodename of linkedItemElement.value) { - let linkedItem: IContentItem | undefined; - - const linkedItemInElement = linkedItemElement.linkedItems.find( - (m) => m.system.codename.toLowerCase() === linkedItemCodename.toLowerCase() - ); - if (linkedItemInElement) { - linkedItem = linkedItemInElement; - } else { - linkedItem = allContentItems.find( - (m) => m.system.codename.toLowerCase() === linkedItemCodename.toLowerCase() - ); - } - - if (linkedItem) { - orderedLinkedItems.push(linkedItem); - } - } - - // Replace linked items with the ordered one - linkedItemElement.linkedItems = orderedLinkedItems; - } - - if (element.type === ElementType.RichText) { - const orderedLinkedItems: IContentItem[] = []; - - const richTextElement = element as Elements.RichTextElement; - - for (const linkedItemCodename of richTextElement.linkedItemCodenames) { - let linkedItem: IContentItem | undefined; - - const linkedItemInElement = richTextElement.linkedItems.find( - (m) => m.system.codename.toLowerCase() === linkedItemCodename.toLowerCase() - ); - if (linkedItemInElement) { - linkedItem = linkedItemInElement; - } else { - linkedItem = allContentItems.find( - (m) => m.system.codename.toLowerCase() === linkedItemCodename.toLowerCase() - ); - } - - if (linkedItem) { - orderedLinkedItems.push(linkedItem); - } - } - - richTextElement.linkedItems = orderedLinkedItems; - } - } - } - } -} diff --git a/_legacy/lib/query/common/base-listing-query.class.ts b/_legacy/lib/query/common/base-listing-query.class.ts deleted file mode 100644 index 61455149..00000000 --- a/_legacy/lib/query/common/base-listing-query.class.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { IDeliveryClientConfig } from '../../config'; -import { - continuationTokenHeaderName, - IGroupedNetworkResponse, - IKontentListAllResponse, - IKontentListResponse, - IDeliveryNetworkResponse, - IListAllQueryConfig, - IQueryConfig, - IContentItem, - ClientTypes, - IUsedInItemRecord, - IContentType, - ITaxonomyGroup, - IContentItemDelta, - ILanguage -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from './base-query.class'; - -type ListingRecord = - | IContentItem - | IContentItemDelta - | IUsedInItemRecord - | IContentType - | ILanguage - | ITaxonomyGroup; - -export abstract class BaseListingQuery< - TClientTypes extends ClientTypes, - TRecord extends ListingRecord, - TResponse extends IKontentListResponse, - TAllResponse extends IKontentListAllResponse, - TQueryConfig extends IQueryConfig, - TContract -> extends BaseQuery { - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Sets continuation token header - */ - withContinuationToken(token: string): this { - // remove previous continuation token if there is any - let queryHeaders = this._queryConfig.customHeaders ?? []; - queryHeaders = queryHeaders.filter((m) => m.header !== continuationTokenHeaderName); - - this._queryConfig.customHeaders = queryHeaders; - - this.withHeaders([ - { - header: continuationTokenHeaderName, - value: token - } - ]); - - return this; - } - - /** - * Query to get all items. Uses paging data and may execute multiple HTTP requests depending on number of items - */ - toAllPromise( - queryAllConfig?: IListAllQueryConfig - ): Promise> { - return this.queryService.getListAllResponse({ - page: 1, - listQueryConfig: queryAllConfig, - allResponseFactory: (items, responses) => { - const response = this.allResponseFactory(items, responses); - - return { - data: response, - responses: responses - }; - }, - getResponse: (nextPageUrl, continuationToken) => { - if (nextPageUrl) { - this.withCustomUrl(nextPageUrl); - } - if (continuationToken) { - this.withContinuationToken(continuationToken); - } - - return this.toPromise(); - } - }); - } - - protected abstract allResponseFactory( - items: TRecord[], - responses: IDeliveryNetworkResponse[] - ): TAllResponse; -} diff --git a/_legacy/lib/query/common/base-query.class.ts b/_legacy/lib/query/common/base-query.class.ts deleted file mode 100644 index a435182b..00000000 --- a/_legacy/lib/query/common/base-query.class.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { IHeader, IQueryParameter } from '@kontent-ai/core-sdk'; - -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - Filters, - IDeliveryNetworkResponse, - IKontentResponse, - IQueryConfig, - Parameters -} from '../../models'; -import { QueryService } from '../../services'; - -export abstract class BaseQuery< - TClientTypes extends ClientTypes, - TResponse extends IKontentResponse, - TQueryConfig extends IQueryConfig, - TContract -> { - protected parameters: IQueryParameter[] = []; - protected customUrl?: string; - protected abstract _queryConfig: TQueryConfig; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) {} - - /** - * Gets URL of the query - */ - abstract getUrl(): string; - - /** - * Gets promise for query execution - */ - abstract toPromise(): Promise>; - - /** - * Maps json data to response - */ - abstract map(json: any): TResponse; - - /** - * Adds custom parameter to query - * @param name Name of parameter - * @param value Value of parameter - */ - withCustomParameter(name: string, value: string): this { - this.parameters.push(new Parameters.QueryParameter(name, value)); - return this; - } - - /** - * Adds parameter to query - * @param name Name of parameter - * @param value Value of parameter - */ - withParameter(parameter: IQueryParameter): this { - this.parameters.push(parameter); - return this; - } - - /** - * Adds parameters to query - * @param parameters Array of parameters - */ - withParameters(parameters: IQueryParameter[]): this { - this.parameters.push(...parameters); - return this; - } - - /** - * Gets headers used by this query - */ - getHeaders(): IHeader[] { - return this.queryService.getHeaders(this._queryConfig, []); - } - - /** - * Sets request headers - */ - withHeaders(headers: IHeader[]): this { - const queryHeaders = this._queryConfig.customHeaders ?? []; - queryHeaders.push(...headers); - this._queryConfig.customHeaders = queryHeaders; - return this; - } - - /** - * Sets request header - */ - withHeader(header: IHeader): this { - const queryHeaders = this._queryConfig.customHeaders ?? []; - queryHeaders.push(header); - this._queryConfig.customHeaders = queryHeaders; - return this; - } - - /** - * Sets custom URL of request (overrides default URL of the query) - */ - withCustomUrl(url: string): this { - this.customUrl = url; - return this; - } - - /** - * Gets all query parameter currently applied to query - */ - getParameters(): IQueryParameter[] { - return this.parameters; - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: TQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - protected resolveUrlInternal(action: string): string { - // use custom URL if user specified it - if (this.customUrl) { - return this.customUrl; - } - - // use original url - return this.queryService.getUrl(action, this._queryConfig ?? {}, this.getParameters()); - } - - protected processDefaultLanguageParameter(): void { - // add default language if none is specified && default language is specified globally - if (this.config.defaultLanguage) { - const languageParameter = this.getParameters().find((m) => - m.getParam()?.toLowerCase().includes('language='.toLowerCase()) - ); - if (!languageParameter) { - // language parameter was not specified in query, use globally defined language - this.parameters.push(new Parameters.LanguageParameter(this.config.defaultLanguage)); - } - } - } - - protected processExcludeArchivedItemsParameter(): void { - if (this.config.excludeArchivedItems) { - this.parameters.push(new Filters.NotEqualsFilter('system.workflow_step', 'archived')); - } - } -} diff --git a/_legacy/lib/query/element/element-query.class.ts b/_legacy/lib/query/element/element-query.class.ts deleted file mode 100644 index a67d05b7..00000000 --- a/_legacy/lib/query/element/element-query.class.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { Responses, IElementQueryConfig, IDeliveryNetworkResponse, ClientTypes } from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from '../common/base-query.class'; - -export class ElementQuery extends BaseQuery< - TClientTypes, - Responses.IViewContentTypeElementResponse, - IElementQueryConfig, - Contracts.IViewContentTypeElementContract -> { - protected _queryConfig: IElementQueryConfig = {}; - - constructor( - protected config: IDeliveryClientConfig, - protected queryService: QueryService, - private typeCodename: string, - private elementCodename: string - ) { - super(config, queryService); - - if (!typeCodename) { - throw Error(`Codename of the type has to be provided`); - } - - if (!elementCodename) { - throw Error(`Codename of the element has to be provided`); - } - } - - toPromise(): Promise< - IDeliveryNetworkResponse - > { - return this.queryService.getElementAsync(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - return super.resolveUrlInternal(`/types/${this.typeCodename}/elements/${this.elementCodename}`); - } - - map(json: any): Responses.IViewContentTypeElementResponse { - return this.queryService.mappingService.viewContentTypeElementResponse(json); - } -} diff --git a/_legacy/lib/query/index.ts b/_legacy/lib/query/index.ts deleted file mode 100644 index 7d64bea9..00000000 --- a/_legacy/lib/query/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from './common/base-query.class'; -export * from './element/element-query.class'; -export * from './item/multiple-items-query.class'; -export * from './item/single-item-query.class'; -export * from './taxonomy/taxonomies-query.class'; -export * from './taxonomy/taxonomy-query.class'; -export * from './type/multiple-type-query.class'; -export * from './type/single-type-query.class'; -export * from './items-feed/items-feed-query.class'; -export * from './language/languages-query.class'; -export * from './sync/initialize-sync-query.class'; -export * from './sync/sync-changes-query.class'; -export * from './used-in/used-in-query.class'; diff --git a/_legacy/lib/query/item/multiple-items-query.class.ts b/_legacy/lib/query/item/multiple-items-query.class.ts deleted file mode 100644 index a5ad925d..00000000 --- a/_legacy/lib/query/item/multiple-items-query.class.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - Filters, - IContentItem, - IItemQueryConfig, - IDeliveryNetworkResponse, - Responses, - Parameters, - ClientTypes -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseItemListingQuery } from '../common/base-item-listing-query.class'; - -export class MultipleItemsQuery< - TClientTypes extends ClientTypes, - TContentItem extends IContentItem = IContentItem -> extends BaseItemListingQuery< - TClientTypes, - Responses.IListContentItemsResponse, - Responses.IListContentItemsAllResponse, - IItemQueryConfig, - Contracts.IListContentItemsContract -> { - protected _queryConfig: IItemQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Adds information about the total number of content items matching your query. - * When set to true, the pagination object returned in the API response contains - * an additional total_count property. - */ - includeTotalCountParameter(): this { - this.parameters.push(new Parameters.IncludeTotalCountParameter()); - return this; - } - - /** - * Gets only item of given type - * @param type Codename of type to get - */ - type(type: TClientTypes['contentTypeCodenames']): this { - this.parameters.push(new Filters.TypeFilter(type)); - return this; - } - - /** - * Gets items of given types (logical or) - * I.e. get items of either 'Actor' or 'Movie' type - * @param types Types to get - */ - types(types: TClientTypes['contentTypeCodenames'][]): this { - this.parameters.push(new Filters.TypeFilter(types)); - return this; - } - - /** - * Gets only item from given collection - * @param collection Codename of collection to get - */ - collection(collection: TClientTypes['collectionCodenames']): this { - this.parameters.push(new Filters.CollectionFilter(collection)); - return this; - } - - /** - * Gets items from given collections (logical or) - * I.e. get items of either 'default' or 'christmas-campaign' collection - * @param collections Collections to get - */ - collections(collections: TClientTypes['collectionCodenames'][]): this { - this.parameters.push(new Filters.CollectionFilter(collections)); - return this; - } - - /** - * Indicates depth of query that affects loading of nested linked items. - * @param depth Depth of the query (> 0) - */ - depthParameter(depth: number): this { - this.parameters.push(new Parameters.DepthParameter(depth)); - return this; - } - - /** - * Language codename - * @param languageCodename Codename of the language - */ - languageParameter(languageCodename: TClientTypes['languageCodenames']): this { - this.parameters.push(new Parameters.LanguageParameter(languageCodename)); - return this; - } - - /** - * Used to limit the number of elements returned by query. - * @param elementCodenames Array of element codenames to fetch - */ - elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); - return this; - } - - /** - * Used to exclude elements returned by query. - * @param elementCodenames Array of element codenames to exclude - */ - excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IListContentItemsResponse, - Contracts.IListContentItemsContract - > - > { - return this.queryService.getMultipleItems(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/items'; - - // handle default language - this.processDefaultLanguageParameter(); - - // handle archived items - this.processExcludeArchivedItemsParameter(); - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IListContentItemsResponse { - return this.queryService.mappingService.listContentItemsResponse(json); - } - - protected allResponseFactory( - items: any[], - responses: IDeliveryNetworkResponse< - Responses.IListContentItemsResponse, - Contracts.IListContentItemsContract - >[] - ): Responses.IListContentItemsAllResponse { - this.linkItems(items, responses); - - return { - items: items, - responses: responses - }; - } - - private linkItems( - items: IContentItem[], - responses: IDeliveryNetworkResponse< - Responses.IListContentItemsResponse, - Contracts.IListContentItemsContract - >[] - ): void { - // prepare all available items (including components) for linking - const allContentItems: IContentItem[] = []; - - // process linked items (modular_content part of the response) - for (const response of responses) { - allContentItems.push( - ...Object.values(response.data.linkedItems) - .filter((m) => m !== undefined) - .map((m) => m as TClientTypes['contentItemType']) - ); - } - - // add standard items - for (const item of items) { - if (!allContentItems.find((m) => m.system.codename.toLowerCase() === item.system.codename.toLowerCase())) { - allContentItems.push(item); - } - } - // process main items - this.linkItemsInRte(allContentItems); - } -} diff --git a/_legacy/lib/query/item/single-item-query.class.ts b/_legacy/lib/query/item/single-item-query.class.ts deleted file mode 100644 index c00be6c2..00000000 --- a/_legacy/lib/query/item/single-item-query.class.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - IContentItem, - IItemQueryConfig, - IDeliveryNetworkResponse, - Responses, - Parameters, - ClientTypes -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from '../common/base-query.class'; - -export class SingleItemQuery< - TClientTypes extends ClientTypes, - TContentItem extends IContentItem = IContentItem -> extends BaseQuery< - TClientTypes, - Responses.IViewContentItemResponse, - IItemQueryConfig, - Contracts.IViewContentItemContract -> { - protected _queryConfig: IItemQueryConfig = {}; - - constructor( - protected config: IDeliveryClientConfig, - protected queryService: QueryService, - private codename: string - ) { - super(config, queryService); - - if (!codename) { - throw Error(`'codename' has to be configured for 'SingleItemQuery' query`); - } - } - - /** - * Indicates depth of query that affects loading of nested linked items. - * @param depth Depth of the query (> 0) - */ - depthParameter(depth: number): this { - this.parameters.push(new Parameters.DepthParameter(depth)); - return this; - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: IItemQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - /** - * Language codename - * @param languageCodename Codename of the language - */ - languageParameter(languageCodename: TClientTypes['languageCodenames']): this { - this.parameters.push(new Parameters.LanguageParameter(languageCodename)); - return this; - } - - /** - * Used to limit the number of elements returned by query. - * @param elementCodenames Array of element codenames to fetch - */ - elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); - return this; - } - - /** - * Used to exclude elements returned by query. - * @param elementCodenames Array of element codenames to exclude - */ - excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IViewContentItemResponse, - Contracts.IViewContentItemContract - > - > { - return this.queryService.getSingleItemAsync(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/items/' + this.codename; - - // add default language is necessry - this.processDefaultLanguageParameter(); - - //process client level archived item exclusion - this.processExcludeArchivedItemsParameter(); - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IViewContentItemResponse { - return this.queryService.mappingService.viewContentItemResponse(json); - } -} diff --git a/_legacy/lib/query/items-feed/items-feed-query.class.ts b/_legacy/lib/query/items-feed/items-feed-query.class.ts deleted file mode 100644 index c0319611..00000000 --- a/_legacy/lib/query/items-feed/items-feed-query.class.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - Filters, - IContentItem, - IDeliveryNetworkResponse, - Parameters, - Responses, - IItemFeedQueryConfig, - ClientTypes -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseItemListingQuery } from '../common/base-item-listing-query.class'; - -export class ItemsFeedQuery< - TClientTypes extends ClientTypes, - TContentItem extends IContentItem = IContentItem -> extends BaseItemListingQuery< - TClientTypes, - Responses.IListItemsFeedResponse, - Responses.IListItemsFeedAllResponse, - IItemFeedQueryConfig, - Contracts.IItemsFeedContract -> { - protected _queryConfig: IItemFeedQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Gets only item of given type - * @param type Codename of type to get - */ - type(type: TClientTypes['contentTypeCodenames']): this { - this.parameters.push(new Filters.TypeFilter(type)); - return this; - } - - /** - * Gets items of given types (logical or) - * I.e. get items of either 'Actor' or 'Movie' type - * @param types Types to get - */ - types(types: TClientTypes['contentTypeCodenames'][]): this { - this.parameters.push(new Filters.TypeFilter(types)); - return this; - } - - /** - * Gets only item from given collection - * @param collection Codename of collection to get - */ - collection(collection: TClientTypes['collectionCodenames']): this { - this.parameters.push(new Filters.CollectionFilter(collection)); - return this; - } - - /** - * Gets items from given collections (logical or) - * I.e. get items of either 'default' or 'christmas-campaign' collection - * @param collections Collections to get - */ - collections(collections: TClientTypes['collectionCodenames'][]): this { - this.parameters.push(new Filters.CollectionFilter(collections)); - return this; - } - - /** - * Language codename - * @param languageCodename Codename of the language - */ - languageParameter(languageCodename: TClientTypes['languageCodenames']): this { - this.parameters.push(new Parameters.LanguageParameter(languageCodename)); - return this; - } - - /** - * Used to limit the number of elements returned by query. - * @param elementCodenames Array of element codenames to fetch - */ - elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); - return this; - } - - /** - * Used to exclude elements returned by query. - * @param elementCodenames Array of element codenames to exclude - */ - excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, - Contracts.IItemsFeedContract - > - > { - return this.queryService.getItemsFeed(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/items-feed'; - - // add default language is necessary - this.processDefaultLanguageParameter(); - - //process client level archived item exclusion - this.processExcludeArchivedItemsParameter(); - - return super.resolveUrlInternal(action); - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: IItemFeedQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - map(json: any): Responses.IListItemsFeedResponse { - return this.queryService.mappingService.itemsFeedResponse(json); - } - - protected allResponseFactory( - items: TContentItem[], - responses: IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, - Contracts.IItemsFeedContract - >[] - ): Responses.IListItemsFeedAllResponse { - if (this.canLinkItems()) { - this.linkFeedItems(items, responses); - } - - return { - items: items, - responses: responses - }; - } - - private linkFeedItems( - items: TContentItem[], - responses: IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, - Contracts.IItemsFeedContract - >[] - ): void { - // prepare all available items (including components) for linking - const allAvailableContentItems: IContentItem[] = []; - - // process linked items (modular_content part of the response) - for (const response of responses) { - allAvailableContentItems.push( - ...Object.values(response.data.linkedItems) - .filter((m) => m !== undefined) - .map((m) => m as TClientTypes['contentItemType']) - ); - } - - // add standard items - for (const item of items) { - if ( - !allAvailableContentItems.find( - (m) => m.system.codename.toLowerCase() === item.system.codename.toLowerCase() - ) - ) { - allAvailableContentItems.push(item); - } - } - // process main items - this.linkItemsInRte(allAvailableContentItems); - } - - private canLinkItems(): boolean { - if (this.config.linkedItemsReferenceHandler === 'ignore') { - return false; - } - - if (this._queryConfig.disableItemLinking === true) { - return false; - } - - return true; - } -} diff --git a/_legacy/lib/query/language/languages-query.class.ts b/_legacy/lib/query/language/languages-query.class.ts deleted file mode 100644 index 99887ffa..00000000 --- a/_legacy/lib/query/language/languages-query.class.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - IDeliveryNetworkResponse, - ILanguage, - ILanguagesQueryConfig, - Parameters, - Responses -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from '../common/base-listing-query.class'; - -export class LanguagesQuery extends BaseListingQuery< - TClientTypes, - ILanguage, - Responses.IListLanguagesResponse, - Responses.IListLanguagesAllResponse, - ILanguagesQueryConfig, - Contracts.IListLanguagesContract -> { - /** - * Endpoint - */ - protected readonly endpoint: string = 'languages'; - - protected _queryConfig: ILanguagesQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Limits the number of taxonomies returned by query - * @param limit Number of taxonomies to load - */ - limitParameter(limit: number): this { - this.parameters.push(new Parameters.LimitParameter(limit)); - return this; - } - - /** - * Skips the selected number of taxonomies - * @param skip Number of taxonomies to skip - */ - skipParameter(skip: number): this { - this.parameters.push(new Parameters.SkipParameter(skip)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IListLanguagesResponse, - Contracts.IListLanguagesContract - > - > { - return this.queryService.getLanguages(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/' + this.endpoint; - - return super.resolveUrlInternal(action); - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: ILanguagesQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - map(json: any): Responses.IListLanguagesResponse { - return this.queryService.mappingService.listLanguagesResponse(json); - } - - protected allResponseFactory( - items: ILanguage[], - responses: IDeliveryNetworkResponse< - Responses.IListLanguagesResponse, - Contracts.IListLanguagesContract - >[] - ): Responses.IListLanguagesAllResponse { - return { - items: items, - responses: responses - }; - } -} diff --git a/_legacy/lib/query/sync/initialize-sync-query.class.ts b/_legacy/lib/query/sync/initialize-sync-query.class.ts deleted file mode 100644 index d704b31a..00000000 --- a/_legacy/lib/query/sync/initialize-sync-query.class.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - Filters, - IDeliveryNetworkResponse, - ILanguagesQueryConfig, - ISyncInitQueryConfig, - Parameters, - Responses -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from '../common/base-query.class'; - -export class InitializeSyncQuery extends BaseQuery< - TClientTypes, - Responses.IInitializeSyncResponse, - ISyncInitQueryConfig, - Contracts.IInitializeSyncContract -> { - protected readonly endpoint: string = 'sync/init'; - - protected _queryConfig: ILanguagesQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Gets only item of given type - * @param type Codename of type to get - */ - type(type: string): this { - this.parameters.push(new Filters.TypeFilter(type)); - return this; - } - - /** - * Gets only item from given collection - * @param collection Codename of collection to get - */ - collection(collection: string): this { - this.parameters.push(new Filters.CollectionFilter(collection)); - return this; - } - - /** - * Language codename - * @param languageCodename Codename of the language - */ - languageParameter(languageCodename: string): this { - this.parameters.push(new Parameters.LanguageParameter(languageCodename)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse - > { - console.warn( - `Sync Api v1 is deprecated. Please use the new Sync Api v2. https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/` - ); - return this.queryService.initializeSync(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/' + this.endpoint; - - return super.resolveUrlInternal(action); - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: ISyncInitQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - map(json: any): Responses.IInitializeSyncResponse { - return this.queryService.mappingService.initializeContentSync(json); - } -} diff --git a/_legacy/lib/query/sync/sync-changes-query.class.ts b/_legacy/lib/query/sync/sync-changes-query.class.ts deleted file mode 100644 index 17356850..00000000 --- a/_legacy/lib/query/sync/sync-changes-query.class.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { IItemQueryConfig, IDeliveryNetworkResponse, Responses, ClientTypes, IContentItemDelta } from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from '../common/base-listing-query.class'; - -export class SyncChangesQuery extends BaseListingQuery< - TClientTypes, - IContentItemDelta, - Responses.ISyncChangesResponse, - Responses.ISyncChangesAllResponse, - IItemQueryConfig, - Contracts.ISyncChangesContract -> { - protected _queryConfig: IItemQueryConfig = {}; - - private readonly action: string = '/sync'; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - toPromise(): Promise> { - console.warn( - `Sync Api v1 is deprecated. Please use the new Sync Api v2. https://kontent.ai/learn/docs/apis/openapi/sync-api-v2/` - ); - return this.queryService.syncChanges(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - return super.resolveUrlInternal(this.action); - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: IItemQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - map(json: any): Responses.ISyncChangesResponse { - return this.queryService.mappingService.syncChanges(json); - } - - protected allResponseFactory( - items: IContentItemDelta[], - responses: IDeliveryNetworkResponse[] - ): Responses.ISyncChangesAllResponse { - return { - items: items, - responses: responses - }; - } -} diff --git a/_legacy/lib/query/taxonomy/taxonomies-query.class.ts b/_legacy/lib/query/taxonomy/taxonomies-query.class.ts deleted file mode 100644 index 346af79b..00000000 --- a/_legacy/lib/query/taxonomy/taxonomies-query.class.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - IDeliveryNetworkResponse, - ITaxonomyGroup, - ITaxonomyQueryConfig, - Parameters, - Responses -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from '../common/base-listing-query.class'; - -export class TaxonomiesQuery extends BaseListingQuery< - TClientTypes, - ITaxonomyGroup, - Responses.IListTaxonomiesResponse, - Responses.IListTaxonomiesAllResponse, - ITaxonomyQueryConfig, - Contracts.IListTaxonomyGroupsContract -> { - /** - * Taxonomies endpoint URL action - */ - protected readonly taxonomiesEndpoint: string = 'taxonomies'; - - protected _queryConfig: ITaxonomyQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Limits the number of taxonomies returned by query - * @param limit Number of taxonomies to load - */ - limitParameter(limit: number): this { - this.parameters.push(new Parameters.LimitParameter(limit)); - return this; - } - - /** - * Skips the selected number of taxonomies - * @param skip Number of taxonomies to skip - */ - skipParameter(skip: number): this { - this.parameters.push(new Parameters.SkipParameter(skip)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IListTaxonomiesResponse, - Contracts.IListTaxonomyGroupsContract - > - > { - return this.queryService.getTaxonomies(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/' + this.taxonomiesEndpoint; - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IListTaxonomiesResponse { - return this.queryService.mappingService.listTaxonomiesResponse(json); - } - - protected allResponseFactory( - items: ITaxonomyGroup[], - responses: IDeliveryNetworkResponse< - Responses.IListTaxonomiesResponse, - Contracts.IListTaxonomyGroupsContract - >[] - ): Responses.IListTaxonomiesAllResponse { - return { - items: items, - responses: responses - }; - } -} diff --git a/_legacy/lib/query/taxonomy/taxonomy-query.class.ts b/_legacy/lib/query/taxonomy/taxonomy-query.class.ts deleted file mode 100644 index 4cac7fa6..00000000 --- a/_legacy/lib/query/taxonomy/taxonomy-query.class.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { ClientTypes, IDeliveryNetworkResponse, ITaxonomyQueryConfig, Responses } from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from '../common/base-query.class'; - -export class TaxonomyQuery extends BaseQuery< - TClientTypes, - Responses.IViewTaxonomyResponse, - ITaxonomyQueryConfig, - Contracts.IViewTaxonomyGroupContract -> { - /** - * Taxonomies endpoint URL action - */ - protected readonly taxonomiesEndpoint: string = 'taxonomies'; - - protected _queryConfig: ITaxonomyQueryConfig = {}; - - constructor( - protected config: IDeliveryClientConfig, - protected queryService: QueryService, - private taxonomyCodename: string - ) { - super(config, queryService); - - if (!taxonomyCodename) { - throw Error(`Cannot create taxonomy query without codename of the taxonomy`); - } - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IViewTaxonomyResponse, - Contracts.IViewTaxonomyGroupContract - > - > { - return this.queryService.getTaxonomy(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/' + this.taxonomiesEndpoint + '/' + this.taxonomyCodename; - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IViewTaxonomyResponse { - return this.queryService.mappingService.viewTaxonomyResponse(json); - } -} diff --git a/_legacy/lib/query/type/multiple-type-query.class.ts b/_legacy/lib/query/type/multiple-type-query.class.ts deleted file mode 100644 index ad8a4828..00000000 --- a/_legacy/lib/query/type/multiple-type-query.class.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - ClientTypes, - IContentType, - IContentTypeQueryConfig, - IDeliveryNetworkResponse, - Parameters, - Responses -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from '../common/base-listing-query.class'; - -export class MultipleTypeQuery extends BaseListingQuery< - TClientTypes, - IContentType, - Responses.IListContentTypesResponse, - Responses.IListContentTypesAllResponse, - IContentTypeQueryConfig, - Contracts.IListContentTypeContract -> { - protected _queryConfig: IContentTypeQueryConfig = {}; - - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { - super(config, queryService); - } - - /** - * Used to limit the number of elements returned by query. - * @param elementCodenames Array of element codenames to fetch - */ - elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); - return this; - } - - /** - * Used to exclude elements returned by query. - * @param elementCodenames Array of element codenames to exclude - */ - excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { - this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); - return this; - } - - /** - * Limits the number of taxonomies returned by query - * @param limit Number of taxonomies to load - */ - limitParameter(limit: number): this { - this.parameters.push(new Parameters.LimitParameter(limit)); - return this; - } - - /** - * Skips the selected number of taxonomies - * @param skip Number of taxonomies to skip - */ - skipParameter(skip: number): this { - this.parameters.push(new Parameters.SkipParameter(skip)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IListContentTypesResponse, - Contracts.IListContentTypeContract - > - > { - return this.queryService.getMultipleTypes(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/types'; - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IListContentTypesResponse { - return this.queryService.mappingService.listContentTypesResponse(json); - } - - protected allResponseFactory( - items: IContentType[], - responses: IDeliveryNetworkResponse< - Responses.IListContentTypesResponse, - Contracts.IListContentTypeContract - >[] - ): Responses.IListContentTypesAllResponse { - return { - items: items, - responses: responses - }; - } -} diff --git a/_legacy/lib/query/type/single-type-query.class.ts b/_legacy/lib/query/type/single-type-query.class.ts deleted file mode 100644 index 8f3e685c..00000000 --- a/_legacy/lib/query/type/single-type-query.class.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { ClientTypes, IContentTypeQueryConfig, IDeliveryNetworkResponse, Responses } from '../../models'; -import { QueryService } from '../../services'; -import { BaseQuery } from '../common/base-query.class'; - -export class SingleTypeQuery extends BaseQuery< - TClientTypes, - Responses.IViewContentTypeResponse, - IContentTypeQueryConfig, - Contracts.IViewContentTypeContract -> { - protected _queryConfig: IContentTypeQueryConfig = {}; - - constructor( - protected config: IDeliveryClientConfig, - protected queryService: QueryService, - private typeCodename: string - ) { - super(config, queryService); - - if (!typeCodename) { - throw Error(`Cannot create type query without the codename of the type`); - } - } - - toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IViewContentTypeResponse, - Contracts.IViewContentTypeContract - > - > { - return this.queryService.getSingleType(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = '/types/' + this.typeCodename; - - return super.resolveUrlInternal(action); - } - - map(json: any): Responses.IViewContentTypeResponse { - return this.queryService.mappingService.viewContentTypeResponse(json); - } -} diff --git a/_legacy/lib/query/used-in/used-in-query.class.ts b/_legacy/lib/query/used-in/used-in-query.class.ts deleted file mode 100644 index 0f8390de..00000000 --- a/_legacy/lib/query/used-in/used-in-query.class.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Contracts } from '../../contracts'; -import { IDeliveryClientConfig } from '../../config'; -import { - Filters, - IDeliveryNetworkResponse, - Parameters, - Responses, - IItemFeedQueryConfig, - ClientTypes, - IUsedInItemRecord, - IQueryConfig -} from '../../models'; -import { QueryService } from '../../services'; -import { BaseListingQuery } from '../common/base-listing-query.class'; - -export type UsedInSetup = { - readonly entity: 'asset' | 'contentItem'; - readonly codename: string; -}; - -export class UsedInQuery extends BaseListingQuery< - TClientTypes, - IUsedInItemRecord, - Responses.IUsedInResponse, - Responses.IUsedInAllResponse, - IQueryConfig, - Contracts.IUsedInItemsContract -> { - protected _queryConfig: IQueryConfig = {}; - - constructor( - protected readonly config: IDeliveryClientConfig, - protected readonly queryService: QueryService, - protected readonly setup: UsedInSetup - ) { - super(config, queryService); - } - - /** - * Gets only item of given type - * @param type Codename of type to get - */ - type(type: TClientTypes['contentTypeCodenames']): this { - this.parameters.push(new Filters.TypeFilter(type)); - return this; - } - - /** - * Gets items of given types (logical or) - * I.e. get items of either 'Actor' or 'Movie' type - * @param types Types to get - */ - types(types: TClientTypes['contentTypeCodenames'][]): this { - this.parameters.push(new Filters.TypeFilter(types)); - return this; - } - - /** - * Gets only item from given collection - * @param collection Codename of collection to get - */ - collection(collection: TClientTypes['collectionCodenames']): this { - this.parameters.push(new Filters.CollectionFilter(collection)); - return this; - } - - /** - * Gets items from given collections (logical or) - * I.e. get items of either 'default' or 'christmas-campaign' collection - * @param collections Collections to get - */ - collections(collections: TClientTypes['collectionCodenames'][]): this { - this.parameters.push(new Filters.CollectionFilter(collections)); - return this; - } - - /** - * Language codename - * @param languageCodename Codename of the language - */ - languageParameter(languageCodename: TClientTypes['languageCodenames']): this { - this.parameters.push(new Parameters.LanguageParameter(languageCodename)); - return this; - } - - toPromise(): Promise< - IDeliveryNetworkResponse, Contracts.IUsedInItemsContract> - > { - return this.queryService.getUsedIn(this.getUrl(), this._queryConfig ?? {}); - } - - getUrl(): string { - const action = `/${this.setup.entity === 'asset' ? 'assets' : 'items'}/${this.setup.codename}/used-in`; - - // add default language is necessary - this.processDefaultLanguageParameter(); - - //process client level archived item exclusion - this.processExcludeArchivedItemsParameter(); - - return super.resolveUrlInternal(action); - } - - /** - * Used to configure query - * @param queryConfig Query configuration - */ - queryConfig(queryConfig: IItemFeedQueryConfig): this { - this._queryConfig = queryConfig; - return this; - } - - map(json: any): Responses.IUsedInResponse { - return this.queryService.mappingService.usedInResponse(json); - } - - protected allResponseFactory( - items: IUsedInItemRecord[], - responses: IDeliveryNetworkResponse, Contracts.IUsedInItemsContract>[] - ): Responses.IUsedInAllResponse { - return { - items: items, - responses: responses - }; - } -} diff --git a/_legacy/lib/sdk-info.generated.ts b/_legacy/lib/sdk-info.generated.ts deleted file mode 100644 index 69d07da7..00000000 --- a/_legacy/lib/sdk-info.generated.ts +++ /dev/null @@ -1,7 +0,0 @@ - -import { ISDKInfo } from '@kontent-ai/core-sdk'; -export const sdkInfo: ISDKInfo = { - host: 'npmjs.com', - version: '16.4.0', - name: '@kontent-ai/delivery-sdk' -}; diff --git a/_legacy/lib/services/base-delivery-query.service.ts b/_legacy/lib/services/base-delivery-query.service.ts deleted file mode 100644 index 25e2c4ca..00000000 --- a/_legacy/lib/services/base-delivery-query.service.ts +++ /dev/null @@ -1,375 +0,0 @@ -import { IResponse, IHeader, IHttpService, IQueryParameter, urlHelper } from '@kontent-ai/core-sdk'; -import { AxiosError } from 'axios'; -import { - waitForLoadingNewContentHeader, - IQueryConfig, - ISDKInfo, - IDeliveryErrorRaw, - DeliveryError, - sdkVersionHeader, - staleContentHeaderName, - continuationTokenHeaderName, - IDeliveryNetworkResponse, - ClientTypes -} from '../models'; - -import { IDeliveryClientConfig } from '../config'; -import { IMappingService } from './mapping.service'; - -export abstract class BaseDeliveryQueryService { - /** - * Default base Url to Kontent.ai Delivery API - */ - private readonly defaultBaseDeliveryApiUrl: string = 'https://deliver.kontent.ai'; - - /** - * Default preview url to Kontent.ai Delivery API - */ - private readonly defaultPreviewDeliveryApiUrl: string = 'https://preview-deliver.kontent.ai'; - - constructor( - /** - * Delivery client configuration - */ - public readonly config: IDeliveryClientConfig, - /** - * Http service for fetching data - */ - public readonly httpService: IHttpService, - /** - * Information about the SDK - */ - public readonly sdkInfo: ISDKInfo, - /** - * Mapping service - */ - public readonly mappingService: IMappingService - ) {} - - /** - * Gets url based on the action, query configuration and options (parameters) - * @param action Action (= url part) that will be hit - * @param queryConfig Query configuration - * @param options Query options - */ - getUrl(action: string, queryConfig: IQueryConfig, options?: IQueryParameter[]): string { - if (!this.config.proxy || !this.config.proxy.advancedProxyUrlResolver) { - return urlHelper.addOptionsToUrl(this.getBaseUrl(queryConfig) + action, options); - } - return this.config.proxy.advancedProxyUrlResolver({ - queryParameters: options ? options : [], - queryString: urlHelper.addOptionsToUrl('', options), - action: action, - domain: this.getDomain(queryConfig), - queryConfig: queryConfig, - environmentId: this.config.environmentId - }); - } - - /** - * Gets proper set of headers for given request. - * @param queryConfig Query configuration - * @param additionalHeaders Custom headers - */ - getHeaders(queryConfig: IQueryConfig, additionalHeaders?: IHeader[]): IHeader[] { - const headers: IHeader[] = []; - - if (additionalHeaders) { - headers.push(...additionalHeaders); - } - - // add SDK Id header for monitoring SDK usage - headers.push(this.getSdkIdHeader()); - - // add headers from global config - if (this.config.globalHeaders) { - headers.push(...this.config.globalHeaders(queryConfig)); - } - - // add query / global headers from query config - headers.push(...this.getQueryHeaders(queryConfig)); - - if (this.isPreviewModeEnabled(queryConfig) && this.isSecuredModeEnabled(queryConfig)) { - throw Error(`Preview & secured modes cannot be used at the same time.`); - } - - // add preview header is required - if (this.isPreviewModeEnabled(queryConfig) && this.config.previewApiKey) { - headers.push(this.getAuthorizationHeader(this.config.previewApiKey)); - } - - // add secured mode header is required - if (this.isSecuredModeEnabled(queryConfig) && this.config.secureApiKey) { - headers.push(this.getAuthorizationHeader(this.config.secureApiKey)); - } - - // add 'X-KC-Wait-For-Loading-New-Content' header if required - if (this.shouldAddWaitForLoadingNewContentHeader(queryConfig)) { - headers.push({ - header: waitForLoadingNewContentHeader, - value: 'true' - }); - } - - return headers; - } - - /** - * Http POST response - * @param url Url of request - * @param queryConfig Query config configuration - */ - protected async postResponseAsync( - url: string, - body: any, - queryConfig?: IQueryConfig, - serviceConfig?: { - headers?: IHeader[]; - } - ): Promise> { - if (!queryConfig) { - queryConfig = {}; - } - - if (!serviceConfig) { - serviceConfig = {}; - } - - try { - return await this.httpService.postAsync( - { - url: url, - body: body - }, - { - cancelToken: queryConfig?.cancelToken, - responseType: 'json', - retryStrategy: this.config.retryStrategy, - headers: this.getHeaders(queryConfig, serviceConfig.headers ? serviceConfig.headers : []) - } - ); - } catch (error) { - throw this.mapDeliveryError(error); - } - } - - /** - * Http GET response - * @param url Url of request - * @param queryConfig Query config configuration - */ - protected async getResponseAsync( - url: string, - queryConfig?: IQueryConfig, - serviceConfig?: { - headers?: IHeader[]; - } - ): Promise> { - if (!queryConfig) { - queryConfig = {}; - } - - if (!serviceConfig) { - serviceConfig = {}; - } - - try { - return await this.httpService.getAsync( - { - url: url - }, - { - cancelToken: queryConfig?.cancelToken, - responseType: 'json', - retryStrategy: this.config.retryStrategy, - headers: this.getHeaders(queryConfig, serviceConfig.headers ? serviceConfig.headers : []) - } - ); - } catch (error) { - throw this.mapDeliveryError(error); - } - } - - /** - * Gets base URL of the request including the environment Id - * @param queryConfig Query configuration - */ - protected getBaseUrl(queryConfig: IQueryConfig): string { - return this.getDomain(queryConfig) + '/' + this.config.environmentId; - } - - protected mapNetworkResponse( - data: TData, - response: IResponse - ): IDeliveryNetworkResponse { - return { - data: data, - response: response, - hasStaleContent: this.getHasStaleContent(response.headers), - xContinuationToken: this.getContinuationToken(response.headers) - }; - } - - /** - * Indicates if current query should use preview mode - * @param queryConfig Query configuration - */ - private isPreviewModeEnabled(queryConfig: IQueryConfig): boolean { - if (queryConfig.usePreviewMode !== undefined) { - return queryConfig.usePreviewMode; - } - - if (!this.config.defaultQueryConfig) { - return false; - } - - if (this.config.defaultQueryConfig.usePreviewMode === true) { - return true; - } - - return false; - } - - private getQueryHeaders(queryConfig: IQueryConfig): IHeader[] { - if (queryConfig.customHeaders) { - return queryConfig.customHeaders; - } - - if (this.config.defaultQueryConfig?.customHeaders) { - return this.config.defaultQueryConfig.customHeaders; - } - - return []; - } - - private shouldAddWaitForLoadingNewContentHeader(queryConfig: IQueryConfig): boolean { - if (queryConfig.waitForLoadingNewContent !== undefined) { - return queryConfig.waitForLoadingNewContent; - } - - if (!this.config.defaultQueryConfig) { - return false; - } - - if (this.config.defaultQueryConfig.waitForLoadingNewContent === true) { - return true; - } - - return false; - } - - /** - * Indicates if current query should use secured mode - * @param queryConfig Query configuration - */ - private isSecuredModeEnabled(queryConfig: IQueryConfig): boolean { - if (queryConfig.useSecuredMode !== undefined) { - return queryConfig.useSecuredMode; - } - - if (!this.config.defaultQueryConfig) { - return false; - } - - if (this.config.defaultQueryConfig.useSecuredMode === true) { - return true; - } - - return false; - } - - /** - * Gets preview or standard URL based on client and query configuration - * @param queryConfig Query configuration - */ - private getDomain(queryConfig: IQueryConfig): string { - if (this.isPreviewModeEnabled(queryConfig)) { - if (!this.config.previewApiKey) { - throw Error(`Preview API key is not configured.`); - } - - // check custom preview url - if (this.config.proxy && this.config.proxy.basePreviewUrl) { - return this.config.proxy.basePreviewUrl; - } - - // use default preview url - return this.defaultPreviewDeliveryApiUrl; - } - - // check custom base url - if (this.config.proxy && this.config.proxy.baseUrl) { - return this.config.proxy.baseUrl; - } - return this.defaultBaseDeliveryApiUrl; - } - - /** - * Gets authorization header. This is used for 'preview' functionality - */ - private getAuthorizationHeader(key?: string): IHeader { - if (!key) { - throw Error(`Cannot get authorization header because key is invalid`); - } - // authorization header required for preview mode - return { - header: 'authorization', - value: `bearer ${key}` - }; - } - - /** - * Header identifying SDK type & version for internal purposes of Kontent.ai - */ - private getSdkIdHeader(): IHeader { - return { - header: sdkVersionHeader, - value: `${this.sdkInfo.host};${this.sdkInfo.name};${this.sdkInfo.version}` - }; - } - - private mapDeliveryError(error: any): any { - let axiosError: AxiosError | undefined; - - if (error.error) { - axiosError = error.error; - } else { - axiosError = error; - } - - if (!axiosError || !axiosError.isAxiosError) { - return error; - } - - const deliveryErrorData = axiosError.response?.data as IDeliveryErrorRaw; - - if (!deliveryErrorData || !deliveryErrorData.error_code) { - return error; - } - - return new DeliveryError({ - errorCode: deliveryErrorData.error_code, - message: deliveryErrorData.message, - specificCode: deliveryErrorData.specific_code, - requestId: deliveryErrorData.request_id - }); - } - - private getHasStaleContent(headers: IHeader[]): boolean { - const hasStaleContentHeader = headers.find( - (m) => m.header.toLowerCase() === staleContentHeaderName.toLowerCase() - ); - - if (hasStaleContentHeader) { - if (hasStaleContentHeader.value.toString() === '1') { - return true; - } - } - return false; - } - - private getContinuationToken(headers: IHeader[]): string | undefined { - const header = headers.find((m) => m.header.toLowerCase() === continuationTokenHeaderName.toLowerCase()); - return header ? header.value : undefined; - } -} diff --git a/_legacy/lib/services/delivery-query.service.ts b/_legacy/lib/services/delivery-query.service.ts deleted file mode 100644 index 19fd7a80..00000000 --- a/_legacy/lib/services/delivery-query.service.ts +++ /dev/null @@ -1,336 +0,0 @@ -import { IHttpService } from '@kontent-ai/core-sdk'; -import { IDeliveryClientConfig } from '../config'; -import { Contracts } from '../contracts'; -import { - Responses, - IContentItem, - IContentTypeQueryConfig, - IGroupedNetworkResponse, - IItemQueryConfig, - IDeliveryNetworkResponse, - ILanguagesQueryConfig, - ITaxonomyQueryConfig, - ISyncInitQueryConfig, - ClientTypes -} from '../models'; -import { - IKontentListAllResponse, - IKontentListResponse, - IListAllQueryConfig, - ISDKInfo -} from '../models/common/common-models'; -import { BaseDeliveryQueryService } from './base-delivery-query.service'; -import { IMappingService } from './mapping.service'; - -export class QueryService extends BaseDeliveryQueryService { - constructor( - config: IDeliveryClientConfig, - httpService: IHttpService, - sdkInfo: ISDKInfo, - mappingService: IMappingService - ) { - super(config, httpService, sdkInfo, mappingService); - } - - /** - * Gets single item from given url - * @param url Url used to get single item - * @param queryConfig Query configuration - */ - async getSingleItemAsync( - url: string, - queryConfig: IItemQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IViewContentItemResponse, - Contracts.IViewContentItemContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse< - Responses.IViewContentItemResponse, - Contracts.IViewContentItemContract - >(this.mappingService.viewContentItemResponse(response.data), response); - } - - /** - * Gets single feed response. Might not contain all items in your environment. - * @param url Url - * @param queryConfig Query configuration - */ - async getItemsFeed( - url: string, - queryConfig: IItemQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, - Contracts.IItemsFeedContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.itemsFeedResponse(response.data), response); - } - - /** - * Gets single used in response. Might not contain all used in references. - * @param url Url - * @param queryConfig Query configuration - */ - async getUsedIn( - url: string, - queryConfig: IItemQueryConfig - ): Promise, Contracts.IUsedInItemsContract>> { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.usedInResponse(response.data), response); - } - - /** - * Gets multiple items from given url - * @param url Url used to get multiple items - * @param queryConfig Query configuration - */ - async getMultipleItems( - url: string, - queryConfig: IItemQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IListContentItemsResponse, - Contracts.IListContentItemsContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.listContentItemsResponse(response.data), response); - } - - /** - * Gets single content type from given url - * @param url Url used to get single type - * @param queryConfig Query configuration - */ - async getSingleType( - url: string, - queryConfig: IContentTypeQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IViewContentTypeResponse, - Contracts.IViewContentTypeContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.viewContentTypeResponse(response.data), response); - } - - /** - * Gets multiple content types from given url - * @param url Url used to get multiple types - * @param queryConfig Query configuration - */ - async getMultipleTypes( - url: string, - queryConfig: IContentTypeQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IListContentTypesResponse, - Contracts.IListContentTypeContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.listContentTypesResponse(response.data), response); - } - - /** - * Initializes synchronization of changes in content items based on the specified parameters. After the initialization, - * you'll get an X-Continuation token in the response. - * Use the token to synchronize changes in the content items matching the initialization criteria. - * @param url Url - * @param queryConfig Query configuration - */ - async initializeSync( - url: string, - queryConfig: ISyncInitQueryConfig - ): Promise> { - const response = await this.postResponseAsync(url, {}, queryConfig); - - return this.mapNetworkResponse(this.mappingService.initializeContentSync(response.data), response); - } - - /** - * Retrieve a list of delta updates to recently changed content items in the specified environment. - * The types of items you get is determined by the X-Continuation token you use. - * @param url Url used to get multiple types - * @param queryConfig Query configuration - */ - async syncChanges( - url: string, - queryConfig: IContentTypeQueryConfig - ): Promise> { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.syncChanges(response.data), response); - } - - /** - * Gets languages - * @param url Url - * @param queryConfig Query configuration - */ - async getLanguages( - url: string, - queryConfig: ILanguagesQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IListLanguagesResponse, - Contracts.IListLanguagesContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.listLanguagesResponse(response.data), response); - } - - /** - * Gets single taxonomy from given url - * @param url Url used to get single taxonomy - * @param queryConfig Query configuration - */ - async getTaxonomy( - url: string, - queryConfig: ITaxonomyQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IViewTaxonomyResponse, - Contracts.IViewTaxonomyGroupContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.viewTaxonomyResponse(response.data), response); - } - - /** - * Gets multiple taxonomies from given url - * @param url Url used to get multiple taxonomies - * @param queryConfig Query configuration - */ - async getTaxonomies( - url: string, - queryConfig: ITaxonomyQueryConfig - ): Promise< - IDeliveryNetworkResponse< - Responses.IListTaxonomiesResponse, - Contracts.IListTaxonomyGroupsContract - > - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.listTaxonomiesResponse(response.data), response); - } - - /** - * Gets single content type element from given url - * @param url Url used to get single content type element - * @param queryConfig Query configuration - */ - async getElementAsync( - url: string, - queryConfig: ITaxonomyQueryConfig - ): Promise< - IDeliveryNetworkResponse - > { - const response = await this.getResponseAsync(url, queryConfig); - - return this.mapNetworkResponse(this.mappingService.viewContentTypeElementResponse(response.data), response); - } - - async getListAllResponse< - TResponse extends IKontentListResponse, - TAllResponse extends IKontentListAllResponse, - TContract - >(data: { - page: number; - getResponse: ( - nextPageUrl?: string, - continuationToken?: string - ) => Promise>; - allResponseFactory: ( - items: any[], - responses: IDeliveryNetworkResponse[] - ) => IGroupedNetworkResponse; - listQueryConfig?: IListAllQueryConfig; - }): Promise> { - const responses = await this.getListAllResponseInternalAsync({ - page: data.page, - resolvedResponses: [], - getResponse: data.getResponse, - nextPageUrl: undefined, - continuationToken: undefined, - listQueryConfig: data.listQueryConfig - }); - - return data.allResponseFactory( - responses.reduce((prev: any[], current) => { - prev.push(...current.data.items); - return prev; - }, []), - responses - ); - } - - private async getListAllResponseInternalAsync(data: { - page: number; - nextPageUrl?: string; - continuationToken?: string; - getResponse: ( - nextPageUrl?: string, - continuationToken?: string - ) => Promise>; - resolvedResponses: IDeliveryNetworkResponse[]; - listQueryConfig?: IListAllQueryConfig; - }): Promise[]> { - if (data.listQueryConfig?.pages) { - if (data.page > data.listQueryConfig.pages) { - // page limit reached, return result - return data.resolvedResponses; - } - } - - const response = await data.getResponse(data.nextPageUrl, data.continuationToken); - - if (data.listQueryConfig?.delayBetweenRequests) { - await this.sleep(data.listQueryConfig.delayBetweenRequests); - } - - data.resolvedResponses.push(response); - - if (data.listQueryConfig?.responseFetched) { - data.listQueryConfig.responseFetched(response, data.nextPageUrl, data.continuationToken); - } - - const nextPage = response.data.pagination?.nextPage; - const continuationToken = response.xContinuationToken; - - if (nextPage || continuationToken) { - // recursively fetch next page data - return await this.getListAllResponseInternalAsync({ - page: data.page + 1, - nextPageUrl: nextPage, - continuationToken: continuationToken, - listQueryConfig: data.listQueryConfig, - getResponse: data.getResponse, - resolvedResponses: data.resolvedResponses - }); - } - - return data.resolvedResponses; - } - - private sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); - } -} diff --git a/_legacy/lib/services/index.ts b/_legacy/lib/services/index.ts deleted file mode 100644 index c65825b1..00000000 --- a/_legacy/lib/services/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './delivery-query.service'; -export * from './mapping.service'; diff --git a/_legacy/lib/services/mapping.service.ts b/_legacy/lib/services/mapping.service.ts deleted file mode 100644 index e64c9ff5..00000000 --- a/_legacy/lib/services/mapping.service.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { IDeliveryClientConfig } from '../config'; -import { Contracts } from '../contracts'; -import { - SyncMapper, - GenericElementMapper, - ItemMapper, - LanguageMapper, - TaxonomyMapper, - TypeMapper, - UsedInMapper -} from '../mappers'; -import { Responses, IContentItem, IPagination, ClientTypes } from '../models'; - -export interface IMappingService { - listContentTypesResponse( - data: Contracts.IListContentTypeContract - ): Responses.IListContentTypesResponse; - - itemsFeedResponse( - data: Contracts.IItemsFeedContract - ): Responses.IListItemsFeedResponse; - - usedInResponse(data: Contracts.IUsedInItemsContract): Responses.IUsedInResponse; - - viewContentTypeResponse( - data: Contracts.IViewContentTypeContract - ): Responses.IViewContentTypeResponse; - - viewContentItemResponse( - data: Contracts.IViewContentItemContract - ): Responses.IViewContentItemResponse; - - listContentItemsResponse( - data: Contracts.IListContentItemsContract - ): Responses.IListContentItemsResponse; - - viewTaxonomyResponse( - data: Contracts.IViewTaxonomyGroupContract - ): Responses.IViewTaxonomyResponse; - - listTaxonomiesResponse( - data: Contracts.IListTaxonomyGroupsContract - ): Responses.IListTaxonomiesResponse; - - viewContentTypeElementResponse( - data: Contracts.IViewContentTypeElementContract - ): Responses.IViewContentTypeElementResponse; - - listLanguagesResponse( - data: Contracts.IListLanguagesContract - ): Responses.IListLanguagesResponse; - initializeContentSync(data: Contracts.IInitializeSyncContract): Responses.IInitializeSyncResponse; - syncChanges(data: Contracts.ISyncChangesContract): Responses.ISyncChangesResponse; -} - -export class MappingService implements IMappingService { - private readonly typeMapper: TypeMapper; - private readonly languageMapper: LanguageMapper; - private readonly itemMapper: ItemMapper; - private readonly taxonomyMapper: TaxonomyMapper; - private readonly usedInMapper: UsedInMapper; - private readonly genericElementMapper: GenericElementMapper; - private readonly syncMapper: SyncMapper; - - constructor(readonly config: IDeliveryClientConfig) { - this.typeMapper = new TypeMapper(); - this.languageMapper = new LanguageMapper(); - this.itemMapper = new ItemMapper(config); - this.taxonomyMapper = new TaxonomyMapper(); - this.usedInMapper = new UsedInMapper(); - this.genericElementMapper = new GenericElementMapper(); - this.syncMapper = new SyncMapper(); - } - - usedInResponse(data: Contracts.IUsedInItemsContract): Responses.IUsedInResponse { - return { - items: data.items.map((m) => this.usedInMapper.mapUsedInItem(m)) - }; - } - - /** - * Gets response for list of languages - * @param data Response data - */ - listLanguagesResponse( - data: Contracts.IListLanguagesContract - ): Responses.IListLanguagesResponse { - return { - items: this.languageMapper.mapMultipleLanguages(data), - pagination: this.mapPagination(data.pagination) - }; - } - - /** - * Gets response for getting a multiple type - * @param data Response data - */ - listContentTypesResponse( - data: Contracts.IListContentTypeContract - ): Responses.IListContentTypesResponse { - return { - items: this.typeMapper.mapMultipleTypes(data), - pagination: this.mapPagination(data.pagination) - }; - } - - /** - * Gets response for single type - * @param data Response data - * @param options Options - */ - viewContentTypeResponse( - data: Contracts.IViewContentTypeContract - ): Responses.IViewContentTypeResponse { - return { - type: this.typeMapper.mapSingleType(data) - }; - } - - itemsFeedResponse( - data: Contracts.IItemsFeedContract - ): Responses.IListItemsFeedResponse { - const itemsResult = this.itemMapper.mapItems({ - linkedItems: Object.values(data.modular_content), - mainItems: data.items - }); - - return { - items: itemsResult.items, - linkedItems: itemsResult.linkedItems - }; - } - - /** - * Gets response for getting single item - * @param data Response data - * @param queryConfig Query configuration - */ - viewContentItemResponse( - data: Contracts.IViewContentItemContract - ): Responses.IViewContentItemResponse { - const itemResult = this.itemMapper.mapSingleItemFromResponse(data); - - return { - item: itemResult.item, - linkedItems: itemResult.linkedItems - }; - } - - /** - * Gets response for getting multiple items - * @param data Response data - * @param queryConfig Query configuration - */ - listContentItemsResponse( - data: Contracts.IListContentItemsContract - ): Responses.IListContentItemsResponse { - const itemsResult = this.itemMapper.mapMultipleItemsFromResponse(data); - - return { - items: itemsResult.items, - pagination: this.mapPagination(data.pagination), - linkedItems: itemsResult.linkedItems - }; - } - - /** - * Gets response for getting single taxonomy item - * @param data Response data - */ - viewTaxonomyResponse( - data: Contracts.IViewTaxonomyGroupContract - ): Responses.IViewTaxonomyResponse { - return { - taxonomy: this.taxonomyMapper.mapTaxonomy(data.system, data.terms) - }; - } - - /** - * Gets response for getting multiples taxonomies - * @param data Response data - */ - listTaxonomiesResponse( - data: Contracts.IListTaxonomyGroupsContract - ): Responses.IListTaxonomiesResponse { - return { - items: this.taxonomyMapper.mapTaxonomies(data.taxonomies), - pagination: this.mapPagination(data.pagination) - }; - } - - /** - * Gets response for getting single content type element - * @param data Response data - */ - viewContentTypeElementResponse( - data: Contracts.IViewContentTypeElementContract - ): Responses.IViewContentTypeElementResponse { - return this.genericElementMapper.mapElement(data); - } - - initializeContentSync(data: Contracts.IInitializeSyncContract): Responses.IInitializeSyncResponse { - return { - items: data.items.map((m) => this.syncMapper.mapContentItemDelta(m)) - }; - } - - syncChanges(data: Contracts.ISyncChangesContract): Responses.ISyncChangesResponse { - return { - items: data.items.map((m) => this.syncMapper.mapContentItemDelta(m)) - }; - } - - private mapPagination(paginationContract: Contracts.IPaginationContract): IPagination { - return { - skip: paginationContract.skip, - count: paginationContract.count, - limit: paginationContract.limit, - nextPage: paginationContract.next_page, - totalCount: paginationContract.total_count ?? null - }; - } -} diff --git a/_legacy/lib/utilities/codename.helper.ts b/_legacy/lib/utilities/codename.helper.ts deleted file mode 100644 index 1afabacb..00000000 --- a/_legacy/lib/utilities/codename.helper.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class CodenameHelper { - /** - * This is used to prevent errors caused by reserved names in content item codename (e.g. 'constructor') - */ - escapeCodenameInCodenameIndexer(codename: string): string { - return `_${codename}`; - } -} - -export const codenameHelper = new CodenameHelper(); diff --git a/_legacy/lib/utilities/delivery-url.helper.ts b/_legacy/lib/utilities/delivery-url.helper.ts deleted file mode 100644 index 60c6688b..00000000 --- a/_legacy/lib/utilities/delivery-url.helper.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class DeliveryUrlHelper { - replaceAssetDomain(originalAssetUrl: string, customDomain: string): string { - return `${customDomain}${this.getPathname(originalAssetUrl)}`; - } - - getPathname(url: string): string { - return new URL(url).pathname; - } -} - -export const deliveryUrlHelper = new DeliveryUrlHelper(); diff --git a/_legacy/lib/utilities/enum.helper.ts b/_legacy/lib/utilities/enum.helper.ts deleted file mode 100644 index e314f38f..00000000 --- a/_legacy/lib/utilities/enum.helper.ts +++ /dev/null @@ -1,38 +0,0 @@ -export class EnumHelper { - getAllValues(T: any): string[] { - const allEnumValues: string[] = Object.keys(T).map((key) => T[key]); - return allEnumValues; - } - - getEnumFromValue(T: any, value: string | number): T | undefined { - try { - if (!value) { - return undefined; - } - - // we can map back from index number directly - if (this.isNumeric(value)) { - return T[value]; - } - - // for strings, we need to compare each value separately - const allEnumValues = this.getAllValues(T); - - const result = allEnumValues.find((m) => m.toLowerCase() === value.toString().toLowerCase()); - - if (!result) { - return undefined; - } - - return result as T; - } catch (err) { - return undefined; - } - } - - private isNumeric(value: any): boolean { - return !isNaN(parseFloat(value)) && isFinite(value); - } -} - -export const enumHelper = new EnumHelper(); diff --git a/_legacy/lib/utilities/index.ts b/_legacy/lib/utilities/index.ts deleted file mode 100644 index f54bdf0e..00000000 --- a/_legacy/lib/utilities/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './codename.helper'; -export * from './delivery-url.helper'; -export * from './enum.helper'; diff --git a/_legacy/misc/set-sdk-version.ts b/_legacy/misc/set-sdk-version.ts deleted file mode 100644 index d75a79fd..00000000 --- a/_legacy/misc/set-sdk-version.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { version, name } from '../package.json'; -import { createSdkVersionFile } from './version-helper'; - -createSdkVersionFile('./lib/sdk-info.generated.ts', version, name, '@kontent-ai/core-sdk'); diff --git a/_legacy/misc/verify-sdk-version.ts b/_legacy/misc/verify-sdk-version.ts deleted file mode 100644 index 994efd47..00000000 --- a/_legacy/misc/verify-sdk-version.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { sdkInfo } from '../lib/sdk-info.generated'; -import { version } from '../package.json'; -import { verifySdkVersion } from './version-helper'; - -verifySdkVersion(sdkInfo, version); diff --git a/_legacy/misc/version-helper.ts b/_legacy/misc/version-helper.ts deleted file mode 100644 index 6f570d5b..00000000 --- a/_legacy/misc/version-helper.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ISDKInfo } from '@kontent-ai/core-sdk'; -import { cyan, green, red, yellow } from 'colors'; -import { writeFileSync } from 'fs'; - -export const verifySdkVersion = (sdkInfo: ISDKInfo, versionInPackage: string) => { - if (sdkInfo.version !== versionInPackage) { - const msg = `Versions of '${sdkInfo.name}' SDK don't match. Lib version is '${sdkInfo.version}' while package version is '${versionInPackage}'. - Please make sure to use identical versions.`; - throw Error(red(msg)); - } else { - console.log(`Version check successful for '${yellow(sdkInfo.version)}' and package '${yellow(sdkInfo.name)}'`); - } -}; - -export const createSdkVersionFile = (filePath: string, appVersion: string, packageName: string, importFrom: string) => { - console.log(cyan('\nCreating SDK version file')); - - const src = ` -import { ISDKInfo } from '${importFrom}'; -export const sdkInfo: ISDKInfo = { - host: 'npmjs.com', - version: '${appVersion}', - name: '${packageName}' -}; -`; - - // ensure version module pulls value from package.json - writeFileSync(filePath, src); - console.log(green(`Updating application version ${yellow(appVersion)}`)); - console.log(`${green('Writing version module to ')}${yellow(filePath)}\n`); -}; diff --git a/_legacy/package-lock.json b/_legacy/package-lock.json deleted file mode 100644 index 6aba0c8d..00000000 --- a/_legacy/package-lock.json +++ /dev/null @@ -1,11524 +0,0 @@ -{ - "name": "@kontent-ai/delivery-sdk", - "version": "16.4.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@kontent-ai/delivery-sdk", - "version": "16.4.0", - "license": "MIT", - "dependencies": { - "@kontent-ai/core-sdk": "10.12.1" - }, - "devDependencies": { - "@types/jasmine": "5.1.12", - "@types/node": "24.10.0", - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "colors": "1.4.0", - "eslint": "9.32.0", - "jasmine-core": "5.12.1", - "jasmine-spec-reporter": "7.0.0", - "karma": "6.4.4", - "karma-chrome-launcher": "3.2.0", - "karma-cli": "2.0.0", - "karma-coverage-istanbul-reporter": "3.0.3", - "karma-jasmine": "5.1.0", - "karma-jasmine-html-reporter": "2.1.0", - "karma-sourcemap-loader": "0.4.0", - "karma-typescript": "5.5.4", - "karma-typescript-es6-transform": "5.5.4", - "lcov-parse": "1.0.0", - "mocha": "11.7.5", - "standard-version": "9.5.0", - "ts-loader": "9.5.4", - "tsx": "4.20.6", - "typescript": "5.2.2", - "typescript-eslint": "8.39.0", - "webpack": "5.102.1", - "webpack-bundle-analyzer": "4.10.2", - "webpack-cli": "6.0.1" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "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": "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": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^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.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "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/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kontent-ai/core-sdk": { - "version": "10.12.1", - "resolved": "https://registry.npmjs.org/@kontent-ai/core-sdk/-/core-sdk-10.12.1.tgz", - "integrity": "sha512-6lD5gVloyqOVgdQhjnnMLBz2Hj3cD/nrXlqrosktWaD0nKCzzxp7h/9F7kOObknWDvxl+hH+yeBLHTGWUegJdg==", - "license": "MIT", - "dependencies": { - "axios": "1.13.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "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" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jasmine": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.12.tgz", - "integrity": "sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.39.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", - "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.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.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.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "license": "MIT" - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", - "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", - "dev": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/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/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "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/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "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/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-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/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/combine-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.26.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/domain-browser": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", - "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", - "dev": true, - "license": "Artistic-2.0", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "license": "ISC", - "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotgitignore/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.250", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", - "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", - "dev": true, - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", - "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/envinfo": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", - "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "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-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@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.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "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/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "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/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/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/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "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", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/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/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "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.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "license": "BSD", - "dependencies": { - "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, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "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, - "license": "ISC", - "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, - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/inline-source-map": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.3.tgz", - "integrity": "sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/inline-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "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-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-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-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-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "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-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "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-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": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-source-maps/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/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jasmine-core": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.12.1.tgz", - "integrity": "sha512-P/UbRZ0LKwXe7wEpwDheuhunPwITn4oPALhrJEQJo6756EwNGnsK/TSQrWojBB4cQDQ+VaxWYws9tFNDuiMh2Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "colors": "1.4.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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, - "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" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "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, - "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, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-cli": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", - "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.3.3" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/mattlewis92" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", - "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "jasmine-core": "^4.0.0 || ^5.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-jasmine/node_modules/jasmine-core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", - "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/karma-sourcemap-loader": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz", - "integrity": "sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.10" - } - }, - "node_modules/karma-typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.4.tgz", - "integrity": "sha512-D7nQ96xu/UekuqCmiPimnCuOFqp8+BxiND6MU6IJVN37E7DgXzr7SUeTzwuTHtKSYpgxKv4iOTUteYTxpeZL9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2", - "assert": "^2.0.0", - "async": "^3.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.4.3", - "combine-source-map": "^0.8.0", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "convert-source-map": "^1.7.0", - "crypto-browserify": "^3.12.0", - "diff": "^4.0.1", - "domain-browser": "^4.16.0", - "events": "^3.2.0", - "glob": "^7.1.6", - "https-browserify": "^1.0.0", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.19", - "log4js": "^6.3.0", - "minimatch": "^3.0.4", - "os-browserify": "^0.3.0", - "pad": "^3.2.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.1.1", - "source-map": "^0.7.3", - "stream-browserify": "^3.0.0", - "stream-http": "^3.1.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.11", - "tmp": "^0.2.1", - "tty-browserify": "^0.0.1", - "url": "^0.11.0", - "util": "^0.12.1", - "vm-browserify": "^1.1.2" - }, - "peerDependencies": { - "karma": "1 || 2 || 3 || 4 || 5 || 6", - "typescript": "1 || 2 || 3 || 4 || 5" - } - }, - "node_modules/karma-typescript-es6-transform": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/karma-typescript-es6-transform/-/karma-typescript-es6-transform-5.5.4.tgz", - "integrity": "sha512-SKUNU4cAxNgmJnF/zCAzMRnBaciQjFumSDrsf1j8TTJvAtwAk/tLM+hru88Dr4Q4SmFUFa+PzIK8NJmykQ2F7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2", - "log4js": "^6.3.0", - "magic-string": "^0.25.7" - } - }, - "node_modules/karma-typescript/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-typescript/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma-typescript/node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/karma-typescript/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-typescript/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" - } - }, - "node_modules/karma-typescript/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "lcov-parse": "bin/cli.js" - } - }, - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "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", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "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, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "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.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" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "license": "MIT" - }, - "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/minimist": { - "version": "1.2.8", - "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" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/mocha/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mocha/node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "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", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "license": "MIT" - }, - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pad": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pad/-/pad-3.3.0.tgz", - "integrity": "sha512-2/G2Q8J/lbkJ3Zf595U9jattrUkM1rwTr3s4n9smp3+ALe66V+t3I75SG0qjWzuQgmXOgiUS0/qE97S+0hP7Cw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">= 4.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.9.5" - } - }, - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "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" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "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/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/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" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "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", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "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/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/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/ripemd160/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "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/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "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/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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "dev": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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": ">= 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/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/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "license": "MIT" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "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/standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-version/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/standard-version/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/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" - } - }, - "node_modules/standard-version/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "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/stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", - "dev": true, - "license": "ISC" - }, - "node_modules/strip-ansi": { - "version": "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/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-loader": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", - "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.39.0.tgz", - "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/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" - } - }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "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/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webpack": { - "version": "5.102.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", - "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.26.3", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.3", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", - "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", - "colorette": "^2.0.14", - "commander": "^12.1.0", - "cross-spawn": "^7.0.3", - "envinfo": "^7.14.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.82.0" - }, - "peerDependenciesMeta": { - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "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/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/workerpool": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", - "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/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" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/_legacy/package.json b/_legacy/package.json deleted file mode 100644 index 85bd466a..00000000 --- a/_legacy/package.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "name": "@kontent-ai/delivery-sdk", - "version": "16.4.0", - "repository": { - "type": "git", - "url": "https://github.com/kontent-ai/delivery-sdk-js" - }, - "private": false, - "author": "richard sustek", - "license": "MIT", - "description": "Official Kontent.AI Delivery API SDK", - "keywords": [ - "Kontent", - "Kontent.ai", - "Kontent SDK", - "Kontent API", - "Kontent Delivery", - "Kontent Javascript", - "Kontent Node.js", - "Kontent Typescript" - ], - "engines": { - "node": ">= 20" - }, - "main": "./dist/cjs/index.js", - "module": "./dist/es6/index.js", - "es2015": "./dist/es6/index.js", - "types": "./dist/cjs/index.d.ts", - "standard-version": { - "scripts": { - "postchangelog": "npm run set-sdk-version" - } - }, - "scripts": { - "release": "npm run lint:check && standard-version", - "release:major": "npm run lint:check && standard-version --release-as major", - "release:major:beta": "npm run lint:check && standard-version --prerelease --release-as major", - "release:beta": "standard-version --prerelease", - "lint:check": "npx eslint lib", - "test:browser": "karma start karma.conf.js", - "test:gh-actions": "karma start karma-gh-actions.conf.js", - "test:node": "npm run build:commonjs && npx mocha --timeout 15s -- \"test/node/**/*.js\"", - "test:all": "npm run test:node && npm run test:gh-actions", - "new-patch": "npm version patch && npm run set-sdk-version && npm run check-version ", - "new-minor": "npm version minor && npm run set-sdk-version && npm run check-version ", - "new-major": "npm version major && npm run set-sdk-version && npm run check-version ", - "prepublishOnly": "npm run lint:check && npm run check-version && npm run build:all && npm run test:all && npm run push:tags", - "set-sdk-version": "tsx ./misc/set-sdk-version.ts", - "check-version": "tsx ./misc/verify-sdk-version.ts", - "webpack:dev": "webpack -- --mode development --config webpack.config.js --progress", - "webpack:prod": "webpack -- --mode production --config webpack.config.js --progress", - "publish:beta": "npm publish --tag=next", - "build:umd": "npm run webpack:dev && npm run webpack:prod", - "build:es6": "tsc -m es6 --outDir dist/es6 --p tsconfig.prod.json", - "build:esnext": "tsc -m esnext --outDir dist/esnext --p tsconfig.prod.json", - "build:commonjs": "tsc -m commonjs --outDir dist/cjs --p tsconfig.prod.json", - "build:all": "npm run clean && npm run lint:check && npm run build:umd && npm run build:es6 && npm run build:esnext && npm run build:commonjs", - "bundle-stats:min": "npm run build:umd && webpack-bundle-analyzer dist/bundles/stats.min.json", - "bundle-stats": "npm run build:umd && webpack-bundle-analyzer dist/bundles/stats.json", - "push:tags": "git push --tags", - "clean": "tsx clean.ts" - }, - "dependencies": { - "@kontent-ai/core-sdk": "10.12.1" - }, - "devDependencies": { - "@types/jasmine": "5.1.12", - "@types/node": "24.10.0", - "colors": "1.4.0", - "jasmine-core": "5.12.1", - "jasmine-spec-reporter": "7.0.0", - "karma": "6.4.4", - "karma-chrome-launcher": "3.2.0", - "karma-cli": "2.0.0", - "karma-coverage-istanbul-reporter": "3.0.3", - "karma-jasmine": "5.1.0", - "karma-jasmine-html-reporter": "2.1.0", - "karma-sourcemap-loader": "0.4.0", - "karma-typescript": "5.5.4", - "karma-typescript-es6-transform": "5.5.4", - "lcov-parse": "1.0.0", - "mocha": "11.7.5", - "standard-version": "9.5.0", - "ts-loader": "9.5.4", - "tsx": "4.20.6", - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "eslint": "9.32.0", - "typescript": "5.2.2", - "webpack": "5.102.1", - "webpack-bundle-analyzer": "4.10.2", - "webpack-cli": "6.0.1", - "typescript-eslint": "8.39.0" - } -} diff --git a/_legacy/readme.md b/_legacy/readme.md deleted file mode 100644 index 86c2a40c..00000000 --- a/_legacy/readme.md +++ /dev/null @@ -1,531 +0,0 @@ -[![npm version](https://badge.fury.io/js/%40kontent-ai%2Fdelivery-sdk.svg)](https://badge.fury.io/js/%40kontent-ai%2Fdelivery-sdk) -[![Build](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/test.yml/badge.svg)](https://github.com/kontent-ai/delivery-sdk-js/actions/workflows/test.yml) -[![npm](https://img.shields.io/npm/dt/@kontent-ai/delivery-sdk.svg)](https://www.npmjs.com/package/@kontent-ai/delivery-sdk) -[![Known Vulnerabilities](https://snyk.io/test/github/kontent-ai/delivery-sdk-js/badge.svg)](https://snyk.io/test/github/kontent-ai/delivery-sdk-js) -[![GitHub license](https://img.shields.io/github/license/kontent-ai/delivery-sdk-js.svg)](https://github.com/kontent-ai/delivery-sdk-js) -![Gzip browser bundle](https://img.badgesize.io/https:/cdn.jsdelivr.net/npm/@kontent-ai/delivery-sdk/dist/bundles/kontent-delivery.umd.min.js?compression=gzip) -[![Discord](https://img.shields.io/discord/821885171984891914?label=Discord&logo=Discord&logoColor=white)](https://discord.gg/SKCxwPtevJ) - -# JavaScript Delivery SDK Documentation - -This library is build for fetching [Kontent.ai](https://kontent.ai/) data with `Delivery API`. Works in browser & node. - -> [!TIP] -> It's **highly recommended** to use this library in combination with -> [Model Generator](https://www.npmjs.com/package/@kontent-ai/model-generator). Generating models will greatly increase -> type safety of your code and offer you an advanced intellisense. - -# Kontent.ai Delivery SDK - -## Installation - -```bash -npm i @kontent-ai/delivery-sdk --save -``` - -## Getting started - -```typescript -import { type IContentItem, type Elements, createDeliveryClient } from '@kontent-ai/delivery-sdk'; - -/** - * Generate models with @kontent-ai/model-generator - */ -export type Movie = IContentItem<{ - readonly title: Elements.TextElement; - readonly plot: Elements.RichTextElement; - readonly released: Elements.DateTimeElement; - readonly length: Elements.NumberElement; - readonly poster: Elements.AssetsElement; - readonly category: Elements.MultipleChoiceElement; - readonly stars: Elements.LinkedItemsElement; - readonly seoname: Elements.UrlSlugElement; - readonly releasecategory: Elements.TaxonomyElement; -}>; - -// Both `CoreDeliveryClient` and `CoreClientTypes` are types generated by @kontent-ai/model-generator -// By using the generated types you will get access to advanced intellisense & type safety -const deliveryClient: CoreDeliveryClient = createDeliveryClient({ - environmentId: '' -}); - -// fetch items -const response = await deliveryClient.items().type('').toPromise(); - -// read data of first item -const movieText = response.data.items[0].elements.title.value; -``` - -## Configuration - -| Property | type | description | -| ---------------------------- | :--------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| environmentId | string | environmentId of your Kontent.ai project | -| elementResolver? | ElementResolver | Element resolver used to map custom elements | -| previewApiKey? | string | Preview API key used to get unpublished content items | -| defaultLanguage? | string | Sets default language that will be used for all queries unless overridden with query parameters | -| proxy? | IDeliveryClientProxyConfig | Can be used to configure custom URLs. Useful when you use reverse proxy or have a need to transform URL - e.g. to remove 'environmentId' | -| secureApiKey? | string | Secured API key: Use secured API only when running on Node.JS server, otherwise you can expose your key | -| defaultQueryConfig? | IQueryConfig | Default configuration for all queries. Can be overridden by individual queries | -| httpService ? | IHttpService | Can be used to inject custom http service for performing requests | -| globalHeaders? | (queryConfig: IQueryConfig) => IHeader[] | Adds ability to add extra headers to each http request | -| retryStrategy? | IRetryStrategyOptions | Retry strategy configuration | -| linkedItemsReferenceHandler? | LinkedItemsReferenceHandler | Indicates if content items are automatically mapped. Available values: 'map' or 'ignore' | -| assetsDomain? | string | Custom domain for assets. Changes url of assets in both asset & rich text elements | -| defaultRenditionPreset? | string | Codename of rendition preset to be applied by default to the base asset URL path when present. When set, the SDK will provide the URL of customized images by default. Right now the only supported preset codename is `default`. | -| excludeArchivedItems? | boolean | Can be used to exclude archived items from all queries by default. Only applicable when preview API is used. | - -### Querying - -The SDK supports the following query parameters: `depthParameter`, `elementsParameter`, `excludeElementsParameter`, -`limitParameter`, `orderParameter`, `skipParameter` and `languageParameter`. For more information about the parameters, -see the [SDK query methods](#filter-content) below. You can also head over to -[Delivery API reference](https://kontent.ai/learn/docs/apis/openapi/delivery-api/#tag/Filtering-parameters). - -```typescript -// Gets 5 items based on the Movie type -deliveryClient.items().type('movie').limitParameter(5).skipParameter(2).toPromise(); -``` - -| Filter | -| -------------------------- | -| `depthParameter` | -| `elementsParameter` | -| `excludeElementsParameter` | -| `limitParameter` | -| `orderParameter` | -| `skipParameter` | -| `languageParameter` | - -#### Filtering - -Filters are also considered query parameters and can be combined. See -[Content filtering in API reference](https://kontent.ai/learn/docs/apis/openapi/delivery-api/#tag/Filtering-parameters) -for more examples. - -```typescript -// Gets items based on the Movie type with 'Warrior' in their 'Title' element -deliveryClient.items().type('movie').equalsFilter('elements.title', 'Warrior').toPromise(); -``` - -| Filter | -| -------------------------- | -| `type` | -| `types` | -| `allFilter` | -| `anyFilter` | -| `containsFilter` | -| `equalsFilter` | -| `greaterThanFilter` | -| `greaterThanOrEqualFilter` | -| `inFilter` | -| `lessThanFilter` | -| `lessThanOrEqualFilter` | -| `rangeFilter` | -| `emptyFilter` | -| `NotEmptyFilter` | -| `notEqualsFilter` | -| `notInFilter` | - -#### Soring - -You can sort data by using any of the following methods: - -```typescript -deliveryClient.items().type('movie').orderByDescending('elements.title').toPromise(); -deliveryClient.items().type('movie').orderByAscending('elements.title').toPromise(); -deliveryClient.items().type('movie').orderParameter('elements.title', 'desc').toPromise(); -``` - -### Execute queries with a custom URL - -When you have an URL (i.e. for `next page` in paging, for testing purposes or just if you prefer to build it on your -own) and still want to leverage SDK functionality such as type mapping, property resolving etc., use `withUrl` parameter -on any query such as: - -```typescript -deliveryClient - .items() - .withUrl('https://deliver.kontent.ai/da5abe9f-fdad-4168-97cd-b3464be2ccb9/items?system.type=movie') - .toPromise(); -``` - -### Custom parameters - -In case you need to use custom parameters to build up an URL, use `withParameter` method: - -```typescript -deliveryClient.items().withParameter('name', 'value').toPromise(); -``` - -### Get localized items - -You can specify [language of items](https://kontent.ai/learn/tutorials/manage-kontent/projects/set-up-languages) with -`languageParameter` of a particular query. You can also define default language that will be used if `languageParameter` -is not used during the initialization of delivery client. - -```typescript -import { createDeliveryClient } from '@kontent-ai/delivery-sdk'; - -var deliveryClient = new createDeliveryClient({ - environmentId: '', - defaultLanguage: 'es' -}); - -// Gets items in 'es' language because it is marked as default -deliveryClient.item('warrior').toPromise(); - -// Gets items in 'en' language because language parameter has priority over the default one -deliveryClient.item('warrior').languageParameter(`en`).toPromise(); -``` - -### Preview mode - -You can enable the preview mode either globally (when [initializing the DeliveryClient](#how-to-use-deliveryclient)) or -per query. In each case, you need to set `previewApiKey` in the delivery client global configuration. - -#### Enable preview mode globally - -```typescript -import { createDeliveryClient } from '@kontent-ai/delivery-sdk'; - -const deliveryClient = createDeliveryClient({ - environmentId: ''; - previewApiKey: '', - defaultQueryConfig: { - usePreviewMode: true - } -}); -``` - -#### Enable preview mode per query - -```typescript -deliveryClient - .items() - .queryConfig({ - usePreviewMode: true - }) - .toPromise(); -``` - -### Secure Delivery API - -Using the Delivery API with -[secure access](https://kontent.ai/learn/tutorials/develop-apps/build-strong-foundation/restrict-public-access) enabled -is recommend only when the request is not being executed on the client (browser) because otherwise you will expose the -API key publicly. - -```typescript -import { createDeliveryClient } from '@kontent-ai/delivery-sdk'; - -const deliveryClient = createDeliveryClient({ - environmentId: ''; - secureApiKey: '', - defaultQueryConfig: { - // Enabled secure access for all queries - useSecuredMode: true - } -}); -``` - -As with [preview mode](#preview-mode), you can also override global settings on query level. - -```typescript -deliveryClient - .items() - .queryConfig({ - // Enables secure access only for this query - useSecuredMode: true - }) - .toPromise(); -``` - -### Image transformation - -Use `ImageUrlBuilder` for your [image transformations](https://kontent.ai/learn/reference/image-transformation) on asset -URLs. - -```typescript -import { transformImageUrl } from '@kontent-ai/delivery-sdk'; - -// Sample asset URL; You'll find URLs like these in asset and rich text elements -const assetUrl = `https://assets-eu-01.kc-usercontent.com/ede994d8-bb05-01b5-9c33-8b65e7372306/4f45e0a8-4fc3-4143-a81f-55b7e4ce7daa/warrior.jpg`; - -const transformedUrl = transformImageUrl(assetUrl) - .withDpr(2) - .withCompression('lossless') - .withQuality(4) - .withHeight(200) - .withWidth(100) - .getUrl(); -``` - -### Paging - -All listing queries support automatic paging. To use automatic paging, use `toAllPromise` extension method: - -```typescript -// this executed multiple HTTP requests until it gets all items -const response = await deliveryClient.items().limitParameter(5).toAllPromise(); - -// only gets 3 pages at maximum -const response = await deliveryClient.items().limitParameter(5).toAllPromise({ - pages: 3 -}); -``` - -### Resolving rich text elements - -[Rich text elements](https://kontent.ai/learn/reference/delivery-api#section/Rich-text-element) in Kontent.ai may -contain linked items and components. For example, if you write a blog post, you might want to insert a video or -testimonial to a specific place in your article. - -To learn how to work with Rich text element have a look at -[@kontent-ai/rich-text-resolver](https://www.npmjs.com/package/@kontent-ai/rich-text-resolver) library. - -## Get content types - -```typescript -deliveryClient.type('movie').toPromise(); -deliveryClient.types().toPromise(); -deliveryClient.types().toAllPromise(); -``` - -## Get taxonomies - -```typescript -deliveryClient.taxonomy('taxonomyGroupName').toPromise(); -deliveryClient.taxonomies().toPromise(); -deliveryClient.taxonomies().toAllPromise(); -``` - -## Proxy configuration - -If you want to use a proxy server, you need to use a different domain or otherwise transform the URL. By using `proxy` -configuration option you can define your own base domains as well as URL format. This is useful if you need to for -example hide the `environmentId` from the URL. - -`IDeliveryClientProxyConfig` offers 3 ways of configuring proxy URL: - -1. `baseUrl` - Base URL used for all requests. Defaults to 'deliver.kontent.ai' -2. `basePreviewUrl` - Base url used for preview requests. Defaults to 'preview-deliver.kontent.ai' -3. `advancedProxyUrlResolver` - Resolver function where you get `IProxyUrlData` context data (includes domain, action, - query parameters..) and can fully customize the final URL. - -Examples: - -```typescript -const client = createDeliveryClient({ - environmentId: '', - // Will be used instead of 'https://deliver.kontent.ai' for all requests. - // Parameters, filters, project Id and other parts of the URL will use default values. - proxy: { - baseUrl: 'http://my-proxy.io' - } -}); -``` - -```typescript -const client = createDeliveryClient({ - environmentId: '', - proxy: { - advancedProxyUrlResolver: (data) => { - const action = data.action; // /items - const domain = data.domain; // https://deliver.kontent.ai - const environmentId = data.environmentId; // xxx - const queryString = data.queryString; // e.g. ?depth=1&elements=xElement - const queryParameters = data.queryParameters; // array with query parameters parameters - const queryConfig = data.queryConfig; // query configuration - return `http://my-proxy.io${action}${queryString}`; // proxy URL with omitted project Id - } - } -}); -``` - -## Error handling - -If the error originates in Kontent.ai (see -[error responses](https://kontent.ai/learn/reference/delivery-api#section/SDKs)), you will get a `DeliveryError` object -instance with more specific information. Otherwise, you will get the original error. - -```typescript -import { DeliveryError } from '@kontent-ai/delivery-sdk'; - -try { - await deliveryClient.item('invalid_codename').toPromise(); -} catch (error) { - if (error instanceof DeliveryError) { - // delivery specific error (e.g. item with codename not found...) - console.log(err.message, err.errorCode); - } else { - // some other error - console.log(error); - } -} -``` - -### Remapping json responses - -In some scenarios, you might want to store `json` response for later use and use SDK to map the response for you. There -are 2 ways you can map previously stored `json`: - -```typescript -const result = await deliveryClient.item('codename').toPromise(); -const json = result.response.data; - -// approach #1 -const remappedData = deliveryClient.mappingService.viewContentItemResponse(json); - -// approach #2 -const remappedData = deliveryClient.item(movieCodename).map(json); -``` - -### Handling circular references - -By default, the SDK automatically maps content items present in `linked items` & `rich text` elements. Linked items can -reference other linked items in their tree (e.g. child item referencing parent) which may cause infinite nesting -(circular reference). This behavior is not an issue for most scenarios, in fact it is beneficial as you can easily -access all linked items. However, you cannot easily serialize such model. Using e.g. `JSON.stringify` would fail if -there are circular references. - -For this reason, you may disable mapping of linked items with `linkedItemsReferenceHandler` configuration option. - -```typescript -const client = getTestDeliveryClient({ - environmentId: '', - linkedItemsReferenceHandler: 'ignore' // or 'map' -}); -``` - -### Using custom HTTP service - -The SDK allows you to inject your own instance of a class implementing the `IHttpService` interface. This way you can -easily mock responses, implement your own http service, or modify the requests in some other way. - -Sample of a test `HttpService` implementation can be found at https://github.com/kontent-ai/core-sdk-js - -Once you have your `HttpService`, use it in delivery client initialization: - -```typescript -const deliveryClient = createDeliveryClient({ - environmentId: '', - httpService: YourHttpServiceImplementation -}); -``` - -### Use custom models for Custom elements - -You can register an `ElementResolver` to map custom elements into dedicated element models and work with data more -effectively. - -For example, if you have a custom `color` element in your Kontent.ai project with json data like: - -```json - "color": { - "type": "custom", - "name": "Color", - "value": "{\"red\":167,\"green\":96,\"blue\":197}" - } -``` - -You can create a `ColorElement` type with strongly typed properties for `red`, `green` & `blue` values that you will -parse from the json. - -```typescript -import { ElementModels, Elements, createDeliveryClient } from '@kontent-ai/delivery-sdk'; - -type ColorElement = Elements.CustomElement<{ - red: number; - green: number; - blue: number; -}>; -``` - -To resolve your custom element into `ColorElement`, use the `ElementResolver` in your delivery client config: - -```typescript -const client = createDeliveryClient({ - environmentId: '', - elementResolver: (elementWrapper) => { - if (elementWrapper.rawElement.type === 'color') { - const parsed = JSON.parse(elementWrapper.rawElement.value); - - return { - red: parsed.red, - green: parsed.green, - blue: parsed.blue - }; - } - - return undefined; - } -}); -``` - -You can then use this custom element type in your models: - -```typescript -type Movie = IContentItem<{ - color: ColorElement; - title: Elements.TextElement; -}>; -``` - -## UMD bundles - -When using UMD bundle and including this library in `script` tag on your `html` page, you can find it under the -`kontentDelivery` global variable. - -Bundles are distributed in `dist/bundles` folder: - -- `dist/bundles/kontent-delivery.umd.js` -- `dist/bundles/kontent-delivery.umd.min.js` - -## Debugging - -### Accessing request data - -Every response from this SDK contains additional debug data you can use to inspect when something is not right or if you -need to access response headers or other network related properties. - -```typescript -const deliveryResponse = await createDeliveryClient({ environmentId: 'environmentId' }) - .item('itemCodename') - .toPromise(); -const rawResponseData = deliveryResponse.response; // contains raw response data, headers, status etc.. -const responseHeaders = deliveryResponse.response.headers; -``` - -### Getting URL of a query - -In case you need to get the raw URL of a request before calling it, use the `getUrl()` method on any query. - -```typescript -const queryText = deliveryClient - .items() - .type('movie') - .limitParameter(10) - .orderParameter('system.codename', 'desc') - .getUrl(); - -console.log(queryText); -// outputs: -// https://deliver.kontent.ai/b52fa0db-84ec-4310-8f7c-3b94ed06644d/items?limit=10&order=system.codename[desc]&system.type=movie -``` - -## Testing - -Note: You need to have `Chrome` installed in order to run tests via Karma. - -- `npm run test:browser` Runs tests in Chrome -- `npm run test:node` Runs tests in node.js -- `npm run test:all` Runs all test - -> If you want to mock http responses, it is possible to use -> [custom Http Service](https://github.com/kontent-ai/core-sdk-js#testing) as a part of the -> [delivery client configuration](#client-configuration). - -## Feedback & Contribution - -Feedback & Contributions are welcomed. Feel free to take/start an issue & submit PR. diff --git a/_legacy/test/browser/client/delivery-client.spec.ts b/_legacy/test/browser/client/delivery-client.spec.ts deleted file mode 100644 index c77b98b1..00000000 --- a/_legacy/test/browser/client/delivery-client.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DeliveryClient } from '../../../lib'; - -describe('Delivery Client initialization', () => { - it(`initialization DeliveryClient without config should throw error`, () => { - expect(() => new DeliveryClient(null as any)).toThrowError(); - expect(() => new DeliveryClient(undefined as any)).toThrowError(); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/core/base-url.spec.ts b/_legacy/test/browser/isolated-tests/core/base-url.spec.ts deleted file mode 100644 index 2fb37a18..00000000 --- a/_legacy/test/browser/isolated-tests/core/base-url.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Base URL', () => { - - const context = new Context(); - setup(context); - - let itemsUrl: string; - let parsedUrl: URL; - - beforeAll(() => { - itemsUrl = context.deliveryClient.items().getUrl(); - - parsedUrl = new URL(itemsUrl); - }); - - it(`url should be defined`, () => expect(itemsUrl).toBeDefined()); - - it(`protocol should be 'https:'`, () => expect(parsedUrl.protocol).toEqual('https:')); - - it(`host should be 'deliver.kontent.ai'`, () => expect(parsedUrl.host).toEqual('deliver.kontent.ai')); - - it(`origin should be 'https://deliver.kontent.ai'`, () => expect(parsedUrl.origin).toEqual('https://deliver.kontent.ai')); - - it(`pathname should contain environment id'`, () => expect(itemsUrl).toContain(context.environmentId)); - - it(`custom base URL should be used'`, () => { - const baseUrl = 'http://custombase.com'; - const contextCustom = new Context({baseUrl: baseUrl}); - setup(contextCustom); - expect(contextCustom.deliveryClient.items().getUrl()).toContain(baseUrl); - }); - - it(`custom preview URL should be used'`, () => { - const previewUrl = 'http://custompreview.com'; - const contextCustom = new Context({basePreviewUrl: previewUrl, defaultQueryConfig: { usePreviewMode: true}}); - setup(contextCustom); - expect(contextCustom.deliveryClient.items().getUrl()).toContain(previewUrl); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/core/core-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/core-headers.spec.ts deleted file mode 100644 index 923b0bff..00000000 --- a/_legacy/test/browser/isolated-tests/core/core-headers.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { sdkInfo } from '../../../../lib'; -import { Context, setup } from '../../setup'; -import { IHeader } from '@kontent-ai/core-sdk'; - -describe('Core headers', () => { - - const context = new Context(); - - setup(context); - - it(`SDK Id version header should be set`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const header = headers.find(m => m.header === 'X-KC-SDKID'); - expect(header).toBeDefined(); - }); - - it(`Verifies SDK Id version format`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const header = headers.find(m => m.header === 'X-KC-SDKID') as IHeader; - const expectedValue = `${sdkInfo.host};${sdkInfo.name};${sdkInfo.version}`; - expect(header.value).toEqual(expectedValue); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/core/global-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/global-headers.spec.ts deleted file mode 100644 index b268aec7..00000000 --- a/_legacy/test/browser/isolated-tests/core/global-headers.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { IHeader } from '@kontent-ai/core-sdk'; - -import { IQueryConfig } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Global headers', () => { - let headers: IHeader[] = []; - const context = new Context(); - let queryConfig: IQueryConfig | undefined; - context.globalHeaders = (xQueryConfig) => { - queryConfig = xQueryConfig; - return [ - { - header: 'gl1', - value: 'vl1', - }, - { - header: 'gl2', - value: 'vl2', - } - ]; - }; - - setup(context); - - beforeAll((done) => { - headers = context.deliveryClient.items().queryConfig({ - usePreviewMode: true - }).getHeaders(); - - done(); - }); - - it(`Global headers should be set`, () => { - const header1 = headers.find(m => m.header === 'gl1') as IHeader; - const header2 = headers.find(m => m.header === 'gl2') as IHeader; - expect(header1).toBeDefined(); - expect(header2).toBeDefined(); - - expect(header1.value).toEqual('vl1'); - expect(header2.value).toEqual('vl2'); - }); - - - it(`Query config should be set and preview mode enabled`, () => { - expect(queryConfig).toBeDefined(); - - if (queryConfig) { - expect(queryConfig.usePreviewMode).toBeTruthy(); - - } - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts deleted file mode 100644 index e6ab5a65..00000000 --- a/_legacy/test/browser/isolated-tests/core/global-query-headers.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Global query headers', () => { - - it(`globally defined header should stay in headers when query config defines empty header array`, () => { - const context = new Context({ - globalHeaders: (config) => [ - { - header: 'xHeader', - value: 'x' - } - ], - defaultQueryConfig: { - customHeaders: [] - } - }); - - setup(context); - const headers = context.deliveryClient.items().getHeaders(); - const xHeader = headers.find(m => m.header === 'xHeader'); - expect(xHeader).toBeDefined(); - }); - - it(`globally defined header should stay in headers along with headers defined by query config`, () => { - const context = new Context({ - globalHeaders: (config) => [ - { - header: 'xHeader', - value: 'x' - } - ], - defaultQueryConfig: { - customHeaders: [{ - header: 'yHeader', - value: 'y' - }] - } - }); - - setup(context); - const headers = context.deliveryClient.items().getHeaders(); - const xHeader = headers.find(m => m.header === 'xHeader'); - const yHeader = headers.find(m => m.header === 'yHeader'); - expect(xHeader).toBeDefined(); - expect(yHeader).toBeDefined(); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/core/preview-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-headers.spec.ts deleted file mode 100644 index 3fdecb35..00000000 --- a/_legacy/test/browser/isolated-tests/core/preview-headers.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Context, setup } from '../../setup'; -import { IHeader } from '@kontent-ai/core-sdk'; - -describe('Preview headers', () => { - - const context = new Context({ - defaultQueryConfig: { - usePreviewMode: true - } - }); - - setup(context); - - it(`preview authorization header should be defined when getting items (global config)'`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`preview authorization header should be defined when getting taxonomies (global config)'`, () => { - const headers = context.deliveryClient.types().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`preview authorization header should be defined for getting types (global config)'`, () => { - const headers = context.deliveryClient.taxonomies().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`preview authorization header should contain preview API key (global config)'`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization') as IHeader; - const expectedValue = 'bearer ' + context.previewApiKey; - expect(authorizationHeader.value).toEqual(expectedValue); - }); - - it(`preview authorization header should NOT be defined when QueryConfig specifically disables it'`, () => { - const headers = context.deliveryClient.items().queryConfig({ - usePreviewMode: false - }).getHeaders(); - - const authorizationHeader = headers.find(m => m.header === 'authorization'); - - expect(authorizationHeader).toBeUndefined(); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/core/preview-url.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-url.spec.ts deleted file mode 100644 index cade624a..00000000 --- a/_legacy/test/browser/isolated-tests/core/preview-url.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Preview URL', () => { - - const context = new Context({ - defaultQueryConfig: { - usePreviewMode: true - } - }); - - setup(context); - - it(`origin should be 'https://preview-deliver.kontent.ai'`, () => { - const url = new URL(context.deliveryClient.items().getUrl()); - expect(url.origin).toEqual('https://preview-deliver.kontent.ai'); - }); - - it(`preview pathname should contain environment id'`, () => { - const url = context.deliveryClient.items().getUrl(); - expect(url).toContain(context.environmentId); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts b/_legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts deleted file mode 100644 index 00c50027..00000000 --- a/_legacy/test/browser/isolated-tests/core/preview-with-secured-mode.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Using secured with preview mode', () => { - - const context = new Context({ - defaultQueryConfig: { - usePreviewMode: true, - useSecuredMode: true - } - }); - - setup(context); - - it(`using secured API in combination with preview mode should thrown an Exception`, () => { - expect(() => context.deliveryClient.items().getHeaders()).toThrowError(); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/core/proxy-url-spec.ts b/_legacy/test/browser/isolated-tests/core/proxy-url-spec.ts deleted file mode 100644 index 8be65fdd..00000000 --- a/_legacy/test/browser/isolated-tests/core/proxy-url-spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { DeliveryClient, IProxyUrlData } from '../../../../lib'; - -describe('Proxy URL #1', () => { - - let proxyData: IProxyUrlData | undefined; - - const client = new DeliveryClient({ - environmentId: 'xxx', - proxy: { - advancedProxyUrlResolver: (data) => { - proxyData = data; - return 'http://custom-proxy.io'; - } - } - }); - - const itemsUrl: string = client - .item('xCodename') - .depthParameter(1) - .elementsParameter(['xElement']) - .queryConfig({ - useSecuredMode: true - }) - .getUrl(); - - it(`Custom proxy should be applied as request URL`, () => expect(itemsUrl).toEqual('http://custom-proxy.io')); - - it(`Proxy data should be assigned correctly`, () => { - if (!proxyData) { - throw Error(`Proxy data is invalid`); - } - expect(proxyData.action).toEqual('/items/xCodename'); - expect(proxyData.queryParameters.length).toEqual(2); - expect(proxyData.environmentId).toEqual('xxx'); - expect(proxyData.queryString).toEqual('?depth=1&elements=xElement'); - expect(proxyData.queryConfig.useSecuredMode).toBeTruthy(); - expect(proxyData.domain).toEqual('https://deliver.kontent.ai'); - }); -}); - - diff --git a/_legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts b/_legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts deleted file mode 100644 index 94996569..00000000 --- a/_legacy/test/browser/isolated-tests/core/secured-api-headers.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Context, setup } from '../../setup'; -import { IHeader } from '@kontent-ai/core-sdk'; - -describe('Secured headers', () => { - - const context = new Context({ - defaultQueryConfig: { - useSecuredMode: true - } - }); - - setup(context); - - it(`secured authorization header should be defined when getting items (global config)'`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`secured authorization header should be defined when getting taxonomies (global config)'`, () => { - const headers = context.deliveryClient.types().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`secured authorization header should be defined for getting types (global config)'`, () => { - const headers = context.deliveryClient.taxonomies().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization'); - expect(authorizationHeader).toBeDefined(); - }); - - it(`secured authorization header should contain secured API key (global config)'`, () => { - const headers = context.deliveryClient.items().getHeaders(); - const authorizationHeader = headers.find(m => m.header === 'authorization') as IHeader; - const expectedValue = 'bearer ' + context.securedApiKey; - expect(authorizationHeader.value).toEqual(expectedValue); - }); - - it(`secured authorization header should NOT be defined when QueryConfig specifically disables it'`, () => { - const headers = context.deliveryClient.items().queryConfig({ - useSecuredMode: false - }).getHeaders(); - - const authorizationHeader = headers.find(m => m.header === 'authorization'); - - expect(authorizationHeader).toBeUndefined(); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts b/_legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts deleted file mode 100644 index 52dd8422..00000000 --- a/_legacy/test/browser/isolated-tests/core/wait-for-loading-new-content-header.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Wait for loading new content header', () => { - - it(`defaultQueryConfig header should be present in headers`, () => { - const context = new Context({ - defaultQueryConfig: { - waitForLoadingNewContent: true - } - }); - - setup(context); - const headers = context.deliveryClient.items().getHeaders(); - const waitForLoadingNewContentHeader = headers.find(m => m.header === 'X-KC-Wait-For-Loading-New-Content'); - expect(waitForLoadingNewContentHeader).toBeDefined(); - }); - - it(`defaultQueryConfig header should not be present in headers`, () => { - const context = new Context({ - defaultQueryConfig: { - waitForLoadingNewContent: false - } - }); - - setup(context); - const headers = context.deliveryClient.items().getHeaders(); - const waitForLoadingNewContentHeader = headers.find(m => m.header === 'X-KC-Wait-For-Loading-New-Content'); - expect(waitForLoadingNewContentHeader).toBeUndefined(); - }); - - it(`defaultQueryConfig header should be present in headers`, () => { - const context = new Context({ - defaultQueryConfig: { - waitForLoadingNewContent: false - } - }); - - setup(context); - const headers = context.deliveryClient.items().queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const waitForLoadingNewContentHeader = headers.find(m => m.header === 'X-KC-Wait-For-Loading-New-Content'); - expect(waitForLoadingNewContentHeader).toBeDefined(); - }); - - it(`defaultQueryConfig header should not be present in headers`, () => { - const context = new Context({ - defaultQueryConfig: { - waitForLoadingNewContent: true - } - }); - - setup(context); - const headers = context.deliveryClient.items().queryConfig({ waitForLoadingNewContent: false }).getHeaders(); - const waitForLoadingNewContentHeader = headers.find(m => m.header === 'X-KC-Wait-For-Loading-New-Content'); - expect(waitForLoadingNewContentHeader).toBeUndefined(); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json b/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json deleted file mode 100644 index 79981782..00000000 --- a/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "item": { - "system": { - "id": "335d17ac-b6ba-4c6a-ae31-23c1193215cb", - "collection": "default", - "name": "My article", - "codename": "my_article", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "last_modified": "2019-03-27T13:21:11.38Z", - "workflow_step": "published" - }, - "elements": { - "assetWithRenditionInDefaultPreset": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "sources.jpg", - "type": "image/jpeg", - "size": 45376, - "description": "Description of what the asset represents.", - "url": "https://assets-us-01.kc-usercontent.com/975bf280-fd91-488c-994c-2f04416e5ee3/3e76909f-599f-4742-b472-77fd4b510e92/sources.jpg", - "width": 640, - "height": 457, - "renditions": { - "default": { - "rendition_id": "b447ca6c-8020-4e8f-be57-1d110721e535", - "preset_id": "a6d98cd5-8b2c-4e50-99c9-15192bce2490", - "width": 1280, - "height": 1024, - "query": "w=1280&h=1024&fit=clip&rect=2396,169,1280,1024" - } - } - } - ] - }, - "assetWithRenditionInMobilePreset": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "sources.jpg", - "type": "image/jpeg", - "size": 45376, - "description": "Description of what the asset represents.", - "url": "https://assets-us-01.kc-usercontent.com/975bf280-fd91-488c-994c-2f04416e5ee3/3e76909f-599f-4742-b472-77fd4b510e92/sources.jpg", - "width": 640, - "height": 457, - "renditions": { - "mobile": { - "rendition_id": "b447ca6c-8020-4e8f-be57-1d110721e535", - "preset_id": "a6d98cd5-8b2c-4e50-99c9-15192bce2490", - "width": 1280, - "height": 1024, - "query": "w=1280&h=1024&fit=clip&rect=2396,169,1280,1024" - } - } - } - ] - }, - "assetWithoutRendition": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "sources.jpg", - "type": "image/jpeg", - "size": 45376, - "description": "Description of what the asset represents.", - "url": "https://assets-us-01.kc-usercontent.com/975bf280-fd91-488c-994c-2f04416e5ee3/3e76909f-599f-4742-b472-77fd4b510e92/sources.jpg", - "width": 640, - "height": 457 - } - ] - } - } - }, - "modular_content": {} -} diff --git a/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts b/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts deleted file mode 100644 index 1767a971..00000000 --- a/_legacy/test/browser/isolated-tests/elements/assets/asset-rendition.spec.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Elements, IContentItem } from '../../../../../lib'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './asset-rendition.spec.json'; - -describe('Asset renditions', () => { - let item: IContentItem; - - describe('renditions are correctly set', () => { - beforeAll(async () => { - const response = (await getDeliveryClientWithJson(responseJson).item('xx').toPromise()); - - item = response.data.item; - }); - - it(`Asset element without rendition - renditions are null`, () => { - const asset = item.elements.assetWithoutRendition as Elements.AssetsElement; - const image = asset.value[0]; - const renditions = image.renditions; - - expect(renditions).toBeNull(); - }); - - it(`Asset element with rendition in default preset - renditions should be accessible`, () => { - const asset = item.elements.assetWithRenditionInDefaultPreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.default; - - const rawImage = responseJson.item.elements.assetWithRenditionInDefaultPreset.value[0]; - const rawRendition = rawImage.renditions.default; - expect(rendition?.rendition_id).toEqual(rawRendition.rendition_id); - expect(rendition?.height).toEqual(rawRendition.height); - expect(rendition?.preset_id).toEqual(rawRendition.preset_id); - expect(rendition?.query).toEqual(rawRendition.query); - expect(rendition?.width).toEqual(rawRendition.width); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - - it(`Asset element with rendition in mobile preset - renditions should be accessible`, () => { - const asset = item.elements.assetWithRenditionInMobilePreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.mobile; - - const rawImage = responseJson.item.elements.assetWithRenditionInMobilePreset.value[0]; - const rawRendition = rawImage.renditions.mobile; - expect(rendition?.height).toEqual(rawRendition.height); - expect(rendition?.preset_id).toEqual(rawRendition.preset_id); - expect(rendition?.query).toEqual(rawRendition.query); - expect(rendition?.width).toEqual(rawRendition.width); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - }); - - describe('no default profile specified in config', () => { - beforeAll(async () => { - const response = (await getDeliveryClientWithJson(responseJson).item('xx').toPromise()); - - item = response.data.item; - }); - - it(`Asset element without rendition - renditions are null`, () => { - const asset = item.elements.assetWithoutRendition as Elements.AssetsElement; - const image = asset.value[0]; - const renditions = image.renditions; - - const rawImage = responseJson.item.elements.assetWithoutRendition.value[0]; - expect(image.url).toEqual(rawImage.url); - expect(renditions).toBeNull(); - }); - - it(`Asset element with rendition in default preset - URL of original asset`, () => { - const asset = item.elements.assetWithRenditionInDefaultPreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.default; - - const rawImage = responseJson.item.elements.assetWithRenditionInDefaultPreset.value[0]; - const rawRendition = rawImage.renditions.default; - expect(image.url).toEqual(rawImage.url); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - - it(`Asset element with rendition in mobile preset - URL of original asset`, () => { - const asset = item.elements.assetWithRenditionInMobilePreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.mobile; - - const rawImage = responseJson.item.elements.assetWithRenditionInMobilePreset.value[0]; - const rawRendition = rawImage.renditions.mobile; - expect(image.url).toEqual(rawImage.url); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - }); - - describe('with default preset specified in config', () => { - beforeAll(async () => { - const response = (await getDeliveryClientWithJson(responseJson, { - defaultRenditionPreset: 'default', - environmentId: 'x' - }).item('xx').toPromise()); - - item = response.data.item; - }); - - it(`Asset element without rendition - URL of original asset`, () => { - const asset = item.elements.assetWithoutRendition as Elements.AssetsElement; - const image = asset.value[0]; - const renditions = image.renditions; - - const rawImage = responseJson.item.elements.assetWithoutRendition.value[0]; - expect(image.url).toEqual(rawImage.url); - expect(renditions).toBeNull(); - }); - - it(`Asset element with rendition in default preset - URL including rendition query string`, () => { - const asset = item.elements.assetWithRenditionInDefaultPreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.default; - - const rawImage = responseJson.item.elements.assetWithRenditionInDefaultPreset.value[0]; - const rawRendition = rawImage.renditions.default; - - expect(image.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - - it(`Asset element with rendition in mobile preset - URL of original asset`, () => { - const asset = item.elements.assetWithRenditionInMobilePreset as Elements.AssetsElement; - const image = asset.value[0]; - const rendition = image.renditions?.mobile; - - const rawImage = responseJson.item.elements.assetWithRenditionInMobilePreset.value[0]; - const rawRendition = rawImage.renditions.mobile; - expect(image.url).toEqual(rawImage.url); - expect(rendition?.url).toEqual(`${rawImage.url}?${rawRendition.query}`); - }); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts b/_legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts deleted file mode 100644 index 88b2f5e6..00000000 --- a/_legacy/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { deliveryUrlHelper } from '../../../../../lib'; -import { getDeliveryClientWithJson, Movie } from '../../../setup'; -import * as responseJson from '../../fake-data/fake-warrior-response.json'; - -describe('Custom assets domain', () => { - let item: Movie; - const customDomain: string = 'https://custom.com'; - - beforeAll(async () => { - const response = await getDeliveryClientWithJson(responseJson, { - assetsDomain: customDomain, - environmentId: 'x' - }) - .item('xx') - .toPromise(); - - item = response.data.item; - }); - - it(`Custom asset domain should be set in asset element`, () => { - const assetElement = item.elements.poster.value[0]; - - expect(assetElement.url).toEqual( - `${customDomain}/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg` - ); - }); - - it(`Custom asset domain should be set for rendition URL in asset element`, () => { - const assetElement = item.elements.poster.value[0]; - - expect(assetElement.renditions?.['default'].url).toEqual( - `${customDomain}/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg?w=1280&h=1024&fit=clip&rect=2396,169,1280,1024` - ); - }); - - it(`Custom asset domain should be set in Rich Text element`, () => { - const richTextElement = item.elements.plot; - - for (const image of richTextElement.images) { - const imagePathname = deliveryUrlHelper.getPathname(image.url); - expect(image.url).toEqual(`${customDomain}${imagePathname}`); - } - }); - - it(`Custom asset domain should be set in HTML of Rich Text elements`, () => { - const richTextElement = item.elements.plot; - - for (const image of richTextElement.images) { - expect(richTextElement.value).toContain(image.url); - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts deleted file mode 100644 index 0e1dfa3e..00000000 --- a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element-with-custom-model.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { IContentItem, ElementType, Elements } from '../../../../../lib'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './custom-element.spec.json'; - - -type ColorElement = Elements.CustomElement<{ - red: number; - green: number; - blue: number; -}>; - -type MarkdownElement = Elements.CustomElement<{ - isMarkdown: boolean; - -}>; - -type ItemWithCustomElements = IContentItem<{ - color: ColorElement; - markdown: MarkdownElement; -}>; - -describe('Custom element with custom model', () => { - let item: ItemWithCustomElements; - - beforeAll(async () => { - const response = await getDeliveryClientWithJson(responseJson, { - environmentId: '', - elementResolver: (elementWrapper) => { - const responseItem = responseJson.items[0]; - const colorElement = responseJson.items[0].elements.color; - const markdownElement = responseJson.items[0].elements.markdown; - - if ( - elementWrapper.system.type === responseItem.system.type && - elementWrapper.rawElement.name === colorElement.name - ) { - const parsed = JSON.parse(elementWrapper.rawElement.value); - - return { - red: parsed.red, - green: parsed.green, - blue: parsed.blue - }; - } - - if ( - elementWrapper.system.type === responseItem.system.type && - elementWrapper.rawElement.name === markdownElement.name - ) { - return { - isMarkdown: true - }; - } - return undefined; - } - }) - .items() - .toPromise(); - - item = response.data.items[0]; - }); - - it(`Color element should be mapped to ColorElement`, () => { - const element = item.elements.color; - const rawElement = responseJson.items[0].elements.color; - - expect(element.value.red).toEqual(167); - expect(element.value.green).toEqual(96); - expect(element.value.blue).toEqual(197); - - expect(element.name).toEqual(rawElement.name); - expect(element.type).toEqual(ElementType.Custom); - }); - - it(`Markdown element should be mapped to MarkdownElement`, () => { - const element = item.elements.markdown; - const rawElement = responseJson.items[0].elements.markdown; - - expect(element.value.isMarkdown).toEqual(true); - expect(element.name).toEqual(rawElement.name); - expect(element.type).toEqual(ElementType.Custom); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json deleted file mode 100644 index 9ad29b73..00000000 --- a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "a3dde145-2456-445d-ac33-3d3f6a092da8", - "name": "Color item", - "codename": "color_item", - "language": "default", - "type": "with_color_picker", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "rich": { - "type": "rich_text", - "name": "Rich", - "images": {}, - "links": {}, - "modular_content": [], - "value": "


" - }, - "color": { - "type": "custom", - "name": "Color", - "value": "{\"red\":167,\"green\":96,\"blue\":197}" - }, - "markdown": { - "type": "custom", - "name": "markdown", - "value": "**Super value**" - }, - "simple_text": { - "type": "text", - "name": "Simple text", - "value": "simple text" - } - } - } - ], - "modular_content": {}, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } - } diff --git a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts b/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts deleted file mode 100644 index 74c09cdb..00000000 --- a/_legacy/test/browser/isolated-tests/elements/custom-element/custom-element.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IContentItem, Elements, ElementType } from '../../../../../lib'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './custom-element.spec.json'; - -describe('Custom element', () => { - let item: IContentItem; - beforeAll(async () => { - const response = (await getDeliveryClientWithJson(responseJson).items().toPromise()).data; - - item = response.items[0]; - }); - - it(`Color element should be mapped to DefaultCustomElement`, () => { - const element = item.elements.color as Elements.CustomElement; - const rawElement = responseJson.items[0].elements.color; - - expect(element.name).toEqual(rawElement.name); - expect(element.type).toEqual(ElementType.Custom); - expect(element.value).toEqual(rawElement.value); - }); - - it(`Markdown element should be mapped to DefaultCustomElement`, () => { - const element = item.elements.markdown as Elements.CustomElement; - const rawElement = responseJson.items[0].elements.markdown; - - expect(element.name).toEqual(rawElement.name); - expect(element.type).toEqual(ElementType.Custom); - expect(element.value).toEqual(rawElement.value); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json b/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json deleted file mode 100644 index 73f62764..00000000 --- a/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "a3dde145-2456-445d-ac33-3d3f6a092da7", - "name": "Rich Text Item (Unordered)", - "codename": "rich_text_item_unordered", - "language": "default", - "type": "item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "rich": { - "type": "rich_text", - "name": "Rich", - "images": { - "66d73245-10e5-4478-93e7-5609fee3cdf7": { - "image_id": "66d73245-10e5-4478-93e7-5609fee3cdf7", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/38af179c-40ba-42e7-a5ca-33b8cdcc0d45/66d73245-10e5-4478-93e7-5609fee3cdf7/image.jpg", - "width": 600, - "height": 457 - } - }, - "links": { - "ef23e568-6aa2-42cd-a120-7823c0ef19f7": { - "codename": "article_codename", - "type": "article", - "url_slug": "my-article" - } - }, - "modular_content": ["n2", "n4", "n3", "n1"], - "value": "

Basic formatted text: plain text, bold, italics, monospace, subscript, superscript.

Links: link to a content item, link to web URL, email link, phone link, link to asset.

Table

ABC
DEF
GHI

Image

\"\"

Component

Inserted content item

" - } - } - }, - { - "system": { - "id": "a3dde145-2456-445d-ac33-3d3f6a092da8", - "name": "Rich Text Item (Ordered)", - "codename": "rich_text_item_ordered", - "language": "default", - "type": "item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "rich": { - "type": "rich_text", - "name": "Rich", - "images": { - "66d73245-10e5-4478-93e7-5609fee3cdf7": { - "image_id": "66d73245-10e5-4478-93e7-5609fee3cdf7", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/38af179c-40ba-42e7-a5ca-33b8cdcc0d45/66d73245-10e5-4478-93e7-5609fee3cdf7/image.jpg", - "width": 600, - "height": 457 - } - }, - "links": { - "ef23e568-6aa2-42cd-a120-7823c0ef19f7": { - "codename": "n4", - "type": "article", - "url_slug": "my-article" - } - }, - "modular_content": ["n1", "n2", "n3", "n4"], - "value": "

Basic formatted text: plain text, bold, italics, monospace, subscript, superscript.

Links: link to a content item, link to web URL, email link, phone link, link to asset.

Table

ABC
DEF
GHI

Image

\"\"

Component

Inserted content item

" - } - } - } - ], - "modular_content": { - "n1": { - "system": { - "id": "a3dde145-2456-445d-ac33-3d3f6a092da8-n1", - "name": "Modular Content 1", - "codename": "n1", - "language": "default", - "type": "modular_item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "text": { - "type": "text", - "name": "Text", - "value": "Text 1" - } - } - }, - "n2": { - "system": { - "id": "a3dde245-2456-445d-ac33-3d3f6a092da8-n2", - "name": "Modular Content 2", - "codename": "n2", - "language": "default", - "type": "modular_item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "text": { - "type": "text", - "name": "Text", - "value": "Text 2" - } - } - }, - "n3": { - "system": { - "id": "a3dde345-2456-445d-ac33-3d3f6a092da8-n3", - "name": "Modular Content 3", - "codename": "n3", - "language": "default", - "type": "modular_item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "text": { - "type": "text", - "name": "Text", - "value": "Text 3" - } - } - }, - "n4": { - "system": { - "id": "a3dde345-2456-445d-ac33-3d3f6a092da8-n4", - "name": "Modular Content 4", - "codename": "n4", - "language": "default", - "type": "modular_item", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "text": { - "type": "text", - "name": "Text", - "value": "Text 4" - } - } - } - }, - "pagination": { - "skip": 0, - "limit": 0, - "count": 3, - "next_page": "" - } -} diff --git a/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts b/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts deleted file mode 100644 index 9d57e0ae..00000000 --- a/_legacy/test/browser/isolated-tests/elements/rich-text/rich-text.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Responses, Elements, ElementType, IContentItem } from '../../../../../lib'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './rich-text.spec.json'; - -describe('Rich-text element', () => { - let response: Responses.IListContentItemsResponse; - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).items().toPromise()).data; - }); - - it(`Rich-text linked items should be re-ordered if not ordered in raw response`, async () => { - const rawItem = responseJson.items.find(({ system: { codename } }) => codename === 'rich_text_item_unordered'); - const item = response.items.find( - ({ system: { codename } }) => codename === 'rich_text_item_unordered' - ) as IContentItem; - const element = item.elements.rich as Elements.RichTextElement; - - expect(element.type).toEqual(ElementType.RichText); - expect(rawItem?.elements.rich.modular_content).toEqual(['n2', 'n4', 'n3', 'n1']); - expect(element.linkedItemCodenames).toEqual(['n1', 'n2', 'n3', 'n4']); - for (let i = 0; i < element.linkedItems.length; ++i) { - expect(element.linkedItems[i].system.codename).toBe(`n${i + 1}`); - } - }); - - it(`Rich-text linked items order should be maintained if already ordered in raw response`, () => { - const rawItem = responseJson.items.find(({ system: { codename } }) => codename === 'rich_text_item_ordered'); - const item = response.items.find( - ({ system: { codename } }) => codename === 'rich_text_item_ordered' - ) as IContentItem; - const element = item.elements.rich as Elements.RichTextElement; - - expect(element.type).toEqual(ElementType.RichText); - expect(rawItem?.elements.rich.modular_content).toEqual(['n1', 'n2', 'n3', 'n4']); - expect(element.linkedItemCodenames).toEqual(['n1', 'n2', 'n3', 'n4']); - for (let i = 0; i < element.linkedItems.length; ++i) { - expect(element.linkedItems[i].system.codename).toBe(`n${i + 1}`); - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json b/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json deleted file mode 100644 index 9e47369c..00000000 --- a/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "a3dde145-2456-445d-ac33-3d3f6a092da8", - "name": "Color item", - "codename": "color_item", - "language": "default", - "type": "with_color_picker", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-01-04T09:56:04.372261Z" - }, - "elements": { - "ufo": { - "type": "ufo", - "name": "Simple text", - "value": "simple text" - } - } - } - ], - "modular_content": {}, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } - } diff --git a/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts b/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts deleted file mode 100644 index 5ffa5dd2..00000000 --- a/_legacy/test/browser/isolated-tests/elements/unknown-element/unknown-element.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Elements, ElementType, IContentItem } from '../../../../../lib'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './unknown-element.spec.json'; - -describe('Unknown element', () => { - let item: IContentItem; - - beforeAll(async () => { - const response = (await getDeliveryClientWithJson(responseJson).items().toPromise()).data; - - item = response.items[0]; - }); - - it(`Ufo element should be mapped to UnknownElement`, () => { - const element = item.elements.ufo as Elements.UnknownElement; - const rawElement = responseJson.items[0].elements.ufo; - - expect(element.name).toEqual(rawElement.name); - expect(element.type).toEqual(ElementType.Unknown); - expect(element.value).toEqual(rawElement.value); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json deleted file mode 100644 index a08a775a..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "325e2acb-1c14-47f6-af9a-27bc8b6c16fe", - "name": "Warrior", - "codename": "warrior", - "language": "en", - "type": "movie", - "sitemap_locations": ["main_sitemap"], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - }, - "plot": { - "type": "rich_text", - "name": "Plot", - "images": { - "22504ba8-2075-48fa-9d4f-8fce3de1754a": { - "image_id": "22504ba8-2075-48fa-9d4f-8fce3de1754a", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - }, - "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5": { - "image_id": "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - }, - "links": { - "3294e4b0-e58b-49d7-85fa-5bc9a86556ec": { - "codename": "joel_edgerton", - "type": "actor", - "url_slug": "joel-edgerton" - }, - "d1557cb1-d7ec-4d04-9742-f86b52bc34fc": { - "codename": "tom_hardy", - "type": "actor", - "url_slug": "tom-hardy" - } - }, - "modular_content": ["tom_hardy", "joel_edgerton", "ec9813f6_194d_018f_e20c_36855fb6e600"], - "value": "

The youngest son of an alcoholic former boxer returns home, where he's trained by his father for competition in a mixed martial arts tournament - a path that puts the fighter on a collision course with his estranged, older brother.

\n

Stars: 

\n\n\n


\n

See more in profile of Joel Edgerton and Tom Hardy

\n

And here are some images: 

\n
\"\"
\n
\"\"
\n


\n

Also, why not include content component in the mix?

\n" - }, - "released": { - "type": "date_time", - "name": "Released", - "value": "2011-09-09T00:00:00Z" - }, - "length": { - "type": "number", - "name": "Length", - "value": 151 - }, - "poster": { - "type": "asset", - "name": "Poster", - "value": [ - { - "name": "warrior.jpg", - "description": null, - "type": "image/jpeg", - "size": 111004, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - } - ] - }, - "category": { - "type": "multiple_choice", - "name": "Category", - "value": [ - { - "name": "Action", - "codename": "action" - }, - { - "name": "Drama", - "codename": "drama" - } - ] - }, - "stars": { - "type": "modular_content", - "name": "Stars", - "value": ["tom_hardy", "joel_edgerton"] - }, - "seoname": { - "type": "url_slug", - "name": "SeoName", - "value": "warrior" - }, - "releasecategory": { - "type": "taxonomy", - "name": "releasecategory", - "taxonomy_group": "releasecategory", - "value": [ - { - "name": "Global release", - "codename": "global_release" - }, - { - "name": "US only", - "codename": "us_only" - } - ] - } - } - } - ], - "modular_content": { - "ec9813f6_194d_018f_e20c_36855fb6e600": { - "system": { - "id": "ec9813f6-194d-018f-e20c-36855fb6e600", - "name": "ec9813f6-194d-018f-e20c-36855fb6e600", - "codename": "ec9813f6_194d_018f_e20c_36855fb6e600", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "first_name": { - "type": "text", - "name": "First name", - "value": "Jennifer " - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Morrison" - }, - "url": { - "type": "url_slug", - "name": "Url", - "value": "component-actor-url" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [] - } - } - }, - "joel_edgerton": { - "system": { - "id": "3294e4b0-e58b-49d7-85fa-5bc9a86556ec", - "name": "Joel Edgerton", - "codename": "joel_edgerton", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2017-08-03T09:21:21.3857294Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "joel-edgerton" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Joel" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Edgerton" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "joel_edgerton.jpg", - "description": null, - "type": "image/jpeg", - "size": 6460, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/2855720a-4ca4-4687-826a-29f9635088e0/joel_edgerton.jpg", - "width": 211, - "height": 317 - } - ] - } - } - }, - "tom_hardy": { - "system": { - "id": "d1557cb1-d7ec-4d04-9742-f86b52bc34fc", - "name": "Tom Hardy", - "codename": "tom_hardy", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2018-02-09T13:11:32.5769383Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "tom-hardy" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Tom" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Hardy" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "tom_hardy.jpg", - "description": null, - "type": "image/jpeg", - "size": 8091, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - ] - } - } - } - } -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts deleted file mode 100644 index 4f74424c..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed-all.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IContentItem, IGroupedNetworkResponse, Responses } from '../../../../../lib'; -import { Context, Movie, setup } from '../../../setup'; -import { getDeliveryClientWithJsonAndHeaders } from '../../../setup'; -import * as responseJson from './items-feed-all.spec.json'; - -describe('Items feed all', () => { - const context = new Context(); - setup(context); - - let response: IGroupedNetworkResponse>; - - beforeAll(async () => { - response = await getDeliveryClientWithJsonAndHeaders( - responseJson, - { - environmentId: 'x' - }, - [] - ) - .itemsFeed() - .queryConfig({ - disableItemLinking: false - }) - .toAllPromise(); - }); - - it(`Validate responses counts`, () => { - expect(response.responses.length).toEqual(1); - }); - - it(`Validate items count`, () => { - expect(response.data.items.length).toEqual(responseJson.items.length); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json deleted file mode 100644 index a08a775a..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "325e2acb-1c14-47f6-af9a-27bc8b6c16fe", - "name": "Warrior", - "codename": "warrior", - "language": "en", - "type": "movie", - "sitemap_locations": ["main_sitemap"], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - }, - "plot": { - "type": "rich_text", - "name": "Plot", - "images": { - "22504ba8-2075-48fa-9d4f-8fce3de1754a": { - "image_id": "22504ba8-2075-48fa-9d4f-8fce3de1754a", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - }, - "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5": { - "image_id": "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - }, - "links": { - "3294e4b0-e58b-49d7-85fa-5bc9a86556ec": { - "codename": "joel_edgerton", - "type": "actor", - "url_slug": "joel-edgerton" - }, - "d1557cb1-d7ec-4d04-9742-f86b52bc34fc": { - "codename": "tom_hardy", - "type": "actor", - "url_slug": "tom-hardy" - } - }, - "modular_content": ["tom_hardy", "joel_edgerton", "ec9813f6_194d_018f_e20c_36855fb6e600"], - "value": "

The youngest son of an alcoholic former boxer returns home, where he's trained by his father for competition in a mixed martial arts tournament - a path that puts the fighter on a collision course with his estranged, older brother.

\n

Stars: 

\n\n\n


\n

See more in profile of Joel Edgerton and Tom Hardy

\n

And here are some images: 

\n
\"\"
\n
\"\"
\n


\n

Also, why not include content component in the mix?

\n" - }, - "released": { - "type": "date_time", - "name": "Released", - "value": "2011-09-09T00:00:00Z" - }, - "length": { - "type": "number", - "name": "Length", - "value": 151 - }, - "poster": { - "type": "asset", - "name": "Poster", - "value": [ - { - "name": "warrior.jpg", - "description": null, - "type": "image/jpeg", - "size": 111004, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - } - ] - }, - "category": { - "type": "multiple_choice", - "name": "Category", - "value": [ - { - "name": "Action", - "codename": "action" - }, - { - "name": "Drama", - "codename": "drama" - } - ] - }, - "stars": { - "type": "modular_content", - "name": "Stars", - "value": ["tom_hardy", "joel_edgerton"] - }, - "seoname": { - "type": "url_slug", - "name": "SeoName", - "value": "warrior" - }, - "releasecategory": { - "type": "taxonomy", - "name": "releasecategory", - "taxonomy_group": "releasecategory", - "value": [ - { - "name": "Global release", - "codename": "global_release" - }, - { - "name": "US only", - "codename": "us_only" - } - ] - } - } - } - ], - "modular_content": { - "ec9813f6_194d_018f_e20c_36855fb6e600": { - "system": { - "id": "ec9813f6-194d-018f-e20c-36855fb6e600", - "name": "ec9813f6-194d-018f-e20c-36855fb6e600", - "codename": "ec9813f6_194d_018f_e20c_36855fb6e600", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "first_name": { - "type": "text", - "name": "First name", - "value": "Jennifer " - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Morrison" - }, - "url": { - "type": "url_slug", - "name": "Url", - "value": "component-actor-url" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [] - } - } - }, - "joel_edgerton": { - "system": { - "id": "3294e4b0-e58b-49d7-85fa-5bc9a86556ec", - "name": "Joel Edgerton", - "codename": "joel_edgerton", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2017-08-03T09:21:21.3857294Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "joel-edgerton" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Joel" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Edgerton" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "joel_edgerton.jpg", - "description": null, - "type": "image/jpeg", - "size": 6460, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/2855720a-4ca4-4687-826a-29f9635088e0/joel_edgerton.jpg", - "width": 211, - "height": 317 - } - ] - } - } - }, - "tom_hardy": { - "system": { - "id": "d1557cb1-d7ec-4d04-9742-f86b52bc34fc", - "name": "Tom Hardy", - "codename": "tom_hardy", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2018-02-09T13:11:32.5769383Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "tom-hardy" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Tom" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Hardy" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "tom_hardy.jpg", - "description": null, - "type": "image/jpeg", - "size": 8091, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - ] - } - } - } - } -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts deleted file mode 100644 index 12715fe5..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items-feed/items-feed.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { IDeliveryNetworkResponse, Responses } from '../../../../../lib'; -import { Context, Movie, setup } from '../../../setup'; -import { getDeliveryClientWithJsonAndHeaders } from '../../../setup'; -import * as responseJson from './items-feed.spec.json'; - -describe('Items feed', () => { - const context = new Context(); - setup(context); - - let response: IDeliveryNetworkResponse, any>; - - beforeAll(async () => { - response = await getDeliveryClientWithJsonAndHeaders( - responseJson, - { - environmentId: 'x', - }, - [ - { - value: 'TokenX', - header: 'X-Continuation' - } - ] - ) - .itemsFeed() - .toPromise(); - }); - - it(`Continuation token should be set`, () => { - expect(response.xContinuationToken).toEqual('TokenX'); - }); - -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json deleted file mode 100644 index a47120a7..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "item": { - "system": { - "id": "117cdfae-52cf-4885-b271-66aef6825612", - "name": "Coffee processing techniques", - "codename": "coffee_processing_techniques", - "language": "en-US", - "type": "article", - "sitemap_locations": [ - "articles" - ], - "collection": "default", - "last_modified": "2018-07-17T08:12:03.07Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Coffee processing techniques" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "on_roasts", - "which_brewing_fits_you_" - ] - } - } - }, - "modular_content": { - "on_roasts": { - "system": { - "id": "f4b3fc05-e988-4dae-9ac1-a94aba566474", - "name": "On Roasts", - "codename": "on_roasts", - "language": "en-US", - "type": "article", - "sitemap_locations": [ - "articles" - ], - "collection": "default", - "last_modified": "2017-12-08T08:49:53.603Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "On Roasts" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "on_roasts", - "which_brewing_fits_you_" - ] - } - } - }, - "which_brewing_fits_you_": { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Which brewing fits you?", - "codename": "which_brewing_fits_you_", - "language": "en-US", - "type": "article", - "sitemap_locations": [ - "articles" - ], - "collection": "default", - "last_modified": "2018-10-11T08:45:56.917Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "coffee_processing_techniques", - "on_roasts" - ] - } - } - } - } -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts deleted file mode 100644 index 9681ea6e..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/circular-referenced-linked-items-mapping.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { getDeliveryClientWithJson } from '../../../setup'; -import { Responses, Elements } from '../../../../../lib'; -import * as responseJson from './circular-referenced-linked-items-mapping.spec.json'; - -describe('Circular references in linked items', () => { - let response: Responses.IViewContentItemResponse; - - const modularItemElement = 'related_articles'; - - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).item('x').toPromise()).data; - }); - - it(`Response should be defines and there should be no stackoverflow exception logged`, () => { - expect(response).toBeDefined(); - }); - - it(`'coffee_processing_techniques' should have mapped items`, () => { - const linkedItem = response.item; - expect(linkedItem).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeDefined(); - }); - - it(`'on_roasts' should have mapped items `, () => { - const linkedItemCodename = 'on_roasts'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeDefined(); - }); - - it(`'which_brewing_fits_you_' should have mapped items`, () => { - const linkedItemCodename = 'which_brewing_fits_you_'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'coffee_processing_techniques' - ) - ).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json deleted file mode 100644 index 9aab6c3f..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Which brewing fits you?", - "codename": "which_brewing_fits_you_", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-03-27T13:24:54.042Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "We have put down three procedures with clearly written steps describing the process of making coffee. Read this article to convince yourself that brewing coffee is no science." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-10-27T00:00:00Z" - } - } - } - ], - "modular_content": {}, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } - } diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts deleted file mode 100644 index 9cf111fc..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-response.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './items-list-response.spec.json'; - -describe('Items list response', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - const parameters: IQueryParameter[] = []; - - beforeAll(async () => { - const query = getDeliveryClientWithJson(responseJson).items().includeTotalCountParameter(); - parameters.push(...query.getParameters()); - response = (await query.toPromise()).data; - }); - - it(`Total count parameter should be set to true`, () => { - const totalCountParameter = parameters.find( - (m) => m.getParam().toLowerCase() === 'includeTotalCount=true'.toLowerCase() - ); - - expect(totalCountParameter).toBeDefined(); - }); - - it(`Response should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`Response item should be mapped properly`, () => { - const item = response.items[0]; - const rawItem = responseJson.items[0]; - - expect(item).toBeDefined(); - expect(rawItem).toBeDefined(); - expect(item.system).toBeDefined(); - - expect(item.elements.title.value).toEqual(rawItem.elements.title.value); - expect(item.elements.summary.value).toEqual(rawItem.elements.summary.value); - expect(item.elements.post_date.value).toEqual(rawItem.elements.post_date.value); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json deleted file mode 100644 index 094cd611..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Brewing", - "codename": "Brewing", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-03-27T13:24:54.042Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "We have put down three procedures with clearly written steps describing the process of making coffee. Read this article to convince yourself that brewing coffee is no science." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-10-27T00:00:00Z" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": ["constructor"] - } - } - } - ], - "modular_content": { - "constructor": { - "system": { - "id": "f4b3fc05-e988-4dae-9ac1-a94aba566474", - "name": "On Roasts", - "codename": "constructor", - "language": "en-US", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2017-12-08T08:49:53.603Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "constructor" - } - } - } - }, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts deleted file mode 100644 index 9b3154c1..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-in-linked-items-response.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './items-list-with-reserved-names-in-linked-items-response.spec.json'; - -describe('Items list with reserved names in linked items', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - const parameters: IQueryParameter[] = []; - - beforeAll(async () => { - const query = getDeliveryClientWithJson(responseJson).items().includeTotalCountParameter(); - parameters.push(...query.getParameters()); - response = (await query.toPromise()).data; - }); - - it(`Total count parameter should be set to true`, () => { - const totalCountParameter = parameters.find( - (m) => m.getParam().toLowerCase() === 'includeTotalCount=true'.toLowerCase() - ); - - expect(totalCountParameter).toBeDefined(); - }); - - it(`Response should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`Response item should be mapped properly`, () => { - const item = response.items[0]; - const rawItem = responseJson.items[0]; - - expect(item).toBeDefined(); - expect(rawItem).toBeDefined(); - expect(item.system).toBeDefined(); - - expect(item.elements.title.value).toEqual(rawItem.elements.title.value); - expect(item.elements.summary.value).toEqual(rawItem.elements.summary.value); - expect(item.elements.post_date.value).toEqual(rawItem.elements.post_date.value); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json deleted file mode 100644 index ab434f9d..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "constructor", - "codename": "constructor", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-03-27T13:24:54.042Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "We have put down three procedures with clearly written steps describing the process of making coffee. Read this article to convince yourself that brewing coffee is no science." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-10-27T00:00:00Z" - } - } - } - ], - "modular_content": { - }, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts deleted file mode 100644 index 302883b2..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-list-with-reserved-names-response.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './items-list-with-reserved-names-response.spec.json'; - -describe('Items list with reserved names', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - const parameters: IQueryParameter[] = []; - - beforeAll(async () => { - const query = getDeliveryClientWithJson(responseJson).items().includeTotalCountParameter(); - parameters.push(...query.getParameters()); - response = (await query.toPromise()).data; - }); - - it(`Total count parameter should be set to true`, () => { - const totalCountParameter = parameters.find( - (m) => m.getParam().toLowerCase() === 'includeTotalCount=true'.toLowerCase() - ); - - expect(totalCountParameter).toBeDefined(); - }); - - it(`Response should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`Response item should be mapped properly`, () => { - const item = response.items[0]; - const rawItem = responseJson.items[0]; - - expect(item).toBeDefined(); - expect(rawItem).toBeDefined(); - expect(item.system).toBeDefined(); - - expect(item.elements.title.value).toEqual(rawItem.elements.title.value); - expect(item.elements.summary.value).toEqual(rawItem.elements.summary.value); - expect(item.elements.post_date.value).toEqual(rawItem.elements.post_date.value); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json deleted file mode 100644 index c18e9f7e..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Which brewing fits you?", - "codename": "which_brewing_fits_you_", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-03-27T13:24:54.042Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "We have put down three procedures with clearly written steps describing the process of making coffee. Read this article to convince yourself that brewing coffee is no science." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-10-27T00:00:00Z" - } - } - } - ], - "modular_content": {}, - "pagination": { - "total_count": 1, - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } - } diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts deleted file mode 100644 index 17dbb5c9..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-with-total-count.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './items-with-total-count.spec.json'; - -describe('Items with total count', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - const parameters: IQueryParameter[] = []; - - beforeAll(async () => { - const query = getDeliveryClientWithJson(responseJson).items().includeTotalCountParameter(); - - parameters.push(...query.getParameters()); - - response = (await query.toPromise()).data; - }); - - it(`Total count parameter should be set to true`, () => { - const totalCountParameter = parameters.find( - (m) => m.getParam().toLowerCase() === 'includeTotalCount=true'.toLowerCase() - ); - - expect(totalCountParameter).toBeDefined(); - }); - - it(`Response should have total count parameter set`, () => { - expect(response.pagination.totalCount).toEqual(responseJson.pagination.total_count); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json b/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json deleted file mode 100644 index 9aab6c3f..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Which brewing fits you?", - "codename": "which_brewing_fits_you_", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-03-27T13:24:54.042Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "We have put down three procedures with clearly written steps describing the process of making coffee. Read this article to convince yourself that brewing coffee is no science." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-10-27T00:00:00Z" - } - } - } - ], - "modular_content": {}, - "pagination": { - "skip": 0, - "limit": 0, - "count": 1, - "next_page": "" - } - } diff --git a/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts deleted file mode 100644 index 3871cddc..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/items/items-without-total-count.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IQueryParameter } from '@kontent-ai/core-sdk'; - -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './items-without-total-count.spec.json'; - -describe('Items without total count', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - const parameters: IQueryParameter[] = []; - - beforeAll(async () => { - const query = getDeliveryClientWithJson(responseJson).items(); - - parameters.push(...query.getParameters()); - - response = (await query.toPromise()).data; - }); - - it(`Total count parameter should not be set`, () => { - const totalCountParameter = parameters.find((m) => - m.getParam().toLowerCase().startsWith('includeTotalCount'.toLowerCase()) - ); - - expect(totalCountParameter).toBeUndefined(); - }); - - it(`Response should not have total count parameter set`, () => { - expect(response.pagination.totalCount).toEqual(null); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json deleted file mode 100644 index 7e8dcd74..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.json +++ /dev/null @@ -1,423 +0,0 @@ -{ - "languages": [ - { - "system": { - "id": "a151379f-332e-4b1e-842b-7519e0c28d56", - "name": "German", - "codename": "de" - } - }, - { - "system": { - "id": "614d82f5-c16c-465b-a34b-a37a1b416d12", - "name": "German -- 11", - "codename": "de-DE---11" - } - }, - { - "system": { - "id": "de7bffee-659e-495f-b462-073974c88147", - "name": "German -- 131", - "codename": "de-DE---131" - } - }, - { - "system": { - "id": "b67aa235-4711-4f59-be02-6c2439fa3231", - "name": "German -- 161", - "codename": "de-DE---161" - } - }, - { - "system": { - "id": "560ef6e2-fa13-4cde-a2f2-7219e4f0be38", - "name": "German -- 31", - "codename": "de-DE---31" - } - }, - { - "system": { - "id": "7878060f-af11-4140-9cd8-64bf98bb4c32", - "name": "German -- 41", - "codename": "de-DE---41" - } - }, - { - "system": { - "id": "29d27691-256a-4707-aac2-58a4bcc2a146", - "name": "German -- 51", - "codename": "de-DE---51" - } - }, - { - "system": { - "id": "cff69077-dd72-436a-bd44-ec2161ebbf02", - "name": "German -- 61", - "codename": "de-DE---61" - } - }, - { - "system": { - "id": "e8089efe-fd5a-4675-a226-83e878a4ccd1", - "name": "German -- 71", - "codename": "de-DE---71" - } - }, - { - "system": { - "id": "869eabb8-3d9d-4581-8823-e499e400dbcf", - "name": "German -- 91", - "codename": "de-DE---91" - } - }, - { - "system": { - "id": "e7d462c9-3d02-49d2-8255-0d453b25351f", - "name": "German -- 121", - "codename": "de-DE---_121" - } - }, - { - "system": { - "id": "9a43bb60-7545-48ef-a3e4-3ba815de166c", - "name": "German -- 191", - "codename": "de-DE---_191" - } - }, - { - "system": { - "id": "0ff7adc4-c297-4d2b-97ec-d25e3c7e8e66", - "name": "German -- 21", - "codename": "de-DE---_21" - } - }, - { - "system": { - "id": "7106d69c-5b02-48b7-a88e-112a4ddd9100", - "name": "German -- 261", - "codename": "de-DE---_261" - } - }, - { - "system": { - "id": "85e9d0b7-09e6-497c-91e7-a949676c8cc1", - "name": "German -- 281", - "codename": "de-DE---_281" - } - }, - { - "system": { - "id": "13193a77-9684-4665-bfe7-751cf6e828d9", - "name": "German - 71", - "codename": "de-DE--71" - } - }, - { - "system": { - "id": "e4a3c739-69a3-4f3a-be2e-042464423ca5", - "name": "German - 81", - "codename": "de-DE--81" - } - }, - { - "system": { - "id": "9339dafc-6a64-45ca-bffd-d6ed1e9fa5da", - "name": "German - 0", - "codename": "de-DE-0" - } - }, - { - "system": { - "id": "83d2cf55-87a8-4f16-b645-27ed2d110918", - "name": "German - 101", - "codename": "de-DE-101" - } - }, - { - "system": { - "id": "09d573c6-976f-4ee3-88d6-5e8e2a921e80", - "name": "German - 11", - "codename": "de-DE-11" - } - }, - { - "system": { - "id": "7dcaa4e5-ec87-48b6-8e79-94863fe2e6dd", - "name": "German - 121", - "codename": "de-DE-121" - } - }, - { - "system": { - "id": "25a95f57-6d28-49b5-8ee3-ad45d05a7191", - "name": "German - 171", - "codename": "de-DE-171" - } - }, - { - "system": { - "id": "b52570c5-0d92-4526-a9d8-efa5107d1bf0", - "name": "German - 191", - "codename": "de-DE-191" - } - }, - { - "system": { - "id": "20f0fba0-9ee3-42a2-9502-0891dde37881", - "name": "German - 21", - "codename": "de-DE-21" - } - }, - { - "system": { - "id": "73bf2fc6-47f4-49b1-bbe0-bdd482a20d53", - "name": "German - 271", - "codename": "de-DE-271" - } - }, - { - "system": { - "id": "a2027e3a-eb07-420b-aebb-9536b80e0bdc", - "name": "German - 311", - "codename": "de-DE-311" - } - }, - { - "system": { - "id": "eeda27e1-0191-4c85-b205-4f6dba123d6b", - "name": "German - 321", - "codename": "de-DE-321" - } - }, - { - "system": { - "id": "1d28d836-24b8-4bad-8366-b5337449faa6", - "name": "German - 381", - "codename": "de-DE-381" - } - }, - { - "system": { - "id": "a5fd9f3c-b500-4531-abeb-c3a26dd49be7", - "name": "German - 441", - "codename": "de-DE-441" - } - }, - { - "system": { - "id": "699e94e5-05d7-47d0-8afb-b46769eb4c9a", - "name": "German - 491", - "codename": "de-DE-491" - } - }, - { - "system": { - "id": "f377ceee-efa0-4e6b-a384-8d94ee74da4a", - "name": "German - 51", - "codename": "de-DE-51" - } - }, - { - "system": { - "id": "85332170-baca-4925-a0e5-8ab1104ff829", - "name": "German - 61", - "codename": "de-DE-61" - } - }, - { - "system": { - "id": "0f6f50d4-e3f5-48e8-9407-a86a1eb5b3a1", - "name": "German - 91", - "codename": "de-DE-91" - } - }, - { - "system": { - "id": "79228548-6576-5a60-acad-53360bf23687", - "name": "German - ext", - "codename": "de-DE-ext" - } - }, - { - "system": { - "id": "9c295dde-9f56-489a-9869-f8bab454ebfd", - "name": "German_131", - "codename": "de-DE_131" - } - }, - { - "system": { - "id": "646bbcbe-bb5a-4aca-a513-9826d205a3df", - "name": "German_211", - "codename": "de-DE_211" - } - }, - { - "system": { - "id": "13f6c434-1652-4850-b874-207207f0cffa", - "name": "German_221", - "codename": "de-DE_221" - } - }, - { - "system": { - "id": "b87ebacc-1686-473a-ad56-ccb0b73ad0e4", - "name": "German_261", - "codename": "de-DE_261" - } - }, - { - "system": { - "id": "3d15c7d7-2b6d-41a5-ab52-d42138ec23af", - "name": "German_31", - "codename": "de-DE_31" - } - }, - { - "system": { - "id": "b800a209-1d0a-409c-8e3c-8fc8430257ad", - "name": "German_331", - "codename": "de-DE_331" - } - }, - { - "system": { - "id": "23eec871-d70a-4d68-9e55-dec481b92fe5", - "name": "German_351", - "codename": "de-DE_351" - } - }, - { - "system": { - "id": "251246ad-ca05-4e51-85e5-7c4a8a461e37", - "name": "German_401", - "codename": "de-DE_401" - } - }, - { - "system": { - "id": "4a3ea19a-26a8-4536-840e-1963a46c5179", - "name": "German_451", - "codename": "de-DE_451" - } - }, - { - "system": { - "id": "eed653b1-ecf4-41dc-b556-f9593f152dcf", - "name": "German_471", - "codename": "de-DE_471" - } - }, - { - "system": { - "id": "ae46bbfa-adb1-43af-9687-d2f80d250a81", - "name": "German_491", - "codename": "de-DE_491" - } - }, - { - "system": { - "id": "385077d2-ecc7-4483-b43f-d81626774cbe", - "name": "German_541", - "codename": "de-DE_541" - } - }, - { - "system": { - "id": "4f34b0c3-f2cf-4e9f-8fba-7db8083a3be3", - "name": "German_591", - "codename": "de-DE_591" - } - }, - { - "system": { - "id": "28ffafad-8b6c-4d41-a84b-2ed650f8aec2", - "name": "German_651", - "codename": "de-DE_651" - } - }, - { - "system": { - "id": "47671fa3-79ea-4810-96c7-513f5d05d58e", - "name": "German_681", - "codename": "de-DE_681" - } - }, - { - "system": { - "id": "1c35c688-8002-4201-b61c-70bc919e2c9c", - "name": "German_741", - "codename": "de-DE_741" - } - }, - { - "system": { - "id": "bef4ed3b-b82e-443d-b69d-6c6504302422", - "name": "German_781", - "codename": "de-DE_781" - } - }, - { - "system": { - "id": "5dfd9c2b-a0b4-4e21-9b52-6ec32840723e", - "name": "German_81", - "codename": "de-DE_81" - } - }, - { - "system": { - "id": "51c9e330-68b1-4a8c-9eb7-0811fde43de0", - "name": "German_811", - "codename": "de-DE_811" - } - }, - { - "system": { - "id": "7f9fda00-117e-48b9-8b64-ed6235162510", - "name": "German_861", - "codename": "de-DE_861" - } - }, - { - "system": { - "id": "f00d0eb3-d637-4cf3-8d4b-0974576f81d5", - "name": "German_951", - "codename": "de-DE_951" - } - }, - { - "system": { - "id": "00699ff5-8984-4d14-b8e8-ed74347bd97b", - "name": "German_961", - "codename": "de-DE_961" - } - }, - { - "system": { - "id": "00000000-0000-0000-0000-000000000000", - "name": "Default environment language", - "codename": "default" - } - }, - { - "system": { - "id": "8fab3c4c-2ba4-47a9-8e53-df8e6154054f", - "name": "looooooooooooooooooooong2", - "codename": "looooooooooooooooooooong2" - } - }, - { - "system": { - "id": "24d5aaa6-a0db-4e20-8c11-6eb272bbe168", - "name": "loooooooooooooooooooooong", - "codename": "loooooooooooooooooooooong" - } - } - ], - "pagination": { - "skip": 100, - "limit": 0, - "count": 59, - "next_page": "" - } -} \ No newline at end of file diff --git a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts deleted file mode 100644 index bdfeff72..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { Responses } from "../../../../../lib/index.js"; -import { Context, getDeliveryClientWithJson, setup } from "../../../setup/index.js"; -import * as responseJson from "./list-languages.spec.json"; - -describe("List languages", () => { - const context = new Context(); - setup(context); - - let response: Responses.IListLanguagesResponse; - - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).languages().toPromise()).data; - }); - - it(`Response should have all properties assigned`, () => { - expect(response.items.length).toEqual(responseJson.languages.length); - - for (const item of response.items) { - const originalItem = responseJson.languages.find((m) => m.system.id === item.system.id); - - if (!originalItem) { - throw Error(`Invalid language '${item.system.id}'`); - } - - expect(item.system.id).toEqual(originalItem.system.id); - expect(item.system.name).toEqual(originalItem.system.name); - expect(item.system.codename).toEqual(originalItem.system.codename); - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json b/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json deleted file mode 100644 index 8bb0cf75..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "items": [ - { - "change_type": "deleted_item", - "timestamp": "2022-10-20T13:03:06.1310204Z", - "data": { - "system": { - "id": "a35d17ac-b6ba-4c6a-ae31-23c1193215cb", - "collection": "default", - "name": "My article", - "codename": "my_article", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "last_modified": "2019-03-27T13:21:11.38Z", - "workflow_step": "published" - } - } - }, - { - "change_type": "changed_item", - "timestamp": "2022-10-20T13:03:06.1310204Z", - "data": { - "system": { - "id": "335d17ac-b6ba-4c6a-ae31-23c1193215cb", - "collection": "default", - "name": "My article", - "codename": "my_article", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "last_modified": "2019-03-27T13:21:11.38Z", - "workflow_step": "published" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - } - } - } - } - ] -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts deleted file mode 100644 index 3b263199..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/sync/initialize-sync.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './initialize-sync.spec.json'; - -describe('Initialize sync', () => { - const context = new Context(); - setup(context); - - let response: Responses.IInitializeSyncResponse; - - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).initializeSync().toPromise()).data; - }); - - it(`Response should have all properties assigned`, () => { - expect(response.items.length).toEqual(responseJson.items.length); - - for (const item of response.items) { - const originalItem = responseJson.items.find((m) => m.data.system.id === item.data.system.id); - - if (!originalItem) { - throw Error(`Invalid item '${item.data.system.id}'`); - } - - expect(item.timestamp).toEqual(originalItem.timestamp); - expect(item.changeType).toEqual(originalItem.change_type); - - expect(item.data.system.codename).toEqual(originalItem.data.system.codename); - expect(item.data.system.type).toEqual(originalItem.data.system.type); - expect(item.data.system.collection).toEqual(originalItem.data.system.collection); - expect(item.data.system.language).toEqual(originalItem.data.system.language); - expect(item.data.system.name).toEqual(originalItem.data.system.name); - expect(item.data.system.workflowStep).toEqual(originalItem.data.system.workflow_step); - expect(item.data.system.lastModified).toEqual(originalItem.data.system.last_modified); - - if (originalItem.data.elements) { - expect(item.data.elements).toEqual(originalItem.data.elements); - } else { - expect(item.data.elements).toEqual({}); - } - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json b/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json deleted file mode 100644 index 9ca393d8..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "items": [ - { - "change_type": "deleted_item", - "timestamp": "2022-10-20T13:03:06.1310204Z", - "data": { - "system": { - "id": "135d17ac-b6ba-4c6a-ae31-23c1193215cb", - "collection": "default", - "name": "My article", - "codename": "my_article", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "last_modified": "2019-03-27T13:21:11.38Z", - "workflow_step": "published" - } - } - }, - { - "change_type": "changed_item", - "timestamp": "2022-10-20T13:03:06.1310204Z", - "data": { - "system": { - "id": "335d17ac-b6ba-4c6a-ae31-23c1193215cb", - "collection": "default", - "name": "My article", - "codename": "my_article", - "language": "en-US", - "type": "article", - "sitemap_locations": [], - "last_modified": "2019-03-27T13:21:11.38Z", - "workflow_step": "published" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - } - } - } - } - ] -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts deleted file mode 100644 index af2ab114..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/sync/sync-changes.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJson } from '../../../setup'; -import * as responseJson from './sync-changes.spec.json'; - -describe('Sync changes', () => { - const context = new Context(); - setup(context); - - let response: Responses.ISyncChangesResponse; - - beforeAll(async () => { - response = (await getDeliveryClientWithJson(responseJson).syncChanges().toPromise()).data; - }); - - it(`Response should have all properties assigned`, () => { - expect(response.items.length).toEqual(responseJson.items.length); - - for (const item of response.items) { - const originalItem = responseJson.items.find((m) => m.data.system.id === item.data.system.id); - - if (!originalItem) { - throw Error(`Invalid item '${item.data.system.id}'`); - } - - expect(item.timestamp).toEqual(originalItem.timestamp); - expect(item.changeType).toEqual(originalItem.change_type); - - expect(item.data.system.codename).toEqual(originalItem.data.system.codename); - expect(item.data.system.type).toEqual(originalItem.data.system.type); - expect(item.data.system.collection).toEqual(originalItem.data.system.collection); - expect(item.data.system.language).toEqual(originalItem.data.system.language); - expect(item.data.system.name).toEqual(originalItem.data.system.name); - expect(item.data.system.workflowStep).toEqual(originalItem.data.system.workflow_step); - expect(item.data.system.lastModified).toEqual(originalItem.data.system.last_modified); - - if (originalItem.data.elements) { - expect(item.data.elements).toEqual(originalItem.data.elements); - } else { - expect(item.data.elements).toEqual({}); - } - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json deleted file mode 100644 index 10e3c799..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "e27603e9-49e7-4d73-ba9f-843017d460db", - "name": "Product", - "codename": "product", - "language": "default", - "type": "product_example_content_type", - "collection": "default", - "workflow": "default", - "workflow_step": "published", - "last_modified": "2019-09-16T09:30:06.1123998Z" - } - } - ] -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts deleted file mode 100644 index 1ed93048..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in-all.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { IGroupedNetworkResponse, Responses } from '../../../../../lib'; -import { Context, setup } from '../../../setup'; -import { getDeliveryClientWithJsonAndHeaders } from '../../../setup'; -import * as responseJson from './used-in-all.spec.json'; - -describe('Used in', () => { - const context = new Context(); - setup(context); - - let response: IGroupedNetworkResponse>; - - beforeAll(async () => { - response = await getDeliveryClientWithJsonAndHeaders( - responseJson, - { - environmentId: 'x' - }, - [] - ) - .itemUsedIn('x') - .queryConfig({ - disableItemLinking: false - }) - .toAllPromise(); - }); - - it(`Validate responses counts`, () => { - expect(response.responses.length).toEqual(1); - }); - - it(`Validate items count`, () => { - expect(response.data.items.length).toEqual(responseJson.items.length); - }); - - it(`Validates mapped item`, () => { - const item = response.data.items[0]; - const sourceItem = responseJson.items[0]; - - expect(item.system.id).toEqual(sourceItem.system.id); - expect(item.system.name).toEqual(sourceItem.system.name); - expect(item.system.codename).toEqual(sourceItem.system.codename); - expect(item.system.language).toEqual(sourceItem.system.language); - expect(item.system.type).toEqual(sourceItem.system.type); - expect(item.system.collection).toEqual(sourceItem.system.collection); - expect(item.system.lastModified).toEqual(sourceItem.system.last_modified); - expect(item.system.workflow).toEqual(sourceItem.system.workflow); - expect(item.system.workflowStep).toEqual(sourceItem.system.workflow_step); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json deleted file mode 100644 index 10e3c799..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "e27603e9-49e7-4d73-ba9f-843017d460db", - "name": "Product", - "codename": "product", - "language": "default", - "type": "product_example_content_type", - "collection": "default", - "workflow": "default", - "workflow_step": "published", - "last_modified": "2019-09-16T09:30:06.1123998Z" - } - } - ] -} diff --git a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts b/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts deleted file mode 100644 index ab7ddb4f..00000000 --- a/_legacy/test/browser/isolated-tests/endpoints/used-in/used-in.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { IDeliveryNetworkResponse, Responses } from '../../../../../lib'; -import { Context, getTestDeliveryClient, setup } from '../../../setup'; -import { getDeliveryClientWithJsonAndHeaders } from '../../../setup'; -import * as responseJson from './used-in.spec.json'; - -describe('Used in', () => { - const context = new Context(); - setup(context); - - const query = getDeliveryClientWithJsonAndHeaders( - responseJson, - { - environmentId: 'x' - }, - [ - { - value: 'TokenX', - header: 'X-Continuation' - } - ] - ).itemUsedIn('product'); - - let response: IDeliveryNetworkResponse, any>; - - beforeAll(async () => { - response = await query.toPromise(); - }); - - it(`Validates asset used in url`, () => { - expect(getTestDeliveryClient().assetUsedIn('x').getUrl()).toEqual( - 'https://deliver.kontent.ai/delivery-environment-id/assets/x/used-in' - ); - }); - - it(`Validates content item used in url`, () => { - expect(getTestDeliveryClient().itemUsedIn('x').getUrl()).toEqual( - 'https://deliver.kontent.ai/delivery-environment-id/items/x/used-in' - ); - }); - - it(`Continuation token should be set`, () => { - expect(response.xContinuationToken).toEqual('TokenX'); - }); - - it(`Validates mapped item`, () => { - const item = response.data.items[0]; - const sourceItem = responseJson.items[0]; - - expect(item.system.id).toEqual(sourceItem.system.id); - expect(item.system.name).toEqual(sourceItem.system.name); - expect(item.system.codename).toEqual(sourceItem.system.codename); - expect(item.system.language).toEqual(sourceItem.system.language); - expect(item.system.type).toEqual(sourceItem.system.type); - expect(item.system.collection).toEqual(sourceItem.system.collection); - expect(item.system.lastModified).toEqual(sourceItem.system.last_modified); - expect(item.system.workflow).toEqual(sourceItem.system.workflow); - expect(item.system.workflowStep).toEqual(sourceItem.system.workflow_step); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json b/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json deleted file mode 100644 index eacf378d..00000000 --- a/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-response.json +++ /dev/null @@ -1,255 +0,0 @@ -{ - "item": { - "system": { - "id": "325e2acb-1c14-47f6-af9a-27bc8b6c16fe", - "name": "Warrior", - "codename": "warrior", - "language": "en", - "type": "movie", - "sitemap_locations": ["main_sitemap"], - "collection": "christmas-campaign", - "last_modified": "2019-09-05T10:51:15.6555984Z", - "workflow_step": "published", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - }, - "plot": { - "type": "rich_text", - "name": "Plot", - "images": { - "22504ba8-2075-48fa-9d4f-8fce3de1754a": { - "image_id": "22504ba8-2075-48fa-9d4f-8fce3de1754a", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - }, - "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5": { - "image_id": "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - }, - "links": { - "3294e4b0-e58b-49d7-85fa-5bc9a86556ec": { - "codename": "joel_edgerton", - "type": "actor", - "url_slug": "joel-edgerton" - }, - "d1557cb1-d7ec-4d04-9742-f86b52bc34fc": { - "codename": "tom_hardy", - "type": "actor", - "url_slug": "tom-hardy" - } - }, - "modular_content": ["tom_hardy", "joel_edgerton", "ec9813f6_194d_018f_e20c_36855fb6e600"], - "value": "

The youngest son of an alcoholic former boxer returns home, where he's trained by his father for competition in a mixed martial arts tournament - a path that puts the fighter on a collision course with his estranged, older brother.

\n

Stars: 

\n\n\n


\n

See more in profile of Joel Edgerton and Tom Hardy

\n

And here are some images: 

\n
\"\"
\n
\"\"
\n


\n

Also, why not include content component in the mix?

\n" - }, - "released": { - "type": "date_time", - "name": "Released", - "value": "2011-09-09T00:00:00Z", - "display_timezone": "Europe/London" - }, - "length": { - "type": "number", - "name": "Length", - "value": 151 - }, - "poster": { - "type": "asset", - "name": "Poster", - "value": [ - { - "name": "warrior.jpg", - "description": null, - "type": "image/jpeg", - "size": 111004, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000, - "renditions": { - "default": { - "rendition_id": "b447ca6c-8020-4e8f-be57-1d110721e535", - "preset_id": "a6d98cd5-8b2c-4e50-99c9-15192bce2490", - "width": 1280, - "height": 1024, - "query": "w=1280&h=1024&fit=clip&rect=2396,169,1280,1024" - } - } - } - ] - }, - "category": { - "type": "multiple_choice", - "name": "Category", - "value": [ - { - "name": "Action", - "codename": "action" - }, - { - "name": "Drama", - "codename": "drama" - } - ] - }, - "stars": { - "type": "modular_content", - "name": "Stars", - "value": ["tom_hardy", "joel_edgerton"] - }, - "seoname": { - "type": "url_slug", - "name": "SeoName", - "value": "warrior" - }, - "releasecategory": { - "type": "taxonomy", - "name": "releasecategory", - "taxonomy_group": "releasecategory", - "value": [ - { - "name": "Global release", - "codename": "global_release" - }, - { - "name": "US only", - "codename": "us_only" - } - ] - } - } - }, - "modular_content": { - "ec9813f6_194d_018f_e20c_36855fb6e600": { - "system": { - "id": "ec9813f6-194d-018f-e20c-36855fb6e600", - "name": "ec9813f6-194d-018f-e20c-36855fb6e600", - "codename": "ec9813f6_194d_018f_e20c_36855fb6e600", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "first_name": { - "type": "text", - "name": "First name", - "value": "Jennifer " - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Morrison" - }, - "url": { - "type": "url_slug", - "name": "Url", - "value": "component-actor-url" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [] - } - } - }, - "joel_edgerton": { - "system": { - "id": "3294e4b0-e58b-49d7-85fa-5bc9a86556ec", - "name": "Joel Edgerton", - "codename": "joel_edgerton", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2017-08-03T09:21:21.3857294Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "joel-edgerton" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Joel" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Edgerton" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "joel_edgerton.jpg", - "description": null, - "type": "image/jpeg", - "size": 6460, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/2855720a-4ca4-4687-826a-29f9635088e0/joel_edgerton.jpg", - "width": 211, - "height": 317 - } - ] - } - } - }, - "tom_hardy": { - "system": { - "id": "d1557cb1-d7ec-4d04-9742-f86b52bc34fc", - "name": "Tom Hardy", - "codename": "tom_hardy", - "language": "en", - "type": "actor", - "sitemap_locations": [], - "collection": "default", - "last_modified": "2018-02-09T13:11:32.5769383Z" - }, - "elements": { - "url": { - "type": "url_slug", - "name": "Url", - "value": "tom-hardy" - }, - "first_name": { - "type": "text", - "name": "First name", - "value": "Tom" - }, - "last_name": { - "type": "text", - "name": "Last name", - "value": "Hardy" - }, - "photo": { - "type": "asset", - "name": "Photo", - "value": [ - { - "name": "tom_hardy.jpg", - "description": null, - "type": "image/jpeg", - "size": 8091, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - ] - } - } - } - } -} diff --git a/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json b/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json deleted file mode 100644 index 68ae3c93..00000000 --- a/_legacy/test/browser/isolated-tests/fake-data/fake-warrior-without-modular-data-response.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "item": { - "system": { - "id": "325e2acb-1c14-47f6-af9a-27bc8b6c16fe", - "name": "Warrior", - "codename": "warrior", - "language": "en", - "type": "movie", - "sitemap_locations": ["main_sitemap"], - "collection": "default", - "last_modified": "2019-09-05T10:51:15.6555984Z" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Warrior" - }, - "plot": { - "type": "rich_text", - "name": "Plot", - "images": { - "22504ba8-2075-48fa-9d4f-8fce3de1754a": { - "image_id": "22504ba8-2075-48fa-9d4f-8fce3de1754a", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - }, - "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5": { - "image_id": "bb0899cf-2c3a-4e3f-8962-60e5a54fcca5", - "description": null, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/bb0899cf-2c3a-4e3f-8962-60e5a54fcca5/tom_hardy.jpg", - "width": 214, - "height": 317 - } - }, - "links": { - "3294e4b0-e58b-49d7-85fa-5bc9a86556ec": { - "codename": "joel_edgerton", - "type": "actor", - "url_slug": "joel-edgerton" - }, - "d1557cb1-d7ec-4d04-9742-f86b52bc34fc": { - "codename": "tom_hardy", - "type": "actor", - "url_slug": "tom-hardy" - } - }, - "modular_content": ["tom_hardy", "joel_edgerton", "ec9813f6_194d_018f_e20c_36855fb6e600"], - "value": "

The youngest son of an alcoholic former boxer returns home, where he's trained by his father for competition in a mixed martial arts tournament - a path that puts the fighter on a collision course with his estranged, older brother.

\n

Stars: 

\n\n\n


\n

See more in profile of Joel Edgerton and Tom Hardy

\n

And here are some images: 

\n
\"\"
\n
\"\"
\n


\n

Also, why not include content component in the mix?

\n" - }, - "released": { - "type": "date_time", - "name": "Released", - "value": "2011-09-09T00:00:00Z" - }, - "length": { - "type": "number", - "name": "Length", - "value": 151 - }, - "poster": { - "type": "asset", - "name": "Poster", - "value": [ - { - "name": "warrior.jpg", - "description": null, - "type": "image/jpeg", - "size": 111004, - "url": "https://assets-us-01.kc-usercontent.com:443/da5abe9f-fdad-4168-97cd-b3464be2ccb9/22504ba8-2075-48fa-9d4f-8fce3de1754a/warrior.jpg", - "width": 648, - "height": 1000 - } - ] - }, - "category": { - "type": "multiple_choice", - "name": "Category", - "value": [ - { - "name": "Action", - "codename": "action" - }, - { - "name": "Drama", - "codename": "drama" - } - ] - }, - "stars": { - "type": "modular_content", - "name": "Stars", - "value": ["tom_hardy", "joel_edgerton"] - }, - "seoname": { - "type": "url_slug", - "name": "SeoName", - "value": "warrior" - }, - "releasecategory": { - "type": "taxonomy", - "name": "releasecategory", - "taxonomy_group": "releasecategory", - "value": [ - { - "name": "Global release", - "codename": "global_release" - }, - { - "name": "US only", - "codename": "us_only" - } - ] - } - } - }, - "modular_content": {} -} diff --git a/_legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts b/_legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts deleted file mode 100644 index f35ad196..00000000 --- a/_legacy/test/browser/isolated-tests/http/custom-http-service.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - IResponse, - IHttpDeleteQueryCall, - IHttpGetQueryCall, - IHttpPatchQueryCall, - IHttpPostQueryCall, - IHttpPutQueryCall, - IHttpQueryOptions, - IHttpService, - IHttpCancelRequestToken -} from '@kontent-ai/core-sdk'; - -import { DeliveryClient } from '../../../../lib'; - -class CustomHttpService implements IHttpService { - getAsync(call: IHttpGetQueryCall, options?: IHttpQueryOptions): Promise> { - return this.resolveTestCall(); - } - - postAsync( - call: IHttpPostQueryCall, - options?: IHttpQueryOptions - ): Promise> { - return this.resolveTestCall(); - } - - putAsync(call: IHttpPutQueryCall, options?: IHttpQueryOptions): Promise> { - return this.resolveTestCall(); - } - - patchAsync( - call: IHttpPatchQueryCall, - options?: IHttpQueryOptions - ): Promise> { - return this.resolveTestCall(); - } - - deleteAsync( - call: IHttpDeleteQueryCall, - options?: IHttpQueryOptions - ): Promise> { - return this.resolveTestCall(); - } - - createCancelToken(): IHttpCancelRequestToken { - return { - cancel: () => {}, - token: undefined - }; - } - - private resolveTestCall(): Promise> { - const promise = new Promise>((resolve, reject) => { - resolve({ - data: {}, - headers: [], - rawResponse: {}, - retryStrategy: { - options: {}, - retryAttempts: 3 - }, - status: 200 - }); - }); - return promise; - } -} - -describe('Custom Http service', () => { - const client = new DeliveryClient({ - environmentId: 'xxx', - httpService: new CustomHttpService() - }); - - it(`Should use custom http service`, () => { - // this is fragile, but we don't want to expose these properties for now - const httpService = client['queryService']['httpService']; - expect(httpService).toEqual(jasmine.any(CustomHttpService)); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts b/_legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts deleted file mode 100644 index 5e3a33c6..00000000 --- a/_legacy/test/browser/isolated-tests/images/image-url-builder.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { transformImageUrl } from '../../../../lib'; - -describe('Image URL builder', () => { - const getImageBuilder = () => transformImageUrl('myimage.jpg'); - - it(`Checks complex query`, () => { - const ib = getImageBuilder(); - ib.withDpr(2).withCompression('lossless').withQuality(4).withHeight(200).withWidth(100); - - expect(ib.getUrl()).toContain('myimage.jpg'); - expect(ib.getUrl()).toContain('q=4'); - expect(ib.getUrl()).toContain('w=100'); - expect(ib.getUrl()).toContain('h=200'); - expect(ib.getUrl()).toContain('lossless=true'); - expect(ib.getUrl()).toContain('dpr=2'); - }); - - it(`Checks automatic format`, () => { - const ib = getImageBuilder(); - ib.withAutomaticFormat(); - expect(ib.getUrl()).toContain('auto=format'); - }); - - it(`Checks automatic format with backup`, () => { - const ib = getImageBuilder(); - ib.withAutomaticFormat('jpg'); - expect(ib.getUrl()).toContain('fm=jpg'); - expect(ib.getUrl()).toContain('auto=format'); - }); - - it(`Checks dpr`, () => { - const ib = getImageBuilder(); - ib.withDpr(9); - expect(ib.getUrl()).toContain('dpr=9'); - }); - - it(`Checks width`, () => { - const ib = getImageBuilder(); - ib.withWidth(250); - expect(ib.getUrl()).toContain('w=250'); - - ib.withWidth(0.5); - expect(ib.getUrl()).toContain('w=0.5'); - - ib.withWidth(97.012345678915); - expect(ib.getUrl()).toContain('w=97.012345678915'); - }); - - it(`Checks height`, () => { - const ib = getImageBuilder(); - ib.withHeight(100); - expect(ib.getUrl()).toContain('h=100'); - }); - - it(`Checks quality`, () => { - const ib = getImageBuilder(); - ib.withQuality(2); - expect(ib.getUrl()).toContain('q=2'); - }); - - it(`Checks format`, () => { - const ib = getImageBuilder(); - ib.withFormat('png'); - expect(ib.getUrl()).toContain('fm=png'); - - ib.withFormat('png8'); - expect(ib.getUrl()).toContain('fm=png8'); - }); - - it(`Checks compression`, () => { - const ib = getImageBuilder(); - ib.withCompression('lossless'); - expect(ib.getUrl()).toContain('lossless=true'); - - ib.withCompression('lossy'); - expect(ib.getUrl()).toContain('lossless=false'); - }); - - it(`Checks rectangle crop`, () => { - const ib = getImageBuilder(); - ib.withRectangleCrop(1, 2, 50, 90); - expect(ib.getUrl()).toContain('rect=1,2,50,90'); - }); - - it(`Checks focal point crop`, () => { - const ib = getImageBuilder(); - ib.withFocalPointCrop(2, 50, 3); - expect(ib.getUrl()).toContain('crop=focalpoint'); - expect(ib.getUrl()).toContain('fp-x=2'); - expect(ib.getUrl()).toContain('fp-y=50'); - expect(ib.getUrl()).toContain('fp-z=3'); - }); - - it(`Checks fit mode`, () => { - const ib = getImageBuilder(); - ib.withFitMode('crop'); - expect(ib.getUrl()).toContain('fit=crop'); - - ib.withFitMode('clip'); - expect(ib.getUrl()).toContain('fit=clip'); - - ib.withFitMode('scale'); - expect(ib.getUrl()).toContain('fit=scale'); - }); - - it(`Checks custom param`, () => { - const ib = getImageBuilder(); - ib.withCustomParam('x=y'); - expect(ib.getUrl()).toContain('x=y'); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/query/custom-headers.spec.ts b/_legacy/test/browser/isolated-tests/query/custom-headers.spec.ts deleted file mode 100644 index bbb9f6c1..00000000 --- a/_legacy/test/browser/isolated-tests/query/custom-headers.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Custom query headers', () => { - const context = new Context(); - setup(context); - - it(`Item query initialization with invalid codename should throw Error`, () => { - expect(() => context.deliveryClient.item(null as any)).toThrowError(); - }); - - it(`Header should be present in result`, () => { - const headers = context.deliveryClient - .items() - .queryConfig({ - customHeaders: [ - { - header: 'xHeader', - value: 'yValue' - } - ] - }) - .getHeaders(); - - const itemHeader = headers.find( - m => m.header === 'xHeader' && m.value === 'yValue' - ); - - expect(itemHeader).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/query/query-config.spec.ts b/_legacy/test/browser/isolated-tests/query/query-config.spec.ts deleted file mode 100644 index 77e77e2a..00000000 --- a/_legacy/test/browser/isolated-tests/query/query-config.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { IQueryConfig, IItemQueryConfig } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Query configurations', () => { - - const context = new Context(); - setup(context); - - it(`QueryConfig should set values properly`, () => { - let queryConfig: IQueryConfig = { usePreviewMode: true, waitForLoadingNewContent: true }; - expect(queryConfig.usePreviewMode).toEqual(true); - expect(queryConfig.waitForLoadingNewContent).toEqual(true); - - queryConfig = ({ usePreviewMode: false, waitForLoadingNewContent: false }); - expect(queryConfig.usePreviewMode).toEqual(false); - expect(queryConfig.waitForLoadingNewContent).toEqual(false); - }); - - it(`ItemQuerConfig should set values properly`, () => { - let queryConfig: IItemQueryConfig = { usePreviewMode: true, waitForLoadingNewContent: true }; - expect(queryConfig.usePreviewMode).toEqual(true); - expect(queryConfig.waitForLoadingNewContent).toEqual(true); - - queryConfig = { usePreviewMode: false, waitForLoadingNewContent: false }; - expect(queryConfig.usePreviewMode).toEqual(false); - expect(queryConfig.waitForLoadingNewContent).toEqual(false); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts b/_legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts deleted file mode 100644 index fb3e3ff4..00000000 --- a/_legacy/test/browser/isolated-tests/query/query-custom-parameter.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Query custom parameter', () => { - - const context = new Context(); - setup(context); - - it(`Url should contain the custom parameter with value #1`, () => { - const url = context.deliveryClient.items().withCustomParameter('customParam', 'customVal').getUrl(); - expect(url).toContain(`customParam=customVal`); - }); - - it(`Url should contain the custom parameter with value #2`, () => { - const url = context.deliveryClient.element('el', 'cd').withCustomParameter('customParam', 'customVal').getUrl(); - expect(url).toContain(`customParam=customVal`); - }); - - it(`Custom param with invalid name should throw Error`, () => { - expect(() => context.deliveryClient.items().withCustomParameter(undefined as any, 'customVal')).toThrowError(); - expect(() => context.deliveryClient.items().withCustomParameter(null as any, 'customVal')).toThrowError(); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/query/query-initialization.spec.ts b/_legacy/test/browser/isolated-tests/query/query-initialization.spec.ts deleted file mode 100644 index 956ebd0f..00000000 --- a/_legacy/test/browser/isolated-tests/query/query-initialization.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Query initialization', () => { - - const context = new Context(); - setup(context); - - it(`Element query initialization with invalid type should throw Error`, () => { - expect(() => context.deliveryClient.element(null as any, 'title')).toThrowError(); - }); - - it(`Element query initialization with invalid type should throw Error`, () => { - expect(() => context.deliveryClient.element('movie', null as any)).toThrowError(); - }); - - it(`Item query initialization with invalid codename should throw Error`, () => { - expect(() => context.deliveryClient.item(null as any)).toThrowError(); - }); - - it(`Type query initialization with invalid codename should throw Error`, () => { - expect(() => context.deliveryClient.type(null as any)).toThrowError(); - }); - - it(`Taxonomy query initialization with invalid codename should throw Error`, () => { - expect(() => context.deliveryClient.taxonomy(null as any)).toThrowError(); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts b/_legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts deleted file mode 100644 index bab2508c..00000000 --- a/_legacy/test/browser/isolated-tests/query/query-url-debug.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Query url debug', () => { - - const context = new Context(); - setup(context); - - it(`Item url`, () => { - const url = context.deliveryClient.item('warrior').getUrl(); - expect(url).toContain('items/warrior'); - }); - - it(`Items url`, () => { - const url = context.deliveryClient.items().getUrl(); - expect(url).toContain('items'); - }); - - it(`Taxonomy url`, () => { - const url = context.deliveryClient.taxonomy('taxonomy_element').getUrl(); - expect(url).toContain('taxonomies/taxonomy_element'); - }); - - it(`Taxonomies url`, () => { - const url = context.deliveryClient.taxonomies().getUrl(); - expect(url).toContain('taxonomies'); - }); - - it(`Type url`, () => { - const url = context.deliveryClient.type('movie').getUrl(); - expect(url).toContain('types/movie'); - }); - - it(`Types url`, () => { - const url = context.deliveryClient.types().getUrl(); - expect(url).toContain('types'); - }); - - it(`Element url`, () => { - const url = context.deliveryClient.element('movie', 'title').getUrl(); - expect(url).toContain('types/movie/elements/title'); - }); - -}); - diff --git a/_legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts b/_legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts deleted file mode 100644 index 95a60ee5..00000000 --- a/_legacy/test/browser/isolated-tests/query/wait-for-loading-new-content.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Wait for loading new content', () => { - - const context = new Context(); - setup(context); - - const waitForLoadingNewContentHeader: string = 'X-KC-Wait-For-Loading-New-Content'; - - it(`'X-KC-Wait-For-Loading-New-Content' header should NOT be set when Query configuration does not set it`, () => { - const itemHeaders = context.deliveryClient.item('any').getHeaders(); - const itemsHeaders = context.deliveryClient.items().getHeaders(); - const taxonomyHeaders = context.deliveryClient.taxonomy('any').getHeaders(); - const taxonomiesHeaders = context.deliveryClient.taxonomies().getHeaders(); - const typeHeaders = context.deliveryClient.type('any').getHeaders(); - const typesHeaders = context.deliveryClient.types().getHeaders(); - - const itemHeader = itemHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const itemsHeader = itemsHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const taxonomyHeader = taxonomyHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const taxonomiesHeader = taxonomiesHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const typeHeader = typeHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const typesHeader = typesHeaders.find(m => m.header === waitForLoadingNewContentHeader); - - expect(itemHeader).toBeUndefined(); - expect(itemsHeader).toBeUndefined(); - expect(taxonomyHeader).toBeUndefined(); - expect(taxonomiesHeader).toBeUndefined(); - expect(typeHeader).toBeUndefined(); - expect(typesHeader).toBeUndefined(); - }); - - it(`'X-KC-Wait-For-Loading-New-Content' header should be be set when Query configuration enables it`, () => { - const itemHeaders = context.deliveryClient.item('any').queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const itemsHeaders = context.deliveryClient.items().queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const taxonomyHeaders = context.deliveryClient.taxonomy('any').queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const taxonomiesHeaders = context.deliveryClient.taxonomies().queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const typeHeaders = context.deliveryClient.type('any').queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - const typesHeaders = context.deliveryClient.types().queryConfig({ waitForLoadingNewContent: true }).getHeaders(); - - const itemHeader = itemHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const itemsHeader = itemsHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const taxonomyHeader = taxonomyHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const taxonomiesHeader = taxonomiesHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const typeHeader = typeHeaders.find(m => m.header === waitForLoadingNewContentHeader); - const typesHeader = typesHeaders.find(m => m.header === waitForLoadingNewContentHeader); - - expect(itemHeader).toBeDefined(); - expect(itemsHeader).toBeDefined(); - expect(taxonomyHeader).toBeDefined(); - expect(taxonomiesHeader).toBeDefined(); - expect(typeHeader).toBeDefined(); - expect(typesHeader).toBeDefined(); - }); -}); - - diff --git a/_legacy/test/browser/isolated-tests/response/item.spec.ts b/_legacy/test/browser/isolated-tests/response/item.spec.ts deleted file mode 100644 index c51cd74e..00000000 --- a/_legacy/test/browser/isolated-tests/response/item.spec.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { Responses } from '../../../../lib'; -import { getDeliveryClientWithJson, Movie } from '../../setup'; -import * as warriorJson from '../fake-data/fake-warrior-response.json'; - -describe('Verifies mapping of delivery content item', () => { - let responseWithLinkedItems: Responses.IViewContentItemResponse; - let responseWithoutLinkedItems: Responses.IViewContentItemResponse; - - beforeAll(async () => { - responseWithLinkedItems = (await getDeliveryClientWithJson(warriorJson).item('x').toPromise()).data; - responseWithoutLinkedItems = ( - await getDeliveryClientWithJson(warriorJson, { - linkedItemsReferenceHandler: 'ignore', - environmentId: 'x' - }) - .item('x') - .toPromise() - ).data; - }); - - it(`checks system codename`, () => { - expect(responseWithLinkedItems.item.system.codename).toEqual(warriorJson.item.system.codename); - }); - - it(`checks system id`, () => { - expect(responseWithLinkedItems.item.system.id).toEqual(warriorJson.item.system.id); - }); - - it(`checks system type`, () => { - expect(responseWithLinkedItems.item.system.type).toEqual(warriorJson.item.system.type); - }); - - it(`checks system collection`, () => { - expect(responseWithLinkedItems.item.system.collection).toEqual(warriorJson.item.system.collection); - }); - - it(`checks last modified`, () => { - expect(responseWithLinkedItems.item.system.lastModified).toEqual(warriorJson.item.system.last_modified); - }); - - it(`checks workflow step`, () => { - expect(responseWithLinkedItems.item.system.workflowStep).toEqual(warriorJson.item.system.workflow_step); - }); - - it(`checks language`, () => { - expect(responseWithLinkedItems.item.system.language).toEqual(warriorJson.item.system.language); - }); - - it(`checks site map locations`, () => { - const locations: string[] = ['main_sitemap']; - expect(responseWithLinkedItems.item.system.sitemapLocations).toEqual(locations); - }); - - it(`checks taxonomy element value`, () => { - expect(responseWithLinkedItems.item.elements.releasecategory.value[0].codename).toEqual( - warriorJson.item.elements.releasecategory.value[0].codename - ); - }); - - it(`checks system workflow`, () => { - expect(responseWithLinkedItems.item.system.workflow).toEqual(warriorJson.item.system.workflow); - }); - - it(`checks system workflow step`, () => { - expect(responseWithLinkedItems.item.system.workflowStep).toEqual(warriorJson.item.system.workflow_step); - }); - - it(`checks strongly typed taxonomy`, () => { - const globalReleaseTaxonomy = responseWithLinkedItems.item.elements.releasecategory.value.find( - (m) => m.codename === 'global_release' - ); - const usReleaseTaxonomy = responseWithLinkedItems.item.elements.releasecategory.value.find( - (m) => m.codename === 'us_only' - ); - - expect(globalReleaseTaxonomy).toBeDefined(); - expect(usReleaseTaxonomy).toBeDefined(); - }); - - it(`checks text element`, () => { - expect(responseWithLinkedItems.item.elements.title.value).toEqual(warriorJson.item.elements.title.value); - }); - - it(`checks rich text element`, () => { - for (const linkedItemCodename of responseWithLinkedItems.item.elements.plot.linkedItemCodenames) { - const linkedItem = responseWithLinkedItems.item.elements.plot.linkedItems.find( - (m) => m.system.codename === linkedItemCodename - ); - - expect(linkedItem).toBeDefined(); - expect(linkedItem?.system.codename).toEqual(linkedItemCodename); - expect(linkedItem?.elements).toBeDefined(); - } - }); - - it(`checks datetime element`, () => { - expect(responseWithLinkedItems.item.elements.released.value).toEqual(warriorJson.item.elements.released.value); - expect(responseWithLinkedItems.item.elements.released.displayTimeZone).toEqual( - warriorJson.item.elements.released.display_timezone - ); - }); - - it(`checks number element`, () => { - expect(responseWithLinkedItems.item.elements.length.value).toEqual(warriorJson.item.elements.length.value); - }); - - it(`checks assets element`, () => { - expect(responseWithLinkedItems.item.elements.poster.value.length).toEqual( - warriorJson.item.elements.poster.value.length - ); - expect(responseWithLinkedItems.item.elements.poster.value[0].url).toEqual( - warriorJson.item.elements.poster.value[0].url - ); - }); - - it(`checks that correct number of linked items are created`, () => { - expect(responseWithLinkedItems.item.elements.stars.linkedItems.length).toEqual( - warriorJson.item.elements.stars.value.length - ); - }); - - it(`checks that text element in first linked item is set`, () => { - expect( - responseWithLinkedItems.item.elements.stars.linkedItems.find( - (m) => - m.elements.first_name.value === warriorJson.modular_content.joel_edgerton.elements.first_name.value - ) - ).toBeDefined(); - }); - - it(`checks that text element in second linked item is set`, () => { - expect( - responseWithLinkedItems.item.elements.stars.linkedItems.find( - (m) => m.elements.first_name.value === warriorJson.modular_content.tom_hardy.elements.first_name.value - ) - ).toBeDefined(); - }); - - describe('Checks disabled linked items mapping', () => { - it(`linked items should not be mapped`, () => { - expect(responseWithoutLinkedItems.item.elements.stars.linkedItems.length).toEqual(0); - }); - - it(`linked items should have empty array`, () => { - expect(responseWithoutLinkedItems.item.elements.plot.linkedItemCodenames.length).toEqual( - warriorJson.item.elements.plot.modular_content.length - ); - expect(responseWithoutLinkedItems.item.elements.plot.linkedItems.length).toEqual(0); - }); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts deleted file mode 100644 index b2d83156..00000000 --- a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-disabled.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Elements, Responses } from '../../../../../lib'; -import { getTestDeliveryClient } from '../../../setup'; -import * as responseJson from './linked-items-mapping.json'; - -describe('Linked items mapping disabled', () => { - const client = getTestDeliveryClient({ - environmentId: 'x', - linkedItemsReferenceHandler: 'ignore' - }); - - const response: Responses.IViewContentItemResponse = client.mappingService.viewContentItemResponse(responseJson); - const modularItemElement = 'related_articles'; - - it(`'coffee_processing_techniques' should have mapped items`, () => { - const linkedItem = response.item; - expect(linkedItem).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeUndefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeUndefined(); - }); - - it(`'on_roasts' should not have parent object in its own linked items `, () => { - const linkedItemCodename = 'on_roasts'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeUndefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeUndefined(); - }); - - it(`'which_brewing_fits_you_' should not have parent object in its own linked items `, () => { - const linkedItemCodename = 'which_brewing_fits_you_'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeUndefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'coffee_processing_techniques' - ) - ).toBeUndefined(); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts deleted file mode 100644 index daaca97b..00000000 --- a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping-enabled.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Elements, Responses } from '../../../../../lib'; -import { getTestDeliveryClient } from '../../../setup'; -import * as responseJson from './linked-items-mapping.json'; - -describe('Linked items mapping enabled', () => { - const client = getTestDeliveryClient({ - environmentId: 'x', - linkedItemsReferenceHandler: 'map' - }); - - const response: Responses.IViewContentItemResponse = client.mappingService.viewContentItemResponse(responseJson); - const modularItemElement = 'related_articles'; - - it(`'coffee_processing_techniques' should have mapped items`, () => { - const linkedItem = response.item; - expect(linkedItem).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeDefined(); - }); - - it(`'on_roasts' should have mapped items `, () => { - const linkedItemCodename = 'on_roasts'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'which_brewing_fits_you_' - ) - ).toBeDefined(); - }); - - it(`'which_brewing_fits_you_' should have mapped items`, () => { - const linkedItemCodename = 'which_brewing_fits_you_'; - const linkedItem = response.linkedItems[linkedItemCodename]; - - expect(linkedItem).toBeDefined(); - - if (!linkedItem) { - throw Error(`Item with codename '${linkedItemCodename}' was not found`); - } - - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'on_roasts' - ) - ).toBeDefined(); - expect( - (linkedItem.elements[modularItemElement] as Elements.LinkedItemsElement).linkedItems.find( - (m) => m.system.codename === 'coffee_processing_techniques' - ) - ).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json b/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json deleted file mode 100644 index a16bb78c..00000000 --- a/_legacy/test/browser/isolated-tests/response/linked-items-mapping/linked-items-mapping.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "item": { - "system": { - "id": "117cdfae-52cf-4885-b271-66aef6825612", - "name": "Coffee processing techniques", - "codename": "coffee_processing_techniques", - "language": "en-US", - "type": "article", - "sitemap_locations": [ - "articles" - ], - "collection": "default", - "last_modified": "2018-07-17T08:12:03.07Z", - "workflow_step": "x", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Coffee processing techniques" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "on_roasts", - "which_brewing_fits_you_" - ] - } - } - }, - "modular_content": { - "on_roasts": { - "system": { - "id": "f4b3fc05-e988-4dae-9ac1-a94aba566474", - "name": "On Roasts", - "codename": "on_roasts", - "language": "en-US", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2017-12-08T08:49:53.603Z", - "workflow_step": "x", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "On Roasts" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "on_roasts", - "which_brewing_fits_you_" - ] - } - } - }, - "which_brewing_fits_you_": { - "system": { - "id": "3120ec15-a4a2-47ec-8ccd-c85ac8ac5ba5", - "name": "Which brewing fits you?", - "codename": "which_brewing_fits_you_", - "language": "en-US", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2018-10-11T08:45:56.917Z", - "workflow_step": "x", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Which brewing fits you?" - }, - "related_articles": { - "type": "modular_content", - "name": "Related articles", - "value": [ - "coffee_processing_techniques", - "on_roasts" - ] - } - } - } - } -} \ No newline at end of file diff --git a/_legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts deleted file mode 100644 index fe1773f0..00000000 --- a/_legacy/test/browser/isolated-tests/services/generic-element-mapper.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { GenericElementMapper } from '../../../../lib/mappers'; - -describe('GenericElementMapper', () => { - - const genericElementMapper = new GenericElementMapper(); - - it(`should throw an Error when invalid response is given`, () => { - expect(() => genericElementMapper.mapElement(null as any)).toThrowError(); - expect(() => genericElementMapper.mapElement(undefined as any)).toThrowError(); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/services/mapping-service.spec.json b/_legacy/test/browser/isolated-tests/services/mapping-service.spec.json deleted file mode 100644 index bceffd34..00000000 --- a/_legacy/test/browser/isolated-tests/services/mapping-service.spec.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "items": [ - { - "system": { - "id": "cf106f4e-30a4-42ef-b313-b8ea3fd3e5c5", - "name": "Coffee Beverages Explained", - "codename": "coffee_beverages_explained", - "language": "default", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2017-04-04T13:40:00.1102334Z", - "workflow_step": "published", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Coffee Beverages Explained" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "Espresso and filtered coffee are the two main categories of coffee, based on the method of preparation. Learn about individual types of coffee that fall under these categories." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-11-18T00:00:00Z" - }, - "teaser_image": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "coffee-beverages-explained-1080px.jpg", - "type": "image/jpeg", - "size": 90895, - "description": null, - "url": "https://assets-us-01.kc-usercontent.com/975bf280-fd91-488c-994c-2f04416e5ee3/e700596b-03b0-4cee-ac5c-9212762c027a/coffee-beverages-explained-1080px.jpg" - } - ] - } - } - }, - { - "system": { - "id": "23f71096-fa89-4f59-a3f9-970e970944ec", - "name": "Donate with us", - "codename": "donate_with_us", - "language": "default", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2017-04-04T13:40:29.970377Z", - "workflow_step": "published", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Donate with us" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "Dancing Goat regularly donates money to Children in Africa, a foundation helping children with food, accommodation, education, and other essentials. Donate with us and create a better world." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-11-12T00:00:00Z" - }, - "teaser_image": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "donate-with-us-1080px.jpg", - "type": "image/jpeg", - "size": 133239, - "description": null, - "url": "https://assets-us-01.kc-usercontent.com/975bf280-fd91-488c-994c-2f04416e5ee3/9b86141d-b667-4c35-82b1-826bc151d72a/donate-with-us-1080px.jpg" - } - ] - } - } - }, - { - "system": { - "id": "b2fea94c-73fd-42ec-a22f-f409878de187", - "name": "Origins of Arabica Bourbon", - "codename": "origins_of_arabica_bourbon", - "language": "default", - "type": "article", - "sitemap_locations": ["articles"], - "collection": "default", - "last_modified": "2017-04-04T13:45:44.1533096Z", - "workflow_step": "published", - "workflow": "default" - }, - "elements": { - "title": { - "type": "text", - "name": "Title", - "value": "Origins of Arabica Bourbon" - }, - "summary": { - "type": "text", - "name": "Summary", - "value": "This one particular type of coffee, the Arabica Bourbon, is now sold only in Japan. It has been brought back to life by enthusiasts after being almost forgotten for nearly sixty years." - }, - "post_date": { - "type": "date_time", - "name": "Post date", - "value": "2014-11-11T00:00:00Z" - }, - "teaser_image": { - "type": "asset", - "name": "Teaser image", - "value": [ - { - "name": "origins-of-arabica-bourbon-1080px.jpg", - "type": "image/jpeg", - "size": 132229, - "description": null, - "url": "https://assets.kenticocloud.com:443/975bf280-fd91-488c-994c-2f04416e5ee3/1cfcb6c9-1fe6-4013-a0bb-b26f8ada2ebf/origins-of-arabica-bourbon-1080px.jpg" - } - ] - } - } - } - ], - "modular_content": {}, - "pagination": { - "skip": 0, - "limit": 3, - "count": 3, - "next_page": "https://deliver.kontent.ai/975bf280-fd91-488c-994c-2f04416e5ee3/items?system.type=article&elements=title%2csummary%2cpost_date%2cteaser_image&order=elements.post_date%5bdesc%5d&depth=0&limit=3&skip=3" - } - } diff --git a/_legacy/test/browser/isolated-tests/services/mapping-service.spec.ts b/_legacy/test/browser/isolated-tests/services/mapping-service.spec.ts deleted file mode 100644 index 876ef53b..00000000 --- a/_legacy/test/browser/isolated-tests/services/mapping-service.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Responses } from '../../../../lib'; -import { getTestDeliveryClient } from '../../setup'; -import * as responseJson from './mapping-service.spec.json'; - -describe('Mapping service', () => { - const client = getTestDeliveryClient({ - environmentId: 'x' - }); - - const listingResponse: Responses.IListContentItemsResponse = - client.mappingService.listContentItemsResponse(responseJson); - - it(`Listing response should be mapped correctly`, () => { - expect(listingResponse.items.length).toEqual(responseJson.items.length); - - for (const item of listingResponse.items) { - const rawItem = responseJson.items.find((m) => m.system.id === item.system.id); - if (!rawItem) { - throw Error(`Raw item with id '${item.system.id}' could not be found`); - } - - expect(item.system.id).toEqual(rawItem.system.id); - expect(item.system.codename).toEqual(rawItem.system.codename); - } - }); -}); diff --git a/_legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts deleted file mode 100644 index 94082ac2..00000000 --- a/_legacy/test/browser/isolated-tests/services/taxonomy-mapper.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TaxonomyMapper } from '../../../../lib/mappers'; - -describe('TaxonomyMapper', () => { - - const taxonomyMapper = new TaxonomyMapper(); - - it(`should throw an Error when invalid response is given`, () => { - expect(() => taxonomyMapper.mapTaxonomy(null as any, [])).toThrowError(); - expect(() => taxonomyMapper.mapTaxonomy(undefined as any, [])).toThrowError(); - - expect(() => taxonomyMapper.mapTaxonomy({} as any, null as any)).toThrowError(); - expect(() => taxonomyMapper.mapTaxonomy({} as any, undefined as any)).toThrowError(); - - expect(() => taxonomyMapper.mapTaxonomy({} as any, 'test' as any)).toThrowError(); - - expect(() => taxonomyMapper.mapTaxonomies(null as any)).toThrowError(); - expect(() => taxonomyMapper.mapTaxonomies(undefined as any)).toThrowError(); - - expect(() => taxonomyMapper.mapTaxonomies('test' as any)).toThrowError(); - - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/services/type-mapper.spec.ts b/_legacy/test/browser/isolated-tests/services/type-mapper.spec.ts deleted file mode 100644 index 926236f6..00000000 --- a/_legacy/test/browser/isolated-tests/services/type-mapper.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TypeMapper } from '../../../../lib/'; - -describe('TypeMapper', () => { - - const typeMapper = new TypeMapper(); - - it(`should throw an Error when invalid response is given`, () => { - expect(() => typeMapper.mapSingleType(null as any)).toThrowError(); - expect(() => typeMapper.mapSingleType(undefined as any)).toThrowError(); - - expect(() => typeMapper.mapSingleType({} as any)).toThrowError(); - - expect(() => typeMapper.mapMultipleTypes(null as any)).toThrowError(); - expect(() => typeMapper.mapMultipleTypes(undefined as any)).toThrowError(); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/url/item-filters.ts b/_legacy/test/browser/isolated-tests/url/item-filters.ts deleted file mode 100644 index c917c8cd..00000000 --- a/_legacy/test/browser/isolated-tests/url/item-filters.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Item url filters', () => { - const context = new Context(); - setup(context); - - it(`empty filter should be set`, () => { - const url = new URL(context.deliveryClient.items().emptyFilter('x').getUrl()); - - const param = url.searchParams.get('x[empty]'); - - expect(param).toBeDefined(); - }); - - it(`notEmpty filter should be set`, () => { - const url = new URL(context.deliveryClient.items().notEmptyFilter('x').getUrl()); - - const param = url.searchParams.get('x[nempty]'); - - expect(param).toBeDefined(); - }); - - it(`type filter with single string should be set`, () => { - const type = 'TypeA'; - const url = new URL(context.deliveryClient.items().type(type).getUrl()); - - const param = url.searchParams.get('system.type'); - - expect(param).toEqual(type); - }); - - it(`type filter with multiple strings should be set`, () => { - const typeA = 'TypeA'; - const typeB = 'TypeB'; - - const types = [typeA, typeB]; - const url = new URL(context.deliveryClient.items().types(types).getUrl()); - - const param = url.searchParams.get('system.type[in]'); - - expect(param).toEqual(`${typeA},${typeB}`); - }); - - it(`collection filter with single string should be set`, () => { - const collection = 'CollectionA'; - const url = new URL(context.deliveryClient.items().collection(collection).getUrl()); - - const param = url.searchParams.get('system.collection'); - - expect(param).toEqual(collection); - }); - - it(`collection filter with multiple strings should be set`, () => { - const collectionA = 'CollectionA'; - const collectionB = 'CollectionB'; - - const collections = [collectionA, collectionB]; - const url = new URL(context.deliveryClient.items().collections(collections).getUrl()); - - const param = url.searchParams.get('system.collection[in]'); - - expect(param).toEqual(`${collectionA},${collectionB}`); - }); - - it(`inFilter with single value should be set`, () => { - const url = new URL(context.deliveryClient.items().inFilter('elem1', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[in]'); - - expect(param).toEqual('val1'); - }); - - it(`inFilter with multiple values should be set`, () => { - const url = new URL(context.deliveryClient.items().notInFilter('elem1', ['val1', 'val2']).getUrl()); - - const param = url.searchParams.get('elem1[nin]'); - - expect(param).toEqual('val1,val2'); - }); - - it(`notInFilter with single value should be set`, () => { - const url = new URL(context.deliveryClient.items().notInFilter('elem1', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[nin]'); - - expect(param).toEqual('val1'); - }); - - it(`notInFilter with multiple values should be set`, () => { - const url = new URL(context.deliveryClient.items().inFilter('elem1', ['val1', 'val2']).getUrl()); - - const param = url.searchParams.get('elem1[in]'); - - expect(param).toEqual('val1,val2'); - }); - - it(`anyFilter with single value should be set`, () => { - const url = new URL(context.deliveryClient.items().anyFilter('elem1', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[any]'); - - expect(param).toEqual('val1'); - }); - - it(`anyFilter with multiple values should be set`, () => { - const url = new URL(context.deliveryClient.items().anyFilter('elem1', ['val1', 'val2']).getUrl()); - - const param = url.searchParams.get('elem1[any]'); - - expect(param).toEqual('val1,val2'); - }); - - it(`containsFilter with single value should be set`, () => { - const url = new URL(context.deliveryClient.items().containsFilter('elem1', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[contains]'); - - expect(param).toEqual('val1'); - }); - - it(`containsFilter with multiple value should be set`, () => { - const url = new URL(context.deliveryClient.items().containsFilter('elem1', ['val1', 'val2']).getUrl()); - - const param = url.searchParams.get('elem1[contains]'); - - expect(param).toEqual('val1,val2'); - }); - - it(`equalsFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().equalsFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[eq]'); - - expect(param).toEqual('val1'); - }); - - it(`notEqualsFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().notEqualsFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[neq]'); - - expect(param).toEqual('val1'); - }); - - it(`greaterThanFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().greaterThanFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[gt]'); - - expect(param).toEqual('val1'); - }); - - it(`greaterThanOrEqualFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().greaterThanOrEqualFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[gte]'); - - expect(param).toEqual('val1'); - }); - - it(`lessThanFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().lessThanFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[lt]'); - - expect(param).toEqual('val1'); - }); - - it(`lessThanOrEqualFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().lessThanOrEqualFilter('elem1', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[lte]'); - - expect(param).toEqual('val1'); - }); - - it(`allFilter with single value should be set`, () => { - const url = new URL(context.deliveryClient.items().allFilter('elem1', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[all]'); - - expect(param).toEqual('val1'); - }); - - it(`allFilter with multiple values should be set`, () => { - const url = new URL(context.deliveryClient.items().allFilter('elem1', ['val1', 'val2']).getUrl()); - - const param = url.searchParams.get('elem1[all]'); - - expect(param).toEqual('val1,val2'); - }); - - it(`rangeFilter should be set`, () => { - const url = new URL(context.deliveryClient.items().rangeFilter('elem1', 1, 10).getUrl()); - - const param = url.searchParams.get('elem1[range]'); - - expect(param).toEqual('1,10'); - }); - - // trim checks - - it(`inFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().inFilter(' elem1 ', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[in]'); - - expect(param).toEqual('val1'); - }); - - it(`allFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().allFilter(' elem1 ', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[all]'); - - expect(param).toEqual('val1'); - }); - - it(`anyFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().anyFilter(' elem1 ', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[any]'); - - expect(param).toEqual('val1'); - }); - - it(`containsFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().containsFilter(' elem1 ', ['val1']).getUrl()); - - const param = url.searchParams.get('elem1[contains]'); - - expect(param).toEqual('val1'); - }); - - it(`greaterThanFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().greaterThanFilter(' elem1 ', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[gt]'); - - expect(param).toEqual('val1'); - }); - - it(`greaterThanOrEqualFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().greaterThanOrEqualFilter(' elem1 ', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[gte]'); - - expect(param).toEqual('val1'); - }); - - it(`lessThanFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().lessThanFilter(' elem1 ', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[lt]'); - - expect(param).toEqual('val1'); - }); - - it(`lessThanOrEqualFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().lessThanOrEqualFilter(' elem1 ', 'val1').getUrl()); - - const param = url.searchParams.get('elem1[lte]'); - - expect(param).toEqual('val1'); - }); - - it(`rangeFilter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().rangeFilter(' elem1 ', 1, 10).getUrl()); - - const param = url.searchParams.get('elem1[range]'); - - expect(param).toEqual('1,10'); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts b/_legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts deleted file mode 100644 index 53a54032..00000000 --- a/_legacy/test/browser/isolated-tests/url/item-url-parameters.spec.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Item url parameters', () => { - const context = new Context({ defaultLanguage: 'default', excludeArchivedItems: true }); - setup(context); - - it(`includeTotalCount parameter should be set to true when used`, () => { - const url = new URL(context.deliveryClient.items().includeTotalCountParameter().getUrl()) - - const param = url.searchParams.get('includeTotalCount'); - - expect(param).toEqual('true'); - }); - - it(`depth param should be set`, () => { - const url = new URL(context.deliveryClient.items().depthParameter(1).getUrl()); - - const param = url.searchParams.get('depth'); - - expect(param).toEqual('1'); - }); - - it(`negative depth parameter should throw error`, () => { - expect(() => context.deliveryClient.items().depthParameter(-1)).toThrowError(); - }); - - it(`multiple elements param should be set`, () => { - const url = new URL(context.deliveryClient.items().elementsParameter(['elem1', 'elem2']).getUrl()); - - const param = url.searchParams.get('elements'); - - expect(param).toEqual('elem1,elem2'); - }); - - it(`single elements param should be set`, () => { - const url = new URL(context.deliveryClient.items().elementsParameter(['elem1']).getUrl()); - - const param = url.searchParams.get('elements'); - - expect(param).toEqual('elem1'); - }); - - - it(`exclue elements param should be set`, () => { - const url = new URL(context.deliveryClient.items().excludeElementsParameter(['elem1', 'elem2']).getUrl()); - - const param = url.searchParams.get('excludeElements'); - - expect(param).toEqual('elem1,elem2'); - }); - - it(`limit parameter should be set`, () => { - const url = new URL(context.deliveryClient.items().limitParameter(1).getUrl()); - - const param = url.searchParams.get('limit'); - - expect(param).toEqual('1'); - }); - - it(`negative limit parameter should throw error`, () => { - expect(() => context.deliveryClient.items().limitParameter(-1)).toThrowError(); - }); - - it(`order (desc) parameter should be set`, () => { - const url = new URL(context.deliveryClient.items().orderParameter('elem1', 'desc').getUrl()); - - const param = url.searchParams.get('order'); - - expect(param).toEqual('elem1[desc]'); - }); - - it(`order (asc) parameter should be set`, () => { - const url = new URL(context.deliveryClient.items().orderParameter('elem1', 'asc').getUrl()); - - const param = url.searchParams.get('order'); - - expect(param).toEqual('elem1[asc]'); - }); - - it(`orderByDescending should be set`, () => { - const url = new URL(context.deliveryClient.items().orderByDescending('elem1').getUrl()); - - const param = url.searchParams.get('order'); - - expect(param).toEqual('elem1[desc]'); - }); - - it(`orderByAscending should be set`, () => { - const url = new URL(context.deliveryClient.items().orderByAscending('elem1').getUrl()); - - const param = url.searchParams.get('order'); - - expect(param).toEqual('elem1[asc]'); - }); - - it(`skip parameter should be set`, () => { - const url = new URL(context.deliveryClient.items().skipParameter(1).getUrl()); - - const param = url.searchParams.get('skip'); - - expect(param).toEqual('1'); - }); - - it(`skip parameter with negative skip should throw error`, () => { - expect(() => context.deliveryClient.items().skipParameter(-1)).toThrowError(); - }); - - it(`language parameter should be set`, () => { - const url = new URL(context.deliveryClient.items().languageParameter('en').getUrl()); - - const param = url.searchParams.get('language'); - - expect(param).toEqual('en'); - }); - - it('exclude archived items should apply workflow filter', () => { - const url = new URL(context.deliveryClient.items().getUrl()); - const param = url.searchParams.get('system.workflow_step[neq]'); - expect(param).toEqual('archived'); - }); - - // trim checks - - it(`elementsParameter should trim its element codenames`, () => { - const url = new URL(context.deliveryClient.items().elementsParameter([' elem1', 'elem2', ' elem3']).getUrl()); - - const param = url.searchParams.get('elements'); - - expect(param).toEqual('elem1,elem2,elem3'); - }); - - it(`orderParameter should trim its element`, () => { - const url = new URL(context.deliveryClient.items().orderParameter(' elem1 ', 'asc').getUrl()); - - const param = url.searchParams.get('order'); - - expect(param).toEqual('elem1[asc]'); - }); - - it('defaultLanguage should set language parameter', () => { - const url = new URL(context.deliveryClient.items().getUrl()); - const param = url.searchParams.get('language'); - expect(param).toEqual('default'); - }); - - it(`languageParameter should overwrite default language`, () => { - const url = new URL(context.deliveryClient.items().languageParameter('es_ES').getUrl()); - - const param = url.searchParams.get('language'); - expect(param).toEqual('es_ES'); - }); -}); diff --git a/_legacy/test/browser/isolated-tests/url/item-url.spec.ts b/_legacy/test/browser/isolated-tests/url/item-url.spec.ts deleted file mode 100644 index fc461894..00000000 --- a/_legacy/test/browser/isolated-tests/url/item-url.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Item URL', () => { - - const context = new Context(); - setup(context); - - it(`item query should thrown error when item's codename is not set`, () => { - expect(() => context.deliveryClient.item(null as any)).toThrowError(); - }); - - it(`item query should thrown error when item's codename is empty`, () => { - expect(() => context.deliveryClient.item('')).toThrowError(); - }); - - it(`item url with 'kyle' codename should end with '/items/kyle`, () => { - const url = new URL(context.deliveryClient.item('kyle').getUrl()); - expect(url.toString()).toContain(`/items/kyle`); - }); - - it(`item url with 'arnold' codename should end with '/items/arnold'`, () => { - const url = new URL(context.deliveryClient.item('arnold').getUrl()); - expect(url.toString()).toContain(`/items/arnold`); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts b/_legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts deleted file mode 100644 index d0125417..00000000 --- a/_legacy/test/browser/isolated-tests/url/taxonomies-url.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Taxonomy url', () => { - - const context = new Context(); - setup(context); - - it(`taxonomies url should contain skip parameter`, () => { - const skip: number = 549228429; - const url = context.deliveryClient.taxonomies().skipParameter(skip).getUrl(); - expect(url).toContain('skip=' + skip.toString()); - }); -}); - diff --git a/_legacy/test/browser/isolated-tests/url/type-url.spec.ts b/_legacy/test/browser/isolated-tests/url/type-url.spec.ts deleted file mode 100644 index 71585dbc..00000000 --- a/_legacy/test/browser/isolated-tests/url/type-url.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Context, setup } from '../../setup'; - -describe('Type url', () => { - - const context = new Context(); - setup(context); - - it(`type query should thrown error when types's codename is not set`, () => { - expect(() => context.deliveryClient.type(null as any)).toThrowError(); - }); - - it(`type url with 'movie' codename should contain '/types/movie`, () => { - const url = context.deliveryClient.type('movie').getUrl(); - expect(url).toContain(`/types/movie`); - }); - - it(`type url for all types should end with 'types'`, () => { - const url = context.deliveryClient.types().getUrl(); - expect(url).toContain(`/types`); - }); - - it(`type url should contain skip parameter`, () => { - const skip: number = 549228429; - const url = context.deliveryClient.types().skipParameter(skip).getUrl(); - expect(url).toContain('skip=' + skip.toString()); - }); - -}); - diff --git a/_legacy/test/browser/live-tests/custom-url/custom-url.spec.ts b/_legacy/test/browser/live-tests/custom-url/custom-url.spec.ts deleted file mode 100644 index 45726427..00000000 --- a/_legacy/test/browser/live-tests/custom-url/custom-url.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Custom URL', () => { - const itemsUrl: string = 'https://deliver.kontent.ai/da5abe9f-fdad-4168-97cd-b3464be2ccb9/items?system.type=movie'; - - const context = new Context(); - setup(context); - - let responseItems: Responses.IListContentItemsResponse; - - beforeAll(async () => { - responseItems = (await context.deliveryClient.items().withCustomUrl(itemsUrl).toPromise()).data; - }); - - it(`items should be defined`, () => { - expect(responseItems).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/live-tests/element/live-element.spec.ts b/_legacy/test/browser/live-tests/element/live-element.spec.ts deleted file mode 100644 index a4dccb85..00000000 --- a/_legacy/test/browser/live-tests/element/live-element.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live element', () => { - const context = new Context(); - setup(context); - - const typeCodename: string = 'movie'; - - const multipleChoiceElementCodename: string = 'category'; - const taxonomyElementCodename: string = 'releasecategory'; - - let multipleChoiceElementResponse: Responses.IViewContentTypeElementResponse; - let taxonomyElementResponse: Responses.IViewContentTypeElementResponse; - - beforeAll(async () => { - multipleChoiceElementResponse = ( - await context.deliveryClient.element(typeCodename, multipleChoiceElementCodename).toPromise() - ).data; - - taxonomyElementResponse = ( - await context.deliveryClient.element(typeCodename, taxonomyElementCodename).toPromise() - ).data; - }); - - it(`element responses should be defined`, () => { - expect(multipleChoiceElementResponse).toBeDefined(); - expect(taxonomyElementResponse).toBeDefined(); - }); - - it(`element taxonomy element should contain valid taxonomy group property`, () => { - expect(taxonomyElementResponse.taxonomyGroup).toBeDefined(); - expect(taxonomyElementResponse.taxonomyGroup).toEqual(jasmine.any(String)); - }); - - it(`multiple choice element should contain options`, () => { - expect(multipleChoiceElementResponse.options).toBeDefined(); - expect(multipleChoiceElementResponse.options.length).toBeGreaterThan(0); - }); -}); diff --git a/_legacy/test/browser/live-tests/errors/kontent-error.spec.ts b/_legacy/test/browser/live-tests/errors/kontent-error.spec.ts deleted file mode 100644 index 6bb684f4..00000000 --- a/_legacy/test/browser/live-tests/errors/kontent-error.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Context, setup } from '../../setup'; -import { DeliveryError } from '../../../../lib'; - -describe('Delivery errors', () => { - const context = new Context(); - setup(context); - - const invalidCodename: string = 'the_invalid_codename'; - let succeeded: boolean; - let error: unknown; - - beforeAll(async () => { - try { - await context.deliveryClient.item(invalidCodename).toPromise(); - succeeded = true; - } catch (err) { - error = err; - succeeded = false; - } - }); - - it(`Response shouldn't succeed because the item does not exists`, () => { - expect(succeeded).toEqual(false); - }); - - it(`Error should be an instance of DeliveryError`, () => { - expect(error).toEqual(jasmine.any(DeliveryError)); - }); - - it(`Error model should have all properties assigned`, () => { - const baseError = error as DeliveryError; - expect(baseError.errorCode).toBeGreaterThan(0); - expect(baseError.specificCode).toBeGreaterThanOrEqual(0); - expect(baseError.message).toBeDefined(); - expect(baseError.requestId).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts b/_legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts deleted file mode 100644 index c2092592..00000000 --- a/_legacy/test/browser/live-tests/item/live-item-base-linked-items.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live item - base linked items', () => { - const context = new Context(); - setup(context); - - const movieCodename: string = 'warrior'; - let response: Responses.IViewContentItemResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.item(movieCodename).toPromise()).data; - }); - - it(`verify linked items included in response and are of 'ContentItem' type`, () => { - expect(Object.keys(response.linkedItems).length).toEqual(3); - - for (const key of Object.keys(response.linkedItems)) { - const linkedItem = response.linkedItems[key]; - expect(linkedItem).toBeDefined(); - } - }); -}); diff --git a/_legacy/test/browser/live-tests/item/live-item.spec.ts b/_legacy/test/browser/live-tests/item/live-item.spec.ts deleted file mode 100644 index 0a161579..00000000 --- a/_legacy/test/browser/live-tests/item/live-item.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live item', () => { - const context = new Context(); - setup(context); - - const movieCodename: string = 'warrior'; - let response: Responses.IViewContentItemResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.item(movieCodename).queryConfig({}).toPromise()).data; - }); - - it(`item response should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`item should be defined`, () => { - expect(response.item).toBeDefined(); - }); - - it(`title should be 'Warrior'`, () => { - expect(response.item.elements.title.value).toEqual('Warrior'); - }); - - it(`released date should be '2011-09-09T00:00:00Z'`, () => { - expect(response.item.elements.released.value).toEqual('2011-09-09T00:00:00Z'); - }); - - it(`poster asset should be defined`, () => { - expect(response.item.elements.poster).toBeDefined(); - }); - - it(`poster asset' url should be set`, () => { - const assetUrl = response.item.elements.poster.value[0].url; - expect(assetUrl).toBeDefined(); - expect(assetUrl).toContain('https://'); - }); - - it(`category options should be defined`, () => { - expect(response.item.elements.category.value).toBeDefined(); - }); - - it(`there should be 2 category options defined`, () => { - expect(response.item.elements.category.value.length).toEqual(2); - }); - - it(`checks codename of first category option`, () => { - expect(response.item.elements.category.value[0].codename).toEqual('action'); - }); - - it(`checks codename of second category option`, () => { - expect(response.item.elements.category.value[1].codename).toEqual('drama'); - }); - - it(`checks that category options are of proper type`, () => { - expect(response.item.elements.category.value[1]).toBeDefined(); - }); - - it(`stars linked items should be defined`, () => { - expect(response.item.elements.stars).toBeDefined(); - }); - - it(`check number of stars items`, () => { - expect(response.item.elements.stars.value.length).toEqual(2); - }); - - it(`checks that linkedItemCodenames element is mapped and container proper data`, () => { - expect(response.item.elements.plot.linkedItemCodenames).toBeDefined(); - expect(response.item.elements.plot.linkedItemCodenames).toContain('tom_hardy'); - expect(response.item.elements.plot.linkedItemCodenames).toContain('joel_edgerton'); - }); - - it(`check that linked item (Actor) has 'first_name' text properly assigned`, () => { - expect(response.item.elements.stars.linkedItems[0].elements.first_name.value).toEqual('Tom'); - }); - - it(`images should be mapped in plot rich text element`, () => { - const images = response.item.elements.plot.images; - - expect(images).toBeDefined(); - expect(images.length).toEqual(2); - }); - - it(`verify linked items included in response`, () => { - expect(Object.keys(response.linkedItems).length).toEqual(3); - for (const key of Object.keys(response.linkedItems)) { - const linkedItem = response.linkedItems[key]; - expect(linkedItem).toBeDefined(); - } - }); -}); diff --git a/_legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts b/_legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts deleted file mode 100644 index a58220d4..00000000 --- a/_legacy/test/browser/live-tests/items-feed/live-items-feed-all.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { IDeliveryNetworkResponse, Contracts, Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live items feed all', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListItemsFeedAllResponse; - const responses: IDeliveryNetworkResponse, Contracts.IItemsFeedContract>[] = []; - - beforeAll(async () => { - response = ( - await context.deliveryClient.itemsFeed().toAllPromise({ - responseFetched: (innerResponse, nextPage, continuationToken) => { - responses.push(innerResponse); - } - }) - ).data; - }); - - it(`items should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`items should have multiple responses`, () => { - expect(response.responses.length).toBeGreaterThan(0); - expect(response.responses.length).toEqual(responses.length); - - for (const innerResponse of response.responses) { - expect(innerResponse.data).toBeDefined(); - } - }); -}); diff --git a/_legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts b/_legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts deleted file mode 100644 index c86dfb87..00000000 --- a/_legacy/test/browser/live-tests/items-feed/live-items-feed.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IDeliveryNetworkResponse, Contracts, Responses } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live items feed', () => { - const context = new Context(); - setup(context); - - let response: IDeliveryNetworkResponse; - - beforeAll(async () => { - response = await context.deliveryClient.itemsFeed().toPromise(); - }); - - it(`Response should have all properties assigned`, () => { - expect(response.data.items).toEqual(jasmine.any(Array)); - expect(response.data.items.length).toBeGreaterThan(0); - expect(response.xContinuationToken).toBeUndefined(); - expect(Object.keys(response.data.linkedItems).length).toBeGreaterThan(0); - - for (const item of response.data.items) { - expect(item.system).toBeDefined(); - expect(item.elements).toBeDefined(); - } - }); -}); diff --git a/_legacy/test/browser/live-tests/items/live-items-all.spec.ts b/_legacy/test/browser/live-tests/items/live-items-all.spec.ts deleted file mode 100644 index 835bd28d..00000000 --- a/_legacy/test/browser/live-tests/items/live-items-all.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { IDeliveryNetworkResponse, Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live items all', () => { - const context = new Context(); - setup(context); - - const type: string = 'movie'; - let response: Responses.IListContentItemsAllResponse; - const responses: IDeliveryNetworkResponse, any>[] = []; - - const pages: number = 2; - const limit: number = 2; - - beforeAll(async () => { - response = ( - await context.deliveryClient - .items() - .limitParameter(limit) - .type(type) - .toAllPromise({ - responseFetched: (innerResponse, nextPage, continuationToken) => { - responses.push(innerResponse); - }, - pages: pages - }) - ).data; - }); - - it(`items should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`check correct number of items`, () => { - expect(response.items.length).toEqual(pages * limit); - }); - - it(`items should have multiple responses`, () => { - expect(response.responses.length).toEqual(pages); - expect(response.responses.length).toEqual(responses.length); - - for (const innerResponse of response.responses) { - expect(innerResponse.data).toBeDefined(); - } - }); -}); diff --git a/_legacy/test/browser/live-tests/items/live-items.spec.ts b/_legacy/test/browser/live-tests/items/live-items.spec.ts deleted file mode 100644 index 64ce89d1..00000000 --- a/_legacy/test/browser/live-tests/items/live-items.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live items', () => { - const context = new Context(); - setup(context); - - const type: string = 'movie'; - let response: Responses.IListContentItemsResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.items().type(type).toPromise()).data; - }); - - it(`items should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`check correct number of items`, () => { - expect(response.items.length).toEqual(6); - }); - - it(`items should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`Linked items should be set`, () => { - expect(Object.keys(response.linkedItems).length).toBeGreaterThan(0); - }); -}); diff --git a/_legacy/test/browser/live-tests/localization/localization-default-language.spec.ts b/_legacy/test/browser/live-tests/localization/localization-default-language.spec.ts deleted file mode 100644 index d1847017..00000000 --- a/_legacy/test/browser/live-tests/localization/localization-default-language.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Context, Movie, setup } from '../../setup'; - -describe('Language #1', () => { - const language = 'en'; - const context = new Context(); - context.defaultLanguage = language; - setup(context); - - const movieCodename: string = 'warrior'; - - const query = context.deliveryClient.item(movieCodename).languageParameter(language); - const queryLanguageParam = query.getParameters().find((m) => m.getParam() === `language=${language}`); - - it(`Language should be '${language}'`, () => { - expect(queryLanguageParam).toBeDefined(); - }); -}); - -describe('Language #2', () => { - const language = 'cz'; - const context = new Context(); - context.defaultLanguage = language; - setup(context); - - const newMovieCodename: string = 'warrior'; - - const query = context.deliveryClient.item(newMovieCodename).languageParameter(language); - const queryLanguageParam = query.getParameters().find((m) => m.getParam() === `language=${language}`); - - it(`language should be '${language}'`, () => { - expect(queryLanguageParam).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/live-tests/localization/localized-item.spec.ts b/_legacy/test/browser/live-tests/localization/localized-item.spec.ts deleted file mode 100644 index ec157edf..00000000 --- a/_legacy/test/browser/live-tests/localization/localized-item.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Localized item', () => { - const context = new Context(); - setup(context); - - const language: string = 'cz'; - const movieCodename: string = 'warrior'; - let response: Responses.IViewContentItemResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.item(movieCodename).languageParameter(language).toPromise()) - .data; - }); - - it(`language should be '${language}'`, () => { - expect(response.item.system.language).toEqual(language); - }); - - it(`title should be localized`, () => { - expect(response.item.elements.title.value).toEqual('Warrior-cz'); - }); -}); diff --git a/_legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts b/_legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts deleted file mode 100644 index 741fd166..00000000 --- a/_legacy/test/browser/live-tests/mapping/live-mapping.service.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IDeliveryNetworkResponse, Contracts, Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Live mapping service', () => { - const context = new Context(); - setup(context); - - const movieCodename: string = 'warrior'; - let response: IDeliveryNetworkResponse, Contracts.IViewContentItemContract>; - - beforeAll(async () => { - response = await context.deliveryClient.item(movieCodename).toPromise(); - }); - - it(`raw response should be available for mapping from stored json (with mapping service)`, () => { - const contractJson = response.response.data; - const reMappedResponse = context.deliveryClient.mappingService.viewContentItemResponse(contractJson); - expect(reMappedResponse).toBeDefined(); - expect(reMappedResponse.item.system.codename).toEqual(movieCodename); - expect(reMappedResponse.item.elements.title.value).toEqual('Warrior'); - }); - - it(`raw response should be available for mapping from stored json (with query)`, () => { - const contractJson = response.response.data; - const reMappedResponse = context.deliveryClient.item(movieCodename).map(contractJson); - expect(reMappedResponse).toBeDefined(); - expect(reMappedResponse.item.system.codename).toEqual(movieCodename); - expect(reMappedResponse.item.elements.title.value).toEqual('Warrior'); - }); -}); diff --git a/_legacy/test/browser/live-tests/network-response/network-response.spec.ts b/_legacy/test/browser/live-tests/network-response/network-response.spec.ts deleted file mode 100644 index cf1d1adf..00000000 --- a/_legacy/test/browser/live-tests/network-response/network-response.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IDeliveryNetworkResponse } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Network response', () => { - const context = new Context(); - setup(context); - - let response: IDeliveryNetworkResponse; - - beforeAll(async () => { - response = await context.deliveryClient - .itemsFeed() - .toPromise(); - }); - - it(`response should contain network response data`, () => { - expect(response.response.headers).toBeDefined(); - expect(response.response.data).toBeDefined(); - expect(response.response.rawResponse).toBeDefined(); - expect(response.response.retryStrategy).toBeDefined(); - expect(response.hasStaleContent).toEqual(false); - expect(response.xContinuationToken).toBeUndefined(); - expect(response.response.status).toEqual(200); - }); -}); diff --git a/_legacy/test/browser/live-tests/pagination/pagination.spec.ts b/_legacy/test/browser/live-tests/pagination/pagination.spec.ts deleted file mode 100644 index 51ad1ad8..00000000 --- a/_legacy/test/browser/live-tests/pagination/pagination.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Pagination', () => { - const context = new Context(); - setup(context); - - const type: string = 'movie'; - let response: Responses.IListContentItemsResponse; - - beforeAll(async () => { - response = ( - await context.deliveryClient.items().type(type).limitParameter(5).skipParameter(1).toPromise() - ).data; - }); - - it(`pagination should be defined`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`check count`, () => { - expect(response.pagination.count).toEqual(5); - }); - - it(`check limit`, () => { - expect(response.pagination.limit).toEqual(5); - }); - - it(`check skip`, () => { - expect(response.pagination.skip).toEqual(1); - }); - - it(`check pagination count`, () => { - expect(response.pagination.nextPage).toEqual(''); - }); -}); diff --git a/_legacy/test/browser/live-tests/promise/response-by-promise.spec.ts b/_legacy/test/browser/live-tests/promise/response-by-promise.spec.ts deleted file mode 100644 index 464a43f8..00000000 --- a/_legacy/test/browser/live-tests/promise/response-by-promise.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, Movie, setup } from '../../setup'; - -describe('Response with Promises', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentItemsResponse; - - beforeAll((done) => { - context.deliveryClient - .items() - .toPromise() - .then((xResponse) => { - response = xResponse.data; - done(); - }) - .catch((err) => { - throw err; - }); - }); - - it(`Response items should be retrieved and mapped just like with Promise`, () => { - expect(response).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/live-tests/readme.md b/_legacy/test/browser/live-tests/readme.md deleted file mode 100644 index 9649f9b1..00000000 --- a/_legacy/test/browser/live-tests/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# Live tests info - -Tests in this section depend on `live` environment diff --git a/_legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts b/_legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts deleted file mode 100644 index 1fb9a42c..00000000 --- a/_legacy/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { ITaxonomyGroup, Responses, ITaxonomyTerms } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live taxonomies', () => { - const context = new Context(); - setup(context); - - const termsWithNestedTermsCodename: string = 'film'; // codename of the taxonomy term that has nested terms - const numberOfNestedTerms: number = 3; // this is the number of nested terms defined by 'termsWithNestedTermsCodename' - const existingTaxonomyCodename: string = 'movietype'; // codename of some of the defined taxonomies - - let response: Responses.IListTaxonomiesResponse; - let taxonomy: ITaxonomyGroup; - - beforeAll(async () => { - response = (await context.deliveryClient.taxonomies().toPromise()).data; - - taxonomy = response.items.find((m) => m.system.codename === existingTaxonomyCodename) as ITaxonomyGroup; - }); - - it(`taxonomies should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`taxonomies should be defined`, () => { - expect(response.items).toBeDefined(); - }); - - it(`taxonomy with codename '${existingTaxonomyCodename}' should be defined`, () => { - expect(taxonomy).toBeDefined(); - }); - - it(`taxomy system attributes should be defined`, () => { - if (!taxonomy) { - throw Error('undefined'); - } - expect(taxonomy.system).toBeDefined(); - expect(taxonomy.system.codename).toBeDefined(); - expect(taxonomy.system.id).toBeDefined(); - expect(taxonomy.system.lastModified).toBeDefined(); - expect(taxonomy.system.name).toBeDefined(); - }); - - it(`taxonomy group should match requested type`, () => { - if (!taxonomy) { - throw Error('undefined'); - } - expect(taxonomy.system.codename).toEqual(existingTaxonomyCodename); - }); - - it(`taxonomy group should have defined terms`, () => { - if (!taxonomy) { - throw Error('undefined'); - } - expect(taxonomy.terms).toBeDefined(); - }); - - it(`taxonomy group should have > 0 terms`, () => { - if (!taxonomy) { - throw Error('undefined'); - } - expect(taxonomy.terms.length).toBeGreaterThan(0); - }); - - it(`taxonomy group should contain nested taxonomies`, () => { - const termsWithNestedTerms = taxonomy.terms.find( - (m) => m.codename === termsWithNestedTermsCodename - ) as ITaxonomyTerms; - expect(termsWithNestedTerms).toBeDefined(); - - expect(termsWithNestedTerms.terms).toBeDefined(); - expect(termsWithNestedTerms.terms.length).toEqual(numberOfNestedTerms); - }); -}); diff --git a/_legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts b/_legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts deleted file mode 100644 index 042b7e6d..00000000 --- a/_legacy/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Responses, ITaxonomyTerms } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live taxonomy', () => { - const context = new Context(); - setup(context); - - const taxonomyCodename: string = 'movietype'; - const termsWithNestedTermsCodename: string = 'film'; // codename of the taxonomy term that has nested terms - const numberOfNestedTerms: number = 3; // this is the number of nested terms defined by 'termsWithNestedTermsCodename' - - let response: Responses.IViewTaxonomyResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.taxonomy(taxonomyCodename).toPromise()).data; - }); - - it(`taxomy should be defined`, () => { - expect(response.taxonomy).toBeDefined(); - }); - - it(`taxomy system attributes should be defined`, () => { - expect(response.taxonomy.system).toBeDefined(); - expect(response.taxonomy.system.codename).toBeDefined(); - expect(response.taxonomy.system.id).toBeDefined(); - expect(response.taxonomy.system.lastModified).toBeDefined(); - expect(response.taxonomy.system.name).toBeDefined(); - }); - - it(`taxonomy group should match requested type`, () => { - expect(response.taxonomy.system.codename).toEqual(taxonomyCodename); - }); - - it(`taxonomy group should have defined terms`, () => { - expect(response.taxonomy.terms).toBeDefined(); - }); - - it(`taxonomy group should have > 0 terms`, () => { - expect(response.taxonomy.terms.length).toBeGreaterThan(0); - }); - - it(`taxonomy group should contain nested taxonomies`, () => { - const termsWithNestedTerms = response.taxonomy.terms.find( - (m) => m.codename === termsWithNestedTermsCodename - ) as ITaxonomyTerms; - expect(termsWithNestedTerms).toBeDefined(); - expect(termsWithNestedTerms.terms).toBeDefined(); - expect(termsWithNestedTerms.terms.length).toEqual(numberOfNestedTerms); - }); -}); diff --git a/_legacy/test/browser/live-tests/types/live-type.spec.ts b/_legacy/test/browser/live-tests/types/live-type.spec.ts deleted file mode 100644 index 5eb8cfa0..00000000 --- a/_legacy/test/browser/live-tests/types/live-type.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { IGenericElement, Responses } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live type', () => { - const context = new Context(); - setup(context); - - const codename: string = 'movie'; - let response: Responses.IViewContentTypeResponse; - - const multipleChoiceElement: string = 'category'; - const taxonomyElement: string = 'releasecategory'; - - beforeAll(async () => { - response = (await context.deliveryClient.type(codename).toPromise()).data; - }); - - it(`type should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`elements should be defined`, () => { - expect(response.type.elements).toBeDefined(); - }); - - it(`system properties should be defined`, () => { - expect(response.type.system).toBeDefined(); - }); - - it(`proper type should be returned based on test config`, () => { - expect(response.type.system.codename).toEqual(codename); - }); - - it(`Verifies taxonomy element - '${taxonomyElement}'`, () => { - const releasecategoryElement = response.type.elements.find( - (m) => m.codename === taxonomyElement - ) as IGenericElement; - expect(releasecategoryElement).toBeDefined(); - expect(releasecategoryElement.taxonomyGroup).toBeDefined(); - expect(releasecategoryElement.taxonomyGroup).toEqual('releasecategory'); - }); - - it(`Verifies multiple_choice element - '${multipleChoiceElement}'`, () => { - const categoryElement = response.type.elements.find( - (m) => m.codename === multipleChoiceElement - ) as IGenericElement; - - expect(categoryElement).toBeDefined(); - expect(categoryElement.options).toBeDefined(); - expect(categoryElement.options.length).toBeGreaterThan(0); - expect(categoryElement.options[0].codename).toBeDefined(); - expect(categoryElement.options[0].name).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/live-tests/types/live-types.spec.ts b/_legacy/test/browser/live-tests/types/live-types.spec.ts deleted file mode 100644 index 79b2ae41..00000000 --- a/_legacy/test/browser/live-tests/types/live-types.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Responses } from '../../../../lib'; -import { Context, setup } from '../../setup'; - -describe('Live types', () => { - const context = new Context(); - setup(context); - - let response: Responses.IListContentTypesResponse; - - beforeAll(async () => { - response = (await context.deliveryClient.types().toPromise()).data; - }); - - it(`types should be defined`, () => { - expect(response).toBeDefined(); - }); - - it(`types should have pagination`, () => { - expect(response.pagination).toBeDefined(); - }); - - it(`there should be at least 1 type`, () => { - expect(response.items.length).toBeGreaterThan(0); - }); - - it(`elements should be defined`, () => { - expect(response.items[0].elements).toBeDefined(); - }); - - it(`system properties should be defined`, () => { - expect(response.items[0].system).toBeDefined(); - }); - - it(`pagination should be defined`, () => { - expect(response.pagination).toBeDefined(); - }); -}); diff --git a/_legacy/test/browser/setup/context.ts b/_legacy/test/browser/setup/context.ts deleted file mode 100644 index 630aafd2..00000000 --- a/_legacy/test/browser/setup/context.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { IHeader, IRetryStrategyOptions } from '@kontent-ai/core-sdk'; -import { DeliveryClient, IDeliveryClientConfig, IQueryConfig } from '../../../lib'; - -export class Context { - public deliveryClient!: DeliveryClient; - - public defaultQueryConfig?: IQueryConfig; - public environmentId!: string; - public previewApiKey?: string; - public securedApiKey?: string; - public usePreviewMode: boolean = false; - public useSecuredMode: boolean = false; - public defaultLanguage?: string; - public excludeArchivedItems?: boolean = false; - public baseUrl?: string; - public basePreviewUrl?: string; - public globalHeaders?: (queryConfig: IQueryConfig) => IHeader[]; - public retryStrategy?: IRetryStrategyOptions; - - constructor(options?: { - defaultQueryConfig?: IQueryConfig; - environmentId?: string; - previewApiKey?: string; - deliveryClient?: DeliveryClient; - defaultLanguage?: string; - excludeArchivedItems?: boolean; - baseUrl?: string; - basePreviewUrl?: string; - securedApiKey?: string; - globalHeaders?: (queryConfig: IQueryConfig) => IHeader[]; - retryStrategy?: IRetryStrategyOptions; - }) { - if (options) { - Object.assign(this, options); - } - } - - getConfig(): IDeliveryClientConfig { - return { - environmentId: this.environmentId, - previewApiKey: this.previewApiKey, - secureApiKey: this.securedApiKey, - defaultQueryConfig: this.defaultQueryConfig, - proxy: { - baseUrl: this.baseUrl, - basePreviewUrl: this.basePreviewUrl - }, - defaultLanguage: this.defaultLanguage, - globalHeaders: this.globalHeaders, - retryStrategy: this.retryStrategy, - excludeArchivedItems: this.excludeArchivedItems - }; - } -} diff --git a/_legacy/test/browser/setup/delivery-test-client.ts b/_legacy/test/browser/setup/delivery-test-client.ts deleted file mode 100644 index e95ffb12..00000000 --- a/_legacy/test/browser/setup/delivery-test-client.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { IHeader, IResponse, TestHttpService } from '@kontent-ai/core-sdk'; - -import { createDeliveryClient, IDeliveryClient, IDeliveryClientConfig } from '../../../lib'; - -const testenvironmentId: string = 'delivery-environment-id'; - -export function toPromise(data: T): Promise { - return new Promise((resolve, reject) => { - resolve(data); - }); -} - -export function getTestDeliveryClient(config?: IDeliveryClientConfig): IDeliveryClient { - return createDeliveryClient( - config - ? config - : { - environmentId: testenvironmentId - } - ); -} - -export function getDeliveryClientWithError(errorJson: any): IDeliveryClient { - return createDeliveryClient({ - environmentId: testenvironmentId, - httpService: new TestHttpService({ - response: undefined, - error: errorJson - }) - }); -} - -export function getDeliveryClientWithJson( - json: any, - config?: IDeliveryClientConfig, - responseHeaders: IHeader[] = [] -): IDeliveryClient { - return getDeliveryClientWithJsonAndHeaders(json, config, responseHeaders); -} - -export function getDeliveryClientWithJsonAndHeaders( - json: any, - config?: IDeliveryClientConfig, - responseHeaders: IHeader[] = [] -): IDeliveryClient { - if (!config) { - return createDeliveryClient({ - environmentId: testenvironmentId, - httpService: new TestHttpService({ - response: getResponseFromJson(json, responseHeaders), - error: undefined - }) - }); - } - - // always set http service - config.httpService = new TestHttpService({ - response: getResponseFromJson(json, responseHeaders), - error: undefined - }); - - return createDeliveryClient(config); -} - -function getResponseFromJson(json: any, responseHeaders: IHeader[] = []): IResponse { - return { - data: json, - headers: responseHeaders, - rawResponse: json, - status: 999, - retryStrategy: { - retryAttempts: 1, - options: {} - } - }; -} diff --git a/_legacy/test/browser/setup/index.ts b/_legacy/test/browser/setup/index.ts deleted file mode 100644 index 0f65953b..00000000 --- a/_legacy/test/browser/setup/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './models'; -export * from './context'; -export * from './setup'; -export * from './delivery-test-client'; diff --git a/_legacy/test/browser/setup/models.ts b/_legacy/test/browser/setup/models.ts deleted file mode 100644 index 9a4c24f0..00000000 --- a/_legacy/test/browser/setup/models.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Elements, IContentItem } from '../../../lib'; - -type LanguageCodenames = 'default' | 'en'; -type CollectionCodenames = 'default'; -type WorkflowCodenames = 'default'; -type WorkflowStepCodenames = 'draft' | 'published' | 'review'; -type ActorElementCodenames = 'first_name' | 'last_name' | 'photo'; - -export type Actor = IContentItem< - { - readonly first_name: Elements.TextElement; - readonly last_name: Elements.TextElement; - readonly photo: Elements.AssetsElement; - }, - 'actor', - LanguageCodenames, - CollectionCodenames, - WorkflowCodenames, - WorkflowStepCodenames, - ActorElementCodenames ->; - -export type ReleaseCategoryTaxonomy = 'global_release' | 'us_only' | 'local_release'; -export type CategoryMultipleChoiceOptionCodenames = 'sci_fi' | 'action' | 'comedy' | 'drama' | 'romance' | 'animation'; - -type MovieElementCodenames = - | 'title' - | 'plot' - | 'released' - | 'length' - | 'poster' - | 'category' - | 'stars' - | 'seoname' - | 'releasecategory'; - -export type Movie = IContentItem< - { - readonly title: Elements.TextElement; - readonly plot: Elements.RichTextElement; - readonly released: Elements.DateTimeElement; - readonly length: Elements.NumberElement; - readonly category: Elements.MultipleChoiceElement; - readonly seoname: Elements.UrlSlugElement; - readonly poster: Elements.AssetsElement; - readonly stars: Elements.LinkedItemsElement; - readonly releasecategory: Elements.TaxonomyElement; - }, - 'movie', - LanguageCodenames, - CollectionCodenames, - WorkflowCodenames, - WorkflowStepCodenames, - MovieElementCodenames ->; diff --git a/_legacy/test/browser/setup/setup.ts b/_legacy/test/browser/setup/setup.ts deleted file mode 100644 index 5b3663e6..00000000 --- a/_legacy/test/browser/setup/setup.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { DeliveryClient, IDeliveryClientConfig } from '../../../lib'; -import { Context } from './context'; - -const defaultenvironmentId = 'da5abe9f-fdad-4168-97cd-b3464be2ccb9'; - -// tslint:disable-next-line:max-line-length -const defaultPreviewApiKey = - 'ew0KICAiYWxnIjogIkhTMjU2IiwNCiAgInR5cCI6ICJKV1QiDQp9.ew0KICAidWlkIjogInVzcl8wdlFZQkNxQXZybm81cmlmSG5pWUVHIiwNCiAgImVtYWlsIjogInJpY2hhcmRzQGtlbnRpY28uY29tIiwNCiAgInByb2plY3RfaWQiOiAiZGE1YWJlOWYtZmRhZC00MTY4LTk3Y2QtYjM0NjRiZTJjY2I5IiwNCiAgImp0aSI6ICJpLXNFVWJlNmZPeUtBQmJOIiwNCiAgInZlciI6ICIxLjAuMCIsDQogICJnaXZlbl9uYW1lIjogIlJpY2hhcmQiLA0KICAiZmFtaWx5X25hbWUiOiAiU3VzdGVrIiwNCiAgImF1ZCI6ICJwcmV2aWV3LmRlbGl2ZXIua2VudGljb2Nsb3VkLmNvbSINCn0.jSq0owesXGAGf8l7e0Ue7wPkP28MT_--ZK5T02sO7yw'; - -const defaultSecuredApiKey = 'securedApiKey'; - -// ----------- setup function o------------ // -export function setup(context: Context) { - // get delivery client with given context - let environmentId: string = defaultenvironmentId; - let previewApiKey: string = defaultPreviewApiKey; - let securedApiKey: string = defaultSecuredApiKey; - - // context settings override default setup - if (context.environmentId) { - environmentId = context.environmentId; - } - - if (context.previewApiKey) { - previewApiKey = context.previewApiKey; - } - - if (context.securedApiKey) { - securedApiKey = context.securedApiKey; - } - - const deliveryClientConfig: IDeliveryClientConfig = { - environmentId: environmentId, - secureApiKey: securedApiKey, - previewApiKey: previewApiKey, - defaultQueryConfig: context.defaultQueryConfig, - defaultLanguage: context.defaultLanguage, - excludeArchivedItems: context.excludeArchivedItems, - proxy: { - baseUrl: context.baseUrl, - basePreviewUrl: context.basePreviewUrl - }, - retryStrategy: context.retryStrategy, - globalHeaders: context.globalHeaders - }; - - // set context - context.environmentId = environmentId; - context.previewApiKey = previewApiKey; - context.securedApiKey = securedApiKey; - - // set delivery client - context.deliveryClient = new DeliveryClient(deliveryClientConfig); -} diff --git a/_legacy/test/node/base/base-node-test.js b/_legacy/test/node/base/base-node-test.js deleted file mode 100644 index 6b6885b7..00000000 --- a/_legacy/test/node/base/base-node-test.js +++ /dev/null @@ -1,30 +0,0 @@ -const KontentDelivery = require('../../../dist/cjs'); -const assert = require('assert'); -const environmentId = 'da5abe9f-fdad-4168-97cd-b3464be2ccb9'; - -const deliveryClient = new KontentDelivery.DeliveryClient({ - environmentId: environmentId, -}); - -describe('Base node.js test', () => { - - let response; - - before(async () => { - response = await deliveryClient.items() - .type('movie') - .limitParameter(10) - .toPromise(); - }); - - it('Response should be successful and should contain an item of defined type', () => { - var item = response.data.items[0]; - - assert.ok(item); - assert.ok(item.system.codename); - }); -}); - - - - diff --git a/_legacy/tsconfig.json b/_legacy/tsconfig.json deleted file mode 100644 index f75651c6..00000000 --- a/_legacy/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "compileOnSave": true, - "compilerOptions": { - "baseUrl": ".", - "outDir": "dist", - "sourceMap": true, - "declaration": true, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "module": "commonjs", - "target": "es6", - "strict": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "resolveJsonModule": true, - "noImplicitReturns": true, - "allowUnreachableCode": false, - "alwaysStrict": true, - "forceConsistentCasingInFileNames": true, - "noUnusedParameters": false, - "noUnusedLocals": true, - "strictFunctionTypes": true, - "noImplicitAny": true, - "typeRoots": ["./node_modules/@types"], - "lib": ["ESNext", "dom"] - }, - "include": ["lib/**/*", "test/**/*", "misc/**/*", "clean.ts", "eslint.config.mjs"], - "exclude": ["node_modules"] -} diff --git a/_legacy/tsconfig.prod.json b/_legacy/tsconfig.prod.json deleted file mode 100644 index 088e5857..00000000 --- a/_legacy/tsconfig.prod.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": [ - "lib/**/*" - ] -} \ No newline at end of file diff --git a/_legacy/tsconfig.webpack.json b/_legacy/tsconfig.webpack.json deleted file mode 100644 index 2f0dbac1..00000000 --- a/_legacy/tsconfig.webpack.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.prod.json", - "compilerOptions": { - "declaration": false - } -} \ No newline at end of file diff --git a/_legacy/webpack.config.js b/_legacy/webpack.config.js deleted file mode 100644 index 702fae82..00000000 --- a/_legacy/webpack.config.js +++ /dev/null @@ -1,58 +0,0 @@ -const path = require('path'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; - -const isProd = (args) => { - return args.mode === 'production' -} - -const outputFolder = (args) => path.resolve(__dirname, 'dist/bundles'); -const bundleFilename = (args) => { - return 'kontent-delivery.umd' + (isProd(args) ? '.min.js' : '.js'); -} - -module.exports = (env, args) => ({ - mode: args.mode, - entry: { - 'index': './lib/index.ts', - }, - resolve: { - extensions: ['.ts', '.js'] - }, - output: { - path: outputFolder(args), - filename: bundleFilename(args), - libraryTarget: 'umd', - umdNamedDefine: true, - library: 'kontentDelivery' - }, - devtool: 'source-map', - module: { - rules: [ - { - test: /\.ts$/, - loader: 'ts-loader', - include: [ - path.resolve(__dirname, 'lib'), - ], - options: { - configFile: require.resolve('./tsconfig.webpack.json') - } - } - ], - }, - performance: { - hints: 'warning', - maxEntrypointSize: 1000000, - maxAssetSize: 1000000 - }, - plugins: [ - new BundleAnalyzerPlugin({ - generateStatsFile: true, - analyzerMode: 'json', - reportFilename: (isProd(args) ? 'report.min' : 'report') + '.json', - statsFilename: (isProd(args) ? 'stats.min' : 'stats') + '.json' - }) - ] -}); - - From 2aa955fd1da2ce35d66a9a37ff07bfcf01a40bfe Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 14:03:39 +0200 Subject: [PATCH 214/221] adds packageManager --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8c917a64..835b00e9 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "engines": { "node": ">= 22" }, + "packageManager": "pnpm@11.5.1", "exports": { ".": { "types": "./dist/public_api.d.ts", From 603309f2144c589c174602d11b6b42ceffedacd8 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Tue, 16 Jun 2026 14:14:27 +0200 Subject: [PATCH 215/221] Update release.yml --- .github/workflows/release.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1cc6ea93..29e43016 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,6 +2,14 @@ on: release: types: [published] +permissions: + # Required for OIDC publishing + id-token: write + contents: read + +env: + INTEGRATION_ENVIRONMENT_ID: ${{ secrets.INTEGRATION_ENVIRONMENT_ID }} + name: publish-to-npm jobs: publish: @@ -18,12 +26,10 @@ jobs: cache: 'pnpm' - run: pnpm install --frozen-lockfile + - run: pnpm run build + - run: pnpm run test - run: pnpm publish --access=public --no-git-checks if: ${{!github.event.release.prerelease}} - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} - - run: pnpm publish --tag prerelease --no-git-checks + - run: pnpm publish --tag prerelease --access=public --no-git-checks if: ${{github.event.release.prerelease}} - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} \ No newline at end of file From 146f9b1d629330f2d337c25e418eea03a5734f54 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 17 Jun 2026 13:54:47 +0200 Subject: [PATCH 216/221] Adds snippet support --- .../models/content-item.models.ts | 10 ++++++++++ package.json | 2 +- sample/sample-schema.ts | 18 +++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/queries/content-items/models/content-item.models.ts b/lib/queries/content-items/models/content-item.models.ts index 87813aef..b5e7728c 100644 --- a/lib/queries/content-items/models/content-item.models.ts +++ b/lib/queries/content-items/models/content-item.models.ts @@ -21,6 +21,16 @@ export type ContentItemSystem> >; +export type SnippetOf< + TSchema extends DeliveryClientSchema, + TTypeCodename extends ContentTypeCodenameOf, + TElements extends { + readonly [Codename in keyof TElements]: Codename extends ElementCodenamesOf + ? ContentItemElementPayload + : never; + }, +> = ContentItemOf; + export type ContentItemOf< TSchema extends DeliveryClientSchema, TTypeCodename extends ContentTypeCodenameOf, diff --git a/package.json b/package.json index 835b00e9..d63f5400 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "engines": { "node": ">= 22" }, - "packageManager": "pnpm@11.5.1", + "packageManager": "pnpm@11.7.0", "exports": { ".": { "types": "./dist/public_api.d.ts", diff --git a/sample/sample-schema.ts b/sample/sample-schema.ts index 6f102ab6..645a76e0 100644 --- a/sample/sample-schema.ts +++ b/sample/sample-schema.ts @@ -26,6 +26,7 @@ import type { FetchContentItemResponse, TaxonomyPayload, } from "../lib/public_api.js"; +import type { SnippetOf } from "../lib/queries/content-items/models/content-item.models.js"; /** * 1. Schema declaration @@ -57,14 +58,19 @@ export type SampleProjectSchema = DeliveryClientSchema<{ "url_slug", "custom_id", "actors", + "metadata__internal_id", ]; - readonly actor: readonly ["first_name", "last_name", "role", "relatedActors"]; + readonly actor: readonly ["first_name", "last_name", "role", "relatedActors", "metadata__internal_id"]; }; readonly collectionCodenames: readonly ["movies", "tv-shows"]; readonly workflowCodenames: readonly ["published", "draft"]; readonly workflowStepCodenames: readonly ["published", "draft"]; }>; +export type MetadataElements = { + readonly metadata__internal_id: Elements.Text; +}; + /** * 2. Content type: Actor * @@ -78,7 +84,7 @@ export type ActorElements = { readonly last_name: Elements.Text; readonly role: Elements.MultipleChoice<"opt1" | "opt2" | "opt3">; readonly relatedActors: Elements.LinkedItems; -}; +} & MetadataElements; // Fully-typed Actor item payload (system metadata + elements). export type Actor = ContentItemOf; @@ -101,7 +107,7 @@ export type MovieElements = { readonly url_slug: Elements.UrlSlug; readonly custom_id: Elements.Custom; readonly actors: Elements.LinkedItems; -}; +} & MetadataElements; // Fully-typed Movie item payload. export type Movie = ContentItemOf; @@ -231,3 +237,9 @@ export async function typedContentTypeElement(): Promise { function isMovie(item: ContentItemPayload): item is Movie { return item.system.codename === ("movie" as keyof SampleProjectSchema["contentTypes"]); } + +function isMetadata( + item: ContentItemPayload, +): item is SnippetOf { + return ["actor", "movie"].includes(item.system.type); +} From be91994ca9dbca29574a8019d451f21ca782cd90 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 17 Jun 2026 15:17:21 +0200 Subject: [PATCH 217/221] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d63f5400..d45ed6d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kontent-ai/delivery-sdk", - "version": "17.0.0-preview.0", + "version": "17.0.0-preview.1", "repository": { "type": "git", "url": "https://github.com/kontent-ai/delivery-sdk-js" From bb5566b01b459a6384391a698601cf57bd7fdd0f Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 17 Jun 2026 15:20:02 +0200 Subject: [PATCH 218/221] Update public_api.ts --- lib/public_api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/public_api.ts b/lib/public_api.ts index 7ce62a67..b6a124ad 100644 --- a/lib/public_api.ts +++ b/lib/public_api.ts @@ -51,6 +51,7 @@ export type { ItemsReferencingAssetPayload, ItemsReferencingItemPayload, ListContentItemsPayload, + SnippetOf, } from "./queries/content-items/models/content-item.models.js"; export type { ContentItemElementPayload } from "./queries/content-items/models/element.models.js"; export type * as Elements from "./queries/content-items/models/element-types.js"; From 0e8f484dd37a356707543b0bec23bea44f8ba3a7 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Wed, 17 Jun 2026 15:20:12 +0200 Subject: [PATCH 219/221] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d45ed6d9..57178c8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kontent-ai/delivery-sdk", - "version": "17.0.0-preview.1", + "version": "17.0.0-preview.2", "repository": { "type": "git", "url": "https://github.com/kontent-ai/delivery-sdk-js" From 8a4966b8bcd3d4b70f5cc34b14a3fd6ea9f80c29 Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Jul 2026 09:21:23 +0200 Subject: [PATCH 220/221] Encodes path params --- .../content-items/fetch-content-item-query.ts | 2 +- .../items-referencing-asset-query.ts | 2 +- .../items-referencing-item-query.ts | 2 +- .../fetch-content-type-element-query.ts | 2 +- .../content-types/fetch-content-type-query.ts | 2 +- .../taxonomies/fetch-taxonomy-query.ts | 2 +- tests/unit/queries/path-encoding.spec.ts | 81 +++++++++++++++++++ 7 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 tests/unit/queries/path-encoding.spec.ts diff --git a/lib/queries/content-items/fetch-content-item-query.ts b/lib/queries/content-items/fetch-content-item-query.ts index 9bd5e334..ca8d4041 100644 --- a/lib/queries/content-items/fetch-content-item-query.ts +++ b/lib/queries/content-items/fetch-content-item-query.ts @@ -54,7 +54,7 @@ export function fetchContentItemQuery( config, request, schema: async () => (await import("./schemas/content-item.schemas.js")).fetchContentItemSchema(), - endpoint: `items/${request.codename}`, + endpoint: `items/${encodeURIComponent(request.codename)}`, }); const extendedQuery = transformDeliveryFetchQuery({ config, diff --git a/lib/queries/content-items/items-referencing-asset-query.ts b/lib/queries/content-items/items-referencing-asset-query.ts index c790bbca..4c531978 100644 --- a/lib/queries/content-items/items-referencing-asset-query.ts +++ b/lib/queries/content-items/items-referencing-asset-query.ts @@ -38,6 +38,6 @@ export function itemsReferencingAssetQuery config, request, schema: async () => (await import("./schemas/content-item.schemas.js")).itemsReferencingAssetSchema(), - endpoint: `assets/${request.codename}/used-in`, + endpoint: `assets/${encodeURIComponent(request.codename)}/used-in`, }); } diff --git a/lib/queries/content-items/items-referencing-item-query.ts b/lib/queries/content-items/items-referencing-item-query.ts index e6f10433..6a385e15 100644 --- a/lib/queries/content-items/items-referencing-item-query.ts +++ b/lib/queries/content-items/items-referencing-item-query.ts @@ -38,6 +38,6 @@ export function itemsReferencingItemQuery( config, request, schema: async () => (await import("./schemas/content-item.schemas.js")).itemsReferencingItemSchema(), - endpoint: `items/${request.codename}/used-in`, + endpoint: `items/${encodeURIComponent(request.codename)}/used-in`, }); } diff --git a/lib/queries/content-types/fetch-content-type-element-query.ts b/lib/queries/content-types/fetch-content-type-element-query.ts index 07f27e40..4235ba7f 100644 --- a/lib/queries/content-types/fetch-content-type-element-query.ts +++ b/lib/queries/content-types/fetch-content-type-element-query.ts @@ -27,6 +27,6 @@ export function fetchContentTypeElementQuery (await import("./schemas/content-type.schemas.js")).contentTypeElementSchema(), - endpoint: `types/${request.typeCodename}/elements/${request.elementCodename}`, + endpoint: `types/${encodeURIComponent(request.typeCodename)}/elements/${encodeURIComponent(request.elementCodename)}`, }); } diff --git a/lib/queries/content-types/fetch-content-type-query.ts b/lib/queries/content-types/fetch-content-type-query.ts index 4f54c9bc..db6bc80e 100644 --- a/lib/queries/content-types/fetch-content-type-query.ts +++ b/lib/queries/content-types/fetch-content-type-query.ts @@ -33,6 +33,6 @@ export function fetchContentTypeQuery (await import("./schemas/content-type.schemas.js")).contentTypeSchema(), - endpoint: `types/${request.codename}`, + endpoint: `types/${encodeURIComponent(request.codename)}`, }); } diff --git a/lib/queries/taxonomies/fetch-taxonomy-query.ts b/lib/queries/taxonomies/fetch-taxonomy-query.ts index 95b09958..c1b584b7 100644 --- a/lib/queries/taxonomies/fetch-taxonomy-query.ts +++ b/lib/queries/taxonomies/fetch-taxonomy-query.ts @@ -28,6 +28,6 @@ export function fetchTaxonomyQuery (await import("./schemas/taxonomy.schemas.js")).taxonomySchema>(), - endpoint: `taxonomies/${request.codename}`, + endpoint: `taxonomies/${encodeURIComponent(request.codename)}`, }); } diff --git a/tests/unit/queries/path-encoding.spec.ts b/tests/unit/queries/path-encoding.spec.ts new file mode 100644 index 00000000..80f9ed00 --- /dev/null +++ b/tests/unit/queries/path-encoding.spec.ts @@ -0,0 +1,81 @@ +import { describe, expect, it } from "vitest"; +import type { DeliveryClientConfig } from "../../../lib/models/core.models.js"; +import { fetchContentItemQuery } from "../../../lib/queries/content-items/fetch-content-item-query.js"; +import { itemsReferencingAssetQuery } from "../../../lib/queries/content-items/items-referencing-asset-query.js"; +import { itemsReferencingItemQuery } from "../../../lib/queries/content-items/items-referencing-item-query.js"; +import { fetchContentTypeElementQuery } from "../../../lib/queries/content-types/fetch-content-type-element-query.js"; +import { fetchContentTypeQuery } from "../../../lib/queries/content-types/fetch-content-type-query.js"; +import { fetchTaxonomyQuery } from "../../../lib/queries/taxonomies/fetch-taxonomy-query.js"; +import { unitEnvironmentId } from "../../utils/test.utils.js"; + +const clientConfig: DeliveryClientConfig = { + apiMode: "public", + environmentId: unitEnvironmentId, +}; + +// A codename crafted to break out of its path segment and inject a new query if left unencoded. +const maliciousCodename = "my item/../x?a=1#f"; +const encodedCodename = encodeURIComponent(maliciousCodename); + +describe("URL path segment encoding", () => { + it("encodes the encoded segment so reserved characters are escaped", () => { + // Sanity check on the expectation itself. + expect(encodedCodename).toBe("my%20item%2F..%2Fx%3Fa%3D1%23f"); + expect(encodedCodename).not.toContain("/"); + expect(encodedCodename).not.toContain("?"); + expect(encodedCodename).not.toContain("#"); + }); + + it("encodes the codename in fetchContentItemQuery (items/{codename})", () => { + const url = fetchContentItemQuery(clientConfig, { codename: maliciousCodename }).inspect().data?.url?.toString() ?? ""; + + expect(url).toContain(`/items/${encodedCodename}`); + // The raw codename must not appear as a real path/query break. + expect(url).not.toContain(maliciousCodename); + // No extra segment or query smuggled in. + const { pathname, search } = new URL(url); + expect(pathname.endsWith(`/items/${encodedCodename}`)).toBe(true); + expect(search).toBe(""); + }); + + it("encodes the codename in fetchContentTypeQuery (types/{codename})", () => { + const url = fetchContentTypeQuery(clientConfig, { codename: maliciousCodename }).inspect().data?.url?.toString() ?? ""; + + expect(url).toContain(`/types/${encodedCodename}`); + expect(new URL(url).search).toBe(""); + }); + + it("encodes the codename in fetchTaxonomyQuery (taxonomies/{codename})", () => { + const url = fetchTaxonomyQuery(clientConfig, { codename: maliciousCodename }).inspect().data?.url?.toString() ?? ""; + + expect(url).toContain(`/taxonomies/${encodedCodename}`); + expect(new URL(url).search).toBe(""); + }); + + it("encodes the codename in itemsReferencingItemQuery (items/{codename}/used-in)", () => { + const url = itemsReferencingItemQuery(clientConfig, { codename: maliciousCodename }).inspect().data?.url?.toString() ?? ""; + + expect(url).toContain(`/items/${encodedCodename}/used-in`); + expect(new URL(url).search).toBe(""); + }); + + it("encodes the codename in itemsReferencingAssetQuery (assets/{codename}/used-in)", () => { + const url = itemsReferencingAssetQuery(clientConfig, { codename: maliciousCodename }).inspect().data?.url?.toString() ?? ""; + + expect(url).toContain(`/assets/${encodedCodename}/used-in`); + expect(new URL(url).search).toBe(""); + }); + + it("encodes both segments in fetchContentTypeElementQuery (types/{type}/elements/{element})", () => { + const url = + fetchContentTypeElementQuery(clientConfig, { + typeCodename: maliciousCodename, + elementCodename: maliciousCodename, + }) + .inspect() + .data?.url?.toString() ?? ""; + + expect(url).toContain(`/types/${encodedCodename}/elements/${encodedCodename}`); + expect(new URL(url).search).toBe(""); + }); +}); From edb78c856b4514fe76c98f943a428529e4c4bf5d Mon Sep 17 00:00:00 2001 From: Richard Sustek Date: Fri, 10 Jul 2026 09:23:16 +0200 Subject: [PATCH 221/221] updates deps --- package.json | 14 +-- pnpm-lock.yaml | 322 ++++++++++++++++++++++++------------------------- 2 files changed, 168 insertions(+), 168 deletions(-) diff --git a/package.json b/package.json index 57178c8a..77c6e6e8 100644 --- a/package.json +++ b/package.json @@ -62,13 +62,13 @@ "devDependencies": { "@kontent-ai/biome-config": "0.7.3", "@kontent-ai/eslint-config": "2.4.1", - "eslint": "10.5.0", - "@biomejs/biome": "2.5.0", - "@types/node": "25.9.3", - "vitest": "4.1.9", - "@vitest/coverage-v8": "4.1.9", - "tsx": "4.22.4", - "@typescript/native-preview": "7.0.0-dev.20260615.1", + "eslint": "10.6.0", + "@biomejs/biome": "2.5.3", + "@types/node": "26.1.1", + "vitest": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "tsx": "4.23.0", + "@typescript/native-preview": "7.0.0-dev.20260707.2", "esbuild": "0.28.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59e71771..855638ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,35 +19,35 @@ importers: version: 4.4.3 devDependencies: '@biomejs/biome': - specifier: 2.5.0 - version: 2.5.0 + specifier: 2.5.3 + version: 2.5.3 '@kontent-ai/biome-config': specifier: 0.7.3 - version: 0.7.3(@biomejs/biome@2.5.0) + version: 0.7.3(@biomejs/biome@2.5.3) '@kontent-ai/eslint-config': specifier: 2.4.1 version: 2.4.1(typescript@6.0.3) '@types/node': - specifier: 25.9.3 - version: 25.9.3 + specifier: 26.1.1 + version: 26.1.1 '@typescript/native-preview': - specifier: 7.0.0-dev.20260615.1 - version: 7.0.0-dev.20260615.1 + specifier: 7.0.0-dev.20260707.2 + version: 7.0.0-dev.20260707.2 '@vitest/coverage-v8': - specifier: 4.1.9 - version: 4.1.9(vitest@4.1.9) + specifier: 4.1.10 + version: 4.1.10(vitest@4.1.10) esbuild: specifier: 0.28.1 version: 0.28.1 eslint: - specifier: 10.5.0 - version: 10.5.0 + specifier: 10.6.0 + version: 10.6.0 tsx: - specifier: 4.22.4 - version: 4.22.4 + specifier: 4.23.0 + version: 4.23.0 vitest: - specifier: 4.1.9 - version: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + specifier: 4.1.10 + version: 4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0)) packages: @@ -72,59 +72,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@2.5.0': - resolution: {integrity: sha512-4kURkd9hAPrdDM3C9n82ycYgx8hvQcW6MjKTEejruj8rK0N8P3OPpdy8BvI8kt3KWY4ycF5XtDOrktetEfhfuw==} + '@biomejs/biome@2.5.3': + resolution: {integrity: sha512-MrJswFdei9EfDwwUy2tQrPDpK0AO+RmMFvBoaaJ6ayBc3sUbHdCE+XG5N8vp+5So41ZupZJQm0roHFFhMGVD7A==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.0': - resolution: {integrity: sha512-Mn3Fwi3SA5fgmfCPqmzpWF2DLZnms3BVAhM088nTnGrTZmHS3wwIjcoZPqpXeNgd3DrrLH6xp8vTLIBuJoZiXw==} + '@biomejs/cli-darwin-arm64@2.5.3': + resolution: {integrity: sha512-QhYP9muVQ0nUO5zztFuPbEwi4+94sJWVjaZds9aMi1l/KNZBiUjdiSUrGHsTaMGDXrYl+r4AS2sUKfgH3w+V3g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.0': - resolution: {integrity: sha512-rg3VPL5P8mYro6pqlXYXuJWph21slVp3SZtAqWSrkZs40d2gTzYmHF8E/X1iTID25btmNKltNDJ926sqVBp7DQ==} + '@biomejs/cli-darwin-x64@2.5.3': + resolution: {integrity: sha512-NC1Ss13UaW7QZX+y8j44bF7AP0jSJdBl6iRhe0MAkvaSqZy+mWg3GaXsrb+eSoHoGDBtaXWEbMVV0iVN2cZ7cQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.0': - resolution: {integrity: sha512-vQdM4oSGaf7ZNeGO9w5+Y8SBtyser9M6znxYbm7Ec8wInxJu1WiKxFYZW5Auj2d80bcVvefuGGRxoFOE0eee8g==} + '@biomejs/cli-linux-arm64-musl@2.5.3': + resolution: {integrity: sha512-fccix0w6xp6csCXgxeC0dU/3ecgRQal0y+cv2SP9ajNlhe7Yrk2Ug7UDe2j9AT9ZDYitkXpvUKgZjjuoYeP4Vg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.0': - resolution: {integrity: sha512-tl+LW8fdD96/xdeWtWwc82LIOc5CoY7N2AsogLTp5R4ECErYt+8Jl/N68ezN9vzSiqPTxw6vjcihoLPYKZHrlw==} + '@biomejs/cli-linux-arm64@2.5.3': + resolution: {integrity: sha512-ksx1KWeyYW18ILL04msF/J4ZBtBDN33znYK8Z/aNv/vlBVxL9/g3mGP+omgHJKy4+KWbK87vcmmpmurfNjSgiA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.0': - resolution: {integrity: sha512-+9hIcMngJ+yGUahXqZuZ8CoWKJE9SAZsFsM3QDvXpNsLbXZ9lqVzgBhOk/jTSYkOA0GLP9eu3teukqpLUojHMg==} + '@biomejs/cli-linux-x64-musl@2.5.3': + resolution: {integrity: sha512-O/yU9YKRUiHhmcjF2f38PSjseVk3G4VLWYc0G2HWpzdBVREV6G8IGWIVEFf7MFPfWIzNUIvPsEjeAZQIOgnLcQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.0': - resolution: {integrity: sha512-zpEGf4RQbFEh8Vt7OmavLyyOzRbtcE9osCqrS1kfvt8jDvxwhKXLSf7n0ebr/ov0RJ9ssP+lhs6C8a9WwFvrQA==} + '@biomejs/cli-linux-x64@2.5.3': + resolution: {integrity: sha512-yMkJtilsgvILDcVkh187aVLTb64xYsrxYajx5kym+r1ULkO5HUOfu9AYKLGQbOVLwJtT2utNw7hhFNg+17mUYA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.0': - resolution: {integrity: sha512-jB0wAvTLI4itx5VidqVUejPQFhRUxiZ9l9FvZ26D5fl6t3qme+ZB4PD3bTSeL1vZ8NI2Rx/zj6H9zcESuGHKGw==} + '@biomejs/cli-win32-arm64@2.5.3': + resolution: {integrity: sha512-cX5z+GYwRcqEok0AH3KSfQGgqYd0Nomfp6Fbe1uiTtELE38hdH2k842wQ9wLNaF/JJ7r4rjJQ4VR+ce+fRmQbw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.0': - resolution: {integrity: sha512-VT/lF+GId+67j8aDfLkxdxNoVApsPSTbyAtB3jJq0IWTrY77WXfbPfpngxq0bA6JCEv/7k8C9qWjDRKRznDlyw==} + '@biomejs/cli-win32-x64@2.5.3': + resolution: {integrity: sha512-ExSaJWi4/u6+GXCszlSKpWSjKNbDseAYqqkCznsCsZ/4uidZ/BEqsCc5/3ctlq6dfIubdIIRSVLC/PG9xPl70Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -525,8 +525,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@25.9.3': - resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@typescript-eslint/eslint-plugin@8.61.0': resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} @@ -587,67 +587,67 @@ packages: resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-EHrtoVGEEhIhsnGe+b8w0FoM9JfIw5SkoPwO8ifaU0PrYm2UbyPbj2I2hOTxtk458t0irvGz2+8cshylBRbKng==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-wny2pgKjGbiZtnOIHVa3tXC1UfDqxNEFzyPGmiqybedG8hipG2Nfp0l5UxbaKCjkLacUpH/W5bP2hBOMVhCOzg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-BcDA56hkk6mrUpysaOVvrdACoX5d2SF1JTwHMoNjT1KysBicExS2wlH0eN0L01iDeqtB73XHl7A4zrKFmKzrBg==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-Afc7M5zOwo+GpfcYwz5Z8HMB2tPVsui7nNIqEuuFB73MPdVqNn/Wmpe4tP4MRri0AtJnJknoHBaTJ/VDAp/Jhw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-TDAlBpyYCF7Z+ELTH+1tabDE6W3shl+H+Z+nmzaQio1I8pFvbwt2iLlE0Rc9CpRdIeaqr0ppMEgXHoeV3fZFWA==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-iITBa2WjjTI5N9t5l7Z4KoOSI+2zBlhbvFzsD/f8qX8QoKjz/Y4DPyBDgezYi8nkqjjksbgSOJ3/ykzhwrB9cg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-YRXRS/7ZqrDKXBJhFQcZiOdnHRuRbWoL/QkggpoGfhIuSAh4HvTU0WEUnPM+jRnH2kUMfsSgd8EAnPvmuP7/VA==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-hJm/UOqZTr9FHmR7uNm8VGX4oKtfWk0Jem0zPeJFNC8ckGUfSBueyiEYMZB+XmRc1aG4x1E46y3CplP4CLHvGQ==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-/QDmRWt6abB7fw3yMchjlyDXej/7Dr8mYG4wvGGf6c1hc5Il5UpDQWNHejatdeKvAu+sszz8JhTuL8et47fTTg==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-du0dzi6y97Po5vDNdPJTyyijHCpaS22JLRnKZEJXBDaO9gCIymOv/5QQokFRuOlQm0bWl3i9PF4OVdGP6uAOQA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-WTJOLoe2rxT0W1i8ndWk2MKrakxRFNki537JZxvKAmSTbyOZznHlW3O3dbryUtTBYA716DDqS3ci24kuIfvBdg==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-SsAwfhyHJ1akgBc+99z4+hwdbHsdWaKB8EwCNIMA6JfSLMeUjffrYvxu+vfMyxVtOVOz7RrRXRoiDiu4a2sCtg==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-4cSCpXG7um18nwmLdU/SjoTv3OcO38/ufTiy1oWVccgGHLJqppiOP9/o+ElKIWhvrp78IaGy8+h3YqEjQ4/pcQ==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-DL4u27stv0fo71sVhOzHSwE+YMZsbBijVI+kg5dLDLilSH79WFTJ8RSQ46vJrCMt+Gjlv/JOZP1PuLJDfioYeQ==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260615.1': - resolution: {integrity: sha512-JJ8X1l7H1GrnseK1k30qfQqB8Pz6jw3IALZVIj5oXQeRbUCe0Wx3ljkJEmOpunogdhEfA8IlOggskbUjVsXKBQ==} + '@typescript/native-preview@7.0.0-dev.20260707.2': + resolution: {integrity: sha512-oUGp+Rep/hqMhPunyinsALUwSlzHINSxitifPiSaeqoKOKD2OlR9NE3TaPqwsl4NlGslsOSUXI1JotWQzpYCPg==} engines: {node: '>=16.20.0'} hasBin: true - '@vitest/coverage-v8@4.1.9': - resolution: {integrity: sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==} + '@vitest/coverage-v8@4.1.10': + resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==} peerDependencies: - '@vitest/browser': 4.1.9 - vitest: 4.1.9 + '@vitest/browser': 4.1.10 + vitest: 4.1.10 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -657,20 +657,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -904,8 +904,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.5.0: - resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1611,8 +1611,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.0: + resolution: {integrity: sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==} engines: {node: '>=18.0.0'} hasBin: true @@ -1645,8 +1645,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1694,20 +1694,20 @@ packages: yaml: optional: true - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1789,39 +1789,39 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@2.5.0': + '@biomejs/biome@2.5.3': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.0 - '@biomejs/cli-darwin-x64': 2.5.0 - '@biomejs/cli-linux-arm64': 2.5.0 - '@biomejs/cli-linux-arm64-musl': 2.5.0 - '@biomejs/cli-linux-x64': 2.5.0 - '@biomejs/cli-linux-x64-musl': 2.5.0 - '@biomejs/cli-win32-arm64': 2.5.0 - '@biomejs/cli-win32-x64': 2.5.0 + '@biomejs/cli-darwin-arm64': 2.5.3 + '@biomejs/cli-darwin-x64': 2.5.3 + '@biomejs/cli-linux-arm64': 2.5.3 + '@biomejs/cli-linux-arm64-musl': 2.5.3 + '@biomejs/cli-linux-x64': 2.5.3 + '@biomejs/cli-linux-x64-musl': 2.5.3 + '@biomejs/cli-win32-arm64': 2.5.3 + '@biomejs/cli-win32-x64': 2.5.3 - '@biomejs/cli-darwin-arm64@2.5.0': + '@biomejs/cli-darwin-arm64@2.5.3': optional: true - '@biomejs/cli-darwin-x64@2.5.0': + '@biomejs/cli-darwin-x64@2.5.3': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.0': + '@biomejs/cli-linux-arm64-musl@2.5.3': optional: true - '@biomejs/cli-linux-arm64@2.5.0': + '@biomejs/cli-linux-arm64@2.5.3': optional: true - '@biomejs/cli-linux-x64-musl@2.5.0': + '@biomejs/cli-linux-x64-musl@2.5.3': optional: true - '@biomejs/cli-linux-x64@2.5.0': + '@biomejs/cli-linux-x64@2.5.3': optional: true - '@biomejs/cli-win32-arm64@2.5.0': + '@biomejs/cli-win32-arm64@2.5.3': optional: true - '@biomejs/cli-win32-x64@2.5.0': + '@biomejs/cli-win32-x64@2.5.3': optional: true '@emnapi/core@1.10.0': @@ -1918,9 +1918,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0)': dependencies: - eslint: 10.5.0 + eslint: 10.6.0 eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': @@ -2017,9 +2017,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kontent-ai/biome-config@0.7.3(@biomejs/biome@2.5.0)': + '@kontent-ai/biome-config@0.7.3(@biomejs/biome@2.5.3)': dependencies: - '@biomejs/biome': 2.5.0 + '@biomejs/biome': 2.5.3 '@kontent-ai/core-sdk@12.0.0-preview.40(ts-pattern@5.9.0)(zod@4.4.3)': dependencies: @@ -2029,7 +2029,7 @@ snapshots: '@kontent-ai/eslint-config@2.4.1(typescript@6.0.3)': dependencies: '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) - '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.61.0(eslint@10.6.0)(typescript@6.0.3) eslint: 9.39.4 eslint-plugin-react: 7.37.5(eslint@9.39.4) transitivePeerDependencies: @@ -2117,14 +2117,14 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@25.9.3': + '@types/node@26.1.1': dependencies: - undici-types: 7.24.6 + undici-types: 8.3.0 '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.0(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.61.0(eslint@10.6.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.61.0 '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@6.0.3) @@ -2137,14 +2137,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.0(eslint@10.5.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.61.0(eslint@10.6.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.61.0 '@typescript-eslint/types': 8.61.0 '@typescript-eslint/typescript-estree': 8.61.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.61.0 debug: 4.4.3 - eslint: 10.5.0 + eslint: 10.6.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2212,41 +2212,41 @@ snapshots: '@typescript-eslint/types': 8.61.0 eslint-visitor-keys: 5.0.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260615.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260615.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260615.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260615.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260615.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260615.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260615.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2': optional: true - '@typescript/native-preview@7.0.0-dev.20260615.1': + '@typescript/native-preview@7.0.0-dev.20260707.2': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260615.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260615.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260615.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260615.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260615.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260615.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260615.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260707.2 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260707.2 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260707.2 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260707.2 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260707.2 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260707.2 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260707.2 - '@vitest/coverage-v8@4.1.9(vitest@4.1.9)': + '@vitest/coverage-v8@4.1.10(vitest@4.1.10)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.9 + '@vitest/utils': 4.1.10 ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -2255,46 +2255,46 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + vitest: 4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0)) - '@vitest/expect@4.1.9': + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4))': + '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0))': dependencies: - '@vitest/spy': 4.1.9 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0) - '@vitest/pretty-format@4.1.9': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.9': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.9 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.9': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.9': {} + '@vitest/spy@4.1.10': {} - '@vitest/utils@4.1.9': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.9 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2665,9 +2665,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.5.0: + eslint@10.6.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.6.0 @@ -3474,7 +3474,7 @@ snapshots: tslib@2.8.1: optional: true - tsx@4.22.4: + tsx@4.23.0: dependencies: esbuild: 0.28.1 optionalDependencies: @@ -3526,13 +3526,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.24.6: {} + undici-types@8.3.0: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4): + vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3540,20 +3540,20 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.3 + '@types/node': 26.1.1 esbuild: 0.28.1 fsevents: 2.3.3 - tsx: 4.22.4 + tsx: 4.23.0 - vitest@4.1.9(@types/node@25.9.3)(@vitest/coverage-v8@4.1.9)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): + vitest@4.1.10(@types/node@26.1.1)(@vitest/coverage-v8@4.1.10)(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0)): dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -3565,11 +3565,11 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.3 - '@vitest/coverage-v8': 4.1.9(vitest@4.1.9) + '@types/node': 26.1.1 + '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) transitivePeerDependencies: - msw