@commercetools-frontend/application-cli 2.1.1 → 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
@@ -258,12 +309,23 @@ set -e
258
309
  echo "Uploading static assets to Google Storage bucket ${bucketUrl}"
259
310
 
260
311
  gcloud storage cp \\
261
- ${assetsPath}/public/{*.css,*.js,*.js.map,*.png,*.html,robots.txt} \\
312
+ ${assetsPath}/public/{*.css,*.js,*.js.map,*.html} \\
262
313
  "${bucketUrl}" \\
263
314
  -n \\
264
315
  -z js,css \\
265
316
  --cache-control="public,max-age=31536000,no-transform"
266
317
 
318
+ # We need to upload the PNG and HTML files separately because we want them
319
+ # to be able to overwrite the existing files (if any). For instance, the
320
+ # file or the favicons.
321
+ # This is controlled with the '-n' option (which is used for the JS and CSS
322
+ # as we don't want to overwrite them)
323
+ gcloud storage cp \\
324
+ ${assetsPath}/public/{*.png,robots.txt} \\
325
+ "${bucketUrl}" \\
326
+ -z txt \\
327
+ --cache-control="public,max-age=31536000,no-transform"
328
+
267
329
  if ${skipMenu}; then
268
330
  echo "Skipping menu.json upload"
269
331
  else
@@ -298,10 +360,10 @@ fi
298
360
  }]);
299
361
  return GoogleStorageUploadScriptsGenerator;
300
362
  }(); // TODO: To be implemented.
