diff --git a/CHANGELOG.md b/CHANGELOG.md index cc607393..adabd7d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [v1.21.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.21.0) (2025-05-05) + - Enhancement + - Region support added + ## [v1.20.3](https://github.com/contentstack/contentstack-management-javascript/tree/v1.20.3) (2025-04-21) - Fix - Handle the sanity tests when ENVs are not provided diff --git a/lib/contentstack.js b/lib/contentstack.js index cf716495..18ded7fd 100644 --- a/lib/contentstack.js +++ b/lib/contentstack.js @@ -7,6 +7,14 @@ import clonedeep from 'lodash/cloneDeep' import getUserAgent from './core/Util.js' import contentstackClient from './contentstackClient.js' import httpClient from './core/contentstackHTTPClient.js' +const regionHostMap = { + NA: 'api.contentstack.io', + EU: 'eu-api.contentstack.com', + AZURE_NA: 'azure-na-api.contentstack.com', + AZURE_EU: 'azure-eu-api.contentstack.com', + GCP_NA: 'gcp-na-api.contentstack.com', + GCP_EU: 'gcp-eu-api.contentstack.com' +} /** * Create client instance @@ -161,8 +169,22 @@ import httpClient from './core/contentstackHTTPClient.js' * @returns Contentstack.Client */ export function client (params = {}) { + let defaultHostName + + if (params.region) { + const region = params.region.toUpperCase() + if (!regionHostMap[region]) { + throw new Error(`Invalid region '${params.region}' provided. Allowed regions are: ${Object.keys(regionHostMap).join(', ')}`) + } + defaultHostName = regionHostMap[region] + } else if (params.host) { + defaultHostName = params.host + } else { + defaultHostName = regionHostMap['NA'] + } + const defaultParameter = { - defaultHostName: 'api.contentstack.io' + defaultHostName: defaultHostName } const sdkAgent = `contentstack-management-javascript/${packages.version}` diff --git a/lib/core/contentstackHTTPClient.js b/lib/core/contentstackHTTPClient.js index 67cf14ba..c1e12770 100644 --- a/lib/core/contentstackHTTPClient.js +++ b/lib/core/contentstackHTTPClient.js @@ -53,6 +53,9 @@ export default function contentstackHttpClient (options) { let port = config.port || 443 const version = config.version || 'v3' + if (config.region) { + config.host = config.defaultHostName // set region on priority + } if (isHost(config.host)) { const parsed = config.host.split(':') if (parsed.length === 2) { diff --git a/package-lock.json b/package-lock.json index 5b5b6f65..409fc16e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@contentstack/management", - "version": "1.20.3", + "version": "1.21.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@contentstack/management", - "version": "1.20.3", + "version": "1.21.0", "license": "MIT", "dependencies": { "assert": "^2.1.0", diff --git a/package.json b/package.json index 8134643c..2a95f1b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.20.3", + "version": "1.21.0", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", diff --git a/test/sanity-check/api/user-test.js b/test/sanity-check/api/user-test.js index 838828cf..015307fa 100644 --- a/test/sanity-check/api/user-test.js +++ b/test/sanity-check/api/user-test.js @@ -4,6 +4,7 @@ import { contentstackClient } from '../../sanity-check/utility/ContentstackClien import { jsonWrite } from '../../sanity-check/utility/fileOperations/readwrite' import axios from 'axios' import dotenv from 'dotenv' +import * as contentstack from '../../../lib/contentstack.js' dotenv.config() var authtoken = '' @@ -74,4 +75,63 @@ describe('Contentstack User Session api Test', () => { }) .catch(done) }) + + it('should get host for NA region by default', done => { + const client = contentstack.client() + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('api.contentstack.io', 'region NA set correctly by default') + done() + }) + + it('should get host for NA region', done => { + const client = contentstack.client({ region: 'NA' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('api.contentstack.io', 'region NA set correctly') + done() + }) + + it('should get host for NA region on priority', done => { + const client = contentstack.client({ region: 'NA', host: 'dev11-api.csnonprod.com' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('api.contentstack.io', 'region NA set correctly with priority') + done() + }) + + it('should get custom host', done => { + const client = contentstack.client({ host: 'dev11-api.csnonprod.com' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('dev11-api.csnonprod.com', 'custom host set correctly') + done() + }) + + it('should get host for EU region', done => { + const client = contentstack.client({ region: 'EU' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('eu-api.contentstack.com', 'region EU set correctly') + done() + }) + + it('should get host for AZURE_NA region', done => { + const client = contentstack.client({ region: 'AZURE_NA' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('azure-na-api.contentstack.com', 'region AZURE_NA set correctly') + done() + }) + + it('should get host for GCP_NA region', done => { + const client = contentstack.client({ region: 'GCP_NA' }) + const baseUrl = client.axiosInstance.defaults.baseURL + expect(baseUrl).to.include('gcp-na-api.contentstack.com', 'region GCP_NA set correctly') + done() + }) + + it('should throw error for invalid region', done => { + try { + contentstack.client({ region: 'DUMMYREGION' }) + done(new Error('Expected error was not thrown for invalid region')) + } catch (error) { + expect(error.message).to.include('Invalid region', 'Error message should indicate invalid region') + done() + } + }) })