@commercetools-frontend/application-cli 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,20 +12,23 @@ import _defineProperty from '@babel/runtime-corejs3/helpers/esm/defineProperty';
12
12
  import _mapInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/map';
13
13
  import _Object$entries from '@babel/runtime-corejs3/core-js-stable/object/entries';
14
14
  import _Set from '@babel/runtime-corejs3/core-js-stable/set';
15
- import _flatInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/flat';
15
+ import _flatMapInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/flat-map';
16
+ import { s as storageProviders, l as loadStorageBucketsConfig, c as clusterContexts } from '../../dist/storage-buckets-config-7277eecb.esm.js';
16
17
  import fs from 'node:fs';
17
18
  import path$1 from 'node:path';
18
19
  import { Listr } from 'listr2';
19
20
  import execa from 'execa';
20
- import { cosmiconfig } from 'cosmiconfig';
21
21
  import { findRootSync } from '@manypkg/find-root';
22
22
  import path from 'path';
23
23
  import _possibleConstructorReturn from '@babel/runtime-corejs3/helpers/esm/possibleConstructorReturn';
24
+ import _assertThisInitialized from '@babel/runtime-corejs3/helpers/esm/assertThisInitialized';
24
25
  import _get from '@babel/runtime-corejs3/helpers/esm/get';
25
26
  import _getPrototypeOf from '@babel/runtime-corejs3/helpers/esm/getPrototypeOf';
26
27
  import _inherits from '@babel/runtime-corejs3/helpers/esm/inherits';
27
28
  import _classCallCheck from '@babel/runtime-corejs3/helpers/esm/classCallCheck';
28
29
  import _createClass from '@babel/runtime-corejs3/helpers/esm/createClass';
30
+ import _classPrivateFieldLooseBase from '@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseBase';
31
+ import _classPrivateFieldLooseKey from '@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseKey';
29
32
  import _Reflect$construct from '@babel/runtime-corejs3/core-js-stable/reflect/construct';
30
33
  import fs$1 from 'fs';
31
34
  import dotenv from 'dotenv';
@@ -33,9 +36,9 @@ import _findInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instanc
33
36
  import _JSON$stringify from '@babel/runtime-corejs3/core-js-stable/json/stringify';
34
37
  import { processConfig } from '@commercetools-frontend/application-config';
35
38
  import { getSupportedLocales } from '@commercetools-frontend/l10n';
36
- import { c as clusterContexts } from '../../dist/storage-buckets-config-7845a091.esm.js';
37
39
  import _sliceInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/slice';
38
40
  import { Validator } from 'jsonschema';
41
+ import 'cosmiconfig';
39
42
  import 'ts-deepmerge';
40
43
 
