From a5a045ca52aa0c6d5c23f9756c27fcb2ad5ff532 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Thu, 29 Jan 2026 12:42:04 +0530 Subject: [PATCH 1/4] Replace hardcoded region objects with dynamic generation using getContentstackEndpoint --- .talismanrc | 6 +- package-lock.json | 143 +++++++------- packages/contentstack-config/package.json | 1 + .../src/utils/region-handler.ts | 183 ++++++++---------- pnpm-lock.yaml | 2 + 5 files changed, 158 insertions(+), 177 deletions(-) diff --git a/.talismanrc b/.talismanrc index 2c4a96ce34..65483d0e1a 100644 --- a/.talismanrc +++ b/.talismanrc @@ -2,7 +2,7 @@ fileignoreconfig: - filename: packages/contentstack-export-to-csv/src/types/index.ts checksum: 28c19efb0c13969d40df964f86fa6de444316e320801f19dee7392df7a36851d - filename: package-lock.json - checksum: 62632519fd82d3941a5e7434fd86a3daf122d7922d765b27147c43ef08f01d87 - - filename: pnpm-lock.yaml - checksum: 7615fbce5f716d889b6558fb06df28d1f34c9e2af7225eb22ed23e2817d6dd69 + checksum: 0982a352c260f7dd5bdde813104c2db8268abc489c791ec467b63eb8badb3cf1 + - filename: packages/contentstack-config/src/utils/region-handler.ts + checksum: ae2df0d7570c11e28a3306bd3ef03ca0ec9e04b3b9b320d6ed50a1764459072c version: '1.0' diff --git a/package-lock.json b/package-lock.json index 0a1827e7ce..99b1810017 100644 --- a/package-lock.json +++ b/package-lock.json @@ -280,46 +280,46 @@ } }, "node_modules/@aws-sdk/client-cloudfront": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.975.0.tgz", - "integrity": "sha512-ysqoEHD7WfB4HxB+liRasBqGjCrkkqgwMmYc49QQ0jrJE2bEaid0IwRuh4PTGgw6Az9fSW7IexIWREgLLxDmpg==", + "version": "3.978.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.978.0.tgz", + "integrity": "sha512-B32xVqHp0/3I5l0jqwZwqVYGn/vJGY0rZm2yQuOb3qjkosIgco/hZJ5UTzj3m7VKmFPq86h8So9N8j7wlkdP5w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/credential-provider-node": "^3.972.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", - "@aws-sdk/types": "^3.973.0", + "@aws-sdk/core": "^3.973.4", + "@aws-sdk/credential-provider-node": "^3.972.2", + "@aws-sdk/middleware-host-header": "^3.972.2", + "@aws-sdk/middleware-logger": "^3.972.2", + "@aws-sdk/middleware-recursion-detection": "^3.972.2", + "@aws-sdk/middleware-user-agent": "^3.972.4", + "@aws-sdk/region-config-resolver": "^3.972.2", + "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", + "@aws-sdk/util-user-agent-browser": "^3.972.2", + "@aws-sdk/util-user-agent-node": "^3.972.2", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", + "@smithy/core": "^3.22.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/node-http-handler": "^4.4.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -333,35 +333,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.975.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.975.0.tgz", - "integrity": "sha512-aF1M/iMD29BPcpxjqoym0YFa4WR9Xie1/IhVumwOGH6TB45DaqYO7vLwantDBcYNRn/cZH6DFHksO7RmwTFBhw==", + "version": "3.978.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.978.0.tgz", + "integrity": "sha512-2chs05VbfgRNb5ZEYIwooeHCaL+DjwvrW3ElkslI71ltEqVNdeWvB7hbkLWPPKazV3kjY3H90pLDY8mMqsET+A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.1", - "@aws-sdk/credential-provider-node": "^3.972.1", - "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", - "@aws-sdk/middleware-expect-continue": "^3.972.1", - "@aws-sdk/middleware-flexible-checksums": "^3.972.1", - "@aws-sdk/middleware-host-header": "^3.972.1", - "@aws-sdk/middleware-location-constraint": "^3.972.1", - "@aws-sdk/middleware-logger": "^3.972.1", - "@aws-sdk/middleware-recursion-detection": "^3.972.1", - "@aws-sdk/middleware-sdk-s3": "^3.972.2", - "@aws-sdk/middleware-ssec": "^3.972.1", - "@aws-sdk/middleware-user-agent": "^3.972.2", - "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/core": "^3.973.4", + "@aws-sdk/credential-provider-node": "^3.972.2", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.2", + "@aws-sdk/middleware-expect-continue": "^3.972.2", + "@aws-sdk/middleware-flexible-checksums": "^3.972.2", + "@aws-sdk/middleware-host-header": "^3.972.2", + "@aws-sdk/middleware-location-constraint": "^3.972.2", + "@aws-sdk/middleware-logger": "^3.972.2", + "@aws-sdk/middleware-recursion-detection": "^3.972.2", + "@aws-sdk/middleware-sdk-s3": "^3.972.4", + "@aws-sdk/middleware-ssec": "^3.972.2", + "@aws-sdk/middleware-user-agent": "^3.972.4", + "@aws-sdk/region-config-resolver": "^3.972.2", "@aws-sdk/signature-v4-multi-region": "3.972.0", - "@aws-sdk/types": "^3.973.0", + "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-endpoints": "3.972.0", - "@aws-sdk/util-user-agent-browser": "^3.972.1", - "@aws-sdk/util-user-agent-node": "^3.972.1", + "@aws-sdk/util-user-agent-browser": "^3.972.2", + "@aws-sdk/util-user-agent-node": "^3.972.2", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.21.1", + "@smithy/core": "^3.22.0", "@smithy/eventstream-serde-browser": "^4.2.8", "@smithy/eventstream-serde-config-resolver": "^4.3.8", "@smithy/eventstream-serde-node": "^4.2.8", @@ -372,21 +372,21 @@ "@smithy/invalid-dependency": "^4.2.8", "@smithy/md5-js": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.11", - "@smithy/middleware-retry": "^4.4.27", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/node-http-handler": "^4.4.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.26", - "@smithy/util-defaults-mode-node": "^4.2.29", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -450,20 +450,20 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.3.tgz", - "integrity": "sha512-ZbM2Xy8ytAcfnNpkBltr6Qdw36W/4NW5nZdZieCuTfacoBFpi/NYiwb8U05KNJvLKeZnrV9Vi696i+r2DQFORg==", + "version": "3.973.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.4.tgz", + "integrity": "sha512-8Rk+kPP74YiR47x54bxYlKZswsaSh0a4XvvRUMLvyS/koNawhsGu/+qSZxREqUeTO+GkKpFvSQIsAZR+deUP+g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.973.1", "@aws-sdk/xml-builder": "^3.972.2", - "@smithy/core": "^3.21.1", + "@smithy/core": "^3.22.0", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.8", @@ -506,19 +506,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.3.tgz", - "integrity": "sha512-IbBGWhaxiEl64fznwh5PDEB0N7YJEAvK5b6nRtPVUKdKAHlOPgo6B9XB8mqWDs8Ct0oF/E34ZLiq2U0L5xDkrg==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.4.tgz", + "integrity": "sha512-OC7F3ipXV12QfDEWybQGHLzoeHBlAdx/nLzPfHP0Wsabu3JBffu5nlzSaJNf7to9HGtOW8Bpu8NX0ugmDrCbtw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.2", + "@aws-sdk/core": "^3.973.4", "@aws-sdk/types": "^3.973.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/node-http-handler": "^4.4.8", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" @@ -779,20 +779,20 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.3.tgz", - "integrity": "sha512-ZVtakKpQ7vI9l7tE2SJjQgoPYv2f/Bw/HMip5wBigsQBDvVbN300h+6nPnm0gnEQwIGGG0yJF3XCvr1/4pZW9A==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.4.tgz", + "integrity": "sha512-lradfn72Td7lswhZKi86VKRNkDtmQR7bq9shX1kaPK1itjThxfcx7ogXSvMm/0cuqoYGic8UUXQOaK4kpU933g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.2", + "@aws-sdk/core": "^3.973.4", "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/core": "^3.21.1", + "@smithy/core": "^3.22.0", "@smithy/node-config-provider": "^4.3.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.12", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.8", @@ -820,16 +820,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.3.tgz", - "integrity": "sha512-zq6aTiO/BiAIOA8EH8nB+wYvvnZ14Md9Gomm5DDhParshVEVglAyNPO5ADK4ZXFQbftIoO+Vgcvf4gewW/+iYQ==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.4.tgz", + "integrity": "sha512-6sU8jrSJvY/lqSnU6IYsa8SrCKwOZ4Enl6O4xVJo8RCq9Bdr5Giuw2eUaJAk9GPcpr4OFcmSFv3JOLhpKGeRZA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.2", + "@aws-sdk/core": "^3.973.4", "@aws-sdk/types": "^3.973.1", "@aws-sdk/util-endpoints": "3.972.0", - "@smithy/core": "^3.21.1", + "@smithy/core": "^3.22.0", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -4299,9 +4299,9 @@ } }, "node_modules/@oclif/plugin-not-found/node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", + "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", "license": "MIT", "optional": true, "peer": true, @@ -14381,9 +14381,9 @@ } }, "node_modules/inquirer/node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", + "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", "license": "MIT", "optional": true, "peer": true, @@ -27406,6 +27406,7 @@ "dependencies": { "@contentstack/cli-command": "~1.7.2", "@contentstack/cli-utilities": "~1.17.0", + "@contentstack/utils": "~1.6.3", "@oclif/core": "^4.3.0", "@oclif/plugin-help": "^6.2.28", "lodash": "^4.17.21" diff --git a/packages/contentstack-config/package.json b/packages/contentstack-config/package.json index af5ac17e96..3cfeee368a 100644 --- a/packages/contentstack-config/package.json +++ b/packages/contentstack-config/package.json @@ -23,6 +23,7 @@ "dependencies": { "@contentstack/cli-command": "~1.7.2", "@contentstack/cli-utilities": "~1.17.0", + "@contentstack/utils":"~1.6.3", "@oclif/core": "^4.3.0", "@oclif/plugin-help": "^6.2.28", "lodash": "^4.17.21" diff --git a/packages/contentstack-config/src/utils/region-handler.ts b/packages/contentstack-config/src/utils/region-handler.ts index 8a5db1da2e..641e72b366 100644 --- a/packages/contentstack-config/src/utils/region-handler.ts +++ b/packages/contentstack-config/src/utils/region-handler.ts @@ -1,4 +1,5 @@ import { configHandler } from '@contentstack/cli-utilities'; +import { getContentstackEndpoint } from '@contentstack/utils'; function validURL(str) { const pattern = new RegExp( @@ -15,109 +16,85 @@ function validURL(str) { return pattern.test(str); } -// Available region list -const regions = { - NA: { - name: 'NA', - cma: 'https://api.contentstack.io', - cda: 'https://cdn.contentstack.io', - uiHost: 'https://app.contentstack.com', - developerHubUrl: 'https://developerhub-api.contentstack.com', - launchHubUrl: 'https://launch-api.contentstack.com', - personalizeUrl: 'https://personalize-api.contentstack.com', - composableStudioUrl: 'https://composable-studio-api.contentstack.com', - }, - 'AWS-NA': { - name: 'AWS-NA', - cma: 'https://api.contentstack.io', - cda: 'https://cdn.contentstack.io', - uiHost: 'https://app.contentstack.com', - developerHubUrl: 'https://developerhub-api.contentstack.com', - launchHubUrl: 'https://launch-api.contentstack.com', - personalizeUrl: 'https://personalize-api.contentstack.com', - composableStudioUrl: 'https://composable-studio-api.contentstack.com', - }, - EU: { - name: 'EU', - cma: 'https://eu-api.contentstack.com', - cda: 'https://eu-cdn.contentstack.com', - uiHost: 'https://eu-app.contentstack.com', - developerHubUrl: 'https://eu-developerhub-api.contentstack.com', - launchHubUrl: 'https://eu-launch-api.contentstack.com', - personalizeUrl: 'https://eu-personalize-api.contentstack.com', - composableStudioUrl: 'https://eu-composable-studio-api.contentstack.com', - }, - 'AWS-EU': { - name: 'AWS-EU', - cma: 'https://eu-api.contentstack.com', - cda: 'https://eu-cdn.contentstack.com', - uiHost: 'https://eu-app.contentstack.com', - developerHubUrl: 'https://eu-developerhub-api.contentstack.com', - launchHubUrl: 'https://eu-launch-api.contentstack.com', - personalizeUrl: 'https://eu-personalize-api.contentstack.com', - composableStudioUrl: 'https://eu-composable-studio-api.contentstack.com', - }, - AU: { - name: 'AU', - cma: 'https://au-api.contentstack.com', - cda: 'https://au-cdn.contentstack.com', - uiHost: 'https://au-app.contentstack.com', - developerHubUrl: 'https://au-developerhub-api.contentstack.com', - launchHubUrl: 'https://au-launch-api.contentstack.com', - personalizeUrl: 'https://au-personalize-api.contentstack.com', - composableStudioUrl: 'https://au-composable-studio-api.contentstack.com', - }, - 'AWS-AU': { - name: 'AWS-AU', - cma: 'https://au-api.contentstack.com', - cda: 'https://au-cdn.contentstack.com', - uiHost: 'https://au-app.contentstack.com', - developerHubUrl: 'https://au-developerhub-api.contentstack.com', - launchHubUrl: 'https://au-launch-api.contentstack.com', - personalizeUrl: 'https://au-personalize-api.contentstack.com', - composableStudioUrl: 'https://au-composable-studio-api.contentstack.com', - }, - 'AZURE-NA': { - name: 'AZURE-NA', - cma: 'https://azure-na-api.contentstack.com', - cda: 'https://azure-na-cdn.contentstack.com', - uiHost: 'https://azure-na-app.contentstack.com', - developerHubUrl: 'https://azure-na-developerhub-api.contentstack.com', - launchHubUrl: 'https://azure-na-launch-api.contentstack.com', - personalizeUrl: 'https://azure-na-personalize-api.contentstack.com', - composableStudioUrl: 'https://azure-na-composable-studio-api.contentstack.com', - }, - 'AZURE-EU': { - name: 'AZURE-EU', - cma: 'https://azure-eu-api.contentstack.com', - cda: 'https://azure-eu-cdn.contentstack.com', - uiHost: 'https://azure-eu-app.contentstack.com', - developerHubUrl: 'https://azure-eu-developerhub-api.contentstack.com', - launchHubUrl: 'https://azure-eu-launch-api.contentstack.com', - personalizeUrl: 'https://azure-eu-personalize-api.contentstack.com', - composableStudioUrl: 'https://azure-eu-composable-studio-api.contentstack.com', - }, - 'GCP-NA': { - name: 'GCP-NA', - cma: 'https://gcp-na-api.contentstack.com', - cda: 'https://gcp-na-cdn.contentstack.com', - uiHost: 'https://gcp-na-app.contentstack.com', - developerHubUrl: 'https://gcp-na-developerhub-api.contentstack.com', - launchHubUrl: 'https://gcp-na-launch-api.contentstack.com', - personalizeUrl: 'https://gcp-na-personalize-api.contentstack.com', - composableStudioUrl: 'https://gcp-na-composable-studio-api.contentstack.com', - }, - 'GCP-EU': { - name: 'GCP-EU', - cma: 'https://gcp-eu-api.contentstack.com', - cda: 'https://gcp-eu-cdn.contentstack.com', - uiHost: 'https://gcp-eu-app.contentstack.com', - developerHubUrl: 'https://gcp-eu-developerhub-api.contentstack.com', - launchHubUrl: 'https://gcp-eu-launch-api.contentstack.com', - personalizeUrl: 'https://gcp-eu-personalize-api.contentstack.com', - composableStudioUrl: 'https://gcp-eu-composable-studio-api.contentstack.com', - }, -}; +/** + * Helper function to get composable studio URL for a region + * Since composableStudio endpoint is not yet in @contentstack/utils, we construct it manually + * @param {string} region - Region identifier (e.g., 'na', 'eu', 'au', 'azure-na', etc.) + * @returns {string} Composable Studio URL for the region + */ +function getComposableStudioUrl(region: string): string { + const normalizedRegion = region.toLowerCase().trim().replace(/_/g, '-'); + + // For North America (default region), no prefix is needed + if (normalizedRegion === 'na' || normalizedRegion === 'us' || normalizedRegion === 'aws-na') { + return 'https://composable-studio-api.contentstack.com'; + } + + // For other regions, use the region as a prefix + return `https://${normalizedRegion}-composable-studio-api.contentstack.com`; +} + +/** + * Helper function to build region object from @contentstack/utils + * @param {string} regionKey - Region identifier + * @returns {object} Region object with all necessary URLs + */ +function getRegionObject(regionKey: string) { + try { + // getContentstackEndpoint handles all aliases defined in regions.json + const endpoints = getContentstackEndpoint(regionKey) as any; + + if (typeof endpoints === 'string') { + throw new Error('Invalid endpoint response'); + } + + return { + name: regionKey, + cma: endpoints.contentManagement, + cda: endpoints.contentDelivery, + uiHost: endpoints.application, + developerHubUrl: endpoints.developerHub, + launchHubUrl: endpoints.launch, + personalizeUrl: endpoints.personalizeManagement, + composableStudioUrl: getComposableStudioUrl(regionKey), + }; + } catch (error) { + return null; + } +} + +/** + * Get all available regions dynamically + * This creates a regions object similar to the old hardcoded one but using @contentstack/utils + */ +function getAvailableRegions() { + const regionKeys = [ + 'NA', + 'AWS-NA', + 'EU', + 'AWS-EU', + 'AU', + 'AWS-AU', + 'AZURE-NA', + 'AZURE-EU', + 'GCP-NA', + 'GCP-EU', + ]; + + const regions: any = {}; + + for (const key of regionKeys) { + const regionObj = getRegionObject(key); + if (regionObj) { + regions[key] = regionObj; + } + } + + return regions; +} + +// Available region list - now dynamically generated +const regions = getAvailableRegions(); class UserConfig { /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf05d203ec..9dedb1584d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -478,6 +478,7 @@ importers: specifiers: '@contentstack/cli-command': ~1.7.2 '@contentstack/cli-utilities': ~1.17.0 + '@contentstack/utils': ~1.6.3 '@oclif/core': ^4.3.0 '@oclif/plugin-help': ^6.2.28 '@oclif/test': ^4.1.13 @@ -499,6 +500,7 @@ importers: dependencies: '@contentstack/cli-command': link:../contentstack-command '@contentstack/cli-utilities': link:../contentstack-utilities + '@contentstack/utils': 1.6.3 '@oclif/core': 4.8.0 '@oclif/plugin-help': 6.2.37 lodash: 4.17.23 From 044dee1122afd7bba2286864e557278fe08c49f2 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Thu, 29 Jan 2026 13:06:15 +0530 Subject: [PATCH 2/4] Refactor getComposableStudioUrl to derive region instead of using a hardcoded region parameter --- .../src/utils/region-handler.ts | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/contentstack-config/src/utils/region-handler.ts b/packages/contentstack-config/src/utils/region-handler.ts index 641e72b366..af334fee1a 100644 --- a/packages/contentstack-config/src/utils/region-handler.ts +++ b/packages/contentstack-config/src/utils/region-handler.ts @@ -17,21 +17,36 @@ function validURL(str) { } /** - * Helper function to get composable studio URL for a region + * Helper function to get composable studio URL from CMA endpoint * Since composableStudio endpoint is not yet in @contentstack/utils, we construct it manually - * @param {string} region - Region identifier (e.g., 'na', 'eu', 'au', 'azure-na', etc.) + * by extracting the region prefix from the CMA URL + * @param {string} cmaUrl - Content Management API URL (e.g., 'https://eu-api.contentstack.com') * @returns {string} Composable Studio URL for the region */ -function getComposableStudioUrl(region: string): string { - const normalizedRegion = region.toLowerCase().trim().replace(/_/g, '-'); +function getComposableStudioUrl(cmaUrl: string): string { + // Extract hostname from URL (e.g., "eu-api.contentstack.com") + const match = cmaUrl.match(/https?:\/\/([^/]+)/); + if (!match) { + return 'https://composable-studio-api.contentstack.com'; + } + + const hostname = match[1]; + + // For default NA region: api.contentstack.io or api.contentstack.com + if (hostname === 'api.contentstack.io' || hostname === 'api.contentstack.com') { + return 'https://composable-studio-api.contentstack.com'; + } + + // For other regions: {region}-api.contentstack.com + // Extract the region prefix before "-api" + const prefixMatch = hostname.match(/^(.+?)-api\.contentstack\.(com|io)$/); + const regionPrefix = prefixMatch ? prefixMatch[1] : ''; - // For North America (default region), no prefix is needed - if (normalizedRegion === 'na' || normalizedRegion === 'us' || normalizedRegion === 'aws-na') { + if (!regionPrefix) { return 'https://composable-studio-api.contentstack.com'; } - // For other regions, use the region as a prefix - return `https://${normalizedRegion}-composable-studio-api.contentstack.com`; + return `https://${regionPrefix}-composable-studio-api.contentstack.com`; } /** @@ -56,7 +71,7 @@ function getRegionObject(regionKey: string) { developerHubUrl: endpoints.developerHub, launchHubUrl: endpoints.launch, personalizeUrl: endpoints.personalizeManagement, - composableStudioUrl: getComposableStudioUrl(regionKey), + composableStudioUrl: getComposableStudioUrl(endpoints.contentManagement), }; } catch (error) { return null; From 0334553dbb29670ed98acca2398e51af1dd33a46 Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Fri, 30 Jan 2026 10:48:26 +0530 Subject: [PATCH 3/4] Enhance type safety in region-handler --- .talismanrc | 2 +- packages/contentstack-config/src/utils/region-handler.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.talismanrc b/.talismanrc index 65483d0e1a..43ea6af232 100644 --- a/.talismanrc +++ b/.talismanrc @@ -4,5 +4,5 @@ fileignoreconfig: - filename: package-lock.json checksum: 0982a352c260f7dd5bdde813104c2db8268abc489c791ec467b63eb8badb3cf1 - filename: packages/contentstack-config/src/utils/region-handler.ts - checksum: ae2df0d7570c11e28a3306bd3ef03ca0ec9e04b3b9b320d6ed50a1764459072c + checksum: 7b36342fda136ce73bcbde45fba78a9fa8f58536abfd6bd48eff1e5d95d3be52 version: '1.0' diff --git a/packages/contentstack-config/src/utils/region-handler.ts b/packages/contentstack-config/src/utils/region-handler.ts index af334fee1a..cbccd9be79 100644 --- a/packages/contentstack-config/src/utils/region-handler.ts +++ b/packages/contentstack-config/src/utils/region-handler.ts @@ -1,5 +1,9 @@ import { configHandler } from '@contentstack/cli-utilities'; import { getContentstackEndpoint } from '@contentstack/utils'; +import { Region } from '../interfaces'; +interface RegionsMap { + [key: string]: Region; +} function validURL(str) { const pattern = new RegExp( @@ -54,7 +58,7 @@ function getComposableStudioUrl(cmaUrl: string): string { * @param {string} regionKey - Region identifier * @returns {object} Region object with all necessary URLs */ -function getRegionObject(regionKey: string) { +function getRegionObject(regionKey: string): Region { try { // getContentstackEndpoint handles all aliases defined in regions.json const endpoints = getContentstackEndpoint(regionKey) as any; @@ -96,7 +100,7 @@ function getAvailableRegions() { 'GCP-EU', ]; - const regions: any = {}; + const regions: RegionsMap = {}; for (const key of regionKeys) { const regionObj = getRegionObject(key); From 62bab101b5dae9da3f2d54d37b4ad1e2f1fb04cc Mon Sep 17 00:00:00 2001 From: "harshitha.d" Date: Fri, 30 Jan 2026 16:33:53 +0530 Subject: [PATCH 4/4] Refactor region-handler to remove getComposableStudioUrl function and use endpoints.composableStudio directly --- .../src/utils/region-handler.ts | 35 +------------------ 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/packages/contentstack-config/src/utils/region-handler.ts b/packages/contentstack-config/src/utils/region-handler.ts index cbccd9be79..170c8394c4 100644 --- a/packages/contentstack-config/src/utils/region-handler.ts +++ b/packages/contentstack-config/src/utils/region-handler.ts @@ -20,39 +20,6 @@ function validURL(str) { return pattern.test(str); } -/** - * Helper function to get composable studio URL from CMA endpoint - * Since composableStudio endpoint is not yet in @contentstack/utils, we construct it manually - * by extracting the region prefix from the CMA URL - * @param {string} cmaUrl - Content Management API URL (e.g., 'https://eu-api.contentstack.com') - * @returns {string} Composable Studio URL for the region - */ -function getComposableStudioUrl(cmaUrl: string): string { - // Extract hostname from URL (e.g., "eu-api.contentstack.com") - const match = cmaUrl.match(/https?:\/\/([^/]+)/); - if (!match) { - return 'https://composable-studio-api.contentstack.com'; - } - - const hostname = match[1]; - - // For default NA region: api.contentstack.io or api.contentstack.com - if (hostname === 'api.contentstack.io' || hostname === 'api.contentstack.com') { - return 'https://composable-studio-api.contentstack.com'; - } - - // For other regions: {region}-api.contentstack.com - // Extract the region prefix before "-api" - const prefixMatch = hostname.match(/^(.+?)-api\.contentstack\.(com|io)$/); - const regionPrefix = prefixMatch ? prefixMatch[1] : ''; - - if (!regionPrefix) { - return 'https://composable-studio-api.contentstack.com'; - } - - return `https://${regionPrefix}-composable-studio-api.contentstack.com`; -} - /** * Helper function to build region object from @contentstack/utils * @param {string} regionKey - Region identifier @@ -75,7 +42,7 @@ function getRegionObject(regionKey: string): Region { developerHubUrl: endpoints.developerHub, launchHubUrl: endpoints.launch, personalizeUrl: endpoints.personalizeManagement, - composableStudioUrl: getComposableStudioUrl(endpoints.contentManagement), + composableStudioUrl: endpoints.composableStudio, }; } catch (error) { return null;