Skip to content

Commit 7405477

Browse files
authored
Merge pull request #2258 from contentstack/export-import/composable-studio
added multi region support
2 parents 11d559f + 34ae653 commit 7405477

File tree

18 files changed

+80
-7
lines changed

18 files changed

+80
-7
lines changed

packages/contentstack-command/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ abstract class ContentstackCommand extends Command {
105105
get personalizeUrl() {
106106
return this.region.personalizeUrl;
107107
}
108+
get composableStudioUrl() {
109+
return this.region.composableStudioUrl;
110+
}
108111
}
109112

110113
module.exports = {

packages/contentstack-command/src/interfaces/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ export interface Region {
55
developerHubUrl: string;
66
personalizeUrl: string;
77
launchHubUrl: string;
8+
composableStudioUrl: string;
89
uiHost: string;
910
}

packages/contentstack-config/src/commands/config/set/region.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
4848
launch: _flags.string({
4949
description: 'Custom host to set for Launch API',
5050
}),
51+
'composable-studio': _flags.string({
52+
description: 'Custom host to set for Composable Studio API',
53+
}),
5154
};
5255
static examples = [
5356
'$ csdx config:set:region',
@@ -62,7 +65,8 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
6265
'$ csdx config:set:region --cma <custom_cma_host_url> --cda <custom_cda_host_url> --ui-host <custom_ui_host_url> --name "India" --developer-hub <custom_developer_hub_url>',
6366
'$ csdx config:set:region --cma <custom_cma_host_url> --cda <custom_cda_host_url> --ui-host <custom_ui_host_url> --name "India" --personalize <custom_personalize_url>',
6467
'$ csdx config:set:region --cma <custom_cma_host_url> --cda <custom_cda_host_url> --ui-host <custom_ui_host_url> --name "India" --launch <custom_launch_url>',
65-
'$ csdx config:set:region --cda <custom_cda_host_url> --cma <custom_cma_host_url> --ui-host <custom_ui_host_url> --name "India" --developer-hub <custom_developer_hub_url> --launch <custom_launch_url> --personalize <custom_personalize_url>',
68+
'$ csdx config:set:region --cma <custom_cma_host_url> --cda <custom_cda_host_url> --ui-host <custom_ui_host_url> --name "India" --composable-studio <custom_composable_studio_url>',
69+
'$ csdx config:set:region --cda <custom_cda_host_url> --cma <custom_cma_host_url> --ui-host <custom_ui_host_url> --name "India" --developer-hub <custom_developer_hub_url> --launch <custom_launch_url> --personalize <custom_personalize_url> --composable-studio <custom_composable_studio_url>',
6670
];
6771