41
44
  function getApplicationDirectory(cwd) {
@@ -67,23 +70,34 @@ function _callSuper(_this, derived, args) {
67
70
  derived = _getPrototypeOf(derived);
68
71
  return _possibleConstructorReturn(_this, isNativeReflectConstruct() ? _Reflect$construct(derived, args || [], _getPrototypeOf(_this).constructor) : derived.apply(_this, args));
69
72
  }
73
+ var _bucketRegion = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
74
+ var _bucketEnvironment$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
70
75
  let StorageProvider = /*#__PURE__*/function () {
71
- function StorageProvider() {
76
+ function StorageProvider(config) {
72
77
  _classCallCheck(this, StorageProvider);
78
+ _Object$defineProperty(this, _bucketRegion, {
79
+ writable: true,
80
+ value: void 0
81
+ });
82
+ _Object$defineProperty(this, _bucketEnvironment$1, {
83
+ writable: true,
84
+ value: void 0
85
+ });
86
+ _classPrivateFieldLooseBase(this, _bucketRegion)[_bucketRegion] = config.bucketRegion;
87
+ _classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1] = config.bucketEnvironment;
73
88
  }
89
+ /**
90
+ * Construct the storage bucket URL for the specific application and cloud environment.
91
+ *
92
+ * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
93
+ * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
94
+ *
95
+ * This allows all cloud environments sharing the same static assets while each application's index
96
+ * is uploaded with different headers (e.g. CSP rules).
97
+ */
74
98
  _createClass(StorageProvider, [{
75
99
  key: "getBucketNamespace",
76
- value:
77
- /**
78
- * Construct the storage bucket URL for the specific application and cloud environment.
79
- *
80
- * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
81
- * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
82
- *
83
- * This allows all cloud environments sharing the same static assets while each application's index
84
- * is uploaded with different headers (e.g. CSP rules).
85
- */
86
- function getBucketNamespace(prNumber) {
100
+ value: function getBucketNamespace(prNumber) {
87
101
  if (!prNumber) return;
88
102
  if (prNumber === 'merchant-center-preview') return prNumber;
89
103
  return `mc-${prNumber}`;
@@ -96,56 +110,85 @@ let StorageProvider = /*#__PURE__*/function () {
96
110
  key: "getAssetsBucketUrl",
97
111
  value: function getAssetsBucketUrl(_ref) {
98
112
  var _context;
99
- let bucketProtocol = _ref.bucketProtocol,
100
- bucketRegion = _ref.bucketRegion,
101
- bucketNamespace = _ref.bucketNamespace,
102
- applicationName = _ref.applicationName;
103
- const assetsBucketUrl = _filterInstanceProperty(_context = [bucketRegion, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
113
+ let applicationName = _ref.applicationName,
114
+ bucketProtocol = _ref.bucketProtocol,
115
+ bucketNamespace = _ref.bucketNamespace;
116
+ const assetsBucketUrl = _filterInstanceProperty(_context = [_classPrivateFieldLooseBase(this, _bucketRegion)[_bucketRegion], bucketNamespace, applicationName]).call(_context, Boolean).join('/');
104
117
  return `${bucketProtocol}${assetsBucketUrl}`;
105
118
  }
106
119
  }, {
107
120
  key: "getApplicationIndexBucketUrl",
108
121
  value: function getApplicationIndexBucketUrl(_ref2) {
109
- let bucketProtocol = _ref2.bucketProtocol,
110
- bucketRegion = _ref2.bucketRegion,
111
- bucketNamespace = _ref2.bucketNamespace,
112
- prNumber = _ref2.prNumber,
122
+ let prNumber = _ref2.prNumber,
113
123
  applicationName = _ref2.applicationName,
114
- bucketEnvironment = _ref2.bucketEnvironment;
124
+ bucketProtocol = _ref2.bucketProtocol,
125
+ bucketNamespace = _ref2.bucketNamespace;
115
126
  const applicationAssetsBucketUrl = this.getAssetsBucketUrl({
116
- bucketProtocol,
117
- bucketRegion,
118
- bucketNamespace,
127
+ applicationName,
119
128
  prNumber,
120
- applicationName
129
+ bucketProtocol,
130
+ bucketNamespace
121
131
  });
122
- const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
132
+ const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]}`;
123
133
  return applicationIndexBucketUrl;
124
134
  }
125
135
  }, {
126
136
  key: "getCdnUrl",
127
137
  value: function getCdnUrl(_ref3) {
128
138
  var _context2;
129
- let publicBaseUrl = _ref3.publicBaseUrl,
130
- bucketRegion = _ref3.bucketRegion,
139
+ let applicationName = _ref3.applicationName,
131
140
  prNumber = _ref3.prNumber,
132
- applicationName = _ref3.applicationName;
133
- return _filterInstanceProperty(_context2 = [publicBaseUrl, bucketRegion, this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
141
+ publicBaseUrl = _ref3.publicBaseUrl;
142
+ return _filterInstanceProperty(_context2 = [publicBaseUrl, _classPrivateFieldLooseBase(this, _bucketRegion)[_bucketRegion], this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
143
+ }
144
+ }, {
145
+ key: "getPublicBaseUrl",
146
+ value: function getPublicBaseUrl(tag) {
147
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]) {
148
+ throw new Error("'bucketEnvironment is not defined. Required to determine 'publicBaseUrl'.");
149
+ }
150
+ const storageProvider = storageProviders[tag];
151
+ const publicBaseUrl = storageProvider.urls[_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]] ?? storageProvider.urls.default;
152
+ return publicBaseUrl;
134
153
  }
135
154
  }]);
136
155
  return StorageProvider;
137
156
  }();
157
+ var _bucketRegion2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
158
+ var _bucketEnvironment2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
138
159
  let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
139
160
  _inherits(GoogleStorageProvider, _StorageProvider);
140
- function GoogleStorageProvider() {
161
+ function GoogleStorageProvider(config) {
162
+ var _this;
141
163
  _classCallCheck(this, GoogleStorageProvider);
142
- return _callSuper(this, GoogleStorageProvider, arguments);
164
+ _this = _callSuper(this, GoogleStorageProvider, [config]);
165
+ _Object$defineProperty(_assertThisInitialized(_this), _bucketRegion2, {
166
+ writable: true,
167
+ value: void 0
168
+ });
169
+ _Object$defineProperty(_assertThisInitialized(_this), _bucketEnvironment2, {
170
+ writable: true,
171
+ value: void 0
172
+ });
173
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketRegion2)[_bucketRegion2] = config.bucketRegion;
174
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketEnvironment2)[_bucketEnvironment2] = config.bucketEnvironment;
175
+ return _this;
143
176
  }
144
177
  _createClass(GoogleStorageProvider, [{
145
178
  key: "getTag",
146
179
  value: function getTag() {
147
180
  return 'gs';
148
181
  }
182
+ }, {
183
+ key: "getBucketRegion",
184
+ value: function getBucketRegion() {
185
+ return _classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2];
186
+ }
187
+ }, {
188
+ key: "getBucketEnvironment",
189
+ value: function getBucketEnvironment() {
190
+ return _classPrivateFieldLooseBase(this, _bucketEnvironment2)[_bucketEnvironment2];
191
+ }
149
192
  }, {
150
193
  key: "getProtocol",
151
194
  value: function getProtocol() {
@@ -154,7 +197,7 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
154
197
  }, {
155
198
  key: "getPublicBaseUrl",
156
199
  value: function getPublicBaseUrl() {
157
- return 'https://storage.googleapis.com';
200
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getPublicBaseUrl", this).call(this, this.getTag());
158
201
  }
159
202
  }, {
160
203
  key: "getCdnUrl",
@@ -182,18 +225,24 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
182
225
  }]);
183
226
  return GoogleStorageProvider;
184
227
  }(StorageProvider); // TODO: to be implemented.
185
- function getStorageProvider(storageProvider) {
228
+ function getStorageProvider(storageProvider, config) {
186
229
  switch (storageProvider) {
187
230
  case 'gs':
188
- return new GoogleStorageProvider();
231
+ return new GoogleStorageProvider(config);
189
232
  default:
190
233
  throw new Error(`Storage provider ${storageProvider} not supported`);
191
234
  }
192
235
  }
193
236
 
237
+ var _bucketEnvironment = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
194
238
  let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
195
- function GoogleStorageUploadScriptsGenerator() {
239
+ function GoogleStorageUploadScriptsGenerator(config) {
196
240
  _classCallCheck(this, GoogleStorageUploadScriptsGenerator);
241
+ _Object$defineProperty(this, _bucketEnvironment, {
242
+ writable: true,
243
+ value: void 0
244
+ });
245
+ _classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment] = config.bucketEnvironment;
197
246
  }
198
247
  _createClass(GoogleStorageUploadScriptsGenerator, [{
199
248
  key: "getApplicationIndexUploadScript",
@@ -201,10 +250,12 @@ let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
201
250
  let packageManagerName = _ref.packageManagerName,
202
251
  bucketUrl = _ref.bucketUrl,
203
252
  cdnUrl = _ref.cdnUrl,
204
- bucketEnvironment = _ref.bucketEnvironment,
205
253
  buildRevision = _ref.buildRevision,
206
254
  buildNumber = _ref.buildNumber,
207
255
  applicationIndexOutFile = _ref.applicationIndexOutFile;
256
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]) {
257
+ throw new Error("Missing 'bucketEnvironment' when generating application index.");
258
+ }
208
259
  return `
209
260
  #!/usr/bin/env bash
210
261
 
@@ -222,7 +273,7 @@ gcloud storage cp \\
222
273
  echo "Creating version.json and uploading it to bucket ${bucketUrl}"
223
274
 
224
275
  NODE_ENV=production ${packageManagerName} application-cli create-version \\
225
- --version-url=${cdnUrl}/${bucketEnvironment}/version.json \\
276
+ --version-url=${cdnUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]}/version.json \\
226
277
  --build-revision=${buildRevision} \\
227
278
  --build-number=${buildNumber} \\
228
279
  --out-file=$(dirname "$0")/version.json
@@ -309,10 +360,10 @@ fi
309
360
  }]);
310
361
  return GoogleStorageUploadScriptsGenerator;
311
362
  }(); // TODO: To be implemented.
312
- function getUploadScriptsGenerator(storageProvider) {
363
+ function getUploadScriptsGenerator(storageProvider, config) {
313
364
  switch (storageProvider) {
314
365
  case 'gs':
315
- return new GoogleStorageUploadScriptsGenerator();
366
+ return new GoogleStorageUploadScriptsGenerator(config);
316
367
  default:
317
368
  throw new Error(`Storage provider ${storageProvider} not supported`);
318
369
  }
@@ -356,10 +407,7 @@ function loadDotenvFiles(_ref) {
356
407
  }
357
408
 
358
409
  function ownKeys$2(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
359
- function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context4, _context5; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context4 = ownKeys$2(Object(t), !0)).call(_context4, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context5 = ownKeys$2(Object(t))).call(_context5, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
360
- const storageBucketConfigExplorer = cosmiconfig('storage-buckets', {
361
- searchStrategy: 'project'
362
- });
410
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context3, _context4; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context3 = ownKeys$2(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context4 = ownKeys$2(Object(t))).call(_context4, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
363
411
  function writeUploadScriptFile(_ref) {
364
412
  let fileName = _ref.fileName,
365
413
  fileContent = _ref.fileContent,
@@ -374,12 +422,10 @@ async function compileApplicationAssets(_ref2) {
374
422
  let cliFlags = _ref2.cliFlags,
375
423
  storageProvider = _ref2.storageProvider,
376
424
  uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
377
- bucketRegion = _ref2.bucketRegion,
378
425
  paths = _ref2.paths;
379
426
  const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
380
427
  storageProvider,
381
428
  bucketUrl: storageProvider.getAssetsBucketUrl({
382
- bucketRegion,
383
429
  prNumber: cliFlags.prNumber,
384
430
  applicationName: cliFlags.applicationName
385
431
  }),
@@ -387,7 +433,7 @@ async function compileApplicationAssets(_ref2) {
387
433
  skipMenu: cliFlags.skipMenu
388
434
  });
389
435
  const parsedApplicationAssetsUploadScriptFile = path$1.parse(cliFlags.applicationAssetsUploadScriptOutFile);
390
- const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${bucketRegion}${parsedApplicationAssetsUploadScriptFile.ext}`;
436
+ const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${storageProvider.getBucketRegion()}${parsedApplicationAssetsUploadScriptFile.ext}`;
391
437
  writeUploadScriptFile({
392
438
  fileName: applicationAssetsUploadScriptFileName,
393
439
  fileContent: applicationAssetsUploadScriptContent,
@@ -399,9 +445,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
399
445
  storageProvider = _ref3.storageProvider,
400
446
  uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
401
447
  paths = _ref3.paths,
402
- bucketRegion = _ref3.bucketRegion,
403
- cloudEnvironment = _ref3.cloudEnvironment,
404
- bucketEnvironment = _ref3.bucketEnvironment;
448
+ cloudEnvironment = _ref3.cloudEnvironment;
405
449
  const cloudEnvironmentDeploymentPath = path$1.join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
406
450
  // Ensure the folder exists
407
451
  const createDeploymentsFolderResult = await execa('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
@@ -413,7 +457,6 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
413
457
 
414
458
  // Construct the proper CDN URL for the specific application
415
459
  const cdnUrl = storageProvider.getCdnUrl({
416
- bucketRegion,
417
460
  prNumber: cliFlags.prNumber,
418
461
  applicationName: cliFlags.applicationName
419
462
  });
@@ -459,13 +502,10 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
459
502
  storageProvider,
460
503
  packageManagerName: cliFlags.packageManagerName,
461
504
  bucketUrl: storageProvider.getApplicationIndexBucketUrl({
462
- bucketRegion,
463
505
  prNumber: cliFlags.prNumber,
464
- applicationName: cliFlags.applicationName,
465
- bucketEnvironment
506
+ applicationName: cliFlags.applicationName
466
507
  }),
467
508
  cdnUrl,
468
- bucketEnvironment,
469
509
  buildRevision: cliFlags.buildRevision,
470
510
  buildNumber: cliFlags.buildNumber,
471
511
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
@@ -484,16 +524,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
484
524
  }
485
525
  async function command$3(cliFlags, cwd) {
486
526
  var _context;
487
- let cloudEnvironmentsGroupedByBucketRegions;
488
- try {
489
- // This is the list of the supported cloud environments and their related bucket location.
490
- cloudEnvironmentsGroupedByBucketRegions = await storageBucketConfigExplorer.search();
491
- } catch (e) {
492
- throw new Error('Failed to load a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
493
- }
494
- if (!cloudEnvironmentsGroupedByBucketRegions) {
495
- throw new Error('Failed loading a storage bucket configuration');
496
- }
527
+ const storageBucketConfig = await loadStorageBucketsConfig();
497
528
  const applicationDirectory = getApplicationDirectory(cwd);
498
529
  let assetsPath;
499
530
  if (cliFlags.ciAssetsRootPath && isCI()) {
@@ -508,28 +539,30 @@ async function command$3(cliFlags, cwd) {
508
539
  dotenvPath: cliFlags.dotenvFolder && path$1.join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
509
540
  assetsPath
510
541
  };
511
- const defaultStorageProviders = ['gs'];
512
- const taskList = new Listr(_mapInstanceProperty(_context = _Object$entries(cloudEnvironmentsGroupedByBucketRegions.config)).call(_context, _ref4 => {
542
+ const defaultStorageProviders = [storageProviders.gs.tag];
543
+ const taskList = new Listr(_mapInstanceProperty(_context = _Object$entries(storageBucketConfig)).call(_context, _ref4 => {
513
544
  let _ref5 = _slicedToArray(_ref4, 2),
514
545
  bucketRegion = _ref5[0],
515
546
  bucketEnvironmentConfigs = _ref5[1];
516
547
  return {
517
548
  title: `Compiling for bucket region ${bucketRegion}`,
518
549
  task: (_bucketRegionCtx, bucketRegionTask) => {
519
- var _context2;
520
550
  // NOTE: Application assets need to be compiled
521
551
  // for all storage providers once per region.
522
- const allStorageProvidersForBucketRegion = [...new _Set(_flatInstanceProperty(_context2 = _mapInstanceProperty(bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders)).call(_context2))];
552
+ const allStorageProvidersForBucketRegion = [...new _Set(_flatMapInstanceProperty(bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders))];
523
553
  const allApplicationAssetTasks = _mapInstanceProperty(allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
524
- const storageProvider = getStorageProvider(storageProviderTag);
525
- const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
554
+ const uploadScriptsGeneratorConfig = {};
555
+ const storageProviderConfig = {
556
+ bucketRegion: bucketRegion
557
+ };
558
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
559
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, uploadScriptsGeneratorConfig);
526
560
  return {
527
561
  title: `Compiling application assets for '${storageProviderTag}'`,
528
562
  task: () => compileApplicationAssets({
529
563
  cliFlags,
530
564
  storageProvider,
531
565
  uploadScriptsGenerator,
532
- bucketRegion: bucketRegion,
533
566
  paths
534
567
  })
535
568
  };
@@ -538,13 +571,17 @@ async function command$3(cliFlags, cwd) {
538
571
  const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
539
572
  bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
540
573
  storageProviders = bucketEnvironmentConfig.storageProviders;
574
+ const storageProviderConfig = {
575
+ bucketRegion: bucketRegion,
576
+ bucketEnvironment
577
+ };
541
578
  return {
542
579
  title: `Compiling for cloud environment '${cloudEnvironment}'`,
543
580
  task: (_storageProviderCtx, storageProviderTask) => {
544
- var _context3;
545
- const applicationIndexTasksForStorageProviders = _mapInstanceProperty(_context3 = storageProviders || defaultStorageProviders).call(_context3, storageProviderTag => {
546
- const storageProvider = getStorageProvider(storageProviderTag);
547
- const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
581
+ var _context2;
582
+ const applicationIndexTasksForStorageProviders = _mapInstanceProperty(_context2 = storageProviders || defaultStorageProviders).call(_context2, storageProviderTag => {
583
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
584
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, storageProviderConfig);
548
585
  return {
549
586
  title: `Compiling application index for storage provider '${storageProviderTag}'`,
550
587
  task: () => {
@@ -553,9 +590,7 @@ async function command$3(cliFlags, cwd) {
553
590
  storageProvider,
554
591
  uploadScriptsGenerator,
555
592
  paths,
556
- bucketRegion: bucketRegion,
557
- cloudEnvironment,
558
- bucketEnvironment
593
+ cloudEnvironment
559
594
  });
560
595
  }
561
596
  };
@@ -839,7 +874,7 @@ async function command(cliFlags) {
839
874
 
840
875
  var pkgJson = {
841
876
  name: "@commercetools-frontend/application-cli",
842
- version: "2.1.2",
877
+ version: "2.2.0",
843
878
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
844
879
  keywords: [
845
880
  "commercetools",
@@ -864,13 +899,13 @@ var pkgJson = {
864
899
  "@babel/core": "^7.22.11",
865
900
  "@babel/runtime-corejs3": "^7.21.0",
866
901
  "@babel/runtime": "^7.21.0",
867
- "@commercetools-frontend/application-config": "22.17.1",
868
- "@commercetools-frontend/constants": "22.17.1",
869
- "@commercetools-frontend/l10n": "22.17.1",
902
+ "@commercetools-frontend/application-config": "22.19.0",
903
+ "@commercetools-frontend/constants": "22.19.0",
904
+ "@commercetools-frontend/l10n": "22.19.0",
870
905
  "@manypkg/find-root": "2.2.1",
871
906
  cac: "^6.7.14",
872
907
  cosmiconfig: "9.0.0",
873
- dotenv: "16.4.1",
908
+ dotenv: "16.4.2",
874
909
  execa: "5.1.1",
875
910
  jsonschema: "^1.4.1",
876
911
  listr2: "8.0.2",
@@ -879,7 +914,7 @@ var pkgJson = {
879
914
  },
880
915
  devDependencies: {
881
916
  "@tsconfig/node20": "20.1.2",
882
- "@types/node": "20.11.5",
917
+ "@types/node": "20.11.25",
883
918
  typescript: "5.2.2"
884
919
  },
885
920
  engines: {
@@ -2,9 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var storageBucketsConfig = require('./storage-buckets-config-478b8585.cjs.dev.js');
5
+ var storageBucketsConfig = require('./storage-buckets-config-30d0f671.cjs.dev.js');
6
6
  require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
7
7
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
8
+ require('cosmiconfig');
8
9
  require('ts-deepmerge');
9
10
 
10
11
 
@@ -13,3 +14,4 @@ exports.bucketEnvironments = storageBucketsConfig.bucketEnvironments;
13
14
  exports.bucketRegions = storageBucketsConfig.bucketRegions;
14
15
  exports.clusterContexts = storageBucketsConfig.clusterContexts;
15
16
  exports.defineStorageBucketsConfig = storageBucketsConfig.defineStorageBucketsConfig;
17
+ exports.storageProviders = storageBucketsConfig.storageProviders;
@@ -2,9 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var storageBucketsConfig = require('./storage-buckets-config-0b3808a3.cjs.prod.js');
5
+ var storageBucketsConfig = require('./storage-buckets-config-06a6b7d2.cjs.prod.js');
6
6
  require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
7
7
  require('@babel/runtime-corejs3/core-js-stable/object/keys');
8
+ require('cosmiconfig');
8
9
  require('ts-deepmerge');
9
10
 
10
11
 
@@ -13,3 +14,4 @@ exports.bucketEnvironments = storageBucketsConfig.bucketEnvironments;
13
14
  exports.bucketRegions = storageBucketsConfig.bucketRegions;
14
15
  exports.clusterContexts = storageBucketsConfig.clusterContexts;
15
16
  exports.defineStorageBucketsConfig = storageBucketsConfig.defineStorageBucketsConfig;
17
+ exports.storageProviders = storageBucketsConfig.storageProviders;
@@ -1,4 +1,5 @@
1
- export { b as bucketEnvironments, a as bucketRegions, c as clusterContexts, d as defineStorageBucketsConfig } from './storage-buckets-config-7845a091.esm.js';
1
+ export { b as bucketEnvironments, a as bucketRegions, c as clusterContexts, d as defineStorageBucketsConfig, s as storageProviders } from './storage-buckets-config-7277eecb.esm.js';
2
2
  import '@babel/runtime-corejs3/core-js-stable/instance/for-each';
3
3
  import '@babel/runtime-corejs3/core-js-stable/object/keys';
4
+ import 'cosmiconfig';
4
5
  import 'ts-deepmerge';
@@ -1,3 +1,4 @@
1
+ import type { TStorageProviderTag, TStorageProvider } from "./types.js";
1
2
  export declare const clusterContexts: {
2
3
  readonly 'ctp_staging_gcp_europe-west1_v1': "ctp_staging_gcp_europe-west1_v1";
3
4
  readonly 'vw_staging_aws_eu-central-1_v1': "vw_staging_aws_eu-central-1_v1";
@@ -32,3 +33,4 @@ export declare const bucketRegions: {
32
33
  readonly northAmerica: "merchant-center-north-america";
33
34
  readonly asia: "merchant-center-asia";
34
35
  };
36
+ export declare const storageProviders: Record<TStorageProviderTag, TStorageProvider>;
@@ -1,4 +1,4 @@
1
- import { TBucketRegion, TCloudEnvironment, type TStorageBucketsConfig } from "./types.js";
1
+ import type { TBucketRegion, TCloudEnvironment, TStorageBucketsConfig } from "./types.js";
2
2
  type TConfigOptions = {
3
3
  disabledBucketRegions?: TBucketRegion[];
4
4
  disabledEnvironments?: TCloudEnvironment[];
@@ -8,4 +8,5 @@ type TDefineConfigArgs = {
8
8
  options?: TConfigOptions;
9
9
  };
10
10
  declare function defineStorageBucketsConfig({ regions, options, }?: TDefineConfigArgs): TStorageBucketsConfig;
11
- export { defineStorageBucketsConfig };
11
+ declare function loadStorageBucketsConfig(): Promise<TStorageBucketsConfig>;
12
+ export { defineStorageBucketsConfig, loadStorageBucketsConfig };
@@ -3,16 +3,10 @@ export type TCloudEnvironment = (typeof clusterContexts)[keyof typeof clusterCon
3
3
  export type TBucketEnvironment = (typeof bucketEnvironments)[keyof typeof bucketEnvironments];
4
4
  export type TBucketRegion = (typeof bucketRegions)[keyof typeof bucketRegions];
5
5
  export type TApplicationAssetsBucketConfig = {
6
- bucketRegion: TBucketRegion;
7
6
  prNumber?: string;
8
7
  applicationName: string;
9
8
  };
10
- export type TApplicationIndexBucketConfig = {
11
- bucketRegion: TBucketRegion;
12
- prNumber?: string;
13
- applicationName: string;
14
- bucketEnvironment: TBucketEnvironment;
15
- };
9
+ export type TApplicationIndexBucketConfig = TApplicationAssetsBucketConfig;
16
10
  export type TUploadScriptFile = {
17
11
  fileName: string;
18
12
  fileContent: string;
@@ -25,14 +19,29 @@ type TPaths = {
25
19
  assetsPath: string;
26
20
  };
27
21
  export type TStorageProviderTag = 'gs' | 's3';
22
+ export type TStorageProvider = {
23
+ tag: TStorageProviderTag;
24
+ urls: {
25
+ default: string;
26
+ } & Partial<Record<TBucketEnvironment, string>>;
27
+ };
28
+ export type TStorageProviderConfig = {
29
+ bucketRegion?: TBucketRegion;
30
+ bucketEnvironment?: TBucketEnvironment;
31
+ };
28
32
  export interface IStorageProvider {
29
33
  getTag(): TStorageProviderTag;
34
+ getBucketRegion(): TBucketRegion | undefined;
35
+ getBucketEnvironment(): TBucketEnvironment | undefined;
30
36
  getProtocol(): string;
31
37
  getPublicBaseUrl(): string;
32
38
  getCdnUrl(config: TApplicationAssetsBucketConfig): string;
33
39
  getAssetsBucketUrl(config: TApplicationAssetsBucketConfig): string;
34
40
  getApplicationIndexBucketUrl(config: TApplicationIndexBucketConfig): string;
35
41
  }
42
+ export type TUploadScriptsGeneratorConfig = {
43
+ bucketEnvironment?: TBucketEnvironment;
44
+ };
36
45
  export interface IUploadScriptsGenerator {
37
46
  getProductionBundlesUploadScript(config: TCreateApplicationAssetsUploadScript): string;
38
47
  getApplicationIndexUploadScript(config: TCreateApplicationIndexUploadScript): string;
@@ -42,16 +51,13 @@ export type TCompileEnvApplicationIndexes = {
42
51
  storageProvider: IStorageProvider;
43
52
  uploadScriptsGenerator: IUploadScriptsGenerator;
44
53
  paths: TPaths;
45
- bucketRegion: TBucketRegion;
46
54
  cloudEnvironment: TCloudEnvironment;
47
- bucketEnvironment: TBucketEnvironment;
48
55
  };
49
56
  export type TCompileApplicationAssets = {
50
57
  cliFlags: TCompileDeploymentsFlags;
51
58
  storageProvider: IStorageProvider;
52
59
  uploadScriptsGenerator: IUploadScriptsGenerator;
53
60
  paths: TPaths;
54
- bucketRegion: TBucketRegion;
55
61
  };
56
62
  export type TBucketEnvironmentConfig = {
57
63
  cloudEnvironment: TCloudEnvironment;
@@ -67,7 +73,6 @@ export type TCreateApplicationIndexUploadScript = {
67
73
  storageProvider: IStorageProvider;
68
74
  bucketUrl: string;
69
75
  cdnUrl: string;
70
- bucketEnvironment: TBucketEnvironment;
71
76
  buildRevision: string;
72
77
  buildNumber: number;
73
78
  applicationIndexOutFile: string;
@@ -2,6 +2,7 @@
2
2
 
3
3
  var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
4
4
  var _Object$keys = require('@babel/runtime-corejs3/core-js-stable/object/keys');
5
+ var cosmiconfig = require('cosmiconfig');
5
6
  var tsDeepmerge = require('ts-deepmerge');
6
7
 
7
8
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -43,6 +44,20 @@ const bucketRegions = {
43
44
  northAmerica: 'merchant-center-north-america',
44
45
  asia: 'merchant-center-asia'
45
46
  };
47
+ const storageProviders = {
48
+ gs: {
49
+ tag: 'gs',
50
+ urls: {
51
+ default: 'https://storage.googleapis.com'
52
+ }
53
+ },
54
+ s3: {
55
+ tag: 's3',
56
+ urls: {
57
+ default: 'https://s3.amazonaws.com'
58
+ }
59
+ }
60
+ };
46
61
 
47
62
  const defaultConfig = {
48
63
  [bucketRegions.previews]: [{
@@ -104,8 +119,26 @@ function defineStorageBucketsConfig() {
104
119
  });
105
120
  return actualConfig;
106
121
  }
122
+ async function loadStorageBucketsConfig() {
123
+ let explorerResult;
124
+ const storageBucketConfigExplorer = cosmiconfig.cosmiconfig('storage-buckets', {
125
+ searchStrategy: 'project'
126
+ });
127
+ try {
128
+ // This is the list of the supported cloud environments and their related bucket location.
129
+ explorerResult = await storageBucketConfigExplorer.search();
130
+ } catch (e) {
131
+ throw new Error('Failed to load a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
132
+ }
133
+ if (!explorerResult) {
134
+ throw new Error('Failed loading a storage bucket configuration');
135
+ }
136
+ return explorerResult?.config;
137
+ }
107
138
 
108
139
  exports.bucketEnvironments = bucketEnvironments;
109
140
  exports.bucketRegions = bucketRegions;
110
141
  exports.clusterContexts = clusterContexts;
111
142
  exports.defineStorageBucketsConfig = defineStorageBucketsConfig;
143
+ exports.loadStorageBucketsConfig = loadStorageBucketsConfig;
144
+ exports.storageProviders = storageProviders;