301
- function getUploadScriptsGenerator(storageProvider) {
363
+ function getUploadScriptsGenerator(storageProvider, config) {
302
364
  switch (storageProvider) {
303
365
  case 'gs':
304
- return new GoogleStorageUploadScriptsGenerator();
366
+ return new GoogleStorageUploadScriptsGenerator(config);
305
367
  default:
306
368
  throw new Error(`Storage provider ${storageProvider} not supported`);
307
369
  }
@@ -345,10 +407,7 @@ function loadDotenvFiles(_ref) {
345
407
  }
346
408
 
347
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; }
348
- 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; }
349
- const storageBucketConfigExplorer = cosmiconfig('storage-buckets', {
350
- searchStrategy: 'project'
351
- });
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; }
352
411
  function writeUploadScriptFile(_ref) {
353
412
  let fileName = _ref.fileName,
354
413
  fileContent = _ref.fileContent,
@@ -363,12 +422,10 @@ async function compileApplicationAssets(_ref2) {
363
422
  let cliFlags = _ref2.cliFlags,
364
423
  storageProvider = _ref2.storageProvider,
365
424
  uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
366
- bucketRegion = _ref2.bucketRegion,
367
425
  paths = _ref2.paths;
368
426
  const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
369
427
  storageProvider,
370
428
  bucketUrl: storageProvider.getAssetsBucketUrl({
371
- bucketRegion,
372
429
  prNumber: cliFlags.prNumber,
373
430
  applicationName: cliFlags.applicationName
374
431
  }),
@@ -376,7 +433,7 @@ async function compileApplicationAssets(_ref2) {
376
433
  skipMenu: cliFlags.skipMenu
377
434
  });
378
435
  const parsedApplicationAssetsUploadScriptFile = path$1.parse(cliFlags.applicationAssetsUploadScriptOutFile);
379
- const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${bucketRegion}${parsedApplicationAssetsUploadScriptFile.ext}`;
436
+ const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${storageProvider.getBucketRegion()}${parsedApplicationAssetsUploadScriptFile.ext}`;
380
437
  writeUploadScriptFile({
381
438
  fileName: applicationAssetsUploadScriptFileName,
382
439
  fileContent: applicationAssetsUploadScriptContent,
@@ -388,9 +445,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
388
445
  storageProvider = _ref3.storageProvider,
389
446
  uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
390
447
  paths = _ref3.paths,
391
- bucketRegion = _ref3.bucketRegion,
392
- cloudEnvironment = _ref3.cloudEnvironment,
393
- bucketEnvironment = _ref3.bucketEnvironment;
448
+ cloudEnvironment = _ref3.cloudEnvironment;
394
449
  const cloudEnvironmentDeploymentPath = path$1.join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
395
450
  // Ensure the folder exists
396
451
  const createDeploymentsFolderResult = await execa('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
@@ -402,7 +457,6 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
402
457
 
403
458
  // Construct the proper CDN URL for the specific application
404
459
  const cdnUrl = storageProvider.getCdnUrl({
405
- bucketRegion,
406
460
  prNumber: cliFlags.prNumber,
407
461
  applicationName: cliFlags.applicationName
408
462
  });
@@ -448,13 +502,10 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
448
502
  storageProvider,
449
503
  packageManagerName: cliFlags.packageManagerName,
450
504
  bucketUrl: storageProvider.getApplicationIndexBucketUrl({
451
- bucketRegion,
452
505
  prNumber: cliFlags.prNumber,
453
- applicationName: cliFlags.applicationName,
454
- bucketEnvironment
506
+ applicationName: cliFlags.applicationName
455
507
  }),
456
508
  cdnUrl,
457
- bucketEnvironment,
458
509
  buildRevision: cliFlags.buildRevision,
459
510
  buildNumber: cliFlags.buildNumber,
460
511
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
@@ -473,16 +524,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
473
524
  }
474
525
  async function command$3(cliFlags, cwd) {
475
526
  var _context;
476
- let cloudEnvironmentsGroupedByBucketRegions;
477
- try {
478
- // This is the list of the supported cloud environments and their related bucket location.
479
- cloudEnvironmentsGroupedByBucketRegions = await storageBucketConfigExplorer.search();
480
- } catch (e) {
481
- throw new Error('Failed to load a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
482
- }
483
- if (!cloudEnvironmentsGroupedByBucketRegions) {
484
- throw new Error('Failed loading a storage bucket configuration');
485
- }
527
+ const storageBucketConfig = await loadStorageBucketsConfig();
486
528
  const applicationDirectory = getApplicationDirectory(cwd);
487
529
  let assetsPath;
488
530
  if (cliFlags.ciAssetsRootPath && isCI()) {
@@ -497,28 +539,30 @@ async function command$3(cliFlags, cwd) {
497
539
  dotenvPath: cliFlags.dotenvFolder && path$1.join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
498
540
  assetsPath
499
541
  };
500
- const defaultStorageProviders = ['gs'];
501
- 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 => {
502
544
  let _ref5 = _slicedToArray(_ref4, 2),
503
545
  bucketRegion = _ref5[0],
504
546
  bucketEnvironmentConfigs = _ref5[1];
505
547
  return {
506
548
  title: `Compiling for bucket region ${bucketRegion}`,
507
549
  task: (_bucketRegionCtx, bucketRegionTask) => {
508
- var _context2;
509
550
  // NOTE: Application assets need to be compiled
510
551
  // for all storage providers once per region.
511
- 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))];
512
553
  const allApplicationAssetTasks = _mapInstanceProperty(allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
513
- const storageProvider = getStorageProvider(storageProviderTag);
514
- 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);
515
560
  return {
516
561
  title: `Compiling application assets for '${storageProviderTag}'`,
517
562
  task: () => compileApplicationAssets({
518
563
  cliFlags,
519
564
  storageProvider,
520
565
  uploadScriptsGenerator,
521
- bucketRegion: bucketRegion,
522
566
  paths
523
567
  })
524
568
  };
@@ -527,13 +571,17 @@ async function command$3(cliFlags, cwd) {
527
571
  const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
528
572
  bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
529
573
  storageProviders = bucketEnvironmentConfig.storageProviders;
574
+ const storageProviderConfig = {
575
+ bucketRegion: bucketRegion,
576
+ bucketEnvironment
577
+ };
530
578
  return {
531
579
  title: `Compiling for cloud environment '${cloudEnvironment}'`,
532
580
  task: (_storageProviderCtx, storageProviderTask) => {
533
- var _context3;
534
- const applicationIndexTasksForStorageProviders = _mapInstanceProperty(_context3 = storageProviders || defaultStorageProviders).call(_context3, storageProviderTag => {
535
- const storageProvider = getStorageProvider(storageProviderTag);
536
- 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);
537
585
  return {
538
586
  title: `Compiling application index for storage provider '${storageProviderTag}'`,
539
587
  task: () => {
@@ -542,9 +590,7 @@ async function command$3(cliFlags, cwd) {
542
590
  storageProvider,
543
591
  uploadScriptsGenerator,
544
592
  paths,
545
- bucketRegion: bucketRegion,
546
- cloudEnvironment,
547
- bucketEnvironment
593
+ cloudEnvironment
548
594
  });
549
595
  }
550
596
  };
@@ -828,7 +874,7 @@ async function command(cliFlags) {
828
874
 
829
875
  var pkgJson = {
830
876
  name: "@commercetools-frontend/application-cli",
831
- version: "2.1.1",
877
+ version: "2.2.0",
832
878
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
833
879
  keywords: [
834
880
  "commercetools",
@@ -853,22 +899,22 @@ var pkgJson = {
853
899
  "@babel/core": "^7.22.11",
854
900
  "@babel/runtime-corejs3": "^7.21.0",
855
901
  "@babel/runtime": "^7.21.0",
856
- "@commercetools-frontend/application-config": "22.17.0",
857
- "@commercetools-frontend/constants": "22.17.0",
858
- "@commercetools-frontend/l10n": "22.17.0",
902
+ "@commercetools-frontend/application-config": "22.19.0",
903
+ "@commercetools-frontend/constants": "22.19.0",
904
+ "@commercetools-frontend/l10n": "22.19.0",
859
905
  "@manypkg/find-root": "2.2.1",
860
906
  cac: "^6.7.14",
861
907
  cosmiconfig: "9.0.0",
862
- dotenv: "16.3.2",
908
+ dotenv: "16.4.2",
863
909
  execa: "5.1.1",
864
910
  jsonschema: "^1.4.1",
865
- listr2: "8.0.1",
911
+ listr2: "8.0.2",
866
912
  "node-fetch": "2.7.0",
867
913
  "ts-deepmerge": "7.0.0"
868
914
  },
869
915
  devDependencies: {
870
916
  "@tsconfig/node20": "20.1.2",
871
- "@types/node": "20.11.5",
917
+ "@types/node": "20.11.25",
872
918
  typescript: "5.2.2"
873
919
  },
874
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;