{"id":19924369,"url":"https://github.com/kontent-ai/delivery-sdk-js","last_synced_at":"2025-05-16T18:07:47.933Z","repository":{"id":37451346,"uuid":"92730132","full_name":"kontent-ai/delivery-sdk-js","owner":"kontent-ai","description":"Kontent Delivery SDK for Javascript","archived":false,"fork":false,"pushed_at":"2025-04-30T11:17:47.000Z","size":9833,"stargazers_count":51,"open_issues_count":2,"forks_count":34,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-04-30T12:51:24.025Z","etag":null,"topics":["delivery-sdk","hacktoberfest","kontent","kontent-a-tool","kontent-ai","kontent-delivery","kontent-js"],"latest_commit_sha":null,"homepage":"https://kontent.ai","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kontent-ai.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-05-29T10:36:20.000Z","updated_at":"2025-04-30T11:17:02.000Z","dependencies_parsed_at":"2023-11-16T12:25:39.922Z","dependency_job_id":"cebcb672-3d59-4ad2-80e3-a225339746fa","html_url":"https://github.com/kontent-ai/delivery-sdk-js","commit_stats":{"total_commits":1594,"total_committers":39,"mean_commits":40.87179487179487,"dds":0.0915934755332497,"last_synced_commit":"0461a97b0583fe9f8629e73d3f3d246a08cd9110"},"previous_names":["kentico/kentico-cloud-js","enngage/kentico-cloud-js","enngage/kenticoclouddeliverytypescriptsdk","kentico/kontent-delivery-sdk-js"],"tags_count":227,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kontent-ai%2Fdelivery-sdk-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kontent-ai%2Fdelivery-sdk-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kontent-ai%2Fdelivery-sdk-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kontent-ai%2Fdelivery-sdk-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kontent-ai","download_url":"https://codeload.github.com/kontent-ai/delivery-sdk-js/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253783378,"owners_count":21963889,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["delivery-sdk","hacktoberfest","kontent","kontent-a-tool","kontent-ai","kontent-delivery","kontent-js"],"created_at":"2024-11-12T22:17:10.666Z","updated_at":"2025-05-16T18:07:47.877Z","avatar_url":"https://github.com/kontent-ai.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![npm version](https://badge.fury.io/js/%40kontent-ai%2Fdelivery-sdk.svg)](https://badge.fury.io/js/%40kontent-ai%2Fdelivery-sdk)\n[![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)\n[![npm](https://img.shields.io/npm/dt/@kontent-ai/delivery-sdk.svg)](https://www.npmjs.com/package/@kontent-ai/delivery-sdk)\n[![Known Vulnerabilities](https://snyk.io/test/github/kontent-ai/delivery-sdk-js/badge.svg)](https://snyk.io/test/github/kontent-ai/delivery-sdk-js)\n[![GitHub license](https://img.shields.io/github/license/kontent-ai/delivery-sdk-js.svg)](https://github.com/kontent-ai/delivery-sdk-js)\n![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)\n[![Discord](https://img.shields.io/discord/821885171984891914?label=Discord\u0026logo=Discord\u0026logoColor=white)](https://discord.gg/SKCxwPtevJ)\n\n# JavaScript Delivery SDK Documentation\n\nThis library is build for fetching [Kontent.ai](https://kontent.ai/) data with `Delivery API`. Works in browser \u0026 node.\n\n\u003e [!TIP]  \n\u003e It's **highly recommended** to use this library in combination with\n\u003e [Model Generator](https://www.npmjs.com/package/@kontent-ai/model-generator). Generating models will greatly increase\n\u003e type safety of your code and offer you an advanced intellisense.\n\n# Kontent.ai Delivery SDK\n\n## Installation\n\n```bash\nnpm i @kontent-ai/delivery-sdk --save\n```\n\n## Getting started\n\n```typescript\nimport { type IContentItem, type Elements, createDeliveryClient } from '@kontent-ai/delivery-sdk';\n\n/**\n * Generate models with @kontent-ai/model-generator\n */\nexport type Movie = IContentItem\u003c{\n    readonly title: Elements.TextElement;\n    readonly plot: Elements.RichTextElement;\n    readonly released: Elements.DateTimeElement;\n    readonly length: Elements.NumberElement;\n    readonly poster: Elements.AssetsElement;\n    readonly category: Elements.MultipleChoiceElement;\n    readonly stars: Elements.LinkedItemsElement\u003cActor\u003e;\n    readonly seoname: Elements.UrlSlugElement;\n    readonly releasecategory: Elements.TaxonomyElement;\n}\u003e;\n\n// Both `CoreDeliveryClient` and `CoreClientTypes` are types generated by @kontent-ai/model-generator\n// By using the generated types you will get access to advanced intellisense \u0026 type safety\nconst deliveryClient: CoreDeliveryClient = createDeliveryClient\u003cCoreClientTypes\u003e({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e'\n});\n\n// fetch items\nconst response = await deliveryClient.items\u003cMovie\u003e().type('\u003cCONTENT_TYPE_CODENAME\u003e').toPromise();\n\n// read data of first item\nconst movieText = response.data.items[0].elements.title.value;\n```\n\n## Configuration\n\n| Property                     |                   type                   | description                                                                                                                                                                                                                       |\n| ---------------------------- | :--------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| environmentId                |                  string                  | environmentId of your Kontent.ai project                                                                                                                                                                                          |\n| elementResolver?             |             ElementResolver              | Element resolver used to map custom elements                                                                                                                                                                                      |\n| previewApiKey?               |                  string                  | Preview API key used to get unpublished content items                                                                                                                                                                             |\n| defaultLanguage?             |                  string                  | Sets default language that will be used for all queries unless overridden with query parameters                                                                                                                                   |\n| 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'                                                                                          |\n| secureApiKey?                |                  string                  | Secured API key: Use secured API only when running on Node.JS server, otherwise you can expose your key                                                                                                                           |\n| defaultQueryConfig?          |               IQueryConfig               | Default configuration for all queries. Can be overridden by individual queries                                                                                                                                                    |\n| httpService ?                |               IHttpService               | Can be used to inject custom http service for performing requests                                                                                                                                                                 |\n| globalHeaders?               | (queryConfig: IQueryConfig) =\u003e IHeader[] | Adds ability to add extra headers to each http request                                                                                                                                                                            |\n| retryStrategy?               |          IRetryStrategyOptions           | Retry strategy configuration                                                                                                                                                                                                      |\n| linkedItemsReferenceHandler? |       LinkedItemsReferenceHandler        | Indicates if content items are automatically mapped. Available values: 'map' or 'ignore'                                                                                                                                          |\n| assetsDomain?                |                  string                  | Custom domain for assets. Changes url of assets in both asset \u0026 rich text elements                                                                                                                                                |\n| 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`. |\n| excludeArchivedItems?        |                 boolean                  | Can be used to exclude archived items from all queries by default. Only applicable when preview API is used.                                                                                                                      |\n\n### Querying\n\nThe SDK supports the following query parameters: `depthParameter`, `elementsParameter`, `excludeElementsParameter`,\n`limitParameter`, `orderParameter`, `skipParameter` and `languageParameter`. For more information about the parameters,\nsee the [SDK query methods](#filter-content) below. You can also head over to\n[Delivery API reference](https://kontent.ai/learn/docs/apis/openapi/delivery-api/#tag/Filtering-parameters).\n\n```typescript\n// Gets 5 items based on the Movie type\ndeliveryClient.items\u003cMovie\u003e().type('movie').limitParameter(5).skipParameter(2).toPromise();\n```\n\n| Filter                     |\n| -------------------------- |\n| `depthParameter`           |\n| `elementsParameter`        |\n| `excludeElementsParameter` |\n| `limitParameter`           |\n| `orderParameter`           |\n| `skipParameter`            |\n| `languageParameter`        |\n\n#### Filtering\n\nFilters are also considered query parameters and can be combined. See\n[Content filtering in API reference](https://kontent.ai/learn/docs/apis/openapi/delivery-api/#tag/Filtering-parameters)\nfor more examples.\n\n```typescript\n// Gets items based on the Movie type with 'Warrior' in their 'Title' element\ndeliveryClient.items\u003cMovie\u003e().type('movie').equalsFilter('elements.title', 'Warrior').toPromise();\n```\n\n| Filter                     |\n| -------------------------- |\n| `type`                     |\n| `types`                    |\n| `allFilter`                |\n| `anyFilter`                |\n| `containsFilter`           |\n| `equalsFilter`             |\n| `greaterThanFilter`        |\n| `greaterThanOrEqualFilter` |\n| `inFilter`                 |\n| `lessThanFilter`           |\n| `lessThanOrEqualFilter`    |\n| `rangeFilter`              |\n| `emptyFilter`              |\n| `NotEmptyFilter`           |\n| `notEqualsFilter`          |\n| `notInFilter`              |\n\n#### Soring\n\nYou can sort data by using any of the following methods:\n\n```typescript\ndeliveryClient.items\u003cMovie\u003e().type('movie').orderByDescending('elements.title').toPromise();\ndeliveryClient.items\u003cMovie\u003e().type('movie').orderByAscending('elements.title').toPromise();\ndeliveryClient.items\u003cMovie\u003e().type('movie').orderParameter('elements.title', 'desc').toPromise();\n```\n\n### Execute queries with a custom URL\n\nWhen you have an URL (i.e. for `next page` in paging, for testing purposes or just if you prefer to build it on your\nown) and still want to leverage SDK functionality such as type mapping, property resolving etc., use `withUrl` parameter\non any query such as:\n\n```typescript\ndeliveryClient\n    .items\u003cMovie\u003e()\n    .withUrl('https://deliver.kontent.ai/da5abe9f-fdad-4168-97cd-b3464be2ccb9/items?system.type=movie')\n    .toPromise();\n```\n\n### Custom parameters\n\nIn case you need to use custom parameters to build up an URL, use `withParameter` method:\n\n```typescript\ndeliveryClient.items\u003cMovie\u003e().withParameter('name', 'value').toPromise();\n```\n\n### Get localized items\n\nYou can specify [language of items](https://kontent.ai/learn/tutorials/manage-kontent/projects/set-up-languages) with\n`languageParameter` of a particular query. You can also define default language that will be used if `languageParameter`\nis not used during the initialization of delivery client.\n\n```typescript\nimport { createDeliveryClient } from '@kontent-ai/delivery-sdk';\n\nvar deliveryClient = new createDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    defaultLanguage: 'es'\n});\n\n// Gets items in 'es' language because it is marked as default\ndeliveryClient.item('warrior').toPromise();\n\n// Gets items in 'en' language because language parameter has priority over the default one\ndeliveryClient.item('warrior').languageParameter(`en`).toPromise();\n```\n\n### Preview mode\n\nYou can enable the preview mode either globally (when [initializing the DeliveryClient](#how-to-use-deliveryclient)) or\nper query. In each case, you need to set `previewApiKey` in the delivery client global configuration.\n\n#### Enable preview mode globally\n\n```typescript\nimport { createDeliveryClient } from '@kontent-ai/delivery-sdk';\n\nconst deliveryClient = createDeliveryClient({\n  environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e';\n  previewApiKey: '\u003cYOUR_PREVIEW_API_KEY\u003e',\n  defaultQueryConfig: {\n    usePreviewMode: true\n  }\n});\n```\n\n#### Enable preview mode per query\n\n```typescript\ndeliveryClient\n    .items()\n    .queryConfig({\n        usePreviewMode: true\n    })\n    .toPromise();\n```\n\n### Secure Delivery API\n\nUsing the Delivery API with\n[secure access](https://kontent.ai/learn/tutorials/develop-apps/build-strong-foundation/restrict-public-access) enabled\nis recommend only when the request is not being executed on the client (browser) because otherwise you will expose the\nAPI key publicly.\n\n```typescript\nimport { createDeliveryClient } from '@kontent-ai/delivery-sdk';\n\nconst deliveryClient = createDeliveryClient({\n  environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e';\n  secureApiKey: '\u003cYOUR_SECURE_ACCESS_KEY\u003e',\n    defaultQueryConfig: {\n      // Enabled secure access for all queries\n      useSecuredMode: true\n  }\n});\n```\n\nAs with [preview mode](#preview-mode), you can also override global settings on query level.\n\n```typescript\ndeliveryClient\n    .items()\n    .queryConfig({\n        // Enables secure access only for this query\n        useSecuredMode: true\n    })\n    .toPromise();\n```\n\n### Image transformation\n\nUse `ImageUrlBuilder` for your [image transformations](https://kontent.ai/learn/reference/image-transformation) on asset\nURLs.\n\n```typescript\nimport { transformImageUrl } from '@kontent-ai/delivery-sdk';\n\n// Sample asset URL; You'll find URLs like these in asset and rich text elements\nconst assetUrl = `https://assets-eu-01.kc-usercontent.com/ede994d8-bb05-01b5-9c33-8b65e7372306/4f45e0a8-4fc3-4143-a81f-55b7e4ce7daa/warrior.jpg`;\n\nconst transformedUrl = transformImageUrl(assetUrl)\n    .withDpr(2)\n    .withCompression('lossless')\n    .withQuality(4)\n    .withHeight(200)\n    .withWidth(100)\n    .getUrl();\n```\n\n### Paging\n\nAll listing queries support automatic paging. To use automatic paging, use `toAllPromise` extension method:\n\n```typescript\n// this executed multiple HTTP requests until it gets all items\nconst response = await deliveryClient.items().limitParameter(5).toAllPromise();\n\n// only gets 3 pages at maximum\nconst response = await deliveryClient.items().limitParameter(5).toAllPromise({\n    pages: 3\n});\n```\n\n### Resolving rich text elements\n\n[Rich text elements](https://kontent.ai/learn/reference/delivery-api#section/Rich-text-element) in Kontent.ai may\ncontain linked items and components. For example, if you write a blog post, you might want to insert a video or\ntestimonial to a specific place in your article.\n\nTo learn how to work with Rich text element have a look at\n[@kontent-ai/rich-text-resolver](https://www.npmjs.com/package/@kontent-ai/rich-text-resolver) library.\n\n## Get content types\n\n```typescript\ndeliveryClient.type('movie').toPromise();\ndeliveryClient.types().toPromise();\ndeliveryClient.types().toAllPromise();\n```\n\n## Get taxonomies\n\n```typescript\ndeliveryClient.taxonomy('taxonomyGroupName').toPromise();\ndeliveryClient.taxonomies().toPromise();\ndeliveryClient.taxonomies().toAllPromise();\n```\n\n## Proxy configuration\n\nIf you want to use a proxy server, you need to use a different domain or otherwise transform the URL. By using `proxy`\nconfiguration option you can define your own base domains as well as URL format. This is useful if you need to for\nexample hide the `environmentId` from the URL.\n\n`IDeliveryClientProxyConfig` offers 3 ways of configuring proxy URL:\n\n1. `baseUrl` - Base URL used for all requests. Defaults to 'deliver.kontent.ai'\n2. `basePreviewUrl` - Base url used for preview requests. Defaults to 'preview-deliver.kontent.ai'\n3. `advancedProxyUrlResolver` - Resolver function where you get `IProxyUrlData` context data (includes domain, action,\n   query parameters..) and can fully customize the final URL.\n\nExamples:\n\n```typescript\nconst client = createDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    // Will be used instead of 'https://deliver.kontent.ai' for all requests.\n    // Parameters, filters, project Id and other parts of the URL will use default values.\n    proxy: {\n        baseUrl: 'http://my-proxy.io'\n    }\n});\n```\n\n```typescript\nconst client = createDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    proxy: {\n        advancedProxyUrlResolver: (data) =\u003e {\n            const action = data.action; // /items\n            const domain = data.domain; // https://deliver.kontent.ai\n            const environmentId = data.environmentId; // xxx\n            const queryString = data.queryString; // e.g. ?depth=1\u0026elements=xElement\n            const queryParameters = data.queryParameters; // array with query parameters parameters\n            const queryConfig = data.queryConfig; // query configuration\n            return `http://my-proxy.io${action}${queryString}`; // proxy URL with omitted project Id\n        }\n    }\n});\n```\n\n## Error handling\n\nIf the error originates in Kontent.ai (see\n[error responses](https://kontent.ai/learn/reference/delivery-api#section/SDKs)), you will get a `DeliveryError` object\ninstance with more specific information. Otherwise, you will get the original error.\n\n```typescript\nimport { DeliveryError } from '@kontent-ai/delivery-sdk';\n\ntry {\n    await deliveryClient.item('invalid_codename').toPromise();\n} catch (error) {\n    if (error instanceof DeliveryError) {\n        // delivery specific error (e.g. item with codename not found...)\n        console.log(err.message, err.errorCode);\n    } else {\n        // some other error\n        console.log(error);\n    }\n}\n```\n\n### Remapping json responses\n\nIn some scenarios, you might want to store `json` response for later use and use SDK to map the response for you. There\nare 2 ways you can map previously stored `json`:\n\n```typescript\nconst result = await deliveryClient.item\u003cMovie\u003e('codename').toPromise();\nconst json = result.response.data;\n\n// approach #1\nconst remappedData = deliveryClient.mappingService.viewContentItemResponse\u003cMovie\u003e(json);\n\n// approach #2\nconst remappedData = deliveryClient.item\u003cMovie\u003e(movieCodename).map(json);\n```\n\n### Handling circular references\n\nBy default, the SDK automatically maps content items present in `linked items` \u0026 `rich text` elements. Linked items can\nreference other linked items in their tree (e.g. child item referencing parent) which may cause infinite nesting\n(circular reference). This behavior is not an issue for most scenarios, in fact it is beneficial as you can easily\naccess all linked items. However, you cannot easily serialize such model. Using e.g. `JSON.stringify` would fail if\nthere are circular references.\n\nFor this reason, you may disable mapping of linked items with `linkedItemsReferenceHandler` configuration option.\n\n```typescript\nconst client = getTestDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    linkedItemsReferenceHandler: 'ignore' // or 'map'\n});\n```\n\n### Using custom HTTP service\n\nThe SDK allows you to inject your own instance of a class implementing the `IHttpService` interface. This way you can\neasily mock responses, implement your own http service, or modify the requests in some other way.\n\nSample of a test `HttpService` implementation can be found at https://github.com/kontent-ai/core-sdk-js\n\nOnce you have your `HttpService`, use it in delivery client initialization:\n\n```typescript\nconst deliveryClient = createDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    httpService: YourHttpServiceImplementation\n});\n```\n\n### Use custom models for Custom elements\n\nYou can register an `ElementResolver` to map custom elements into dedicated element models and work with data more\neffectively.\n\nFor example, if you have a custom `color` element in your Kontent.ai project with json data like:\n\n```json\n \"color\": {\n  \"type\": \"custom\",\n  \"name\": \"Color\",\n  \"value\": \"{\\\"red\\\":167,\\\"green\\\":96,\\\"blue\\\":197}\"\n  }\n```\n\nYou can create a `ColorElement` type with strongly typed properties for `red`, `green` \u0026 `blue` values that you will\nparse from the json.\n\n```typescript\nimport { ElementModels, Elements, createDeliveryClient } from '@kontent-ai/delivery-sdk';\n\ntype ColorElement = Elements.CustomElement\u003c{\n    red: number;\n    green: number;\n    blue: number;\n}\u003e;\n```\n\nTo resolve your custom element into `ColorElement`, use the `ElementResolver` in your delivery client config:\n\n```typescript\nconst client = createDeliveryClient({\n    environmentId: '\u003cYOUR_ENVIRONMENT_ID\u003e',\n    elementResolver: (elementWrapper) =\u003e {\n        if (elementWrapper.rawElement.type === 'color') {\n            const parsed = JSON.parse(elementWrapper.rawElement.value);\n\n            return {\n                red: parsed.red,\n                green: parsed.green,\n                blue: parsed.blue\n            };\n        }\n\n        return undefined;\n    }\n});\n```\n\nYou can then use this custom element type in your models:\n\n```typescript\ntype Movie = IContentItem\u003c{\n    color: ColorElement;\n    title: Elements.TextElement;\n}\u003e;\n```\n\n## UMD bundles\n\nWhen using UMD bundle and including this library in `script` tag on your `html` page, you can find it under the\n`kontentDelivery` global variable.\n\nBundles are distributed in `dist/bundles` folder:\n\n-   `dist/bundles/kontent-delivery.umd.js`\n-   `dist/bundles/kontent-delivery.umd.min.js`\n\n## Debugging\n\n### Accessing request data\n\nEvery response from this SDK contains additional debug data you can use to inspect when something is not right or if you\nneed to access response headers or other network related properties.\n\n```typescript\nconst deliveryResponse = await createDeliveryClient({ environmentId: 'environmentId' })\n    .item('itemCodename')\n    .toPromise();\nconst rawResponseData = deliveryResponse.response; // contains raw response data, headers, status etc..\nconst responseHeaders = deliveryResponse.response.headers;\n```\n\n### Getting URL of a query\n\nIn case you need to get the raw URL of a request before calling it, use the `getUrl()` method on any query.\n\n```typescript\nconst queryText = deliveryClient\n    .items()\n    .type('movie')\n    .limitParameter(10)\n    .orderParameter('system.codename', 'desc')\n    .getUrl();\n\nconsole.log(queryText);\n// outputs:\n// https://deliver.kontent.ai/b52fa0db-84ec-4310-8f7c-3b94ed06644d/items?limit=10\u0026order=system.codename[desc]\u0026system.type=movie\n```\n\n## Testing\n\nNote: You need to have `Chrome` installed in order to run tests via Karma.\n\n-   `npm run test:browser` Runs tests in Chrome\n-   `npm run test:node` Runs tests in node.js\n-   `npm run test:all` Runs all test\n\n\u003e If you want to mock http responses, it is possible to use\n\u003e [custom Http Service](https://github.com/kontent-ai/core-sdk-js#testing) as a part of the\n\u003e [delivery client configuration](#client-configuration).\n\n## Feedback \u0026 Contribution\n\nFeedback \u0026 Contributions are welcomed. Feel free to take/start an issue \u0026 submit PR.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkontent-ai%2Fdelivery-sdk-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkontent-ai%2Fdelivery-sdk-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkontent-ai%2Fdelivery-sdk-js/lists"}