6872
static args: ArgInput = {
@@ -78,6 +82,7 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
7882
let developerHubUrl = regionSetFlags['developer-hub'];
7983
let personalizeUrl = regionSetFlags['personalize'];
8084
let launchHubUrl = regionSetFlags['launch'];
85+
let composableStudioUrl = regionSetFlags['composable-studio'];
8186
let selectedRegion = args.region;
8287
if (!(cda && cma && uiHost && name) && !selectedRegion) {
8388
selectedRegion = await interactive.askRegions();
@@ -105,7 +110,19 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
105110
if (!personalizeUrl) {
106111
personalizeUrl = this.transformUrl(cma, 'personalize-api');
107112
}
108-
let customRegion: Region = { cda, cma, uiHost, name, developerHubUrl, personalizeUrl, launchHubUrl };
113+
if (!composableStudioUrl) {
114+
composableStudioUrl = this.transformUrl(cma, 'composable-studio-api');
115+
}
116+
let customRegion: Region = {
117+
cda,
118+
cma,
119+
uiHost,
120+
name,
121+
developerHubUrl,
122+
personalizeUrl,
123+
launchHubUrl,
124+
composableStudioUrl,
125+
};
109126
customRegion = regionHandler.setCustomRegion(customRegion);
110127
await authHandler.setConfigData('logout'); //Todo: Handle this logout flow well through logout command call
111128
cliux.success(`Custom region has been set to ${customRegion.name}`);
@@ -115,6 +132,7 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
115132
cliux.success(`Developer Hub URL: ${customRegion.developerHubUrl}`);
116133
cliux.success(`Personalize URL: ${customRegion.personalizeUrl}`);
117134
cliux.success(`Launch URL: ${customRegion.launchHubUrl}`);
135+
cliux.success(`Composable Studio URL: ${customRegion.composableStudioUrl}`);
118136
} catch (error) {
119137
this.logger.error('failed to set the region', error);
120138
cliux.error(`Failed to set region due to: ${error.message}`);
@@ -133,6 +151,7 @@ export default class RegionSetCommand extends BaseCommand<typeof RegionSetComman
133151
cliux.success(`Developer Hub URL: ${regionDetails.developerHubUrl}`);
134152
cliux.success(`Personalize URL: ${regionDetails.personalizeUrl}`);
135153
cliux.success(`Launch URL: ${regionDetails.launchHubUrl}`);
154+
cliux.success(`Composable Studio URL: ${regionDetails.composableStudioUrl}`);
136155
} else {
137156
cliux.error(`Invalid region is given`);
138157
}

packages/contentstack-config/src/interfaces/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface Region {
1818
developerHubUrl: string;
1919
personalizeUrl: string;
2020
launchHubUrl: string;
21+
composableStudioUrl: string;
2122
}
2223

2324
export interface Limit {

packages/contentstack-config/src/utils/region-handler.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const regions = {
2525
developerHubUrl: 'https://developerhub-api.contentstack.com',
2626
launchHubUrl: 'https://launch-api.contentstack.com',
2727
personalizeUrl: 'https://personalize-api.contentstack.com',
28+
composableStudioUrl: 'https://composable-studio-api.contentstack.com',
2829
},
2930
'AWS-NA': {
3031
name: 'AWS-NA',
@@ -34,6 +35,7 @@ const regions = {
3435
developerHubUrl: 'https://developerhub-api.contentstack.com',
3536
launchHubUrl: 'https://launch-api.contentstack.com',
3637
personalizeUrl: 'https://personalize-api.contentstack.com',
38+
composableStudioUrl: 'https://composable-studio-api.contentstack.com',
3739
},
3840
EU: {
3941
name: 'EU',
@@ -43,6 +45,7 @@ const regions = {
4345
developerHubUrl: 'https://eu-developerhub-api.contentstack.com',
4446
launchHubUrl: 'https://eu-launch-api.contentstack.com',
4547
personalizeUrl: 'https://eu-personalize-api.contentstack.com',
48+
composableStudioUrl: 'https://eu-composable-studio-api.contentstack.com',
4649
},
4750
'AWS-EU': {
4851
name: 'AWS-EU',
@@ -52,6 +55,7 @@ const regions = {
5255
developerHubUrl: 'https://eu-developerhub-api.contentstack.com',
5356
launchHubUrl: 'https://eu-launch-api.contentstack.com',
5457
personalizeUrl: 'https://eu-personalize-api.contentstack.com',
58+
composableStudioUrl: 'https://eu-composable-studio-api.contentstack.com',
5559
},
5660
AU: {
5761
name: 'AU',
@@ -61,6 +65,7 @@ const regions = {
6165
developerHubUrl: 'https://au-developerhub-api.contentstack.com',
6266
launchHubUrl: 'https://au-launch-api.contentstack.com',
6367
personalizeUrl: 'https://au-personalize-api.contentstack.com',
68+
composableStudioUrl: 'https://au-composable-studio-api.contentstack.com',
6469
},
6570
'AWS-AU': {
6671
name: 'AWS-AU',
@@ -70,6 +75,7 @@ const regions = {
7075
developerHubUrl: 'https://au-developerhub-api.contentstack.com',
7176
launchHubUrl: 'https://au-launch-api.contentstack.com',
7277
personalizeUrl: 'https://au-personalize-api.contentstack.com',
78+
composableStudioUrl: 'https://au-composable-studio-api.contentstack.com',
7379
},
7480
'AZURE-NA': {
7581
name: 'AZURE-NA',
@@ -79,6 +85,7 @@ const regions = {
7985
developerHubUrl: 'https://azure-na-developerhub-api.contentstack.com',
8086
launchHubUrl: 'https://azure-na-launch-api.contentstack.com',
8187
personalizeUrl: 'https://azure-na-personalize-api.contentstack.com',
88+
composableStudioUrl: 'https://azure-na-composable-studio-api.contentstack.com',
8289
},
8390
'AZURE-EU': {
8491
name: 'AZURE-EU',
@@ -88,6 +95,7 @@ const regions = {
8895
developerHubUrl: 'https://azure-eu-developerhub-api.contentstack.com',
8996
launchHubUrl: 'https://azure-eu-launch-api.contentstack.com',
9097
personalizeUrl: 'https://azure-eu-personalize-api.contentstack.com',
98+
composableStudioUrl: 'https://azure-eu-composable-studio-api.contentstack.com',
9199
},
92100
'GCP-NA': {
93101
name: 'GCP-NA',
@@ -97,6 +105,7 @@ const regions = {
97105
developerHubUrl: 'https://gcp-na-developerhub-api.contentstack.com',
98106
launchHubUrl: 'https://gcp-na-launch-api.contentstack.com',
99107
personalizeUrl: 'https://gcp-na-personalize-api.contentstack.com',
108+
composableStudioUrl: 'https://gcp-na-composable-studio-api.contentstack.com',
100109
},
101110
'GCP-EU': {
102111
name: 'GCP-EU',
@@ -106,6 +115,7 @@ const regions = {
106115
developerHubUrl: 'https://gcp-eu-developerhub-api.contentstack.com',
107116
launchHubUrl: 'https://gcp-eu-launch-api.contentstack.com',
108117
personalizeUrl: 'https://gcp-eu-personalize-api.contentstack.com',
118+
composableStudioUrl: 'https://gcp-eu-composable-studio-api.contentstack.com',
109119
},
110120
};
111121

@@ -195,6 +205,7 @@ class UserConfig {
195205
developerHubUrl: regionObject['developerHubUrl'],
196206
personalizeUrl: regionObject['personalizeUrl'],
197207
launchHubUrl: regionObject['launchHubUrl'],
208+
composableStudioUrl: regionObject['composableStudioUrl'],
198209
};
199210

200211
return sanitizedRegion;

packages/contentstack-config/test/unit/commands/region.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('Region command', function () {
1717
developerHubUrl: 'https://developerhub-api.contentstack.com',
1818
launchHubUrl: 'https://launch-api.contentstack.com',
1919
personalizeUrl: 'https://personalization-api.contentstack.com',
20+
composableStudioUrl: 'https://composable-studio-api.contentstack.com',
2021
};
2122
let cliuxPrintStub: sinon.SinonStub;
2223
let configGetStub: sinon.SinonStub;
@@ -69,6 +70,7 @@ describe('Region command', function () {
6970
expect(result.developerHubUrl).to.equal('https://developerhub-api.contentstack.com');
7071
expect(result.personalizeUrl).to.equal('https://personalize-api.contentstack.com');
7172
expect(result.launchHubUrl).to.equal('https://launch-api.contentstack.com');
73+
expect(result.composableStudioUrl).to.equal('https://composable-studio-api.contentstack.com');
7274
});
7375

7476
it('should set EU region', function () {
@@ -80,6 +82,7 @@ describe('Region command', function () {
8082
expect(result.developerHubUrl).to.equal('https://eu-developerhub-api.contentstack.com');
8183
expect(result.personalizeUrl).to.equal('https://eu-personalize-api.contentstack.com');
8284
expect(result.launchHubUrl).to.equal('https://eu-launch-api.contentstack.com');
85+
expect(result.composableStudioUrl).to.equal('https://eu-composable-studio-api.contentstack.com');
8386
});
8487

8588
it('should set AU region', function () {
@@ -91,6 +94,7 @@ describe('Region command', function () {
9194
expect(result.developerHubUrl).to.equal('https://au-developerhub-api.contentstack.com');
9295
expect(result.personalizeUrl).to.equal('https://au-personalize-api.contentstack.com');
9396
expect(result.launchHubUrl).to.equal('https://au-launch-api.contentstack.com');
97+
expect(result.composableStudioUrl).to.equal('https://au-composable-studio-api.contentstack.com');
9498
});
9599

96100
it('should set AWS-NA region', function () {
@@ -102,6 +106,7 @@ describe('Region command', function () {
102106
expect(result.developerHubUrl).to.equal('https://developerhub-api.contentstack.com');
103107
expect(result.personalizeUrl).to.equal('https://personalize-api.contentstack.com');
104108
expect(result.launchHubUrl).to.equal('https://launch-api.contentstack.com');
109+
expect(result.composableStudioUrl).to.equal('https://composable-studio-api.contentstack.com');
105110
});
106111

107112
it('should set AWS-EU region', function () {
@@ -113,6 +118,7 @@ describe('Region command', function () {
113118
expect(result.developerHubUrl).to.equal('https://eu-developerhub-api.contentstack.com');
114119
expect(result.personalizeUrl).to.equal('https://eu-personalize-api.contentstack.com');
115120
expect(result.launchHubUrl).to.equal('https://eu-launch-api.contentstack.com');
121+
expect(result.composableStudioUrl).to.equal('https://eu-composable-studio-api.contentstack.com');
116122
});
117123

118124
it('should set AWS-AU region', function () {
@@ -124,6 +130,7 @@ describe('Region command', function () {
124130
expect(result.developerHubUrl).to.equal('https://au-developerhub-api.contentstack.com');
125131
expect(result.personalizeUrl).to.equal('https://au-personalize-api.contentstack.com');
126132
expect(result.launchHubUrl).to.equal('https://au-launch-api.contentstack.com');
133+
expect(result.composableStudioUrl).to.equal('https://au-composable-studio-api.contentstack.com');
127134
});
128135

129136
it('should set AZURE-NA region', function () {
@@ -135,6 +142,7 @@ describe('Region command', function () {
135142
expect(result.developerHubUrl).to.equal('https://azure-na-developerhub-api.contentstack.com');
136143
expect(result.personalizeUrl).to.equal('https://azure-na-personalize-api.contentstack.com');
137144
expect(result.launchHubUrl).to.equal('https://azure-na-launch-api.contentstack.com');
145+
expect(result.composableStudioUrl).to.equal('https://azure-na-composable-studio-api.contentstack.com');
138146
});
139147

140148
it('should set AZURE-EU region', function () {
@@ -146,6 +154,7 @@ describe('Region command', function () {
146154
expect(result.developerHubUrl).to.equal('https://azure-eu-developerhub-api.contentstack.com');
147155
expect(result.personalizeUrl).to.equal('https://azure-eu-personalize-api.contentstack.com');
148156
expect(result.launchHubUrl).to.equal('https://azure-eu-launch-api.contentstack.com');
157+
expect(result.composableStudioUrl).to.equal('https://azure-eu-composable-studio-api.contentstack.com');
149158
});
150159

151160
it('should set GCP-NA region', function () {
@@ -157,6 +166,7 @@ describe('Region command', function () {
157166
expect(result.developerHubUrl).to.equal('https://gcp-na-developerhub-api.contentstack.com');
158167
expect(result.personalizeUrl).to.equal('https://gcp-na-personalize-api.contentstack.com');
159168
expect(result.launchHubUrl).to.equal('https://gcp-na-launch-api.contentstack.com');
169+
expect(result.composableStudioUrl).to.equal('https://gcp-na-composable-studio-api.contentstack.com');
160170
});
161171

162172
it('should set GCP-EU region', function () {
@@ -168,6 +178,7 @@ describe('Region command', function () {
168178
expect(result.developerHubUrl).to.equal('https://gcp-eu-developerhub-api.contentstack.com');
169179
expect(result.personalizeUrl).to.equal('https://gcp-eu-personalize-api.contentstack.com');
170180
expect(result.launchHubUrl).to.equal('https://gcp-eu-launch-api.contentstack.com');
181+
expect(result.composableStudioUrl).to.equal('https://gcp-eu-composable-studio-api.contentstack.com');
171182
});
172183

173184
it('should return undefined for invalid region', function () {
@@ -263,6 +274,18 @@ describe('Region command', function () {
263274
expect(result.launchHubUrl).to.equal(customRegion.launchHubUrl);
264275
});
265276

277+
it('should set a custom region with composable studio URL', function () {
278+
const customRegion = {
279+
cma: 'https://custom-cma.com',
280+
cda: 'https://custom-cda.com',
281+
uiHost: 'https://custom-ui.com',
282+
name: 'Custom Region',
283+
composableStudioUrl: 'https://custom-composable-studio.com',
284+
};
285+
const result = UserConfig.setCustomRegion(customRegion);
286+
expect(result.composableStudioUrl).to.equal(customRegion.composableStudioUrl);
287+
});
288+
266289
it('should set a custom region with all optional URLs', function () {
267290
const customRegion = {
268291
cma: 'https://custom-cma.com',
@@ -272,6 +295,7 @@ describe('Region command', function () {
272295
developerHubUrl: 'https://custom-developer-hub.com',
273296
personalizeUrl: 'https://custom-personalize.com',
274297
launchHubUrl: 'https://custom-launch.com',
298+
composableStudioUrl: 'https://custom-composable-studio.com',
275299
};
276300
const result = UserConfig.setCustomRegion(customRegion);
277301
expect(result).to.deep.equal(customRegion);
@@ -286,6 +310,7 @@ describe('Region command', function () {
286310
developerHubUrl: 'https://custom-developer-hub.com',
287311
personalizeUrl: 'https://custom-personalize.com',
288312
launchHubUrl: 'https://custom-launch.com',
313+
composableStudioUrl: 'https://custom-composable-studio.com',
289314
invalidProperty: 'should be removed',
290315
};
291316
const result = UserConfig.setCustomRegion(customRegion);

packages/contentstack-export/src/commands/cm/stacks/export.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,9 @@ export default class ExportCommand extends Command {
174174
if (this.personalizeUrl) {
175175
exportConfig.modules.personalize.baseURL[exportConfig.region.name] = this.personalizeUrl;
176176
}
177+
178+
if (this.composableStudioUrl) {
179+
exportConfig.modules['composable-studio'].apiBaseUrl = this.composableStudioUrl;
180+
}
177181
}
178182
}

packages/contentstack-export/src/config/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,8 @@ const config: DefaultConfig = {
217217
'composable-studio': {
218218
dirName: 'composable_studio',
219219
fileName: 'composable_studio.json',
220-
apiBaseUrl: 'https://composable-studio-api.contentstack.com/v1',
220+
apiBaseUrl: 'https://composable-studio-api.contentstack.com',
221+
apiVersion: 'v1',
221222
},
222223
taxonomies: {
223224
dirName: 'taxonomies',

packages/contentstack-export/src/export/modules/composable-studio.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default class ExportComposableStudio {
2626

2727
// Initialize HttpClient with Composable Studio API base URL
2828
this.apiClient = new HttpClient();
29-
this.apiClient.baseUrl(this.composableStudioConfig.apiBaseUrl);
29+
this.apiClient.baseUrl(`${this.composableStudioConfig.apiBaseUrl}/${this.composableStudioConfig.apiVersion}`);
3030
}
3131

3232
async start(): Promise<void> {

packages/contentstack-export/src/types/default-config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export default interface DefaultConfig {
167167
dirName: string;
168168
fileName: string;
169169
apiBaseUrl: string;
170+
apiVersion: string;
170171
};
171172
masterLocale: {
172173
dirName: string;

0 commit comments

Comments
 (0)