@commercetools-frontend/application-cli 2.1.2 → 2.3.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.
@@ -16,20 +16,23 @@ var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
16
16
  var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
17
17
  var _Object$entries = require('@babel/runtime-corejs3/core-js-stable/object/entries');
18
18
  var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
19
- var _flatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/flat');
19
+ var _flatMapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/flat-map');
20
+ var storageBucketsConfig = require('../../dist/storage-buckets-config-28a1d76e.cjs.dev.js');
20
21
  var fs = require('node:fs');
21
22
  var path$1 = require('node:path');
22
23
  var listr2 = require('listr2');
23
24
  var execa = require('execa');
24
- var cosmiconfig = require('cosmiconfig');
25
25
  var findRoot = require('@manypkg/find-root');
26
26
  var path = require('path');
27
27
  var _possibleConstructorReturn = require('@babel/runtime-corejs3/helpers/possibleConstructorReturn');
28
+ var _assertThisInitialized = require('@babel/runtime-corejs3/helpers/assertThisInitialized');
28
29
  var _get = require('@babel/runtime-corejs3/helpers/get');
29
30
  var _getPrototypeOf = require('@babel/runtime-corejs3/helpers/getPrototypeOf');
30
31
  var _inherits = require('@babel/runtime-corejs3/helpers/inherits');
31
32
  var _classCallCheck = require('@babel/runtime-corejs3/helpers/classCallCheck');
32
33
  var _createClass = require('@babel/runtime-corejs3/helpers/createClass');
34
+ var _classPrivateFieldLooseBase = require('@babel/runtime-corejs3/helpers/classPrivateFieldLooseBase');
35
+ var _classPrivateFieldLooseKey = require('@babel/runtime-corejs3/helpers/classPrivateFieldLooseKey');
33
36
  var _Reflect$construct = require('@babel/runtime-corejs3/core-js-stable/reflect/construct');
34
37
  var fs$1 = require('fs');
35
38
  var dotenv = require('dotenv');
@@ -37,9 +40,9 @@ var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/insta
37
40
  var _JSON$stringify = require('@babel/runtime-corejs3/core-js-stable/json/stringify');
38
41
  var applicationConfig = require('@commercetools-frontend/application-config');
39
42
  var l10n = require('@commercetools-frontend/l10n');
40
- var storageBucketsConfig = require('../../dist/storage-buckets-config-478b8585.cjs.dev.js');
41
43
  var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/slice');
42
44
  var jsonschema = require('jsonschema');
45
+ require('cosmiconfig');
43
46
  require('ts-deepmerge');
44
47
 
45
48
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -55,7 +58,7 @@ var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defin
55
58
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
56
59
  var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
57
60
  var _Set__default = /*#__PURE__*/_interopDefault(_Set);
58
- var _flatInstanceProperty__default = /*#__PURE__*/_interopDefault(_flatInstanceProperty);
61
+ var _flatMapInstanceProperty__default = /*#__PURE__*/_interopDefault(_flatMapInstanceProperty);
59
62
  var fs__default = /*#__PURE__*/_interopDefault(fs);
60
63
  var path__default$1 = /*#__PURE__*/_interopDefault(path$1);
61
64
  var execa__default = /*#__PURE__*/_interopDefault(execa);
@@ -96,23 +99,34 @@ function _callSuper(_this, derived, args) {
96
99
  derived = _getPrototypeOf(derived);
97
100
  return _possibleConstructorReturn(_this, isNativeReflectConstruct() ? _Reflect$construct__default["default"](derived, args || [], _getPrototypeOf(_this).constructor) : derived.apply(_this, args));
98
101
  }
102
+ var _bucketRegion$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
103
+ var _bucketEnvironment$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
99
104
  let StorageProvider = /*#__PURE__*/function () {
100
- function StorageProvider() {
105
+ function StorageProvider(config) {
101
106
  _classCallCheck(this, StorageProvider);
107
+ _Object$defineProperty__default["default"](this, _bucketRegion$1, {
108
+ writable: true,
109
+ value: void 0
110
+ });
111
+ _Object$defineProperty__default["default"](this, _bucketEnvironment$1, {
112
+ writable: true,
113
+ value: void 0
114
+ });
115
+ _classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1] = config.bucketRegion;
116
+ _classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1] = config.bucketEnvironment;
102
117
  }
