diff --git a/CHANGELOG.md b/CHANGELOG.md index 764b6f7d..1bff4d94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ 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.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) diff --git a/lib/client/delivery-client.factory.ts b/lib/client/delivery-client.factory.ts index df78ebc5..861343f0 100644 --- a/lib/client/delivery-client.factory.ts +++ b/lib/client/delivery-client.factory.ts @@ -1,6 +1,9 @@ +import { ClientTypes } from '../models'; import { IDeliveryClientConfig } from '../config/delivery-configs'; import { DeliveryClient } from './delivery-client'; -export function createDeliveryClient(config: IDeliveryClientConfig): DeliveryClient { +export function createDeliveryClient( + config: IDeliveryClientConfig +): DeliveryClient { return new DeliveryClient(config); } diff --git a/lib/client/delivery-client.ts b/lib/client/delivery-client.ts index 54f8b6ec..9bcf79ac 100644 --- a/lib/client/delivery-client.ts +++ b/lib/client/delivery-client.ts @@ -1,7 +1,6 @@ import { HttpService } from '@kontent-ai/core-sdk'; - import { IDeliveryClientConfig } from '../config'; -import { IContentItem } from '../models'; +import { ClientTypes, IContentItem } from '../models'; import { ElementQuery, ItemsFeedQuery, @@ -19,9 +18,9 @@ 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; +export class DeliveryClient implements IDeliveryClient { + private queryService: QueryService; + public mappingService: IMappingService; /** * Delivery client used to fetch data from Kontent.ai @@ -49,14 +48,14 @@ export class DeliveryClient implements IDeliveryClient { /** * Gets query for multiple languages */ - languages(): LanguagesQuery { + languages(): LanguagesQuery { return new LanguagesQuery(this.config, this.queryService); } /** * Gets query for multiple types */ - types(): MultipleTypeQuery { + types(): MultipleTypeQuery { return new MultipleTypeQuery(this.config, this.queryService); } @@ -64,45 +63,53 @@ export class DeliveryClient implements IDeliveryClient { * Gets query for single type * @param {string} typeCodename - Codename of the type to fetch */ - type(typeCodename: string): SingleTypeQuery { + type(typeCodename: TClientTypes['contentTypeCodenames']): SingleTypeQuery { return new SingleTypeQuery(this.config, this.queryService, typeCodename); } /** * Gets query for multiple items */ - items(): MultipleItemsQuery { - return new MultipleItemsQuery(this.config, this.queryService); + 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); + item( + codename: string + ): SingleItemQuery { + return new SingleItemQuery(this.config, this.queryService, codename); } /** * Gets query for items feed. Executes single HTTP request only */ - itemsFeed(): ItemsFeedQuery { - return new ItemsFeedQuery(this.config, this.queryService); + 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: string): TaxonomyQuery { + 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); + taxonomies(): TaxonomiesQuery { + return new TaxonomiesQuery(this.config, this.queryService); } /** @@ -110,21 +117,24 @@ export class DeliveryClient implements IDeliveryClient { * @param {string} typeCodename - Codename of the type * @param {string} elementCodename - Codename of the element */ - element(typeCodename: string, elementCodename: string): ElementQuery { + element( + typeCodename: TClientTypes['contentTypeCodenames'], + elementCodename: TClientTypes['elementCodenames'] + ): ElementQuery { return new ElementQuery(this.config, this.queryService, typeCodename, elementCodename); } /** * Gets query for initializing sync */ - initializeSync(): InitializeSyncQuery { + initializeSync(): InitializeSyncQuery { return new InitializeSyncQuery(this.config, this.queryService); } /** * Gets query fetching delta updates of content items */ - syncChanges(): SyncChangesQuery { + syncChanges(): SyncChangesQuery { return new SyncChangesQuery(this.config, this.queryService); } } diff --git a/lib/client/idelivery-client.interface.ts b/lib/client/idelivery-client.interface.ts index c8003d9e..305bfe09 100644 --- a/lib/client/idelivery-client.interface.ts +++ b/lib/client/idelivery-client.interface.ts @@ -1,4 +1,4 @@ -import { IContentItem } from '../models'; +import { ClientTypes, IContentItem } from '../models'; import { ElementQuery, ItemsFeedQuery, @@ -14,67 +14,78 @@ import { } from '../query'; import { IMappingService } from '../services'; -export interface IDeliveryClient { +export interface IDeliveryClient { /** * Mapping service - can be used to get strongly typed responses from json result */ - mappingService: IMappingService; + mappingService: IMappingService; /** * Gets query for languages */ - languages(): LanguagesQuery; + languages(): LanguagesQuery; /** * Gets query for multiple types */ - types(): MultipleTypeQuery; + types(): MultipleTypeQuery; /** * Gets query for single type * @param {string} typeCodename - Codename of the type to retrieve */ - type(typeCodename: string): SingleTypeQuery; + type(typeCodename: TClientTypes['contentTypeCodenames']): SingleTypeQuery; /** * Gets query for multiple items */ - items(): MultipleItemsQuery; + items(): MultipleItemsQuery< + TClientTypes, + TContentItem + >; /** * Gets query for items feed. Executes single HTTP request only */ - itemsFeed(): ItemsFeedQuery; + itemsFeed(): ItemsFeedQuery< + TClientTypes, + TContentItem + >; /** * Gets query for single item * @param {string} codename - Codename of item to retrieve */ - item(codename: string): SingleItemQuery; + item( + codename: string + ): SingleItemQuery; /** * Gets query for multiple taxonomies */ - taxonomies(): TaxonomiesQuery; + taxonomies(): TaxonomiesQuery; /** * Gets query for single item * @param {string} codename - Codename of taxonomy to retrieve */ - taxonomy(codename: string): TaxonomyQuery; + taxonomy(codename: TClientTypes['taxonomyCodenames']): TaxonomyQuery; /** * Gets query for an element within a type */ - element(typeCodename: string, elementCodename: string): ElementQuery; + element( + typeCodename: TClientTypes['contentTypeCodenames'], + elementCodename: TClientTypes['elementCodenames'] + ): ElementQuery; /** * Gets query for initializing sync */ - initializeSync(): InitializeSyncQuery; + initializeSync(): InitializeSyncQuery; /** * Gets query fetching delta updates of content items */ - syncChanges(): SyncChangesQuery; + syncChanges(): SyncChangesQuery; } diff --git a/lib/mappers/element.mapper.ts b/lib/mappers/element.mapper.ts index a76b1fab..66eb5d75 100644 --- a/lib/mappers/element.mapper.ts +++ b/lib/mappers/element.mapper.ts @@ -18,19 +18,18 @@ interface IRichTextImageUrlRecord { newUrl: string; } -export class ElementMapper { +export class ElementMapper { constructor(private readonly config: IDeliveryClientConfig) {} - mapElements(data: { + mapElements(data: { dataToMap: IContentItemWithRawElements; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; processingStartedForCodenames: string[]; preparedItems: IContentItemWithRawDataContainer; - }): IMapElementsResult | undefined { + }): IMapElementsResult | undefined { // return processed item to avoid infinite recursion - const processedItem = data.processedItems[ - codenameHelper.escapeCodenameInCodenameIndexer(data.dataToMap.item.system.codename) - ] as TContentItem | undefined; + const processedItem = + data.processedItems[codenameHelper.escapeCodenameInCodenameIndexer(data.dataToMap.item.system.codename)]; if (processedItem) { // item was already resolved return { @@ -43,7 +42,8 @@ export class ElementMapper { const preparedItem = data.preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(data.dataToMap.item.system.codename)]; - const itemInstance = preparedItem?.item as TContentItem; + + const itemInstance = preparedItem?.item; if (!itemInstance) { // item is not present in response @@ -73,7 +73,7 @@ export class ElementMapper { } return { - item: itemInstance, + item: itemInstance as TContentItem, processedItems: data.processedItems, preparedItems: data.preparedItems, processingStartedForCodenames: data.processingStartedForCodenames @@ -83,7 +83,7 @@ export class ElementMapper { private mapElement(data: { elementWrapper: ElementModels.IElementWrapper; item: IContentItem; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; processingStartedForCodenames: string[]; preparedItems: IContentItemWithRawDataContainer; }): ElementModels.IElement { @@ -146,7 +146,7 @@ export class ElementMapper { private mapRichTextElement( elementWrapper: ElementModels.IElementWrapper, - processedItems: IContentItemsContainer, + processedItems: IContentItemsContainer, processingStartedForCodenames: string[], preparedItems: IContentItemWithRawDataContainer ): Elements.RichTextElement { @@ -336,7 +336,7 @@ export class ElementMapper { private mapLinkedItemsElement(data: { elementWrapper: ElementModels.IElementWrapper; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; processingStartedForCodenames: string[]; preparedItems: IContentItemWithRawDataContainer; }): Elements.LinkedItemsElement { @@ -371,7 +371,7 @@ export class ElementMapper { private getOrSaveLinkedItemForElement( codename: string, element: Contracts.IElementContract, - processedItems: IContentItemsContainer, + processedItems: IContentItemsContainer, mappingStartedForCodenames: string[], preparedItems: IContentItemWithRawDataContainer ): IContentItem | undefined { @@ -398,7 +398,7 @@ export class ElementMapper { return undefined; } - let mappedLinkedItem: IContentItem | undefined; + let mappedLinkedItem: TContentItemType | undefined; // original resolving if item is still undefined const mappedLinkedItemResult = this.mapElements({ diff --git a/lib/mappers/item.mapper.ts b/lib/mappers/item.mapper.ts index ed01ec1c..6abc259c 100644 --- a/lib/mappers/item.mapper.ts +++ b/lib/mappers/item.mapper.ts @@ -9,25 +9,34 @@ import { } from '../models'; import { ElementMapper } from './element.mapper'; -export interface IMapItemResult { +export interface IMapItemResult< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem +> { item: TContentItem; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; preparedItems: IContentItemWithRawDataContainer; processingStartedForCodenames: string[]; } -export interface IMultipleItemsMapResult { +export interface IMultipleItemsMapResult< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem +> { items: TContentItem[]; - linkedItems: IContentItemsContainer; + linkedItems: IContentItemsContainer; } -export interface ISingleItemMapResult { +export interface ISingleItemMapResult< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem +> { item: TContentItem; - linkedItems: IContentItemsContainer; + linkedItems: IContentItemsContainer; } -export class ItemMapper { - private readonly elementMapper: ElementMapper; +export class ItemMapper { + private readonly elementMapper: ElementMapper; constructor(readonly config: IDeliveryClientConfig) { this.elementMapper = new ElementMapper(config); @@ -38,9 +47,9 @@ export class ItemMapper { * @param response Response used to map the item * @param queryConfig Query configuration */ - mapSingleItemFromResponse( + mapSingleItemFromResponse( response: Contracts.IViewContentItemContract - ): ISingleItemMapResult { + ): ISingleItemMapResult { const mapResult = this.mapItems({ mainItems: [response.item], linkedItems: Object.values(response.modular_content) @@ -57,9 +66,9 @@ export class ItemMapper { * @param response Response used to map the item * @param queryConfig Query configuration */ - mapMultipleItemsFromResponse( + mapMultipleItemsFromResponse( response: Contracts.IItemsWithModularContentContract - ): IMultipleItemsMapResult { + ): IMultipleItemsMapResult { const mapResult = this.mapItems({ mainItems: response.items, linkedItems: Object.values(response.modular_content) @@ -71,15 +80,15 @@ export class ItemMapper { /** * Maps item contracts to full models */ - mapItems(data: { + mapItems(data: { mainItems: Contracts.IContentItemContract[]; linkedItems: Contracts.IContentItemContract[]; - }): IMultipleItemsMapResult { - const processedItems: IContentItemsContainer = {}; + }): IMultipleItemsMapResult { + const processedItems: IContentItemsContainer = {}; const preparedItems: IContentItemWithRawDataContainer = {}; const processingStartedForCodenames: string[] = []; const mappedMainItems: TContentItem[] = []; - const mappedLinkedItems: IContentItemsContainer = {}; + const mappedLinkedItems: IContentItemsContainer = {}; const itemsToResolve: Contracts.IContentItemContract[] = [...data.mainItems, ...data.linkedItems]; // first prepare reference for all items @@ -110,7 +119,7 @@ export class ItemMapper { processingStartedForCodenames: processingStartedForCodenames }); - mappedLinkedItems[(item.system.codename)] = itemResult.item; + mappedLinkedItems[item.system.codename] = itemResult.item; } return { @@ -122,12 +131,12 @@ export class ItemMapper { /** * Maps item contract to full model */ - private mapItem(data: { + private mapItem(data: { item: IContentItemWithRawElements; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; processingStartedForCodenames: string[]; preparedItems: IContentItemWithRawDataContainer; - }): IMapItemResult { + }): IMapItemResult { if (!data.item) { throw Error(`Could not map item because its undefined`); } diff --git a/lib/mappers/language.mapper.ts b/lib/mappers/language.mapper.ts index 5d698687..a3e17e4f 100644 --- a/lib/mappers/language.mapper.ts +++ b/lib/mappers/language.mapper.ts @@ -1,20 +1,24 @@ import { Contracts } from '../contracts'; import { ILanguage } from '../models'; -export class LanguageMapper { - mapMultipleLanguages(response: Contracts.IListLanguagesContract): ILanguage[] { +export class LanguageMapper { + mapMultipleLanguages(response: Contracts.IListLanguagesContract): ILanguage[] { return response.languages.map((language) => { return this.mapLanguage(language); }); } - private mapLanguage(language: Contracts.ILanguageContract): ILanguage { + private mapLanguage(language: Contracts.ILanguageContract): ILanguage { if (!language) { throw Error(`Cannot map language`); } return { - system: language.system + system: { + codename: language.system.codename as TLanguageCodenames, + id: language.system.id, + name: language.system.name + } }; } } diff --git a/lib/mappers/taxonomy.mapper.ts b/lib/mappers/taxonomy.mapper.ts index 68c46470..7371f5be 100644 --- a/lib/mappers/taxonomy.mapper.ts +++ b/lib/mappers/taxonomy.mapper.ts @@ -1,11 +1,11 @@ import { Contracts } from '../contracts'; import { ITaxonomyGroup, ITaxonomySystemAttributes, ITaxonomyTerms } from '../models'; -export class TaxonomyMapper { +export class TaxonomyMapper { mapTaxonomy( taxonomySystem: Contracts.ITaxonomySystemAttributesContract, taxonomyTerms: Contracts.ITaxonomyTermsContract[] - ): ITaxonomyGroup { + ): ITaxonomyGroup { if (!taxonomySystem) { throw Error(`Cannot map taxonomy due to missing 'system' property`); } @@ -18,9 +18,9 @@ export class TaxonomyMapper { throw Error(`Cannot map terms because no terms array was provided`); } - const mappedSystemAttributes: ITaxonomySystemAttributes = { + const mappedSystemAttributes: ITaxonomySystemAttributes = { name: taxonomySystem.name, - codename: taxonomySystem.codename, + codename: taxonomySystem.codename as TaxonomyCodenames, id: taxonomySystem.id, lastModified: taxonomySystem.last_modified }; @@ -33,7 +33,7 @@ export class TaxonomyMapper { }; } - mapTaxonomies(taxonomies: Contracts.ITaxonomyGroupContract[]): ITaxonomyGroup[] { + mapTaxonomies(taxonomies: Contracts.ITaxonomyGroupContract[]): ITaxonomyGroup[] { if (!taxonomies) { throw Error(`Cannot map taxonomy due to missing 'taxonomies' property`); } @@ -42,7 +42,7 @@ export class TaxonomyMapper { throw Error(`Cannot map taxonomies because the 'taxonomies' property is not an array `); } - const mappedTaxonomies: ITaxonomyGroup[] = []; + const mappedTaxonomies: ITaxonomyGroup[] = []; taxonomies.forEach((taxonomy) => { mappedTaxonomies.push(this.mapTaxonomy(taxonomy.system, taxonomy.terms)); diff --git a/lib/mappers/type.mapper.ts b/lib/mappers/type.mapper.ts index 6cdc4266..75bdc12a 100644 --- a/lib/mappers/type.mapper.ts +++ b/lib/mappers/type.mapper.ts @@ -1,18 +1,18 @@ import { Contracts } from '../contracts'; import { IContentType, IContentTypeSystemAttributes, IGenericElement } from '../models'; -export class TypeMapper { - mapSingleType(response: Contracts.IViewContentTypeContract): IContentType { +export class TypeMapper { + mapSingleType(response: Contracts.IViewContentTypeContract): IContentType { return this.mapType(response); } - mapMultipleTypes(response: Contracts.IListContentTypeContract): IContentType[] { + mapMultipleTypes(response: Contracts.IListContentTypeContract): IContentType[] { return response.types.map((type) => { return this.mapType(type); }); } - private mapType(type: Contracts.IContentTypeContract): IContentType { + private mapType(type: Contracts.IContentTypeContract): IContentType { if (!type) { throw Error(`Cannot map type`); } @@ -21,8 +21,8 @@ export class TypeMapper { throw Error(`Cannot map type elements`); } - const system: IContentTypeSystemAttributes = { - codename: type.system.codename, + const system: IContentTypeSystemAttributes = { + codename: type.system.codename as TContentTypeCodenames, id: type.system.id, name: type.system.name, lastModified: type.system.last_modified diff --git a/lib/models/content-type-models.ts b/lib/models/content-type-models.ts index 68762e18..6a88fff7 100644 --- a/lib/models/content-type-models.ts +++ b/lib/models/content-type-models.ts @@ -1,7 +1,7 @@ import { IQueryConfig } from './common/common-models'; import { IGenericElement } from './element-models'; -export interface IContentTypeSystemAttributes { +export interface IContentTypeSystemAttributes { /** * Id of the type */ @@ -15,7 +15,7 @@ export interface IContentTypeSystemAttributes { /** * Codename of the type */ - codename: string; + codename: TContentTypeCodename; /** * Date of last modification @@ -23,11 +23,11 @@ export interface IContentTypeSystemAttributes { lastModified: Date; } -export interface IContentType { +export interface IContentType { /** * Content type system attributes */ - system: IContentTypeSystemAttributes; + system: IContentTypeSystemAttributes; /** * Elements (elements) assigned to content type diff --git a/lib/models/item-models.ts b/lib/models/item-models.ts index 9ba2fa30..9ea6137f 100644 --- a/lib/models/item-models.ts +++ b/lib/models/item-models.ts @@ -2,9 +2,12 @@ import { Contracts } from '../contracts'; import { ElementModels } from '../elements/element-models'; import { IQueryConfig } from './common/common-models'; -export interface IMapElementsResult { +export interface IMapElementsResult< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem +> { item: TContentItem; - processedItems: IContentItemsContainer; + processedItems: IContentItemsContainer; preparedItems: IContentItemWithRawDataContainer; processingStartedForCodenames: string[]; } @@ -145,8 +148,8 @@ export interface IContentItemWithRawDataContainer { [key: string]: IContentItemWithRawElements; } -export interface IContentItemsContainer { - [key: string]: IContentItem; +export interface IContentItemsContainer { + [key: string]: TContentItem | undefined; } export interface IRichTextImage { @@ -162,3 +165,14 @@ export interface IItemQueryConfig extends IQueryConfig {} export interface IItemFeedQueryConfig extends IQueryConfig { disableItemLinking?: boolean; } + +export type ClientTypes = { + readonly contentItemType: IContentItem; + readonly contentTypeCodenames: string; + readonly workflowCodenames: string; + readonly worfklowStepCodenames: string; + readonly collectionCodenames: string; + readonly taxonomyCodenames: string; + readonly languageCodenames: string; + readonly elementCodenames: string; +}; diff --git a/lib/models/language-models.ts b/lib/models/language-models.ts index 19b6efe6..7736c90c 100644 --- a/lib/models/language-models.ts +++ b/lib/models/language-models.ts @@ -1,13 +1,13 @@ import { IQueryConfig } from './common'; -export interface ILanguageSystem { +export interface ILanguageSystem { id: string; name: string; - codename: string; + codename: TLanguageCodenames; } -export interface ILanguage { - system: ILanguageSystem; +export interface ILanguage { + system: ILanguageSystem; } export interface ILanguagesQueryConfig extends IQueryConfig { diff --git a/lib/models/responses.ts b/lib/models/responses.ts index 7f5917fe..2e60278e 100644 --- a/lib/models/responses.ts +++ b/lib/models/responses.ts @@ -10,61 +10,76 @@ import { IContentItemDelta } from './sync-models'; import { ITaxonomyGroup } from './taxonomy-models'; export namespace Responses { - export interface IListContentTypesResponse extends IKontentListResponse { - items: IContentType[]; + export interface IListContentTypesResponse extends IKontentListResponse { + items: IContentType[]; pagination: IPagination; } - export interface IListContentTypesAllResponse extends IKontentListAllResponse { - items: IContentType[]; - responses: IDeliveryNetworkResponse[]; + export interface IListContentTypesAllResponse extends IKontentListAllResponse { + items: IContentType[]; + responses: IDeliveryNetworkResponse< + IListContentTypesResponse, + Contracts.IListContentTypeContract + >[]; } - export interface IViewContentTypeResponse extends IKontentResponse { - type: IContentType; + export interface IViewContentTypeResponse extends IKontentResponse { + type: IContentType; } - export interface IViewContentTypeElementResponse extends IKontentResponse { - codename?: string, - type: string, + codename?: string; + type: string; name: string; - taxonomyGroup?: string + taxonomyGroup?: string; options: IGenericElementOption[]; } - export interface IListItemsFeedResponse - extends IKontentListResponse { + export interface IListItemsFeedResponse< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem + > extends IKontentListResponse { items: TContentItem[]; - linkedItems: IContentItemsContainer; + linkedItems: IContentItemsContainer; } - export interface IListItemsFeedAllResponse - extends IKontentListAllResponse { + export interface IListItemsFeedAllResponse< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem + > extends IKontentListAllResponse { items: TContentItem[]; - responses: IDeliveryNetworkResponse, Contracts.IItemsFeedContract>[]; + responses: IDeliveryNetworkResponse< + IListItemsFeedResponse, + Contracts.IItemsFeedContract + >[]; } - export interface IListContentItemsResponse - extends IKontentListResponse { + export interface IListContentItemsResponse< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem + > extends IKontentListResponse { items: TContentItem[]; pagination: IPagination; - linkedItems: IContentItemsContainer; + linkedItems: IContentItemsContainer; } - export interface IListContentItemsAllResponse - extends IKontentListAllResponse { + export interface IListContentItemsAllResponse< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem + > extends IKontentListAllResponse { items: TContentItem[]; responses: IDeliveryNetworkResponse< - IListContentItemsResponse, + IListContentItemsResponse, Contracts.IListContentItemsContract >[]; } - export interface IViewContentItemResponse - extends IKontentResponse { + export interface IViewContentItemResponse< + TContentItem extends IContentItem = IContentItem, + TLinkedItemType extends IContentItem = IContentItem + > extends IKontentResponse { item: TContentItem; - linkedItems: IContentItemsContainer; + linkedItems: IContentItemsContainer; } export interface IInitializeSyncResponse extends IKontentResponse { @@ -80,27 +95,33 @@ export namespace Responses { responses: IDeliveryNetworkResponse[]; } - export interface IListLanguagesResponse extends IKontentListResponse { - items: ILanguage[]; + export interface IListLanguagesResponse extends IKontentListResponse { + items: ILanguage[]; pagination: IPagination; } - export interface IListLanguagesAllResponse extends IKontentListAllResponse { - items: ILanguage[]; - responses: IDeliveryNetworkResponse[]; + export interface IListLanguagesAllResponse extends IKontentListAllResponse { + items: ILanguage[]; + responses: IDeliveryNetworkResponse< + IListLanguagesResponse, + Contracts.IListLanguagesContract + >[]; } - export interface IViewTaxonomyResponse extends IKontentResponse { - taxonomy: ITaxonomyGroup; + export interface IViewTaxonomyResponse extends IKontentResponse { + taxonomy: ITaxonomyGroup; } - export interface IListTaxonomiesResponse extends IKontentListResponse { - items: ITaxonomyGroup[]; + export interface IListTaxonomiesResponse extends IKontentListResponse { + items: ITaxonomyGroup[]; pagination: IPagination; } - export interface IListTaxonomiesAllResponse extends IKontentListAllResponse { - items: ITaxonomyGroup[]; - responses: IDeliveryNetworkResponse[]; + export interface IListTaxonomiesAllResponse extends IKontentListAllResponse { + items: ITaxonomyGroup[]; + responses: IDeliveryNetworkResponse< + IListTaxonomiesResponse, + Contracts.IListTaxonomyGroupsContract + >[]; } } diff --git a/lib/models/taxonomy-models.ts b/lib/models/taxonomy-models.ts index 8fb8be2f..ff6c67a4 100644 --- a/lib/models/taxonomy-models.ts +++ b/lib/models/taxonomy-models.ts @@ -1,14 +1,14 @@ import { IQueryConfig } from './common/common-models'; -export interface ITaxonomyGroup { - system: ITaxonomySystemAttributes; +export interface ITaxonomyGroup { + system: ITaxonomySystemAttributes; terms: ITaxonomyTerms[]; } -export interface ITaxonomySystemAttributes { +export interface ITaxonomySystemAttributes { id: string; name: string; - codename: string; + codename: TaxonomyCodename; lastModified: Date; } diff --git a/lib/query/common/base-item-listing-query.class.ts b/lib/query/common/base-item-listing-query.class.ts index 062d2d9b..5ab31f3c 100644 --- a/lib/query/common/base-item-listing-query.class.ts +++ b/lib/query/common/base-item-listing-query.class.ts @@ -1,5 +1,6 @@ import { IDeliveryClientConfig } from '../../config'; import { + ClientTypes, Filters, IKontentListAllResponse, IKontentListResponse, @@ -11,12 +12,13 @@ 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) { +> extends BaseListingQuery { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } diff --git a/lib/query/common/base-listing-query.class.ts b/lib/query/common/base-listing-query.class.ts index d0aba64a..f2e1c260 100644 --- a/lib/query/common/base-listing-query.class.ts +++ b/lib/query/common/base-listing-query.class.ts @@ -8,18 +8,20 @@ import { IDeliveryNetworkResponse, IListAllQueryConfig, IQueryConfig, - IContentItem + IContentItem, + ClientTypes } from '../../models'; import { QueryService } from '../../services'; import { BaseQuery } from './base-query.class'; export abstract class BaseListingQuery< + TClientTypes extends ClientTypes, TResponse extends IKontentListResponse, TAllResponse extends IKontentListAllResponse, TQueryConfig extends IQueryConfig, TContract -> extends BaseQuery { - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { +> extends BaseQuery { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } diff --git a/lib/query/common/base-query.class.ts b/lib/query/common/base-query.class.ts index 2bc43aa0..a435182b 100644 --- a/lib/query/common/base-query.class.ts +++ b/lib/query/common/base-query.class.ts @@ -1,14 +1,26 @@ import { IHeader, IQueryParameter } from '@kontent-ai/core-sdk'; import { IDeliveryClientConfig } from '../../config'; -import { Filters, IDeliveryNetworkResponse, IKontentResponse, IQueryConfig, Parameters } from '../../models'; +import { + ClientTypes, + Filters, + IDeliveryNetworkResponse, + IKontentResponse, + IQueryConfig, + Parameters +} from '../../models'; import { QueryService } from '../../services'; -export abstract class BaseQuery { +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) {} + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) {} /** * Gets URL of the query diff --git a/lib/query/element/element-query.class.ts b/lib/query/element/element-query.class.ts index 311a6c5b..a67d05b7 100644 --- a/lib/query/element/element-query.class.ts +++ b/lib/query/element/element-query.class.ts @@ -1,20 +1,20 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { Responses, IElementQueryConfig, IDeliveryNetworkResponse } from '../../models'; +import { Responses, IElementQueryConfig, IDeliveryNetworkResponse, ClientTypes } from '../../models'; import { QueryService } from '../../services'; import { BaseQuery } from '../common/base-query.class'; -export class ElementQuery extends BaseQuery< +export class ElementQuery extends BaseQuery< + TClientTypes, Responses.IViewContentTypeElementResponse, IElementQueryConfig, Contracts.IViewContentTypeElementContract > { - protected _queryConfig: IElementQueryConfig = {}; constructor( protected config: IDeliveryClientConfig, - protected queryService: QueryService, + protected queryService: QueryService, private typeCodename: string, private elementCodename: string ) { @@ -30,10 +30,7 @@ export class ElementQuery extends BaseQuery< } toPromise(): Promise< - IDeliveryNetworkResponse< - Responses.IViewContentTypeElementResponse, - Contracts.IViewContentTypeElementContract - > + IDeliveryNetworkResponse > { return this.queryService.getElementAsync(this.getUrl(), this._queryConfig ?? {}); } diff --git a/lib/query/item/multiple-items-query.class.ts b/lib/query/item/multiple-items-query.class.ts index 13db355a..a5ad925d 100644 --- a/lib/query/item/multiple-items-query.class.ts +++ b/lib/query/item/multiple-items-query.class.ts @@ -1,18 +1,30 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { Filters, IContentItem, IItemQueryConfig, IDeliveryNetworkResponse, Responses, Parameters } from '../../models'; +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 extends BaseItemListingQuery< - Responses.IListContentItemsResponse, - Responses.IListContentItemsAllResponse, +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) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } @@ -30,7 +42,7 @@ export class MultipleItemsQuery, Contracts.IListContentItemsContract> + IDeliveryNetworkResponse< + Responses.IListContentItemsResponse, + Contracts.IListContentItemsContract + > > { return this.queryService.getMultipleItems(this.getUrl(), this._queryConfig ?? {}); } @@ -118,17 +133,17 @@ export class MultipleItemsQuery { + map(json: any): Responses.IListContentItemsResponse { return this.queryService.mappingService.listContentItemsResponse(json); } protected allResponseFactory( items: any[], responses: IDeliveryNetworkResponse< - Responses.IListContentItemsResponse, + Responses.IListContentItemsResponse, Contracts.IListContentItemsContract >[] - ): Responses.IListContentItemsAllResponse { + ): Responses.IListContentItemsAllResponse { this.linkItems(items, responses); return { @@ -140,7 +155,7 @@ export class MultipleItemsQuery, + Responses.IListContentItemsResponse, Contracts.IListContentItemsContract >[] ): void { @@ -149,7 +164,11 @@ export class MultipleItemsQuery m !== undefined) + .map((m) => m as TClientTypes['contentItemType']) + ); } // add standard items diff --git a/lib/query/item/single-item-query.class.ts b/lib/query/item/single-item-query.class.ts index 7d2ac74d..c00be6c2 100644 --- a/lib/query/item/single-item-query.class.ts +++ b/lib/query/item/single-item-query.class.ts @@ -1,11 +1,22 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { IContentItem, IItemQueryConfig, IDeliveryNetworkResponse, Responses, Parameters } from '../../models'; +import { + IContentItem, + IItemQueryConfig, + IDeliveryNetworkResponse, + Responses, + Parameters, + ClientTypes +} from '../../models'; import { QueryService } from '../../services'; import { BaseQuery } from '../common/base-query.class'; -export class SingleItemQuery extends BaseQuery< - Responses.IViewContentItemResponse, +export class SingleItemQuery< + TClientTypes extends ClientTypes, + TContentItem extends IContentItem = IContentItem +> extends BaseQuery< + TClientTypes, + Responses.IViewContentItemResponse, IItemQueryConfig, Contracts.IViewContentItemContract > { @@ -13,7 +24,7 @@ export class SingleItemQuery e constructor( protected config: IDeliveryClientConfig, - protected queryService: QueryService, + protected queryService: QueryService, private codename: string ) { super(config, queryService); @@ -45,7 +56,7 @@ export class SingleItemQuery e * Language codename * @param languageCodename Codename of the language */ - languageParameter(languageCodename: string): this { + languageParameter(languageCodename: TClientTypes['languageCodenames']): this { this.parameters.push(new Parameters.LanguageParameter(languageCodename)); return this; } @@ -54,7 +65,7 @@ export class SingleItemQuery e * Used to limit the number of elements returned by query. * @param elementCodenames Array of element codenames to fetch */ - elementsParameter(elementCodenames: string[]): this { + elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); return this; } @@ -63,13 +74,16 @@ export class SingleItemQuery e * Used to exclude elements returned by query. * @param elementCodenames Array of element codenames to exclude */ - excludeElementsParameter(elementCodenames: string[]): this { + excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); return this; } toPromise(): Promise< - IDeliveryNetworkResponse, Contracts.IViewContentItemContract> + IDeliveryNetworkResponse< + Responses.IViewContentItemResponse, + Contracts.IViewContentItemContract + > > { return this.queryService.getSingleItemAsync(this.getUrl(), this._queryConfig ?? {}); } @@ -86,7 +100,7 @@ export class SingleItemQuery e return super.resolveUrlInternal(action); } - map(json: any): Responses.IViewContentItemResponse { + map(json: any): Responses.IViewContentItemResponse { return this.queryService.mappingService.viewContentItemResponse(json); } } diff --git a/lib/query/items-feed/items-feed-query.class.ts b/lib/query/items-feed/items-feed-query.class.ts index b37d54ef..3395084e 100644 --- a/lib/query/items-feed/items-feed-query.class.ts +++ b/lib/query/items-feed/items-feed-query.class.ts @@ -6,20 +6,25 @@ import { IDeliveryNetworkResponse, Parameters, Responses, - IItemFeedQueryConfig + IItemFeedQueryConfig, + ClientTypes } from '../../models'; import { QueryService } from '../../services'; import { BaseItemListingQuery } from '../common/base-item-listing-query.class'; -export class ItemsFeedQuery extends BaseItemListingQuery< - Responses.IListItemsFeedResponse, - Responses.IListItemsFeedAllResponse, +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) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } @@ -89,7 +94,10 @@ export class ItemsFeedQuery ex } toPromise(): Promise< - IDeliveryNetworkResponse, Contracts.IItemsFeedContract> + IDeliveryNetworkResponse< + Responses.IListItemsFeedResponse, + Contracts.IItemsFeedContract + > > { return this.queryService.getItemsFeed(this.getUrl(), this._queryConfig ?? {}); } @@ -115,17 +123,17 @@ export class ItemsFeedQuery ex return this; } - map(json: any): Responses.IListItemsFeedResponse { + map(json: any): Responses.IListItemsFeedResponse { return this.queryService.mappingService.itemsFeedResponse(json); } protected allResponseFactory( items: TContentItem[], responses: IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, + Responses.IListItemsFeedResponse, Contracts.IItemsFeedContract >[] - ): Responses.IListItemsFeedAllResponse { + ): Responses.IListItemsFeedAllResponse { if (this.canLinkItems()) { this.linkFeedItems(items, responses); } @@ -139,7 +147,7 @@ export class ItemsFeedQuery ex private linkFeedItems( items: TContentItem[], responses: IDeliveryNetworkResponse< - Responses.IListItemsFeedResponse, + Responses.IListItemsFeedResponse, Contracts.IItemsFeedContract >[] ): void { @@ -148,7 +156,11 @@ export class ItemsFeedQuery ex // process linked items (modular_content part of the response) for (const response of responses) { - allAvailableContentItems.push(...Object.values(response.data.linkedItems)); + allAvailableContentItems.push( + ...Object.values(response.data.linkedItems) + .filter((m) => m !== undefined) + .map((m) => m as TClientTypes['contentItemType']) + ); } // add standard items diff --git a/lib/query/language/languages-query.class.ts b/lib/query/language/languages-query.class.ts index db8ee03a..55ecbc49 100644 --- a/lib/query/language/languages-query.class.ts +++ b/lib/query/language/languages-query.class.ts @@ -1,17 +1,13 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { - IDeliveryNetworkResponse, - ILanguagesQueryConfig, - Parameters, - Responses -} from '../../models'; +import { ClientTypes, IDeliveryNetworkResponse, ILanguagesQueryConfig, Parameters, Responses } from '../../models'; import { QueryService } from '../../services'; import { BaseListingQuery } from '../common/base-listing-query.class'; -export class LanguagesQuery extends BaseListingQuery< - Responses.IListLanguagesResponse, - Responses.IListLanguagesAllResponse, +export class LanguagesQuery extends BaseListingQuery< + TClientTypes, + Responses.IListLanguagesResponse, + Responses.IListLanguagesAllResponse, ILanguagesQueryConfig, Contracts.IListLanguagesContract > { @@ -22,7 +18,7 @@ export class LanguagesQuery extends BaseListingQuery< protected _queryConfig: ILanguagesQueryConfig = {}; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } @@ -45,7 +41,10 @@ export class LanguagesQuery extends BaseListingQuery< } toPromise(): Promise< - IDeliveryNetworkResponse + IDeliveryNetworkResponse< + Responses.IListLanguagesResponse, + Contracts.IListLanguagesContract + > > { return this.queryService.getLanguages(this.getUrl(), this._queryConfig ?? {}); } @@ -65,14 +64,17 @@ export class LanguagesQuery extends BaseListingQuery< return this; } - map(json: any): Responses.IListLanguagesResponse { + map(json: any): Responses.IListLanguagesResponse { return this.queryService.mappingService.listLanguagesResponse(json); } protected allResponseFactory( items: any[], - responses: IDeliveryNetworkResponse[] - ): Responses.IListLanguagesAllResponse { + responses: IDeliveryNetworkResponse< + Responses.IListLanguagesResponse, + Contracts.IListLanguagesContract + >[] + ): Responses.IListLanguagesAllResponse { return { items: items, responses: responses diff --git a/lib/query/sync/initialize-sync-query.class.ts b/lib/query/sync/initialize-sync-query.class.ts index 5f81dc23..100742e1 100644 --- a/lib/query/sync/initialize-sync-query.class.ts +++ b/lib/query/sync/initialize-sync-query.class.ts @@ -1,6 +1,7 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; import { + ClientTypes, Filters, IDeliveryNetworkResponse, ILanguagesQueryConfig, @@ -11,7 +12,8 @@ import { import { QueryService } from '../../services'; import { BaseQuery } from '../common/base-query.class'; -export class InitializeSyncQuery extends BaseQuery< +export class InitializeSyncQuery extends BaseQuery< + TClientTypes, Responses.IInitializeSyncResponse, ISyncInitQueryConfig, Contracts.IInitializeSyncContract @@ -20,7 +22,7 @@ export class InitializeSyncQuery extends BaseQuery< protected _queryConfig: ILanguagesQueryConfig = {}; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } diff --git a/lib/query/sync/sync-changes-query.class.ts b/lib/query/sync/sync-changes-query.class.ts index b986daf3..eac92a66 100644 --- a/lib/query/sync/sync-changes-query.class.ts +++ b/lib/query/sync/sync-changes-query.class.ts @@ -1,10 +1,11 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { IItemQueryConfig, IDeliveryNetworkResponse, Responses } from '../../models'; +import { IItemQueryConfig, IDeliveryNetworkResponse, Responses, ClientTypes } from '../../models'; import { QueryService } from '../../services'; import { BaseListingQuery } from '../common/base-listing-query.class'; -export class SyncChangesQuery extends BaseListingQuery< +export class SyncChangesQuery extends BaseListingQuery< + TClientTypes, Responses.ISyncChangesResponse, Responses.ISyncChangesAllResponse, IItemQueryConfig, @@ -14,7 +15,7 @@ export class SyncChangesQuery extends BaseListingQuery< private readonly action: string = '/sync'; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } diff --git a/lib/query/taxonomy/taxonomies-query.class.ts b/lib/query/taxonomy/taxonomies-query.class.ts index 91d11cfc..efe50710 100644 --- a/lib/query/taxonomy/taxonomies-query.class.ts +++ b/lib/query/taxonomy/taxonomies-query.class.ts @@ -1,17 +1,13 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { - IDeliveryNetworkResponse, - ITaxonomyQueryConfig, - Parameters, - Responses -} from '../../models'; +import { ClientTypes, IDeliveryNetworkResponse, ITaxonomyQueryConfig, Parameters, Responses } from '../../models'; import { QueryService } from '../../services'; import { BaseListingQuery } from '../common/base-listing-query.class'; -export class TaxonomiesQuery extends BaseListingQuery< - Responses.IListTaxonomiesResponse, - Responses.IListTaxonomiesAllResponse, +export class TaxonomiesQuery extends BaseListingQuery< + TClientTypes, + Responses.IListTaxonomiesResponse, + Responses.IListTaxonomiesAllResponse, ITaxonomyQueryConfig, Contracts.IListTaxonomyGroupsContract > { @@ -22,7 +18,7 @@ export class TaxonomiesQuery extends BaseListingQuery< protected _queryConfig: ITaxonomyQueryConfig = {}; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } @@ -46,7 +42,7 @@ export class TaxonomiesQuery extends BaseListingQuery< toPromise(): Promise< IDeliveryNetworkResponse< - Responses.IListTaxonomiesResponse, + Responses.IListTaxonomiesResponse, Contracts.IListTaxonomyGroupsContract > > { @@ -59,17 +55,17 @@ export class TaxonomiesQuery extends BaseListingQuery< return super.resolveUrlInternal(action); } - map(json: any): Responses.IListTaxonomiesResponse { + map(json: any): Responses.IListTaxonomiesResponse { return this.queryService.mappingService.listTaxonomiesResponse(json); } protected allResponseFactory( items: any[], responses: IDeliveryNetworkResponse< - Responses.IListTaxonomiesResponse, + Responses.IListTaxonomiesResponse, Contracts.IListTaxonomyGroupsContract >[] - ): Responses.IListTaxonomiesAllResponse { + ): Responses.IListTaxonomiesAllResponse { return { items: items, responses: responses diff --git a/lib/query/taxonomy/taxonomy-query.class.ts b/lib/query/taxonomy/taxonomy-query.class.ts index a516b989..4cac7fa6 100644 --- a/lib/query/taxonomy/taxonomy-query.class.ts +++ b/lib/query/taxonomy/taxonomy-query.class.ts @@ -1,11 +1,12 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { IDeliveryNetworkResponse, ITaxonomyQueryConfig, Responses } from '../../models'; +import { ClientTypes, IDeliveryNetworkResponse, ITaxonomyQueryConfig, Responses } from '../../models'; import { QueryService } from '../../services'; import { BaseQuery } from '../common/base-query.class'; -export class TaxonomyQuery extends BaseQuery< - Responses.IViewTaxonomyResponse, +export class TaxonomyQuery extends BaseQuery< + TClientTypes, + Responses.IViewTaxonomyResponse, ITaxonomyQueryConfig, Contracts.IViewTaxonomyGroupContract > { @@ -18,7 +19,7 @@ export class TaxonomyQuery extends BaseQuery< constructor( protected config: IDeliveryClientConfig, - protected queryService: QueryService, + protected queryService: QueryService, private taxonomyCodename: string ) { super(config, queryService); @@ -29,7 +30,10 @@ export class TaxonomyQuery extends BaseQuery< } toPromise(): Promise< - IDeliveryNetworkResponse + IDeliveryNetworkResponse< + Responses.IViewTaxonomyResponse, + Contracts.IViewTaxonomyGroupContract + > > { return this.queryService.getTaxonomy(this.getUrl(), this._queryConfig ?? {}); } @@ -40,7 +44,7 @@ export class TaxonomyQuery extends BaseQuery< return super.resolveUrlInternal(action); } - map(json: any): Responses.IViewTaxonomyResponse { + map(json: any): Responses.IViewTaxonomyResponse { return this.queryService.mappingService.viewTaxonomyResponse(json); } } diff --git a/lib/query/type/multiple-type-query.class.ts b/lib/query/type/multiple-type-query.class.ts index 8a62d342..4285047a 100644 --- a/lib/query/type/multiple-type-query.class.ts +++ b/lib/query/type/multiple-type-query.class.ts @@ -1,18 +1,19 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { IContentTypeQueryConfig, IDeliveryNetworkResponse, Parameters, Responses } from '../../models'; +import { ClientTypes, IContentTypeQueryConfig, IDeliveryNetworkResponse, Parameters, Responses } from '../../models'; import { QueryService } from '../../services'; import { BaseListingQuery } from '../common/base-listing-query.class'; -export class MultipleTypeQuery extends BaseListingQuery< - Responses.IListContentTypesResponse, - Responses.IListContentTypesAllResponse, +export class MultipleTypeQuery extends BaseListingQuery< + TClientTypes, + Responses.IListContentTypesResponse, + Responses.IListContentTypesAllResponse, IContentTypeQueryConfig, Contracts.IListContentTypeContract > { protected _queryConfig: IContentTypeQueryConfig = {}; - constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { + constructor(protected config: IDeliveryClientConfig, protected queryService: QueryService) { super(config, queryService); } @@ -20,7 +21,7 @@ export class MultipleTypeQuery extends BaseListingQuery< * Used to limit the number of elements returned by query. * @param elementCodenames Array of element codenames to fetch */ - elementsParameter(elementCodenames: string[]): this { + elementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { this.parameters.push(new Parameters.ElementsParameter(elementCodenames)); return this; } @@ -29,7 +30,7 @@ export class MultipleTypeQuery extends BaseListingQuery< * Used to exclude elements returned by query. * @param elementCodenames Array of element codenames to exclude */ - excludeElementsParameter(elementCodenames: string[]): this { + excludeElementsParameter(elementCodenames: TClientTypes['elementCodenames'][]): this { this.parameters.push(new Parameters.ExcludeElementsParameter(elementCodenames)); return this; } @@ -53,7 +54,10 @@ export class MultipleTypeQuery extends BaseListingQuery< } toPromise(): Promise< - IDeliveryNetworkResponse + IDeliveryNetworkResponse< + Responses.IListContentTypesResponse, + Contracts.IListContentTypeContract + > > { return this.queryService.getMultipleTypes(this.getUrl(), this._queryConfig ?? {}); } @@ -64,14 +68,17 @@ export class MultipleTypeQuery extends BaseListingQuery< return super.resolveUrlInternal(action); } - map(json: any): Responses.IListContentTypesResponse { + map(json: any): Responses.IListContentTypesResponse { return this.queryService.mappingService.listContentTypesResponse(json); } protected allResponseFactory( items: any[], - responses: IDeliveryNetworkResponse[] - ): Responses.IListContentTypesAllResponse { + responses: IDeliveryNetworkResponse< + Responses.IListContentTypesResponse, + Contracts.IListContentTypeContract + >[] + ): Responses.IListContentTypesAllResponse { return { items: items, responses: responses diff --git a/lib/query/type/single-type-query.class.ts b/lib/query/type/single-type-query.class.ts index 5be8ba90..8f3e685c 100644 --- a/lib/query/type/single-type-query.class.ts +++ b/lib/query/type/single-type-query.class.ts @@ -1,11 +1,12 @@ import { Contracts } from '../../contracts'; import { IDeliveryClientConfig } from '../../config'; -import { IContentTypeQueryConfig, IDeliveryNetworkResponse, Responses } from '../../models'; +import { ClientTypes, IContentTypeQueryConfig, IDeliveryNetworkResponse, Responses } from '../../models'; import { QueryService } from '../../services'; import { BaseQuery } from '../common/base-query.class'; -export class SingleTypeQuery extends BaseQuery< - Responses.IViewContentTypeResponse, +export class SingleTypeQuery extends BaseQuery< + TClientTypes, + Responses.IViewContentTypeResponse, IContentTypeQueryConfig, Contracts.IViewContentTypeContract > { @@ -13,7 +14,7 @@ export class SingleTypeQuery extends BaseQuery< constructor( protected config: IDeliveryClientConfig, - protected queryService: QueryService, + protected queryService: QueryService, private typeCodename: string ) { super(config, queryService); @@ -24,7 +25,10 @@ export class SingleTypeQuery extends BaseQuery< } toPromise(): Promise< - IDeliveryNetworkResponse + IDeliveryNetworkResponse< + Responses.IViewContentTypeResponse, + Contracts.IViewContentTypeContract + > > { return this.queryService.getSingleType(this.getUrl(), this._queryConfig ?? {}); } @@ -35,7 +39,7 @@ export class SingleTypeQuery extends BaseQuery< return super.resolveUrlInternal(action); } - map(json: any): Responses.IViewContentTypeResponse { + map(json: any): Responses.IViewContentTypeResponse { return this.queryService.mappingService.viewContentTypeResponse(json); } } diff --git a/lib/sdk-info.generated.ts b/lib/sdk-info.generated.ts index cc05a08e..f2841f75 100644 --- a/lib/sdk-info.generated.ts +++ b/lib/sdk-info.generated.ts @@ -2,6 +2,6 @@ import { ISDKInfo } from '@kontent-ai/core-sdk'; export const sdkInfo: ISDKInfo = { host: 'npmjs.com', - version: '15.2.0', + version: '16.0.0-0', name: '@kontent-ai/delivery-sdk' }; diff --git a/lib/services/base-delivery-query.service.ts b/lib/services/base-delivery-query.service.ts index 8265c205..25e2c4ca 100644 --- a/lib/services/base-delivery-query.service.ts +++ b/lib/services/base-delivery-query.service.ts @@ -9,13 +9,14 @@ import { sdkVersionHeader, staleContentHeaderName, continuationTokenHeaderName, - IDeliveryNetworkResponse + IDeliveryNetworkResponse, + ClientTypes } from '../models'; import { IDeliveryClientConfig } from '../config'; import { IMappingService } from './mapping.service'; -export abstract class BaseDeliveryQueryService { +export abstract class BaseDeliveryQueryService { /** * Default base Url to Kontent.ai Delivery API */ @@ -42,7 +43,7 @@ export abstract class BaseDeliveryQueryService { /** * Mapping service */ - public readonly mappingService: IMappingService + public readonly mappingService: IMappingService ) {} /** diff --git a/lib/services/delivery-query.service.ts b/lib/services/delivery-query.service.ts index 0ed801fc..e84cd6b4 100644 --- a/lib/services/delivery-query.service.ts +++ b/lib/services/delivery-query.service.ts @@ -11,7 +11,8 @@ import { IDeliveryNetworkResponse, ILanguagesQueryConfig, ITaxonomyQueryConfig, - ISyncInitQueryConfig + ISyncInitQueryConfig, + ClientTypes } from '../models'; import { IKontentListAllResponse, @@ -22,12 +23,12 @@ import { import { BaseDeliveryQueryService } from './base-delivery-query.service'; import { IMappingService } from './mapping.service'; -export class QueryService extends BaseDeliveryQueryService { +export class QueryService extends BaseDeliveryQueryService { constructor( config: IDeliveryClientConfig, httpService: IHttpService, sdkInfo: ISDKInfo, - mappingService: IMappingService + mappingService: IMappingService ) { super(config, httpService, sdkInfo, mappingService); } @@ -37,16 +38,19 @@ export class QueryService extends BaseDeliveryQueryService { * @param url Url used to get single item * @param queryConfig Query configuration */ - async getSingleItemAsync( + async getSingleItemAsync( url: string, queryConfig: IItemQueryConfig ): Promise< - IDeliveryNetworkResponse, Contracts.IViewContentItemContract> + IDeliveryNetworkResponse< + Responses.IViewContentItemResponse, + Contracts.IViewContentItemContract + > > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse< - Responses.IViewContentItemResponse, + Responses.IViewContentItemResponse, Contracts.IViewContentItemContract >(this.mappingService.viewContentItemResponse(response.data), response); } @@ -56,10 +60,15 @@ export class QueryService extends BaseDeliveryQueryService { * @param url Url * @param queryConfig Query configuration */ - async getItemsFeed( + async getItemsFeed( url: string, queryConfig: IItemQueryConfig - ): Promise, Contracts.IItemsFeedContract>> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IListItemsFeedResponse, + Contracts.IItemsFeedContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.itemsFeedResponse(response.data), response); @@ -70,11 +79,14 @@ export class QueryService extends BaseDeliveryQueryService { * @param url Url used to get multiple items * @param queryConfig Query configuration */ - async getMultipleItems( + async getMultipleItems( url: string, queryConfig: IItemQueryConfig ): Promise< - IDeliveryNetworkResponse, Contracts.IListContentItemsContract> + IDeliveryNetworkResponse< + Responses.IListContentItemsResponse, + Contracts.IListContentItemsContract + > > { const response = await this.getResponseAsync(url, queryConfig); @@ -89,7 +101,12 @@ export class QueryService extends BaseDeliveryQueryService { async getSingleType( url: string, queryConfig: IContentTypeQueryConfig - ): Promise> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IViewContentTypeResponse, + Contracts.IViewContentTypeContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.viewContentTypeResponse(response.data), response); @@ -103,7 +120,12 @@ export class QueryService extends BaseDeliveryQueryService { async getMultipleTypes( url: string, queryConfig: IContentTypeQueryConfig - ): Promise> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IListContentTypesResponse, + Contracts.IListContentTypeContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.listContentTypesResponse(response.data), response); @@ -148,7 +170,12 @@ export class QueryService extends BaseDeliveryQueryService { async getLanguages( url: string, queryConfig: ILanguagesQueryConfig - ): Promise> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IListLanguagesResponse, + Contracts.IListLanguagesContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.listLanguagesResponse(response.data), response); @@ -162,7 +189,12 @@ export class QueryService extends BaseDeliveryQueryService { async getTaxonomy( url: string, queryConfig: ITaxonomyQueryConfig - ): Promise> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IViewTaxonomyResponse, + Contracts.IViewTaxonomyGroupContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.viewTaxonomyResponse(response.data), response); @@ -176,7 +208,12 @@ export class QueryService extends BaseDeliveryQueryService { async getTaxonomies( url: string, queryConfig: ITaxonomyQueryConfig - ): Promise> { + ): Promise< + IDeliveryNetworkResponse< + Responses.IListTaxonomiesResponse, + Contracts.IListTaxonomyGroupsContract + > + > { const response = await this.getResponseAsync(url, queryConfig); return this.mapNetworkResponse(this.mappingService.listTaxonomiesResponse(response.data), response); diff --git a/lib/services/mapping.service.ts b/lib/services/mapping.service.ts index 9767f741..07fdada5 100644 --- a/lib/services/mapping.service.ts +++ b/lib/services/mapping.service.ts @@ -1,43 +1,53 @@ import { IDeliveryClientConfig } from '../config'; import { Contracts } from '../contracts'; import { SyncMapper, GenericElementMapper, ItemMapper, LanguageMapper, TaxonomyMapper, TypeMapper } from '../mappers'; -import { Responses, IContentItem, IPagination } from '../models'; +import { Responses, IContentItem, IPagination, ClientTypes } from '../models'; -export interface IMappingService { - listContentTypesResponse(data: Contracts.IListContentTypeContract): Responses.IListContentTypesResponse; +export interface IMappingService { + listContentTypesResponse( + data: Contracts.IListContentTypeContract + ): Responses.IListContentTypesResponse; - itemsFeedResponse( + itemsFeedResponse( data: Contracts.IItemsFeedContract - ): Responses.IListItemsFeedResponse; + ): Responses.IListItemsFeedResponse; - viewContentTypeResponse(data: Contracts.IViewContentTypeContract): Responses.IViewContentTypeResponse; + viewContentTypeResponse( + data: Contracts.IViewContentTypeContract + ): Responses.IViewContentTypeResponse; - viewContentItemResponse( + viewContentItemResponse( data: Contracts.IViewContentItemContract - ): Responses.IViewContentItemResponse; + ): Responses.IViewContentItemResponse; - listContentItemsResponse( + listContentItemsResponse( data: Contracts.IListContentItemsContract - ): Responses.IListContentItemsResponse; + ): Responses.IListContentItemsResponse; - viewTaxonomyResponse(data: Contracts.IViewTaxonomyGroupContract): Responses.IViewTaxonomyResponse; + viewTaxonomyResponse( + data: Contracts.IViewTaxonomyGroupContract + ): Responses.IViewTaxonomyResponse; - listTaxonomiesResponse(data: Contracts.IListTaxonomyGroupsContract): Responses.IListTaxonomiesResponse; + listTaxonomiesResponse( + data: Contracts.IListTaxonomyGroupsContract + ): Responses.IListTaxonomiesResponse; viewContentTypeElementResponse( data: Contracts.IViewContentTypeElementContract ): Responses.IViewContentTypeElementResponse; - listLanguagesResponse(data: Contracts.IListLanguagesContract): Responses.IListLanguagesResponse; + 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; +export class MappingService implements IMappingService { + private readonly typeMapper: TypeMapper; + private readonly languageMapper: LanguageMapper; + private readonly itemMapper: ItemMapper; + private readonly taxonomyMapper: TaxonomyMapper; private readonly genericElementMapper: GenericElementMapper; private readonly syncMapper: SyncMapper; @@ -54,7 +64,9 @@ export class MappingService implements IMappingService { * Gets response for list of languages * @param data Response data */ - listLanguagesResponse(data: Contracts.IListLanguagesContract): Responses.IListLanguagesResponse { + listLanguagesResponse( + data: Contracts.IListLanguagesContract + ): Responses.IListLanguagesResponse { return { items: this.languageMapper.mapMultipleLanguages(data), pagination: this.mapPagination(data.pagination) @@ -65,7 +77,9 @@ export class MappingService implements IMappingService { * Gets response for getting a multiple type * @param data Response data */ - listContentTypesResponse(data: Contracts.IListContentTypeContract): Responses.IListContentTypesResponse { + listContentTypesResponse( + data: Contracts.IListContentTypeContract + ): Responses.IListContentTypesResponse { return { items: this.typeMapper.mapMultipleTypes(data), pagination: this.mapPagination(data.pagination) @@ -77,15 +91,17 @@ export class MappingService implements IMappingService { * @param data Response data * @param options Options */ - viewContentTypeResponse(data: Contracts.IViewContentTypeContract): Responses.IViewContentTypeResponse { + viewContentTypeResponse( + data: Contracts.IViewContentTypeContract + ): Responses.IViewContentTypeResponse { return { type: this.typeMapper.mapSingleType(data) }; } - itemsFeedResponse( + itemsFeedResponse( data: Contracts.IItemsFeedContract - ): Responses.IListItemsFeedResponse { + ): Responses.IListItemsFeedResponse { const itemsResult = this.itemMapper.mapItems({ linkedItems: Object.values(data.modular_content), mainItems: data.items @@ -102,9 +118,9 @@ export class MappingService implements IMappingService { * @param data Response data * @param queryConfig Query configuration */ - viewContentItemResponse( + viewContentItemResponse( data: Contracts.IViewContentItemContract - ): Responses.IViewContentItemResponse { + ): Responses.IViewContentItemResponse { const itemResult = this.itemMapper.mapSingleItemFromResponse(data); return { @@ -118,9 +134,9 @@ export class MappingService implements IMappingService { * @param data Response data * @param queryConfig Query configuration */ - listContentItemsResponse( + listContentItemsResponse( data: Contracts.IListContentItemsContract - ): Responses.IListContentItemsResponse { + ): Responses.IListContentItemsResponse { const itemsResult = this.itemMapper.mapMultipleItemsFromResponse(data); return { @@ -134,7 +150,9 @@ export class MappingService implements IMappingService { * Gets response for getting single taxonomy item * @param data Response data */ - viewTaxonomyResponse(data: Contracts.IViewTaxonomyGroupContract): Responses.IViewTaxonomyResponse { + viewTaxonomyResponse( + data: Contracts.IViewTaxonomyGroupContract + ): Responses.IViewTaxonomyResponse { return { taxonomy: this.taxonomyMapper.mapTaxonomy(data.system, data.terms) }; @@ -144,10 +162,12 @@ export class MappingService implements IMappingService { * Gets response for getting multiples taxonomies * @param data Response data */ - listTaxonomiesResponse(data: Contracts.IListTaxonomyGroupsContract): Responses.IListTaxonomiesResponse { + listTaxonomiesResponse( + data: Contracts.IListTaxonomyGroupsContract + ): Responses.IListTaxonomiesResponse { return { items: this.taxonomyMapper.mapTaxonomies(data.taxonomies), - pagination: this.mapPagination(data.pagination), + pagination: this.mapPagination(data.pagination) }; } diff --git a/lib/utilities/delivery-url.helper.ts b/lib/utilities/delivery-url.helper.ts index ac2c68e1..60c6688b 100644 --- a/lib/utilities/delivery-url.helper.ts +++ b/lib/utilities/delivery-url.helper.ts @@ -1,16 +1,10 @@ -import * as urlParse from 'url-parse'; - export class DeliveryUrlHelper { replaceAssetDomain(originalAssetUrl: string, customDomain: string): string { - const urlPath = this.getUrlPathname(originalAssetUrl); - - return `${customDomain}${urlPath}`; + return `${customDomain}${this.getPathname(originalAssetUrl)}`; } - getUrlPathname(url: string): string { - const parsedUrl = urlParse(url); - - return parsedUrl.pathname; + getPathname(url: string): string { + return new URL(url).pathname; } } diff --git a/package-lock.json b/package-lock.json index fce3b5e3..9d2172a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,24 @@ { "name": "@kontent-ai/delivery-sdk", - "version": "15.2.0", + "version": "16.0.0-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@kontent-ai/delivery-sdk", - "version": "15.2.0", + "version": "16.0.0-0", "license": "MIT", "dependencies": { - "@kontent-ai/core-sdk": "10.9.0", - "url-parse": "1.5.10" + "@kontent-ai/core-sdk": "10.9.0" }, "devDependencies": { "@types/jasmine": "5.1.5", "@types/node": "22.13.1", - "@types/url-parse": "1.4.11", - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/eslint-plugin": "8.24.0", + "@typescript-eslint/parser": "8.24.0", "colors": "1.4.0", - "eslint": "9.19.0", - "jasmine-core": "5.5.0", + "eslint": "9.20.0", + "jasmine-core": "5.6.0", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.4", "karma-chrome-launcher": "3.2.0", @@ -37,7 +35,7 @@ "ts-loader": "9.5.2", "tsx": "4.19.2", "typescript": "5.2.2", - "typescript-eslint": "8.23.0", + "typescript-eslint": "8.24.0", "webpack": "5.97.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "6.0.1" @@ -2192,9 +2190,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", - "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", + "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", "dev": true, "license": "MIT", "engines": { @@ -2644,25 +2642,18 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/url-parse": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@types/url-parse/-/url-parse-1.4.11.tgz", - "integrity": "sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==", - "dev": true, - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", - "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz", + "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/type-utils": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/type-utils": "8.24.0", + "@typescript-eslint/utils": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2682,16 +2673,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", - "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz", + "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4" }, "engines": { @@ -2707,14 +2698,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", - "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz", + "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0" + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2725,14 +2716,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", - "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz", + "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/typescript-estree": "8.24.0", + "@typescript-eslint/utils": "8.24.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -2749,9 +2740,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", - "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz", + "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==", "dev": true, "license": "MIT", "engines": { @@ -2763,14 +2754,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", - "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz", + "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/visitor-keys": "8.24.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2790,16 +2781,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", - "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz", + "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0" + "@typescript-eslint/scope-manager": "8.24.0", + "@typescript-eslint/types": "8.24.0", + "@typescript-eslint/typescript-estree": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2814,13 +2805,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", - "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz", + "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/types": "8.24.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -5266,18 +5257,18 @@ } }, "node_modules/eslint": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", - "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", + "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.19.0", + "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -5355,6 +5346,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", + "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7006,9 +7010,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.5.0.tgz", - "integrity": "sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz", + "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==", "dev": true, "license": "MIT" }, @@ -8940,12 +8944,6 @@ "node": ">=0.4.x" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9323,6 +9321,7 @@ "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": { @@ -10560,15 +10559,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", - "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.0.tgz", + "integrity": "sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", - "@typescript-eslint/utils": "8.23.0" + "@typescript-eslint/eslint-plugin": "8.24.0", + "@typescript-eslint/parser": "8.24.0", + "@typescript-eslint/utils": "8.24.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10759,16 +10758,6 @@ "node": ">= 0.4" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", diff --git a/package.json b/package.json index 74b0ae95..308d1f45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kontent-ai/delivery-sdk", - "version": "15.2.0", + "version": "16.0.0-0", "repository": { "type": "git", "url": "https://github.com/kontent-ai/delivery-sdk-js" @@ -61,15 +61,13 @@ "clean": "tsx clean.ts" }, "dependencies": { - "@kontent-ai/core-sdk": "10.9.0", - "url-parse": "1.5.10" + "@kontent-ai/core-sdk": "10.9.0" }, "devDependencies": { - "@types/url-parse": "1.4.11", "@types/jasmine": "5.1.5", "@types/node": "22.13.1", "colors": "1.4.0", - "jasmine-core": "5.5.0", + "jasmine-core": "5.6.0", "jasmine-spec-reporter": "7.0.0", "karma": "6.4.4", "karma-chrome-launcher": "3.2.0", @@ -85,13 +83,13 @@ "standard-version": "9.5.0", "ts-loader": "9.5.2", "tsx": "4.19.2", - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", - "eslint": "9.19.0", + "@typescript-eslint/eslint-plugin": "8.24.0", + "@typescript-eslint/parser": "8.24.0", + "eslint": "9.20.0", "typescript": "5.2.2", "webpack": "5.97.1", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "6.0.1", - "typescript-eslint": "8.23.0" + "typescript-eslint": "8.24.0" } } diff --git a/test/browser/client/delivery-client.spec.ts b/test/browser/client/delivery-client.spec.ts index 63a86ce7..c77b98b1 100644 --- a/test/browser/client/delivery-client.spec.ts +++ b/test/browser/client/delivery-client.spec.ts @@ -1,10 +1,8 @@ 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(); - }); - + 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/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts b/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts index 32a6e1f1..88b2f5e6 100644 --- a/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts +++ b/test/browser/isolated-tests/elements/assets/custom-assets-domain.spec.ts @@ -37,7 +37,7 @@ describe('Custom assets domain', () => { const richTextElement = item.elements.plot; for (const image of richTextElement.images) { - const imagePathname = deliveryUrlHelper.getUrlPathname(image.url); + const imagePathname = deliveryUrlHelper.getPathname(image.url); expect(image.url).toEqual(`${customDomain}${imagePathname}`); } }); diff --git a/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts b/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts index bb442aa5..c9630057 100644 --- a/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts +++ b/test/browser/isolated-tests/endpoints/languages/list-languages.spec.ts @@ -7,13 +7,12 @@ 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; }); - it(`Response should have all properties assigned`, () => { expect(response.items.length).toEqual(responseJson.languages.length); diff --git a/test/browser/live-tests/errors/kontent-error.spec.ts b/test/browser/live-tests/errors/kontent-error.spec.ts index cfe8b777..6bb684f4 100644 --- a/test/browser/live-tests/errors/kontent-error.spec.ts +++ b/test/browser/live-tests/errors/kontent-error.spec.ts @@ -7,7 +7,7 @@ describe('Delivery errors', () => { const invalidCodename: string = 'the_invalid_codename'; let succeeded: boolean; - let error: any | DeliveryError; + let error: unknown; beforeAll(async () => { try { diff --git a/test/browser/live-tests/promise/response-by-promise.spec.ts b/test/browser/live-tests/promise/response-by-promise.spec.ts index b353bb7c..464a43f8 100644 --- a/test/browser/live-tests/promise/response-by-promise.spec.ts +++ b/test/browser/live-tests/promise/response-by-promise.spec.ts @@ -14,6 +14,9 @@ describe('Response with Promises', () => { .then((xResponse) => { response = xResponse.data; done(); + }) + .catch((err) => { + throw err; }); }); diff --git a/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts b/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts index b43cac7b..1fb9a42c 100644 --- a/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts +++ b/test/browser/live-tests/taxonomy/live-taxonomies.spec.ts @@ -9,13 +9,13 @@ describe('Live taxonomies', () => { 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; + 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; + taxonomy = response.items.find((m) => m.system.codename === existingTaxonomyCodename) as ITaxonomyGroup; }); it(`taxonomies should have pagination`, () => { diff --git a/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts b/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts index efa32963..042b7e6d 100644 --- a/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts +++ b/test/browser/live-tests/taxonomy/live-taxonomy.spec.ts @@ -9,7 +9,7 @@ describe('Live taxonomy', () => { 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; + let response: Responses.IViewTaxonomyResponse; beforeAll(async () => { response = (await context.deliveryClient.taxonomy(taxonomyCodename).toPromise()).data; diff --git a/test/browser/live-tests/types/live-type.spec.ts b/test/browser/live-tests/types/live-type.spec.ts index 027677e9..5eb8cfa0 100644 --- a/test/browser/live-tests/types/live-type.spec.ts +++ b/test/browser/live-tests/types/live-type.spec.ts @@ -6,7 +6,7 @@ describe('Live type', () => { setup(context); const codename: string = 'movie'; - let response: Responses.IViewContentTypeResponse; + let response: Responses.IViewContentTypeResponse; const multipleChoiceElement: string = 'category'; const taxonomyElement: string = 'releasecategory'; diff --git a/test/browser/live-tests/types/live-types.spec.ts b/test/browser/live-tests/types/live-types.spec.ts index 28d10af9..79b2ae41 100644 --- a/test/browser/live-tests/types/live-types.spec.ts +++ b/test/browser/live-tests/types/live-types.spec.ts @@ -5,7 +5,7 @@ describe('Live types', () => { const context = new Context(); setup(context); - let response: Responses.IListContentTypesResponse; + let response: Responses.IListContentTypesResponse; beforeAll(async () => { response = (await context.deliveryClient.types().toPromise()).data;