@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.
@@ -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-705b6341.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$1 = /*#__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$1, {
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$1)[_bucketRegion$1] = 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,94 @@ 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,
113
+ let applicationName = _ref.applicationName,
114
+ bucketProtocol = _ref.bucketProtocol,
101
115
  bucketNamespace = _ref.bucketNamespace,
102
- applicationName = _ref.applicationName;
103
- const assetsBucketUrl = _filterInstanceProperty(_context = [bucketRegion, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
116
+ tag = _ref.tag;
117
+ if (!_classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1]) {
118
+ throw new Error("'bucketRegion' is not defined. Required to determine 'assetsBucketUrl'.");
119
+ }
120
+ const storageProvider = storageProviders[tag];
121
+ const assetBuketUrl = storageProvider.urls.bucket?.[_classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1]] ?? _classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1];
122
+ const assetsBucketUrl = _filterInstanceProperty(_context = [assetBuketUrl, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
104
123
  return `${bucketProtocol}${assetsBucketUrl}`;
105
124
  }
106
125
  }, {
107
126
  key: "getApplicationIndexBucketUrl",
108
127
  value: function getApplicationIndexBucketUrl(_ref2) {
109
- let bucketProtocol = _ref2.bucketProtocol,
110
- bucketRegion = _ref2.bucketRegion,
111
- bucketNamespace = _ref2.bucketNamespace,
128
+ let tag = _ref2.tag,
112
129
  prNumber = _ref2.prNumber,
113
130
  applicationName = _ref2.applicationName,
114
- bucketEnvironment = _ref2.bucketEnvironment;
131
+ bucketProtocol = _ref2.bucketProtocol,
132
+ bucketNamespace = _ref2.bucketNamespace;
115
133
  const applicationAssetsBucketUrl = this.getAssetsBucketUrl({
116
- bucketProtocol,
117
- bucketRegion,
118
- bucketNamespace,
134
+ tag,
135
+ applicationName,
119
136
  prNumber,
120
- applicationName
137
+ bucketProtocol,
138
+ bucketNamespace
121
139
  });
122
- const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
140
+ const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]}`;
123
141
  return applicationIndexBucketUrl;
124
142
  }
125
143
  }, {
126
144
  key: "getCdnUrl",
127
145
  value: function getCdnUrl(_ref3) {
128
146
  var _context2;
129
- let publicBaseUrl = _ref3.publicBaseUrl,
130
- bucketRegion = _ref3.bucketRegion,
147
+ let applicationName = _ref3.applicationName,
131
148
  prNumber = _ref3.prNumber,
132
- applicationName = _ref3.applicationName;
133
- return _filterInstanceProperty(_context2 = [publicBaseUrl, bucketRegion, this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
149
+ publicBaseUrl = _ref3.publicBaseUrl,
150
+ excludeBucketRegion = _ref3.excludeBucketRegion;
151
+ return _filterInstanceProperty(_context2 = [publicBaseUrl, excludeBucketRegion ? null : _classPrivateFieldLooseBase(this, _bucketRegion$1)[_bucketRegion$1], this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
152
+ }
153
+ }, {
154
+ key: "getPublicBaseUrl",
155
+ value: function getPublicBaseUrl(tag) {
156
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]) {
157
+ throw new Error("'bucketEnvironment' is not defined. Required to determine 'publicBaseUrl'.");
158
+ }
159
+ const storageProvider = storageProviders[tag];
160
+ const publicBaseUrl = storageProvider.urls.public[_classPrivateFieldLooseBase(this, _bucketEnvironment$1)[_bucketEnvironment$1]] ?? storageProvider.urls.public.default;
161
+ return publicBaseUrl;
134
162
  }
135
163
  }]);
136
164
  return StorageProvider;
137
165
  }();
166
+ var _bucketRegion2$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
167
+ var _bucketEnvironment2$1 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
138
168
  let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
139
169
  _inherits(GoogleStorageProvider, _StorageProvider);
140
- function GoogleStorageProvider() {
170
+ function GoogleStorageProvider(config) {
171
+ var _this;
141
172
  _classCallCheck(this, GoogleStorageProvider);
142
- return _callSuper(this, GoogleStorageProvider, arguments);
173
+ _this = _callSuper(this, GoogleStorageProvider, [config]);
174
+ _Object$defineProperty(_assertThisInitialized(_this), _bucketRegion2$1, {
175
+ writable: true,
176
+ value: void 0
177
+ });
178
+ _Object$defineProperty(_assertThisInitialized(_this), _bucketEnvironment2$1, {
179
+ writable: true,
180
+ value: void 0
181
+ });
182
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketRegion2$1)[_bucketRegion2$1] = config.bucketRegion;
183
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this), _bucketEnvironment2$1)[_bucketEnvironment2$1] = config.bucketEnvironment;
184
+ return _this;
143
185
  }
144
186
  _createClass(GoogleStorageProvider, [{
145
187
  key: "getTag",
146
188
  value: function getTag() {
147
189
  return 'gs';
148
190
  }
191
+ }, {
192
+ key: "getBucketRegion",
193
+ value: function getBucketRegion() {
194
+ return _classPrivateFieldLooseBase(this, _bucketRegion2$1)[_bucketRegion2$1];
195
+ }
196
+ }, {
197
+ key: "getBucketEnvironment",
198
+ value: function getBucketEnvironment() {
199
+ return _classPrivateFieldLooseBase(this, _bucketEnvironment2$1)[_bucketEnvironment2$1];
200
+ }
149
201
  }, {
150
202
  key: "getProtocol",
151
203
  value: function getProtocol() {
@@ -154,7 +206,7 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
154
206
  }, {
155
207
  key: "getPublicBaseUrl",
156
208
  value: function getPublicBaseUrl() {
157
- return 'https://storage.googleapis.com';
209
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getPublicBaseUrl", this).call(this, this.getTag());
158
210
  }
159
211
  }, {
160
212
  key: "getCdnUrl",
@@ -167,6 +219,7 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
167
219
  key: "getAssetsBucketUrl",
168
220
  value: function getAssetsBucketUrl(config) {
169
221
  return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
222
+ tag: this.getTag(),
170
223
  bucketProtocol: this.getProtocol(),
171
224
  bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
172
225
  }, config));
@@ -175,25 +228,114 @@ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
175
228
  key: "getApplicationIndexBucketUrl",
176
229
  value: function getApplicationIndexBucketUrl(config) {
177
230
  return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
231
+ tag: this.getTag(),
178
232
  bucketProtocol: this.getProtocol(),
179
233
  bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
180
234
  }, config));
181
235
  }
182
236
  }]);
183
237
  return GoogleStorageProvider;
184
- }(StorageProvider); // TODO: to be implemented.
185
- function getStorageProvider(storageProvider) {
238
+ }(StorageProvider);
239
+ var _bucketRegion3 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
240
+ var _bucketEnvironment3 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
241
+ let AwsStorageProvider = /*#__PURE__*/function (_StorageProvider2) {
242
+ _inherits(AwsStorageProvider, _StorageProvider2);
243
+ function AwsStorageProvider(config) {
244
+ var _this2;
245
+ _classCallCheck(this, AwsStorageProvider);
246
+ _this2 = _callSuper(this, AwsStorageProvider, [config]);
247
+ _Object$defineProperty(_assertThisInitialized(_this2), _bucketRegion3, {
248
+ writable: true,
249
+ value: void 0
250
+ });
251
+ _Object$defineProperty(_assertThisInitialized(_this2), _bucketEnvironment3, {
252
+ writable: true,
253
+ value: void 0
254
+ });
255
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this2), _bucketRegion3)[_bucketRegion3] = config.bucketRegion;
256
+ _classPrivateFieldLooseBase(_assertThisInitialized(_this2), _bucketEnvironment3)[_bucketEnvironment3] = config.bucketEnvironment;
257
+ return _this2;
258
+ }
259
+ _createClass(AwsStorageProvider, [{
260
+ key: "getTag",
261
+ value: function getTag() {
262
+ return 's3';
263
+ }
264
+ }, {
265
+ key: "getBucketRegion",
266
+ value: function getBucketRegion() {
267
+ return _classPrivateFieldLooseBase(this, _bucketRegion3)[_bucketRegion3];
268
+ }
269
+ }, {
270
+ key: "getBucketEnvironment",
271
+ value: function getBucketEnvironment() {
272
+ return _classPrivateFieldLooseBase(this, _bucketEnvironment3)[_bucketEnvironment3];
273
+ }
274
+ }, {
275
+ key: "getProtocol",
276
+ value: function getProtocol() {
277
+ return 's3://';
278
+ }
279
+ }, {
280
+ key: "getPublicBaseUrl",
281
+ value: function getPublicBaseUrl() {
282
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getPublicBaseUrl", this).call(this, this.getTag());
283
+ }
284
+ }, {
285
+ key: "getCdnUrl",
286
+ value: function getCdnUrl(config) {
287
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getCdnUrl", this).call(this, _objectSpread$4({
288
+ publicBaseUrl: this.getPublicBaseUrl(),
289
+ excludeBucketRegion: true
290
+ }, config));
291
+ }
292
+ }, {
293
+ key: "getAssetsBucketUrl",
294
+ value: function getAssetsBucketUrl(config) {
295
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
296
+ tag: this.getTag(),
297
+ bucketProtocol: this.getProtocol(),
298
+ bucketNamespace: _get(_getPrototypeOf(AwsStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
299
+ }, config));
300
+ }
301
+ }, {
302
+ key: "getApplicationIndexBucketUrl",
303
+ value: function getApplicationIndexBucketUrl(config) {
304
+ return _get(_getPrototypeOf(AwsStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
305
+ tag: this.getTag(),
306
+ bucketProtocol: this.getProtocol(),
307
+ bucketNamespace: _get(_getPrototypeOf(AwsStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
308
+ }, config));
309
+ }
310
+ }]);
311
+ return AwsStorageProvider;
312
+ }(StorageProvider);
313
+ function getStorageProvider(storageProvider, config) {
186
314
  switch (storageProvider) {
187
315
  case 'gs':
188
- return new GoogleStorageProvider();
316
+ return new GoogleStorageProvider(config);
317
+ case 's3':
318
+ return new AwsStorageProvider(config);
189
319
  default:
190
320
  throw new Error(`Storage provider ${storageProvider} not supported`);
191
321
  }
192
322
  }