118
+ /**
119
+ * Construct the storage bucket URL for the specific application and cloud environment.
120
+ *
121
+ * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
122
+ * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
123
+ *
124
+ * This allows all cloud environments sharing the same static assets while each application's index
125
+ * is uploaded with different headers (e.g. CSP rules).
126
+ */
103
127
  _createClass(StorageProvider, [{
104
128
  key: "getBucketNamespace",
105
- value:
106
- /**
107
- * Construct the storage bucket URL for the specific application and cloud environment.
108
- *
109
- * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
110
- * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
111
- *
112
- * This allows all cloud environments sharing the same static assets while each application's index
113
- * is uploaded with different headers (e.g. CSP rules).
114
- */
115
- function getBucketNamespace(prNumber) {
129
+ value: function getBucketNamespace(prNumber) {
116
130
  if (!prNumber) return;
117
131
  if (prNumber === 'merchant-center-preview') return prNumber;
118
132
  return `mc-${prNumber}`;
@@ -125,56 +139,94 @@ let StorageProvider = /*#__PURE__*/function () {
125
139
  key: "getAssetsBucketUrl",
126
140
  value: function getAssetsBucketUrl(_ref) {
127
141
  var _context;
128
- let bucketProtocol = _ref.bucketProtocol,
129
- bucketRegion = _ref.bucketRegion,
142
+ let applicationName = _ref.applicationName,
143
+ bucketProtocol = _ref.bucketProtocol,
130
144
  bucketNamespace = _ref.bucketNamespace,
131
- applicationName = _ref.applicationName;
132
- const assetsBucketUrl = _filterInstanceProperty__default["default"](_context = [bucketRegion, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
145
+ tag = _ref.tag;
146
+ if (!_classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1]) {
147
+ throw new Error("'bucketRegion' is not defined. Required to determine 'assetsBucketUrl'.");
148
+ }
149
+ const storageProvider = storageBucketsConfig.storageProviders[tag];
150
+ const assetBuketUrl = storageProvider.urls.bucket?.[_classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1]] ?? _classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1];
151
+ const assetsBucketUrl = _filterInstanceProperty__default["default"](_context = [assetBuketUrl, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
133
152
  return `${bucketProtocol}${assetsBucketUrl}`;
134
153
  }
135
154
  }, {
136
155
  key: "getApplicationIndexBucketUrl",
137
156
  value: function getApplicationIndexBucketUrl(_ref2) {
138
- let bucketProtocol = _ref2.bucketProtocol,
139
- bucketRegion = _ref2.bucketRegion,
140
- bucketNamespace = _ref2.bucketNamespace,
157
+ let tag = _ref2.tag,
141
158
  prNumber = _ref2.prNumber,
142
159
  applicationName = _ref2.applicationName,
143
- bucketEnvironment = _ref2.bucketEnvironment;
160
+ bucketProtocol = _ref2.bucketProtocol,
161
+ bucketNamespace = _ref2.bucketNamespace;
144
162
  const applicationAssetsBucketUrl = this.getAssetsBucketUrl({
145
- bucketProtocol,
146
- bucketRegion,
147
- bucketNamespace,
163
+ tag,
164
+ applicationName,
148
165
  prNumber,
149
- applicationName
166
+ bucketProtocol,
167
+ bucketNamespace
150
168
  });
151
- const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
169
+ const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]}`;
152
170
  return applicationIndexBucketUrl;
153
171
  }
154
172
  }, {
155
173
  key: "getCdnUrl",
156
174
  value: function getCdnUrl(_ref3) {
157
175
  var _context2;
158
- let publicBaseUrl = _ref3.publicBaseUrl,
159
- bucketRegion = _ref3.bucketRegion,
176
+ let applicationName = _ref3.applicationName,
160
177
  prNumber = _ref3.prNumber,
161
- applicationName = _ref3.applicationName;
162
- return _filterInstanceProperty__default["default"](_context2 = [publicBaseUrl, bucketRegion, this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
178
+ publicBaseUrl = _ref3.publicBaseUrl,
179
+ excludeBucketRegion = _ref3.excludeBucketRegion;
180
+ return _filterInstanceProperty__default["default"](_context2 = [publicBaseUrl, excludeBucketRegion ? null : _classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1], this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
181
+ }
182
+ }, {
183
+ key: "getPublicBaseUrl",
184
+ value: function getPublicBaseUrl(tag) {
185
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]) {
186
+ throw new Error("'bucketEnvironment' is not defined. Required to determine 'publicBaseUrl'.");
187
+ }
188
+ const storageProvider = storageBucketsConfig.storageProviders[tag];
189
+ const publicBaseUrl = storageProvider.urls.public[_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]] ?? storageProvider.urls.public.default;
190
+ return publicBaseUrl;
163
191
  }
164
192
  }]);
165
193
  return StorageProvider;
166
194
  }();
195
+ var _bucketRegion2$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
196
+ var _bucketEnvironment2$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
167
197
  let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
168
198
  _inherits(GoogleStorageProvider, _StorageProvider);
169
- function GoogleStorageProvider() {
199
+ function GoogleStorageProvider(config) {
200
+ var _this;
170
201
  _classCallCheck(this, GoogleStorageProvider);
171
- return _callSuper(this, GoogleStorageProvider, arguments);
202
+ _this = _callSuper(this, GoogleStorageProvider, [config]);
203
+ _Object$defineProperty__default["default"](_assertThisInitialized(_this), _bucketRegion2$1, {
204
+ writable: true,
205
+ value: void 0
206
+ });
207
+ _Object$defineProperty__default["default"](_assertThisInitialized(_this), _bucketEnvironment2$1, {
208
+ writable: true,
209
+ value: void 0
210
+ });
211
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketRegion2$1)[_bucketRegion2$1] = config.bucketRegion;
212
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketEnvironment2$1)[_bucketEnvironment2$1] = config.bucketEnvironment;
213
+ return _this;
172
214
  }
173
215
  _createClass(GoogleStorageProvider, [{
174
216
  key: "getTag",
175
217
  value: function getTag() {
176
218
  return 'gs';
177
219
  }
220
+ }, {
221
+ key: "getBucketRegion",
222
+ value: function getBucketRegion() {
223
+ return _classPrivateFieldLooseBase(this, _bucketRegion2$1)[_bucketRegion2$1];
224
+ }
225
+ }, {
226
+ key: "getBucketEnvironment",
227
+ value: function getBucketEnvironment() {
228
+ return _classPrivateFieldLooseBase(this, _bucketEnvironment2$1)[_bucketEnvironment2$1];
229
+ }
178
230
  }, {
179
231
  key: "getProtocol",
180
232
  value: function getProtocol() {
@@ -183,7 +235,7 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
183
235
  }, {
184
236
  key: "getPublicBaseUrl",
185
237
  value: function getPublicBaseUrl() {
186
- return 'https://storage.googleapis.com';
238
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getPublicBaseUrl", this).call(this, this.getTag());
187
239
  }
188
240
  }, {
189
241
  key: "getCdnUrl",
@@ -196,6 +248,7 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
196
248
  key: "getAssetsBucketUrl",
197
249
  value: function getAssetsBucketUrl(config) {
198
250
  return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
251
+ tag: this.getTag(),
199
252
  bucketProtocol: this.getProtocol(),
200
253
  bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
201
254
  }, config));
@@ -204,25 +257,114 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
204
257
  key: "getApplicationIndexBucketUrl",
205
258
  value: function getApplicationIndexBucketUrl(config) {
206
259
  return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
260
+ tag: this.getTag(),
207
261
  bucketProtocol: this.getProtocol(),
208
262
  bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
209
263
  }, config));
210
264
  }
211
265
  }]);
212
266
  return GoogleStorageProvider;
213
- }(StorageProvider); // TODO: to be implemented.
214
- function getStorageProvider(storageProvider) {
267
+ }(StorageProvider);
268
+ var _bucketRegion3 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
269
+ var _bucketEnvironment3 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
270
+ let AwsStorageProvider = /*#__PURE__*/function (_StorageProvider2) {
271
+ _inherits(AwsStorageProvider, _StorageProvider2);
272
+ function AwsStorageProvider(config) {
273
+ var _this2;
274
+ _classCallCheck(this, AwsStorageProvider);
275
+ _this2 = _callSuper(this, AwsStorageProvider, [config]);
276
+ _Object$defineProperty__default["default"](_assertThisInitialized(_this2), _bucketRegion3, {
277
+ writable: true,
278
+ value: void 0
279
+ });
280
+ _Object$defineProperty__default["default"](_assertThisInitialized(_this2), _bucketEnvironment3, {
281
+ writable: true,
282
+ value: void 0
283
+ });
284
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this2), _bucketRegion3)[_bucketRegion3] = config.bucketRegion;
285
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this2), _bucketEnvironment3)[_bucketEnvironment3] = config.bucketEnvironment;
286
+ return _this2;
287
+ }
288
+ _createClass(AwsStorageProvider, [{
289
+ key: "getTag",
290
+ value: function getTag() {
291
+ return 's3';
292
+ }
293
+ }, {
294
+ key: "getBucketRegion",
295
+ value: function getBucketRegion() {
296
+ return _classPrivateFieldLooseBase(this, _bucketRegion3)[_bucketRegion3];
297
+ }
298
+ }, {
299
+ key: "getBucketEnvironment",
300
+ value: function getBucketEnvironment() {
301
+ return _classPrivateFieldLooseBase(this, _bucketEnvironment3)[_bucketEnvironment3];
302
+ }
303
+ }, {
304
+ key: "getProtocol",
305
+ value: function getProtocol() {
306
+ return 's3://';
307
+ }
308
+ }, {
309
+ key: "getPublicBaseUrl",
310
+ value: function getPublicBaseUrl() {
311
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getPublicBaseUrl", this).call(this, this.getTag());
312
+ }
313
+ }, {
314
+ key: "getCdnUrl",
315
+ value: function getCdnUrl(config) {
316
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getCdnUrl", this).call(this, _objectSpread$4({
317
+ publicBaseUrl: this.getPublicBaseUrl(),
318
+ excludeBucketRegion: true
319
+ }, config));
320
+ }
321
+ }, {
322
+ key: "getAssetsBucketUrl",
323
+ value: function getAssetsBucketUrl(config) {
324
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
325
+ tag: this.getTag(),
326
+ bucketProtocol: this.getProtocol(),
327
+ bucketNamespace: _get(_getPrototypeOf(AwsStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
328
+ }, config));
329
+ }
330
+ }, {
331
+ key: "getApplicationIndexBucketUrl",
332
+ value: function getApplicationIndexBucketUrl(config) {
333
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
334
+ tag: this.getTag(),
335
+ bucketProtocol: this.getProtocol(),
336
+ bucketNamespace: _get(_getPrototypeOf(AwsStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
337
+ }, config));
338
+ }
339
+ }]);
340
+ return AwsStorageProvider;
341
+ }(StorageProvider);
342
+ function getStorageProvider(storageProvider, config) {
215
343
  switch (storageProvider) {
216
344
  case 'gs':
217
- return new GoogleStorageProvider();
345
+ return new GoogleStorageProvider(config);
346
+ case 's3':
347
+ return new AwsStorageProvider(config);
218
348
  default:
219
349
  throw new Error(`Storage provider ${storageProvider} not supported`);
220
350
  }
221
351
  }
222
352
 
353
+ var _bucketEnvironment = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
354
+ var _bucketRegion = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
223
355
  let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
224
- function GoogleStorageUploadScriptsGenerator() {
356
+ function GoogleStorageUploadScriptsGenerator(config) {
225
357
  _classCallCheck(this, GoogleStorageUploadScriptsGenerator);
358
+ _Object$defineProperty__default["default"](this, _bucketEnvironment, {
359
+ writable: true,
360
+ value: void 0
361
+ });
362
+ _Object$defineProperty__default["default"](this, _bucketRegion, {
363
+ writable: true,
364
+ value: void 0
365
+ });
366
+ _classPrivateFieldLooseBase(this, _bucketRegion)[_bucketRegion] = config.bucketRegion;
367
+ _classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment] = config.bucketEnvironment;
226
368
  }
227
369
  _createClass(GoogleStorageUploadScriptsGenerator, [{
228
370
  key: "getApplicationIndexUploadScript",
@@ -230,10 +372,12 @@ let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
230
372
  let packageManagerName = _ref.packageManagerName,
231
373
  bucketUrl = _ref.bucketUrl,
232
374
  cdnUrl = _ref.cdnUrl,
233
- bucketEnvironment = _ref.bucketEnvironment,
234
375
  buildRevision = _ref.buildRevision,
235
376
  buildNumber = _ref.buildNumber,
236
377
  applicationIndexOutFile = _ref.applicationIndexOutFile;
378
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]) {
379
+ throw new Error("Missing 'bucketEnvironment' when generating application index.");
380
+ }
237
381
  return `
238
382
  #!/usr/bin/env bash
239
383
 
@@ -251,7 +395,7 @@ gcloud storage cp \\
251
395
  echo "Creating version.json and uploading it to bucket ${bucketUrl}"
252
396
 
253
397
  NODE_ENV=production ${packageManagerName} application-cli create-version \\
254
- --version-url=${cdnUrl}/${bucketEnvironment}/version.json \\
398
+ --version-url=${cdnUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]}/version.json \\
255
399
  --build-revision=${buildRevision} \\
256
400
  --build-number=${buildNumber} \\
257
401
  --out-file=$(dirname "$0")/version.json
@@ -337,11 +481,130 @@ fi
337
481
  }
338
482
  }]);
339
483
  return GoogleStorageUploadScriptsGenerator;
340
- }(); // TODO: To be implemented.
341
- function getUploadScriptsGenerator(storageProvider) {
484
+ }();
485
+ var _bucketEnvironment2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
486
+ var _bucketRegion2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
487
+ let AwsStorageUploadScriptsGenerator = /*#__PURE__*/function () {
488
+ function AwsStorageUploadScriptsGenerator(config) {
489
+ _classCallCheck(this, AwsStorageUploadScriptsGenerator);
490
+ _Object$defineProperty__default["default"](this, _bucketEnvironment2, {
491
+ writable: true,
492
+ value: void 0
493
+ });
494
+ _Object$defineProperty__default["default"](this, _bucketRegion2, {
495
+ writable: true,
496
+ value: void 0
497
+ });
498
+ _classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2] = config.bucketRegion;
499
+ _classPrivateFieldLooseBase(this, _bucketEnvironment2)[_bucketEnvironment2] = config.bucketEnvironment;
500
+ }
501
+ _createClass(AwsStorageUploadScriptsGenerator, [{
502
+ key: "getApplicationIndexUploadScript",
503
+ value: function getApplicationIndexUploadScript(_ref3) {
504
+ let packageManagerName = _ref3.packageManagerName,
505
+ bucketUrl = _ref3.bucketUrl,
506
+ cdnUrl = _ref3.cdnUrl,
507
+ buildRevision = _ref3.buildRevision,
508
+ buildNumber = _ref3.buildNumber,
509
+ applicationIndexOutFile = _ref3.applicationIndexOutFile;
510
+ return `
511
+ #!/usr/bin/env bash
512
+
513
+ echo "Uploading static assets to Amazon S3 bucket ${bucketUrl}"
514
+
515
+ set -e
516
+
517
+ aws s3 cp \\
518
+ "$(dirname "$0")/${applicationIndexOutFile}" \\
519
+ "${bucketUrl}/" \\
520
+ --content-type="text/html" \\
521
+ --cache-control="public,max-age=0,no-transform" \\
522
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
523
+
524
+ echo "Creating version.json and uploading it to bucket ${bucketUrl}"
525
+
526
+ NODE_ENV=production ${packageManagerName} application-cli create-version \\
527
+ --version-url=${cdnUrl}/${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}/version.json \\
528
+ --build-revision=${buildRevision} \\
529
+ --build-number=${buildNumber} \\
530
+ --out-file=$(dirname "$0")/version.json
531
+
532
+ aws s3 cp \\
533
+ "$(dirname "$0")/version.json" \\
534
+ "${bucketUrl}/" \\
535
+ --content-type="application/json" \\
536
+ --cache-control="public,max-age=0,no-transform" \\
537
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
538
+ `;
539
+ }
540
+ }, {
541
+ key: "getProductionBundlesUploadScript",
542
+ value: function getProductionBundlesUploadScript(_ref4) {
543
+ let bucketUrl = _ref4.bucketUrl,
544
+ assetsPath = _ref4.assetsPath,
545
+ skipMenu = _ref4.skipMenu;
546
+ return `
547
+ #!/usr/bin/env bash
548
+
549
+ echo "Uploading static assets to Amazon S3 bucket ${bucketUrl}"
550
+
551
+ set -e
552
+
553
+ # NOTE:
554
+ # The sync command on the AWS CLI is different to the -n option on the gcloud CLI.
555
+ # Sync will only upload files that are not already in the bucket, but it will skip existing ones
556
+ # that have been changed locally.
557
+ # The -n option on the gcloud CLI will skip uploading existing files and prevents them to be overwritten.
558
+ # https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
559
+ # https://cloud.google.com/sdk/gcloud/reference/storage/cp
560
+ #
561
+ # Compression (gzip) is enabled on CloudFront by default. Hence compression does happing while uploading.
562
+ # https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-configuring
563
+ aws s3 sync ${assetsPath}/public \\
564
+ "${bucketUrl}" \\
565
+ --exclude "*" \\
566
+ --include "*.css" \\
567
+ --include "*.js" \\
568
+ --include "*.js.map" \\
569
+ --include "*.html" \\
570
+ --cache-control="public,max-age=31536000,no-transform" \\
571
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
572
+
573
+ # We need to upload the PNG and HTML files separately because we want them
574
+ # to be able to overwrite the existing files (if any). For instance, the
575
+ # file or the favicons.
576
+ aws s3 cp ${assetsPath}/public \\
577
+ "${bucketUrl}" \\
578
+ --recursive \\
579
+ --exclude "*" \\
580
+ --include "*.png" \\
581
+ --include "robots.txt" \\
582
+ --cache-control="public,max-age=31536000,no-transform" \\
583
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
584
+
585
+ if ${skipMenu}; then
586
+ echo "Skipping menu.json upload"
587
+ else
588
+ echo "Uploading menu.json to bucket ${bucketUrl}"
589
+
590
+ aws s3 cp \\
591
+ ${assetsPath}/menu.json \\
592
+ ${bucketUrl} \\
593
+ --content-type="application/json" \\
594
+ --cache-control="public,max-age=0,no-transform" \\
595
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
596
+ fi
597
+ `;
598
+ }
599
+ }]);
600
+ return AwsStorageUploadScriptsGenerator;
601
+ }();
602
+ function getUploadScriptsGenerator(storageProvider, config) {
342
603
  switch (storageProvider) {
343
604
  case 'gs':
344
- return new GoogleStorageUploadScriptsGenerator();
605
+ return new GoogleStorageUploadScriptsGenerator(config);
606
+ case 's3':
607
+ return new AwsStorageUploadScriptsGenerator(config);
345
608
  default:
346
609
  throw new Error(`Storage provider ${storageProvider} not supported`);
347
610
  }
@@ -385,10 +648,7 @@ function loadDotenvFiles(_ref) {
385
648
  }
386
649
 
387
650
  function ownKeys$2(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
388
- 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__default["default"](_context4 = ownKeys$2(Object(t), !0)).call(_context4, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context5 = ownKeys$2(Object(t))).call(_context5, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
389
- const storageBucketConfigExplorer = cosmiconfig.cosmiconfig('storage-buckets', {
390
- searchStrategy: 'project'
391
- });
651
+ 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__default["default"](_context3 = ownKeys$2(Object(t), !0)).call(_context3, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context4 = ownKeys$2(Object(t))).call(_context4, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
392
652
  function writeUploadScriptFile(_ref) {
393
653
  let fileName = _ref.fileName,
394
654
  fileContent = _ref.fileContent,
@@ -403,12 +663,10 @@ async function compileApplicationAssets(_ref2) {
403
663
  let cliFlags = _ref2.cliFlags,
404
664
  storageProvider = _ref2.storageProvider,
405
665
  uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
406
- bucketRegion = _ref2.bucketRegion,
407
666
  paths = _ref2.paths;
408
667
  const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
409
668
  storageProvider,
410
669
  bucketUrl: storageProvider.getAssetsBucketUrl({
411
- bucketRegion,
412
670
  prNumber: cliFlags.prNumber,
413
671
  applicationName: cliFlags.applicationName
414
672
  }),
@@ -416,7 +674,7 @@ async function compileApplicationAssets(_ref2) {
416
674
  skipMenu: cliFlags.skipMenu
417
675
  });
418
676
  const parsedApplicationAssetsUploadScriptFile = path__default$1["default"].parse(cliFlags.applicationAssetsUploadScriptOutFile);
419
- const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${bucketRegion}${parsedApplicationAssetsUploadScriptFile.ext}`;
677
+ const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${storageProvider.getBucketRegion()}${parsedApplicationAssetsUploadScriptFile.ext}`;
420
678
  writeUploadScriptFile({
421
679
  fileName: applicationAssetsUploadScriptFileName,
422
680
  fileContent: applicationAssetsUploadScriptContent,
@@ -428,9 +686,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
428
686
  storageProvider = _ref3.storageProvider,
429
687
  uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
430
688
  paths = _ref3.paths,
431
- bucketRegion = _ref3.bucketRegion,
432
- cloudEnvironment = _ref3.cloudEnvironment,
433
- bucketEnvironment = _ref3.bucketEnvironment;
689
+ cloudEnvironment = _ref3.cloudEnvironment;
434
690
  const cloudEnvironmentDeploymentPath = path__default$1["default"].join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
435
691
  // Ensure the folder exists
436
692
  const createDeploymentsFolderResult = await execa__default["default"]('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
@@ -442,7 +698,6 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
442
698
 
443
699
  // Construct the proper CDN URL for the specific application
444
700
  const cdnUrl = storageProvider.getCdnUrl({
445
- bucketRegion,
446
701
  prNumber: cliFlags.prNumber,
447
702
  applicationName: cliFlags.applicationName
448
703
  });
@@ -488,13 +743,10 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
488
743
  storageProvider,
489
744
  packageManagerName: cliFlags.packageManagerName,
490
745
  bucketUrl: storageProvider.getApplicationIndexBucketUrl({
491
- bucketRegion,
492
746
  prNumber: cliFlags.prNumber,
493
- applicationName: cliFlags.applicationName,
494
- bucketEnvironment
747
+ applicationName: cliFlags.applicationName
495
748
  }),
496
749
  cdnUrl,
497
- bucketEnvironment,
498
750
  buildRevision: cliFlags.buildRevision,
499
751
  buildNumber: cliFlags.buildNumber,
500
752
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
@@ -513,16 +765,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
513
765
  }
514
766
  async function command$3(cliFlags, cwd) {
515
767
  var _context;
516
- let cloudEnvironmentsGroupedByBucketRegions;
517
- try {
518
- // This is the list of the supported cloud environments and their related bucket location.
519
- cloudEnvironmentsGroupedByBucketRegions = await storageBucketConfigExplorer.search();
520
- } catch (e) {
521
- throw new Error('Failed to load a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
522
- }
523
- if (!cloudEnvironmentsGroupedByBucketRegions) {
524
- throw new Error('Failed loading a storage bucket configuration');
525
- }
768
+ const storageBucketConfig = await storageBucketsConfig.loadStorageBucketsConfig();
526
769
  const applicationDirectory = getApplicationDirectory(cwd);
527
770
  let assetsPath;
528
771
  if (cliFlags.ciAssetsRootPath && isCI()) {
@@ -537,28 +780,32 @@ async function command$3(cliFlags, cwd) {
537
780
  dotenvPath: cliFlags.dotenvFolder && path__default$1["default"].join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
538
781
  assetsPath
539
782
  };
540
- const defaultStorageProviders = ['gs'];
541
- const taskList = new listr2.Listr(_mapInstanceProperty__default["default"](_context = _Object$entries__default["default"](cloudEnvironmentsGroupedByBucketRegions.config)).call(_context, _ref4 => {
783
+ const defaultStorageProviders = [storageBucketsConfig.storageProviders.gs.tag];
784
+ const taskList = new listr2.Listr(_mapInstanceProperty__default["default"](_context = _Object$entries__default["default"](storageBucketConfig)).call(_context, _ref4 => {
542
785
  let _ref5 = _slicedToArray(_ref4, 2),
543
786
  bucketRegion = _ref5[0],
544
787
  bucketEnvironmentConfigs = _ref5[1];
545
788
  return {
546
789
  title: `Compiling for bucket region ${bucketRegion}`,
547
790
  task: (_bucketRegionCtx, bucketRegionTask) => {
548
- var _context2;
549
791
  // NOTE: Application assets need to be compiled
550
792
  // for all storage providers once per region.
551
- const allStorageProvidersForBucketRegion = [...new _Set__default["default"](_flatInstanceProperty__default["default"](_context2 = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders)).call(_context2))];
793
+ const allStorageProvidersForBucketRegion = [...new _Set__default["default"](_flatMapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders))];
552
794
  const allApplicationAssetTasks = _mapInstanceProperty__default["default"](allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
553
- const storageProvider = getStorageProvider(storageProviderTag);
554
- const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
795
+ const uploadScriptsGeneratorConfig = {
796
+ bucketRegion: bucketRegion
797
+ };
798
+ const storageProviderConfig = {
799
+ bucketRegion: bucketRegion
800
+ };
801
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
802
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, uploadScriptsGeneratorConfig);
555
803
  return {
556
804
  title: `Compiling application assets for '${storageProviderTag}'`,
557
805
  task: () => compileApplicationAssets({
558
806
  cliFlags,
559
807
  storageProvider,
560
808
  uploadScriptsGenerator,
561
- bucketRegion: bucketRegion,
562
809
  paths
563
810
  })
564
811
  };
@@ -567,13 +814,17 @@ async function command$3(cliFlags, cwd) {
567
814
  const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
568
815
  bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
569
816
  storageProviders = bucketEnvironmentConfig.storageProviders;
817
+ const storageProviderConfig = {
818
+ bucketRegion: bucketRegion,
819
+ bucketEnvironment
820
+ };
570
821
  return {
571
822
  title: `Compiling for cloud environment '${cloudEnvironment}'`,
572
823
  task: (_storageProviderCtx, storageProviderTask) => {
573
- var _context3;
574
- const applicationIndexTasksForStorageProviders = _mapInstanceProperty__default["default"](_context3 = storageProviders || defaultStorageProviders).call(_context3, storageProviderTag => {
575
- const storageProvider = getStorageProvider(storageProviderTag);
576
- const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
824
+ var _context2;
825
+ const applicationIndexTasksForStorageProviders = _mapInstanceProperty__default["default"](_context2 = storageProviders || defaultStorageProviders).call(_context2, storageProviderTag => {
826
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
827
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, storageProviderConfig);
577
828
  return {
578
829
  title: `Compiling application index for storage provider '${storageProviderTag}'`,
579
830
  task: () => {
@@ -582,9 +833,7 @@ async function command$3(cliFlags, cwd) {
582
833
  storageProvider,
583
834
  uploadScriptsGenerator,
584
835
  paths,
585
- bucketRegion: bucketRegion,
586
- cloudEnvironment,
587
- bucketEnvironment
836
+ cloudEnvironment
588
837
  });
589
838
  }
590
839
  };
@@ -868,7 +1117,7 @@ async function command(cliFlags) {
868
1117
 
869
1118
  var pkgJson = {
870
1119
  name: "@commercetools-frontend/application-cli",
871
- version: "2.1.2",
1120
+ version: "2.3.0",
872
1121
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
873
1122
  keywords: [
874
1123
  "commercetools",
@@ -891,15 +1140,15 @@ var pkgJson = {
891
1140
  },
892
1141
  dependencies: {
893
1142
  "@babel/core": "^7.22.11",
894
- "@babel/runtime-corejs3": "^7.21.0",
895
1143
  "@babel/runtime": "^7.21.0",
896
- "@commercetools-frontend/application-config": "22.17.1",
897
- "@commercetools-frontend/constants": "22.17.1",
898
- "@commercetools-frontend/l10n": "22.17.1",
1144
+ "@babel/runtime-corejs3": "^7.21.0",
1145
+ "@commercetools-frontend/application-config": "22.22.0",
1146
+ "@commercetools-frontend/constants": "22.22.0",
1147
+ "@commercetools-frontend/l10n": "22.22.0",
899
1148
  "@manypkg/find-root": "2.2.1",
900
1149
  cac: "^6.7.14",
901
1150
  cosmiconfig: "9.0.0",
902
- dotenv: "16.4.1",
1151
+ dotenv: "16.4.2",
903
1152
  execa: "5.1.1",
904
1153
  jsonschema: "^1.4.1",
905
1154
  listr2: "8.0.2",
@@ -908,7 +1157,7 @@ var pkgJson = {
908
1157
  },
909
1158
  devDependencies: {
910
1159
  "@tsconfig/node20": "20.1.2",
911
- "@types/node": "20.11.5",
1160
+ "@types/node": "20.11.30",
912
1161
  typescript: "5.2.2"
913
1162
  },
914
1163
  engines: {