From e6aea8bc228d03c405341b4523eb8d1325d62cbd Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Tue, 29 Apr 2025 16:12:21 +0530 Subject: [PATCH 1/2] Region support added --- CHANGELOG.md | 4 ++ lib/contentstack.js | 27 ++++++++++++- lib/core/contentstackHTTPClient.js | 3 ++ package-lock.json | 4 +- package.json | 2 +- test/sanity-check/api/user-test.js | 63 ++++++++++++++++++++++++++++++ 6 files changed, 98 insertions(+), 5 deletions(-) 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..86ed1844 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,9 +169,24 @@ import httpClient from './core/contentstackHTTPClient.js' * @returns Contentstack.Client */ export function client (params = {}) { - const defaultParameter = { - defaultHostName: 'api.contentstack.io' + + 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: defaultHostName +} const sdkAgent = `contentstack-management-javascript/${packages.version}` const userAgentHeader = getUserAgent(sdkAgent, diff --git a/lib/core/contentstackHTTPClient.js b/lib/core/contentstackHTTPClient.js index 67cf14ba..327ec07c 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..0929f5e0 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,66 @@ 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() + } + }) + + }) From c2ec78d6d7f78e8671003f6a5804eadb04b503b5 Mon Sep 17 00:00:00 2001 From: sunil-lakshman <104969541+sunil-lakshman@users.noreply.github.com> Date: Tue, 29 Apr 2025 16:17:27 +0530 Subject: [PATCH 2/2] Fixed linting errors --- lib/contentstack.js | 37 +++++++++++++++--------------- lib/core/contentstackHTTPClient.js | 2 +- test/sanity-check/api/user-test.js | 3 --- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/contentstack.js b/lib/contentstack.js index 86ed1844..18ded7fd 100644 --- a/lib/contentstack.js +++ b/lib/contentstack.js @@ -8,12 +8,12 @@ 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' + 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' } /** @@ -169,24 +169,23 @@ const regionHostMap = { * @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) { + 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 { + } else { defaultHostName = regionHostMap['NA'] -} + } -const defaultParameter = { - defaultHostName: defaultHostName -} + const defaultParameter = { + defaultHostName: defaultHostName + } const sdkAgent = `contentstack-management-javascript/${packages.version}` const userAgentHeader = getUserAgent(sdkAgent, diff --git a/lib/core/contentstackHTTPClient.js b/lib/core/contentstackHTTPClient.js index 327ec07c..c1e12770 100644 --- a/lib/core/contentstackHTTPClient.js +++ b/lib/core/contentstackHTTPClient.js @@ -54,7 +54,7 @@ export default function contentstackHttpClient (options) { const version = config.version || 'v3' if (config.region) { - config.host = config.defaultHostName //set region on priority + config.host = config.defaultHostName // set region on priority } if (isHost(config.host)) { const parsed = config.host.split(':') diff --git a/test/sanity-check/api/user-test.js b/test/sanity-check/api/user-test.js index 0929f5e0..015307fa 100644 --- a/test/sanity-check/api/user-test.js +++ b/test/sanity-check/api/user-test.js @@ -125,7 +125,6 @@ describe('Contentstack User Session api Test', () => { done() }) - it('should throw error for invalid region', done => { try { contentstack.client({ region: 'DUMMYREGION' }) @@ -135,6 +134,4 @@ describe('Contentstack User Session api Test', () => { done() } }) - - })