Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .talismanrc
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
fileignoreconfig:
- filename: package-lock.json
checksum: cb21e1b4fc8240b8ee33c6f974a9d1cf25d96afb9161c85633cbb061f069bbc4
checksum: e0a6679bfc6556fb7a8424c3f8eb0cec62f2cc871ad544f691fa064ddec30db7
- filename: test/unit/utils.spec.ts
checksum: a491df0a19c336ff5b18450fb23e26676a1798222100c946150e7a1b6504d953
- filename: test/unit/contentstack.spec.ts
checksum: d5b99c01459ab8bc597baaa9e6cc4aa91ac6d9bf78af08e1d0220d0c5db3d0b3
- filename: test/unit/utils.spec.ts
checksum: 79ce5bd78376db37a34df82c0fea19031e995b66a5a246e73f8262fa05d65a9c
- filename: test/unit/query-optimization-comprehensive.spec.ts
checksum: f5aaf6c784d7c101a05ca513c584bbd6e95f963d1e42779f2596050d9bcbac96
- filename: src/lib/entries.ts
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
### Version: 4.11.0
#### Date: Jan-19-2026
Enhancement: Integrated getContentstackEndpoint method of Utils SDK for endpoint selection

### Version: 4.10.5
#### Date: Jan-05-2026
Fix: update esm export path to include .js extension (upgrade contentstack-js-core dependency)
Expand Down
618 changes: 309 additions & 309 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@contentstack/delivery-sdk",
"version": "4.10.6",
"version": "4.11.0",
"type": "module",
"license": "MIT",
"main": "./dist/legacy/index.cjs",
Expand Down Expand Up @@ -35,8 +35,8 @@
"husky-check": "npm run build && husky && chmod +x .husky/pre-commit"
},
"dependencies": {
"@contentstack/core": "^1.3.8",
"@contentstack/utils": "1.5.0",
"@contentstack/core": "^1.3.6",
"@contentstack/utils": "^1.6.3",
"axios": "^1.13.1",
"humps": "^2.0.1"
},
Expand Down
2 changes: 1 addition & 1 deletion src/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export interface StackConfig extends HttpClientParams {
environment: string;
branch?: string;
early_access?: string[];
region?: Region;
region?: Region | string;
locale?: string;
plugins?: ContentstackPlugin[];
logHandler?: (level: string, data: any) => void;
Expand Down
10 changes: 3 additions & 7 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import { Region, params } from './types';
import { getContentstackEndpoint } from '@contentstack/utils';

export function getHostforRegion(region: Region = Region.US, host?: string): string {
export function getHostforRegion(region: Region | string, host?: string): string {
if (host) return host;

let url = 'cdn.contentstack.io';
if (region !== Region.US) {
url = region.toString().toLowerCase() + '-cdn.contentstack.com';
}

return url;
return getContentstackEndpoint(region, 'contentDelivery', true) as string;
}

/**
Expand Down
188 changes: 174 additions & 14 deletions test/unit/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@ import {
} from "../utils/constant";
import { httpClient, AxiosInstance } from "@contentstack/core";
import MockAdapter from "axios-mock-adapter";
import * as Utils from "@contentstack/utils";

// Mock getContentstackEndpoint from @contentstack/utils
jest.mock("@contentstack/utils", () => ({
getContentstackEndpoint: jest.fn(),
}));

const mockGetContentstackEndpoint = Utils.getContentstackEndpoint as jest.MockedFunction<
typeof Utils.getContentstackEndpoint
>;

let client: AxiosInstance;
let mockClient: MockAdapter;
Expand All @@ -23,35 +33,185 @@ beforeAll(() => {

describe("Utils functions", () => {
describe("getHostforRegion function", () => {
it("should return custom host when provided", () => {
beforeEach(() => {
// Reset mock before each test
mockGetContentstackEndpoint.mockReset();
});

it("should return custom host when provided and not call getContentstackEndpoint", () => {
const customHost = "custom.example.com";
const result = getHostforRegion(Region.EU, customHost);

expect(result).toBe(customHost);
expect(mockGetContentstackEndpoint).not.toHaveBeenCalled();
});

it("should return default host when no region is provided", () => {
const result = getHostforRegion();
it("should call getContentstackEndpoint with correct parameters when no host is provided", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_URL);

const result = getHostforRegion(Region.US);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.US,
"contentDelivery",
true
);
expect(result).toBe(HOST_URL);
});

it("should return correct host for each region using Region enum", () => {
// Test using Region enum values
expect(getHostforRegion(Region.EU)).toBe(HOST_EU_REGION);
expect(getHostforRegion(Region.AU)).toBe(HOST_AU_REGION);
expect(getHostforRegion(Region.AZURE_NA)).toBe(HOST_AZURE_NA_REGION);
expect(getHostforRegion(Region.AZURE_EU)).toBe("azure-eu-cdn.contentstack.com");
expect(getHostforRegion(Region.GCP_NA)).toBe(HOST_GCP_NA_REGION);
expect(getHostforRegion(Region.GCP_EU)).toBe(HOST_GCP_EU_REGION);

it("should return correct host for EU region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_EU_REGION);

const result = getHostforRegion(Region.EU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.EU,
"contentDelivery",
true
);
expect(result).toBe(HOST_EU_REGION);
});

it("should return correct host for AU region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_AU_REGION);

const result = getHostforRegion(Region.AU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.AU,
"contentDelivery",
true
);
expect(result).toBe(HOST_AU_REGION);
});

it("should return default host for US region", () => {
expect(getHostforRegion(Region.US)).toBe(HOST_URL);
it("should return correct host for AZURE_NA region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_AZURE_NA_REGION);

const result = getHostforRegion(Region.AZURE_NA);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.AZURE_NA,
"contentDelivery",
true
);
expect(result).toBe(HOST_AZURE_NA_REGION);
});

it("should prioritize custom host over region", () => {
it("should return correct host for AZURE_EU region using getContentstackEndpoint", () => {
const azureEuHost = "azure-eu-cdn.contentstack.com";
mockGetContentstackEndpoint.mockReturnValue(azureEuHost);

const result = getHostforRegion(Region.AZURE_EU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.AZURE_EU,
"contentDelivery",
true
);
expect(result).toBe(azureEuHost);
});

it("should return correct host for GCP_NA region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_GCP_NA_REGION);

const result = getHostforRegion(Region.GCP_NA);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.GCP_NA,
"contentDelivery",
true
);
expect(result).toBe(HOST_GCP_NA_REGION);
});

it("should return correct host for GCP_EU region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_GCP_EU_REGION);

const result = getHostforRegion(Region.GCP_EU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.GCP_EU,
"contentDelivery",
true
);
expect(result).toBe(HOST_GCP_EU_REGION);
});

it("should return correct host for US region using getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_URL);

const result = getHostforRegion(Region.US);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.US,
"contentDelivery",
true
);
expect(result).toBe(HOST_URL);
});

it("should prioritize custom host over region and not call getContentstackEndpoint", () => {
const customHost = "priority.example.com";

const result = getHostforRegion(Region.EU, customHost);

expect(result).toBe(customHost);
expect(mockGetContentstackEndpoint).not.toHaveBeenCalled();
});

it("should handle string region values and call getContentstackEndpoint", () => {
const stringRegion = "eu";
mockGetContentstackEndpoint.mockReturnValue(HOST_EU_REGION);

const result = getHostforRegion(stringRegion);

expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
stringRegion,
"contentDelivery",
true
);
expect(result).toBe(HOST_EU_REGION);
});

it("should handle empty string host and call getContentstackEndpoint", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_URL);

const result = getHostforRegion(Region.US, "");

// Empty string is falsy, so it should call getContentstackEndpoint
expect(mockGetContentstackEndpoint).toHaveBeenCalledWith(
Region.US,
"contentDelivery",
true
);
expect(result).toBe(HOST_URL);
});

it("should always pass 'contentDelivery' as service parameter", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_URL);

getHostforRegion(Region.US);
getHostforRegion(Region.EU);
getHostforRegion(Region.AU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledTimes(3);
mockGetContentstackEndpoint.mock.calls.forEach((call) => {
expect(call[1]).toBe("contentDelivery");
});
});

it("should always pass true as omitHttps parameter", () => {
mockGetContentstackEndpoint.mockReturnValue(HOST_URL);

getHostforRegion(Region.US);
getHostforRegion(Region.EU);

expect(mockGetContentstackEndpoint).toHaveBeenCalledTimes(2);
mockGetContentstackEndpoint.mock.calls.forEach((call) => {
expect(call[2]).toBe(true);
});
});
});

Expand Down