193
323
 
324
+ var _bucketEnvironment = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
325
+ var _bucketRegion = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
194
326
  let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
195
- function GoogleStorageUploadScriptsGenerator() {
327
+ function GoogleStorageUploadScriptsGenerator(config) {
196
328
  _classCallCheck(this, GoogleStorageUploadScriptsGenerator);
329
+ _Object$defineProperty(this, _bucketEnvironment, {
330
+ writable: true,
331
+ value: void 0
332
+ });
333
+ _Object$defineProperty(this, _bucketRegion, {
334
+ writable: true,
335
+ value: void 0
336
+ });
337
+ _classPrivateFieldLooseBase(this, _bucketRegion)[_bucketRegion] = config.bucketRegion;
338
+ _classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment] = config.bucketEnvironment;
197
339
  }
198
340
  _createClass(GoogleStorageUploadScriptsGenerator, [{
199
341
  key: "getApplicationIndexUploadScript",
@@ -201,10 +343,12 @@ let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
201
343
  let packageManagerName = _ref.packageManagerName,
202
344
  bucketUrl = _ref.bucketUrl,
203
345
  cdnUrl = _ref.cdnUrl,
204
- bucketEnvironment = _ref.bucketEnvironment,
205
346
  buildRevision = _ref.buildRevision,
206
347
  buildNumber = _ref.buildNumber,
207
348
  applicationIndexOutFile = _ref.applicationIndexOutFile;
349
+ if (!_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]) {
350
+ throw new Error("Missing 'bucketEnvironment' when generating application index.");
351
+ }
208
352
  return `
209
353
  #!/usr/bin/env bash
210
354
 
@@ -222,7 +366,7 @@ gcloud storage cp \\
222
366
  echo "Creating version.json and uploading it to bucket ${bucketUrl}"
223
367
 
224
368
  NODE_ENV=production ${packageManagerName} application-cli create-version \\
225
- --version-url=${cdnUrl}/${bucketEnvironment}/version.json \\
369
+ --version-url=${cdnUrl}/${_classPrivateFieldLooseBase(this, _bucketEnvironment)[_bucketEnvironment]}/version.json \\
226
370
  --build-revision=${buildRevision} \\
227
371
  --build-number=${buildNumber} \\
228
372
  --out-file=$(dirname "$0")/version.json
@@ -308,11 +452,130 @@ fi
308
452
  }
309
453
  }]);
310
454
  return GoogleStorageUploadScriptsGenerator;
311
- }(); // TODO: To be implemented.
312
- function getUploadScriptsGenerator(storageProvider) {
455
+ }();
456
+ var _bucketEnvironment2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketEnvironment");
457
+ var _bucketRegion2 = /*#__PURE__*/_classPrivateFieldLooseKey("bucketRegion");
458
+ let AwsStorageUploadScriptsGenerator = /*#__PURE__*/function () {
459
+ function AwsStorageUploadScriptsGenerator(config) {
460
+ _classCallCheck(this, AwsStorageUploadScriptsGenerator);
461
+ _Object$defineProperty(this, _bucketEnvironment2, {
462
+ writable: true,
463
+ value: void 0
464
+ });
465
+ _Object$defineProperty(this, _bucketRegion2, {
466
+ writable: true,
467
+ value: void 0
468
+ });
469
+ _classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2] = config.bucketRegion;
470
+ _classPrivateFieldLooseBase(this, _bucketEnvironment2)[_bucketEnvironment2] = config.bucketEnvironment;
471
+ }
472
+ _createClass(AwsStorageUploadScriptsGenerator, [{
473
+ key: "getApplicationIndexUploadScript",
474
+ value: function getApplicationIndexUploadScript(_ref3) {
475
+ let packageManagerName = _ref3.packageManagerName,
476
+ bucketUrl = _ref3.bucketUrl,
477
+ cdnUrl = _ref3.cdnUrl,
478
+ buildRevision = _ref3.buildRevision,
479
+ buildNumber = _ref3.buildNumber,
480
+ applicationIndexOutFile = _ref3.applicationIndexOutFile;
481
+ return `
482
+ #!/usr/bin/env bash
483
+
484
+ echo "Uploading static assets to Amazon S3 bucket ${bucketUrl}"
485
+
486
+ set -e
487
+
488
+ aws s3 cp \\
489
+ "$(dirname "$0")/${applicationIndexOutFile}" \\
490
+ "${bucketUrl}/" \\
491
+ --content-type="text/html" \\
492
+ --cache-control="public,max-age=0,no-transform" \\
493
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
494
+
495
+ echo "Creating version.json and uploading it to bucket ${bucketUrl}"
496
+
497
+ NODE_ENV=production ${packageManagerName} application-cli create-version \\
498
+ --version-url=${cdnUrl}/${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}/version.json \\
499
+ --build-revision=${buildRevision} \\
500
+ --build-number=${buildNumber} \\
501
+ --out-file=$(dirname "$0")/version.json
502
+
503
+ aws s3 cp \\
504
+ "$(dirname "$0")/version.json" \\
505
+ "${bucketUrl}/" \\
506
+ --content-type="application/json" \\
507
+ --cache-control="public,max-age=0,no-transform" \\
508
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
509
+ `;
510
+ }
511
+ }, {
512
+ key: "getProductionBundlesUploadScript",
513
+ value: function getProductionBundlesUploadScript(_ref4) {
514
+ let bucketUrl = _ref4.bucketUrl,
515
+ assetsPath = _ref4.assetsPath,
516
+ skipMenu = _ref4.skipMenu;
517
+ return `
518
+ #!/usr/bin/env bash
519
+
520
+ echo "Uploading static assets to Amazon S3 bucket ${bucketUrl}"
521
+
522
+ set -e
523
+
524
+ # NOTE:
525
+ # The sync command on the AWS CLI is different to the -n option on the gcloud CLI.
526
+ # Sync will only upload files that are not already in the bucket, but it will skip existing ones
527
+ # that have been changed locally.
528
+ # The -n option on the gcloud CLI will skip uploading existing files and prevents them to be overwritten.
529
+ # https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
530
+ # https://cloud.google.com/sdk/gcloud/reference/storage/cp
531
+ #
532
+ # Compression (gzip) is enabled on CloudFront by default. Hence compression does happing while uploading.
533
+ # https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-configuring
534
+ aws s3 sync ${assetsPath}/public \\
535
+ "${bucketUrl}" \\
536
+ --exclude "*" \\
537
+ --include "*.css" \\
538
+ --include "*.js" \\
539
+ --include "*.js.map" \\
540
+ --include "*.html" \\
541
+ --cache-control="public,max-age=31536000,no-transform" \\
542
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
543
+
544
+ # We need to upload the PNG and HTML files separately because we want them
545
+ # to be able to overwrite the existing files (if any). For instance, the
546
+ # file or the favicons.
547
+ aws s3 cp ${assetsPath}/public \\
548
+ "${bucketUrl}" \\
549
+ --recursive \\
550
+ --exclude "*" \\
551
+ --include "*.png" \\
552
+ --include "robots.txt" \\
553
+ --cache-control="public,max-age=31536000,no-transform" \\
554
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
555
+
556
+ if ${skipMenu}; then
557
+ echo "Skipping menu.json upload"
558
+ else
559
+ echo "Uploading menu.json to bucket ${bucketUrl}"
560
+
561
+ aws s3 cp \\
562
+ ${assetsPath}/menu.json \\
563
+ ${bucketUrl} \\
564
+ --content-type="application/json" \\
565
+ --cache-control="public,max-age=0,no-transform" \\
566
+ --profile ${_classPrivateFieldLooseBase(this, _bucketRegion2)[_bucketRegion2]}
567
+ fi
568
+ `;
569
+ }
570
+ }]);
571
+ return AwsStorageUploadScriptsGenerator;
572
+ }();
573
+ function getUploadScriptsGenerator(storageProvider, config) {
313
574
  switch (storageProvider) {
314
575
  case 'gs':
315
- return new GoogleStorageUploadScriptsGenerator();
576
+ return new GoogleStorageUploadScriptsGenerator(config);
577
+ case 's3':
578
+ return new AwsStorageUploadScriptsGenerator(config);
316
579
  default:
317
580
  throw new Error(`Storage provider ${storageProvider} not supported`);
318
581
  }
@@ -356,10 +619,7 @@ function loadDotenvFiles(_ref) {
356
619
  }
357
620
 
358
621
  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
- });
622
+ 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
623
  function writeUploadScriptFile(_ref) {
364
624
  let fileName = _ref.fileName,
365
625
  fileContent = _ref.fileContent,
@@ -374,12 +634,10 @@ async function compileApplicationAssets(_ref2) {
374
634
  let cliFlags = _ref2.cliFlags,
375
635
  storageProvider = _ref2.storageProvider,
376
636
  uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
377
- bucketRegion = _ref2.bucketRegion,
378
637
  paths = _ref2.paths;
379
638
  const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
380
639
  storageProvider,
381
640
  bucketUrl: storageProvider.getAssetsBucketUrl({
382
- bucketRegion,
383
641
  prNumber: cliFlags.prNumber,
384
642
  applicationName: cliFlags.applicationName
385
643
  }),
@@ -387,7 +645,7 @@ async function compileApplicationAssets(_ref2) {
387
645
  skipMenu: cliFlags.skipMenu
388
646
  });
389
647
  const parsedApplicationAssetsUploadScriptFile = path$1.parse(cliFlags.applicationAssetsUploadScriptOutFile);
390
- const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${bucketRegion}${parsedApplicationAssetsUploadScriptFile.ext}`;
648
+ const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${storageProvider.getBucketRegion()}${parsedApplicationAssetsUploadScriptFile.ext}`;
391
649
  writeUploadScriptFile({
392
650
  fileName: applicationAssetsUploadScriptFileName,
393
651
  fileContent: applicationAssetsUploadScriptContent,
@@ -399,9 +657,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
399
657
  storageProvider = _ref3.storageProvider,
400
658
  uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
401
659
  paths = _ref3.paths,
402
- bucketRegion = _ref3.bucketRegion,
403
- cloudEnvironment = _ref3.cloudEnvironment,
404
- bucketEnvironment = _ref3.bucketEnvironment;
660
+ cloudEnvironment = _ref3.cloudEnvironment;
405
661
  const cloudEnvironmentDeploymentPath = path$1.join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
406
662
  // Ensure the folder exists
407
663
  const createDeploymentsFolderResult = await execa('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
@@ -413,7 +669,6 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
413
669
 
414
670
  // Construct the proper CDN URL for the specific application
415
671
  const cdnUrl = storageProvider.getCdnUrl({
416
- bucketRegion,
417
672
  prNumber: cliFlags.prNumber,
418
673
  applicationName: cliFlags.applicationName
419
674
  });
@@ -459,13 +714,10 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
459
714
  storageProvider,
460
715
  packageManagerName: cliFlags.packageManagerName,
461
716
  bucketUrl: storageProvider.getApplicationIndexBucketUrl({
462
- bucketRegion,
463
717
  prNumber: cliFlags.prNumber,
464
- applicationName: cliFlags.applicationName,
465
- bucketEnvironment
718
+ applicationName: cliFlags.applicationName
466
719
  }),
467
720
  cdnUrl,
468
- bucketEnvironment,
469
721
  buildRevision: cliFlags.buildRevision,
470
722
  buildNumber: cliFlags.buildNumber,
471
723
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
@@ -484,16 +736,7 @@ async function compileEnvironmentApplicationIndexes(_ref3) {
484
736
  }
485
737
  async function command$3(cliFlags, cwd) {
486
738
  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
- }
739
+ const storageBucketConfig = await loadStorageBucketsConfig();
497
740
  const applicationDirectory = getApplicationDirectory(cwd);
498
741
  let assetsPath;
499
742
  if (cliFlags.ciAssetsRootPath && isCI()) {
@@ -508,28 +751,32 @@ async function command$3(cliFlags, cwd) {
508
751
  dotenvPath: cliFlags.dotenvFolder && path$1.join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
509
752
  assetsPath
510
753
  };
511
- const defaultStorageProviders = ['gs'];
512
- const taskList = new Listr(_mapInstanceProperty(_context = _Object$entries(cloudEnvironmentsGroupedByBucketRegions.config)).call(_context, _ref4 => {
754
+ const defaultStorageProviders = [storageProviders.gs.tag];
755
+ const taskList = new Listr(_mapInstanceProperty(_context = _Object$entries(storageBucketConfig)).call(_context, _ref4 => {
513
756
  let _ref5 = _slicedToArray(_ref4, 2),
514
757
  bucketRegion = _ref5[0],
515
758
  bucketEnvironmentConfigs = _ref5[1];
516
759
  return {
517
760
  title: `Compiling for bucket region ${bucketRegion}`,
518
761
  task: (_bucketRegionCtx, bucketRegionTask) => {
519
- var _context2;
520
762
  // NOTE: Application assets need to be compiled
521
763
  // for all storage providers once per region.
522
- const allStorageProvidersForBucketRegion = [...new _Set(_flatInstanceProperty(_context2 = _mapInstanceProperty(bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders)).call(_context2))];
764
+ const allStorageProvidersForBucketRegion = [...new _Set(_flatMapInstanceProperty(bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders))];
523
765
  const allApplicationAssetTasks = _mapInstanceProperty(allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
524
- const storageProvider = getStorageProvider(storageProviderTag);
525
- const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
766
+ const uploadScriptsGeneratorConfig = {
767
+ bucketRegion: bucketRegion
768
+ };
769
+ const storageProviderConfig = {
770
+ bucketRegion: bucketRegion
771
+ };
772
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
773
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, uploadScriptsGeneratorConfig);
526
774
  return {
527
775
  title: `Compiling application assets for '${storageProviderTag}'`,
528
776
  task: () => compileApplicationAssets({
529
777
  cliFlags,
530
778
  storageProvider,
531
779
  uploadScriptsGenerator,
532
- bucketRegion: bucketRegion,
533
780
  paths
534
781
  })
535
782
  };
@@ -538,13 +785,17 @@ async function command$3(cliFlags, cwd) {
538
785
  const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
539
786
  bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
540
787
  storageProviders = bucketEnvironmentConfig.storageProviders;
788
+ const storageProviderConfig = {
789
+ bucketRegion: bucketRegion,
790
+ bucketEnvironment
791
+ };
541
792
  return {
542
793
  title: `Compiling for cloud environment '${cloudEnvironment}'`,
543
794
  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);
795
+ var _context2;
796
+ const applicationIndexTasksForStorageProviders = _mapInstanceProperty(_context2 = storageProviders || defaultStorageProviders).call(_context2, storageProviderTag => {
797
+ const storageProvider = getStorageProvider(storageProviderTag, storageProviderConfig);
798
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag, storageProviderConfig);
548
799
  return {
549
800
  title: `Compiling application index for storage provider '${storageProviderTag}'`,
550
801
  task: () => {
@@ -553,9 +804,7 @@ async function command$3(cliFlags, cwd) {
553
804
  storageProvider,
554
805
  uploadScriptsGenerator,
555
806
  paths,
556
- bucketRegion: bucketRegion,
557
- cloudEnvironment,
558
- bucketEnvironment
807
+ cloudEnvironment
559
808
  });
560
809
  }
561
810
  };
@@ -839,7 +1088,7 @@ async function command(cliFlags) {
839
1088
 
840
1089
  var pkgJson = {
841
1090
  name: "@commercetools-frontend/application-cli",
842
- version: "2.1.2",
1091
+ version: "2.3.0",
843
1092
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
844
1093
  keywords: [
845
1094
  "commercetools",
@@ -862,15 +1111,15 @@ var pkgJson = {
862
1111
  },
863
1112
  dependencies: {
864
1113
  "@babel/core": "^7.22.11",
865
- "@babel/runtime-corejs3": "^7.21.0",
866
1114
  "@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",
1115
+ "@babel/runtime-corejs3": "^7.21.0",
1116
+ "@commercetools-frontend/application-config": "22.22.0",
1117
+ "@commercetools-frontend/constants": "22.22.0",
1118
+ "@commercetools-frontend/l10n": "22.22.0",
870
1119
  "@manypkg/find-root": "2.2.1",
871
1120
  cac: "^6.7.14",
872
1121
  cosmiconfig: "9.0.0",
873
- dotenv: "16.4.1",
1122
+ dotenv: "16.4.2",
874
1123
  execa: "5.1.1",
875
1124
  jsonschema: "^1.4.1",
876
1125
  listr2: "8.0.2",
@@ -879,7 +1128,7 @@ var pkgJson = {
879
1128
  },
880
1129
  devDependencies: {
881
1130
  "@tsconfig/node20": "20.1.2",
882
- "@types/node": "20.11.5",
1131
+ "@types/node": "20.11.30",
883
1132
  typescript: "5.2.2"
884
1133
  },
885
1134
  engines: {