@commercetools-frontend/application-cli 1.8.1 → 2.1.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.
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var cac = require('cac');
6
6
  var _Object$keys = require('@babel/runtime-corejs3/core-js-stable/object/keys');
7
7
  var _Object$getOwnPropertySymbols = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
8
+ var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
8
9
  var _Object$getOwnPropertyDescriptor = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor');
9
10
  var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
10
11
  var _Object$getOwnPropertyDescriptors = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors');
@@ -12,46 +13,59 @@ var _Object$defineProperties = require('@babel/runtime-corejs3/core-js-stable/ob
12
13
  var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/object/define-property');
13
14
  var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
14
15
  var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
15
- var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
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
- var _concatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/concat');
19
- var fs = require('fs');
20
- var path = require('path');
18
+ var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
19
+ var _flatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/flat');
20
+ var fs = require('node:fs');
21
+ var path$1 = require('node:path');
21
22
  var listr2 = require('listr2');
22
23
  var execa = require('execa');
23
24
  var cosmiconfig = require('cosmiconfig');
24
25
  var findRoot = require('@manypkg/find-root');
26
+ var path = require('path');
27
+ var _possibleConstructorReturn = require('@babel/runtime-corejs3/helpers/possibleConstructorReturn');
28
+ var _get = require('@babel/runtime-corejs3/helpers/get');
29
+ var _getPrototypeOf = require('@babel/runtime-corejs3/helpers/getPrototypeOf');
30
+ var _inherits = require('@babel/runtime-corejs3/helpers/inherits');
31
+ var _classCallCheck = require('@babel/runtime-corejs3/helpers/classCallCheck');
32
+ var _createClass = require('@babel/runtime-corejs3/helpers/createClass');
33
+ var _Reflect$construct = require('@babel/runtime-corejs3/core-js-stable/reflect/construct');
34
+ var fs$1 = require('fs');
25
35
  var dotenv = require('dotenv');
26
36
  var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
27
37
  var _JSON$stringify = require('@babel/runtime-corejs3/core-js-stable/json/stringify');
28
38
  var applicationConfig = require('@commercetools-frontend/application-config');
29
39
  var l10n = require('@commercetools-frontend/l10n');
40
+ var storageBucketsConfig = require('../../dist/storage-buckets-config-0b3808a3.cjs.prod.js');
30
41
  var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/slice');
31
- var fetch = require('node-fetch');
32
42
  var jsonschema = require('jsonschema');
43
+ require('ts-deepmerge');
33
44
 
34
45
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
35
46
 
36
47
  var _Object$keys__default = /*#__PURE__*/_interopDefault(_Object$keys);
37
48
  var _Object$getOwnPropertySymbols__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertySymbols);
49
+ var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
38
50
  var _Object$getOwnPropertyDescriptor__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptor);
39
51
  var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
40
52
  var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptors);
41
53
  var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
42
54
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
43
- var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
44
55
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
45
56
  var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
46
- var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
57
+ var _Set__default = /*#__PURE__*/_interopDefault(_Set);
58
+ var _flatInstanceProperty__default = /*#__PURE__*/_interopDefault(_flatInstanceProperty);
47
59
  var fs__default = /*#__PURE__*/_interopDefault(fs);
48
- var path__default = /*#__PURE__*/_interopDefault(path);
60
+ var path__default$1 = /*#__PURE__*/_interopDefault(path$1);
49
61
  var execa__default = /*#__PURE__*/_interopDefault(execa);
62
+ var path__default = /*#__PURE__*/_interopDefault(path);
63
+ var _Reflect$construct__default = /*#__PURE__*/_interopDefault(_Reflect$construct);
64
+ var fs__default$1 = /*#__PURE__*/_interopDefault(fs$1);
50
65
  var dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
51
66
  var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
52
67
  var _JSON$stringify__default = /*#__PURE__*/_interopDefault(_JSON$stringify);
53
68
  var _sliceInstanceProperty__default = /*#__PURE__*/_interopDefault(_sliceInstanceProperty);
54
- var fetch__default = /*#__PURE__*/_interopDefault(fetch);
55
69
 
56
70
  function getApplicationDirectory(cwd) {
57
71
  return fs__default["default"].realpathSync(cwd);
@@ -66,19 +80,167 @@ function isCI() {
66
80
  return process.env.CI === true || process.env.CI === 'true';
67
81
  }
68
82
 
69
- function createApplicationIndexUploadScript(_ref) {
70
- let packageManagerName = _ref.packageManagerName,
71
- bucketUrl = _ref.bucketUrl,
72
- cdnUrl = _ref.cdnUrl,
73
- bucketEnvironment = _ref.bucketEnvironment,
74
- buildRevision = _ref.buildRevision,
75
- buildNumber = _ref.buildNumber,
76
- applicationIndexOutFile = _ref.applicationIndexOutFile;
77
- const uploadScriptContent = `#!/usr/bin/env bash
83
+ function ownKeys$4(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; }
84
+ function _objectSpread$4(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$4(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$4(Object(t))).call(_context4, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
85
+ function _callSuper(_this, derived, args) {
86
+ function isNativeReflectConstruct() {
87
+ if (typeof Reflect === "undefined" || !_Reflect$construct__default["default"]) return false;
88
+ if (_Reflect$construct__default["default"].sham) return false;
89
+ if (typeof Proxy === "function") return true;
90
+ try {
91
+ return !Boolean.prototype.valueOf.call(_Reflect$construct__default["default"](Boolean, [], function () {}));
92
+ } catch (e) {
93
+ return false;
94
+ }
95
+ }
96
+ derived = _getPrototypeOf(derived);
97
+ return _possibleConstructorReturn(_this, isNativeReflectConstruct() ? _Reflect$construct__default["default"](derived, args || [], _getPrototypeOf(_this).constructor) : derived.apply(_this, args));
98
+ }
99
+ let StorageProvider = /*#__PURE__*/function () {
100
+ function StorageProvider() {
101
+ _classCallCheck(this, StorageProvider);
102
+ }
103
+ _createClass(StorageProvider, [{
104
+ 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) {
116
+ if (!prNumber) return;
117
+ if (prNumber === 'merchant-center-preview') return prNumber;
118
+ return `mc-${prNumber}`;
119
+ }
120
+
121
+ /**
122
+ * Construct the storage bucket URL for the specific application and cloud environment.
123
+ */
124
+ }, {
125
+ key: "getAssetsBucketUrl",
126
+ value: function getAssetsBucketUrl(_ref) {
127
+ var _context;
128
+ let bucketProtocol = _ref.bucketProtocol,
129
+ bucketRegion = _ref.bucketRegion,
130
+ bucketNamespace = _ref.bucketNamespace,
131
+ applicationName = _ref.applicationName;
132
+ const assetsBucketUrl = _filterInstanceProperty__default["default"](_context = [bucketRegion, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
133
+ return `${bucketProtocol}${assetsBucketUrl}`;
134
+ }
135
+ }, {
136
+ key: "getApplicationIndexBucketUrl",
137
+ value: function getApplicationIndexBucketUrl(_ref2) {
138
+ let bucketProtocol = _ref2.bucketProtocol,
139
+ bucketRegion = _ref2.bucketRegion,
140
+ bucketNamespace = _ref2.bucketNamespace,
141
+ prNumber = _ref2.prNumber,
142
+ applicationName = _ref2.applicationName,
143
+ bucketEnvironment = _ref2.bucketEnvironment;
144
+ const applicationAssetsBucketUrl = this.getAssetsBucketUrl({
145
+ bucketProtocol,
146
+ bucketRegion,
147
+ bucketNamespace,
148
+ prNumber,
149
+ applicationName
150
+ });
151
+ const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
152
+ return applicationIndexBucketUrl;
153
+ }
154
+ }, {
155
+ key: "getCdnUrl",
156
+ value: function getCdnUrl(_ref3) {
157
+ var _context2;
158
+ let publicBaseUrl = _ref3.publicBaseUrl,
159
+ bucketRegion = _ref3.bucketRegion,
160
+ prNumber = _ref3.prNumber,
161
+ applicationName = _ref3.applicationName;
162
+ return _filterInstanceProperty__default["default"](_context2 = [publicBaseUrl, bucketRegion, this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
163
+ }
164
+ }]);
165
+ return StorageProvider;
166
+ }();
167
+ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
168
+ _inherits(GoogleStorageProvider, _StorageProvider);
169
+ function GoogleStorageProvider() {
170
+ _classCallCheck(this, GoogleStorageProvider);
171
+ return _callSuper(this, GoogleStorageProvider, arguments);
172
+ }
173
+ _createClass(GoogleStorageProvider, [{
174
+ key: "getTag",
175
+ value: function getTag() {
176
+ return 'gs';
177
+ }
178
+ }, {
179
+ key: "getProtocol",
180
+ value: function getProtocol() {
181
+ return 'gs://';
182
+ }
183
+ }, {
184
+ key: "getPublicBaseUrl",
185
+ value: function getPublicBaseUrl() {
186
+ return 'https://storage.googleapis.com';
187
+ }
188
+ }, {
189
+ key: "getCdnUrl",
190
+ value: function getCdnUrl(config) {
191
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getCdnUrl", this).call(this, _objectSpread$4({
192
+ publicBaseUrl: this.getPublicBaseUrl()
193
+ }, config));
194
+ }
195
+ }, {
196
+ key: "getAssetsBucketUrl",
197
+ value: function getAssetsBucketUrl(config) {
198
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
199
+ bucketProtocol: this.getProtocol(),
200
+ bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
201
+ }, config));
202
+ }
203
+ }, {
204
+ key: "getApplicationIndexBucketUrl",
205
+ value: function getApplicationIndexBucketUrl(config) {
206
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
207
+ bucketProtocol: this.getProtocol(),
208
+ bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
209
+ }, config));
210
+ }
211
+ }]);
212
+ return GoogleStorageProvider;
213
+ }(StorageProvider); // TODO: to be implemented.
214
+ function getStorageProvider(storageProvider) {
215
+ switch (storageProvider) {
216
+ case 'gs':
217
+ return new GoogleStorageProvider();
218
+ default:
219
+ throw new Error(`Storage provider ${storageProvider} not supported`);
220
+ }
221
+ }
222
+
223
+ let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
224
+ function GoogleStorageUploadScriptsGenerator() {
225
+ _classCallCheck(this, GoogleStorageUploadScriptsGenerator);
226
+ }
227
+ _createClass(GoogleStorageUploadScriptsGenerator, [{
228
+ key: "getApplicationIndexUploadScript",
229
+ value: function getApplicationIndexUploadScript(_ref) {
230
+ let packageManagerName = _ref.packageManagerName,
231
+ bucketUrl = _ref.bucketUrl,
232
+ cdnUrl = _ref.cdnUrl,
233
+ bucketEnvironment = _ref.bucketEnvironment,
234
+ buildRevision = _ref.buildRevision,
235
+ buildNumber = _ref.buildNumber,
236
+ applicationIndexOutFile = _ref.applicationIndexOutFile;
237
+ return `
238
+ #!/usr/bin/env bash
78
239
 
79
240
  set -e
80
241
 
81
- echo "Uploading compiled ${applicationIndexOutFile} to bucket ${bucketUrl}"
242
+ echo "Uploading compiled ${applicationIndexOutFile} to Google Storage bucket ${bucketUrl}"
243
+
82
244
  gcloud storage cp \\
83
245
  "$(dirname "$0")/${applicationIndexOutFile}" \\
84
246
  "${bucketUrl}/" \\
@@ -101,14 +263,15 @@ gcloud storage cp \\
101
263
  --content-type="application/json" \\
102
264
  --cache-control="public,max-age=0,no-transform"
103
265
  `;
104
- return uploadScriptContent;
105
- }
106
-
107
- function createApplicationAssetsUploadScript(_ref) {
108
- let bucketUrl = _ref.bucketUrl,
109
- assetsPath = _ref.assetsPath,
110
- skipMenu = _ref.skipMenu;
111
- const uploadScriptContent = `#!/usr/bin/env bash
266
+ }
267
+ }, {
268
+ key: "getProductionBundlesUploadScript",
269
+ value: function getProductionBundlesUploadScript(_ref2) {
270
+ let bucketUrl = _ref2.bucketUrl,
271
+ assetsPath = _ref2.assetsPath,
272
+ skipMenu = _ref2.skipMenu;
273
+ return `
274
+ #!/usr/bin/env bash
112
275
 
113
276
  set -e
114
277
 
@@ -121,7 +284,7 @@ set -e
121
284
  # "valid" lifetime of an asset to be cached.
122
285
  # 4. The '-n' will skip uploading existing files and prevents them to
123
286
  # be overwritten
124
- echo "Uploading static assets to bucket ${bucketUrl}"
287
+ echo "Uploading static assets to Google Storage bucket ${bucketUrl}"
125
288
 
126
289
  gcloud storage cp \\
127
290
  ${assetsPath}/public/{*.css,*.js,*.js.map,*.png,*.html,robots.txt} \\
@@ -160,7 +323,17 @@ else
160
323
  --cache-control="public,max-age=0,no-transform"
161
324
  fi
162
325
  `;
163
- return uploadScriptContent;
326
+ }
327
+ }]);
328
+ return GoogleStorageUploadScriptsGenerator;
329
+ }(); // TODO: To be implemented.
330
+ function getUploadScriptsGenerator(storageProvider) {
331
+ switch (storageProvider) {
332
+ case 'gs':
333
+ return new GoogleStorageUploadScriptsGenerator();
334
+ default:
335
+ throw new Error(`Storage provider ${storageProvider} not supported`);
336
+ }
164
337
  }
165
338
 
166
339
  function ownKeys$3(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; }
@@ -174,7 +347,7 @@ function loadDotenvFiles(_ref) {
174
347
  }
175
348
 
176
349
  // Check if the given path exists.
177
- if (!fs__default["default"].existsSync(dotenvPath)) {
350
+ if (!fs__default$1["default"].existsSync(dotenvPath)) {
178
351
  throw new Error(`The dotenv folder path does not exist: "${dotenvPath}".`);
179
352
  }
180
353
 
@@ -201,74 +374,29 @@ function loadDotenvFiles(_ref) {
201
374
  }
202
375
 
203
376
  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; }
204
- function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var _context5, _context6; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context5 = ownKeys$2(Object(t), !0)).call(_context5, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context6 = ownKeys$2(Object(t))).call(_context6, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
205
- const buckedConfigExplorer = cosmiconfig.cosmiconfig('google-storage-buckets');
206
- function assertCollapsedBucketEnvironmentConfig(bucketEnvironmentConfigOrBucketEnvironment) {
207
- return typeof bucketEnvironmentConfigOrBucketEnvironment == 'string';
208
- }
209
- function assertExpandedBucketEnvironmentConfig(bucketEnvironmentConfigOrBucketEnvironment) {
210
- return typeof bucketEnvironmentConfigOrBucketEnvironment == 'object' && typeof bucketEnvironmentConfigOrBucketEnvironment.cloudEnvironment == 'string' && typeof bucketEnvironmentConfigOrBucketEnvironment.bucketEnvironment == 'string';
211
- }
377
+ 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; }
378
+ const storageBucketConfigExplorer = cosmiconfig.cosmiconfig('storage-buckets', {
379
+ searchStrategy: 'project'
380
+ });
212
381
  function writeUploadScriptFile(_ref) {
213
382
  let fileName = _ref.fileName,
214
383
  fileContent = _ref.fileContent,
215
384
  filePath = _ref.filePath;
216
- fs__default["default"].writeFileSync(path__default["default"].join(filePath, fileName), fileContent, {
385
+ fs__default["default"].writeFileSync(path__default$1["default"].join(filePath, fileName), fileContent, {
217
386
  // Make the script executable
218
387
  mode: 0o755,
219
388
  encoding: 'utf8'
220
389
  });
221
390
  }
222
- function getBucketNamespace(prNumber) {
223
- if (!prNumber) return;
224
- if (prNumber === 'merchant-center-preview') return prNumber;
225
- return `mc-${prNumber}`;
226
- }
227
-
228
- /**
229
- * Construct the storage bucket URL for the specific application and cloud environment.
230
- *
231
- * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
232
- * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
233
- *
234
- * This allows all cloud environments sharing the same static assets while each application's index
235
- * is uploaded with different headers (e.g. CSP rules).
236
- */
237
-
238
- function getApplicationAssetsBucketUrl(_ref2) {
239
- var _context;
240
- let bucketRegion = _ref2.bucketRegion,
241
- prNumber = _ref2.prNumber,
242
- applicationName = _ref2.applicationName;
243
- const applicationAssetsBucketUrl = _filterInstanceProperty__default["default"](_context = [`gs://${bucketRegion}`, getBucketNamespace(prNumber), applicationName]).call(_context, Boolean);
244
- return applicationAssetsBucketUrl.join('/');
245
- }
246
- function getApplicationIndexBucketUrl(_ref3) {
247
- let bucketRegion = _ref3.bucketRegion,
248
- prNumber = _ref3.prNumber,
249
- applicationName = _ref3.applicationName,
250
- bucketEnvironment = _ref3.bucketEnvironment;
251
- const applicationAssetsBucketUrl = getApplicationAssetsBucketUrl({
252
- bucketRegion,
253
- prNumber,
254
- applicationName
255
- });
256
- const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
257
- return applicationIndexBucketUrl;
258
- }
259
- function getCdnUrl(_ref4) {
260
- var _context2;
261
- let bucketRegion = _ref4.bucketRegion,
262
- prNumber = _ref4.prNumber,
263
- applicationName = _ref4.applicationName;
264
- return _filterInstanceProperty__default["default"](_context2 = [`https://storage.googleapis.com/${bucketRegion}`, getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
265
- }
266
- async function compileApplicationAssets(_ref5) {
267
- let cliFlags = _ref5.cliFlags,
268
- bucketRegion = _ref5.bucketRegion,
269
- paths = _ref5.paths;
270
- const applicationAssetsUploadScriptContent = createApplicationAssetsUploadScript({
271
- bucketUrl: getApplicationAssetsBucketUrl({
391
+ async function compileApplicationAssets(_ref2) {
392
+ let cliFlags = _ref2.cliFlags,
393
+ storageProvider = _ref2.storageProvider,
394
+ uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
395
+ bucketRegion = _ref2.bucketRegion,
396
+ paths = _ref2.paths;
397
+ const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
398
+ storageProvider,
399
+ bucketUrl: storageProvider.getAssetsBucketUrl({
272
400
  bucketRegion,
273
401
  prNumber: cliFlags.prNumber,
274
402
  applicationName: cliFlags.applicationName
@@ -276,21 +404,23 @@ async function compileApplicationAssets(_ref5) {
276
404
  assetsPath: paths.assetsPath,
277
405
  skipMenu: cliFlags.skipMenu
278
406
  });
279
- const parsedApplicationAssetsUploadScriptFile = path__default["default"].parse(cliFlags.applicationAssetsUploadScriptOutFile);
407
+ const parsedApplicationAssetsUploadScriptFile = path__default$1["default"].parse(cliFlags.applicationAssetsUploadScriptOutFile);
280
408
  const applicationAssetsUploadScriptFileName = `${parsedApplicationAssetsUploadScriptFile.name}-${bucketRegion}${parsedApplicationAssetsUploadScriptFile.ext}`;
281
409
  writeUploadScriptFile({
282
410
  fileName: applicationAssetsUploadScriptFileName,
283
411
  fileContent: applicationAssetsUploadScriptContent,
284
- filePath: paths.deploymentsPath
412
+ filePath: path__default$1["default"].join(paths.deploymentsPath, storageProvider.getTag())
285
413
  });
286
414
  }
287
- async function compileEnvironmentApplicationIndexes(_ref6) {
288
- let cliFlags = _ref6.cliFlags,
289
- paths = _ref6.paths,
290
- bucketRegion = _ref6.bucketRegion,
291
- cloudEnvironment = _ref6.cloudEnvironment,
292
- bucketEnvironment = _ref6.bucketEnvironment;
293
- const cloudEnvironmentDeploymentPath = path__default["default"].join(paths.deploymentsPath, cloudEnvironment);
415
+ async function compileEnvironmentApplicationIndexes(_ref3) {
416
+ let cliFlags = _ref3.cliFlags,
417
+ storageProvider = _ref3.storageProvider,
418
+ uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
419
+ paths = _ref3.paths,
420
+ bucketRegion = _ref3.bucketRegion,
421
+ cloudEnvironment = _ref3.cloudEnvironment,
422
+ bucketEnvironment = _ref3.bucketEnvironment;
423
+ const cloudEnvironmentDeploymentPath = path__default$1["default"].join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
294
424
  // Ensure the folder exists
295
425
  const createDeploymentsFolderResult = await execa__default["default"]('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
296
426
  encoding: 'utf8'
@@ -300,7 +430,7 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
300
430
  }
301
431
 
302
432
  // Construct the proper CDN URL for the specific application
303
- const cdnUrl = getCdnUrl({
433
+ const cdnUrl = storageProvider.getCdnUrl({
304
434
  bucketRegion,
305
435
  prNumber: cliFlags.prNumber,
306
436
  applicationName: cliFlags.applicationName
@@ -343,9 +473,10 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
343
473
  if (compileResult.failed) {
344
474
  throw new Error(compileResult.stderr);
345
475
  }
346
- const applicationIndexUploadScriptContent = createApplicationIndexUploadScript({
476
+ const applicationIndexUploadScriptContent = uploadScriptsGenerator.getApplicationIndexUploadScript({
477
+ storageProvider,
347
478
  packageManagerName: cliFlags.packageManagerName,
348
- bucketUrl: getApplicationIndexBucketUrl({
479
+ bucketUrl: storageProvider.getApplicationIndexBucketUrl({
349
480
  bucketRegion,
350
481
  prNumber: cliFlags.prNumber,
351
482
  applicationName: cliFlags.applicationName,
@@ -357,8 +488,6 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
357
488
  buildNumber: cliFlags.buildNumber,
358
489
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
359
490
  });
360
- // Generate bash scripts to run the `gcloud storage` upload command.
361
-
362
491
  writeUploadScriptFile({
363
492
  fileName: cliFlags.applicationIndexUploadScriptOutFile,
364
493
  fileContent: applicationIndexUploadScriptContent,
@@ -366,23 +495,22 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
366
495
  });
367
496
 
368
497
  // Move the compiled `index.html` to the deployments folder of the related cloud environment.
369
-
370
- const moveResult = await execa__default["default"]('mv', [path__default["default"].join(paths.publicAssetsPath, 'index.html'), path__default["default"].join(cloudEnvironmentDeploymentPath, cliFlags.applicationIndexOutFile)]);
498
+ const moveResult = await execa__default["default"]('mv', [path__default$1["default"].join(paths.publicAssetsPath, 'index.html'), path__default$1["default"].join(cloudEnvironmentDeploymentPath, cliFlags.applicationIndexOutFile)]);
371
499
  if (moveResult.failed) {
372
500
  throw new Error(moveResult.stderr);
373
501
  }
374
502
  }
375
503
  async function command$3(cliFlags, cwd) {
376
- var _context3;
504
+ var _context;
377
505
  let cloudEnvironmentsGroupedByBucketRegions;
378
506
  try {
379
507
  // This is the list of the supported cloud environments and their related bucket location.
380
- cloudEnvironmentsGroupedByBucketRegions = await buckedConfigExplorer.search();
508
+ cloudEnvironmentsGroupedByBucketRegions = await storageBucketConfigExplorer.search();
381
509
  } catch (e) {
382
- throw new Error('Failed loading a Google Bucket configuration. Create a cosmiconfig for `google-storage-buckets` for example `google-storage-buckets.config.cjs`.');
510
+ throw new Error('Failed to load a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
383
511
  }
384
512
  if (!cloudEnvironmentsGroupedByBucketRegions) {
385
- throw new Error('Failed loading a Google Bucket configuration');
513
+ throw new Error('Failed loading a storage bucket configuration');
386
514
  }
387
515
  const applicationDirectory = getApplicationDirectory(cwd);
388
516
  let assetsPath;
@@ -395,48 +523,70 @@ async function command$3(cliFlags, cwd) {
395
523
  const paths = {
396
524
  publicAssetsPath: resolveInApplication('public', cwd),
397
525
  deploymentsPath: resolveInApplication('deployments', cwd),
398
- dotenvPath: cliFlags.dotenvFolder && path__default["default"].join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
526
+ dotenvPath: cliFlags.dotenvFolder && path__default$1["default"].join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
399
527
  assetsPath
400
528
  };
401
- const taskList = new listr2.Listr(_mapInstanceProperty__default["default"](_context3 = _Object$entries__default["default"](cloudEnvironmentsGroupedByBucketRegions.config)).call(_context3, _ref7 => {
402
- let _ref8 = _slicedToArray(_ref7, 2),
403
- bucketRegion = _ref8[0],
404
- bucketEnvironmentConfigs = _ref8[1];
529
+ const defaultStorageProviders = ['gs'];
530
+ const taskList = new listr2.Listr(_mapInstanceProperty__default["default"](_context = _Object$entries__default["default"](cloudEnvironmentsGroupedByBucketRegions.config)).call(_context, _ref4 => {
531
+ let _ref5 = _slicedToArray(_ref4, 2),
532
+ bucketRegion = _ref5[0],
533
+ bucketEnvironmentConfigs = _ref5[1];
405
534
  return {
406
535
  title: `Compiling for bucket region ${bucketRegion}`,
407
- task: () => {
408
- var _context4;
409
- return new listr2.Listr(_concatInstanceProperty__default["default"](_context4 = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfigOrBucketEnvironment => {
410
- let cloudEnvironment = '';
411
- let bucketEnvironment = '';
412
- if (assertExpandedBucketEnvironmentConfig(bucketEnvironmentConfigOrBucketEnvironment)) {
413
- cloudEnvironment = bucketEnvironmentConfigOrBucketEnvironment.cloudEnvironment;
414
- bucketEnvironment = bucketEnvironmentConfigOrBucketEnvironment.bucketEnvironment;
415
- } else if (assertCollapsedBucketEnvironmentConfig(bucketEnvironmentConfigOrBucketEnvironment)) {
416
- cloudEnvironment = bucketEnvironmentConfigOrBucketEnvironment;
417
- bucketEnvironment = bucketEnvironmentConfigOrBucketEnvironment;
418
- }
536
+ task: (_bucketRegionCtx, bucketRegionTask) => {
537
+ var _context2;
538
+ // NOTE: Application assets need to be compiled
539
+ // for all storage providers once per region.
540
+ const allStorageProvidersForBucketRegion = [...new _Set__default["default"](_flatInstanceProperty__default["default"](_context2 = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders)).call(_context2))];
541
+ const allApplicationAssetTasks = _mapInstanceProperty__default["default"](allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
542
+ const storageProvider = getStorageProvider(storageProviderTag);
543
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
419
544
  return {
420
- title: `Compiling application index for environment ${cloudEnvironment} and bucket ${bucketEnvironment}`,
421
- task: () => compileEnvironmentApplicationIndexes({
545
+ title: `Compiling application assets for '${storageProviderTag}'`,
546
+ task: () => compileApplicationAssets({
422
547
  cliFlags,
423
- paths,
424
- bucketRegion,
425
- cloudEnvironment,
426
- bucketEnvironment
548
+ storageProvider,
549
+ uploadScriptsGenerator,
550
+ bucketRegion: bucketRegion,
551
+ paths
427
552
  })
428
553
  };
429
- })).call(_context4, {
430
- title: `Compiling application assets`,
431
- task: () => compileApplicationAssets({
432
- cliFlags,
433
- bucketRegion,
434
- paths
435
- })
436
- }));
554
+ });
555
+ const allApplicationIndexTasks = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => {
556
+ const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
557
+ bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
558
+ storageProviders = bucketEnvironmentConfig.storageProviders;
559
+ return {
560
+ title: `Compiling for cloud environment '${cloudEnvironment}'`,
561
+ task: (_storageProviderCtx, storageProviderTask) => {
562
+ var _context3;
563
+ const applicationIndexTasksForStorageProviders = _mapInstanceProperty__default["default"](_context3 = storageProviders || defaultStorageProviders).call(_context3, storageProviderTag => {
564
+ const storageProvider = getStorageProvider(storageProviderTag);
565
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
566
+ return {
567
+ title: `Compiling application index for storage provider '${storageProviderTag}'`,
568
+ task: () => {
569
+ return compileEnvironmentApplicationIndexes({
570
+ cliFlags,
571
+ storageProvider,
572
+ uploadScriptsGenerator,
573
+ paths,
574
+ bucketRegion: bucketRegion,
575
+ cloudEnvironment,
576
+ bucketEnvironment
577
+ });
578
+ }
579
+ };
580
+ });
581
+ return storageProviderTask.newListr(applicationIndexTasksForStorageProviders);
582
+ }
583
+ };
584
+ });
585
+ return bucketRegionTask.newListr([...allApplicationIndexTasks, ...allApplicationAssetTasks]);
437
586
  }
438
587
  };
439
588
  }), {
589
+ // @ts-ignore
440
590
  renderer: isCI() ? 'verbose' : 'default'
441
591
  });
442
592
  await taskList.run();
@@ -527,21 +677,23 @@ const mapApplicationMenuConfigToGraqhQLMenuJson = config => {
527
677
  const doesCloudEnvironmentExist = _ref => {
528
678
  let dotenvPath = _ref.dotenvPath,
529
679
  cloudEnvironment = _ref.cloudEnvironment;
530
- return fs__default["default"].existsSync(path__default["default"].join(dotenvPath ?? '', cloudEnvironment));
680
+ return fs__default$1["default"].existsSync(path__default["default"].join(dotenvPath ?? '', `.env.${cloudEnvironment}`));
531
681
  };
532
682
  async function command$2(cliFlags, cwd) {
533
683
  const applicationDirectory = getApplicationDirectory(cwd);
534
684
  const monorepoRoot = findRoot.findRootSync(cwd);
535
685
  const dotenvPath = cliFlags.dotenvFolder && path__default["default"].join(monorepoRoot.rootDir, cliFlags.dotenvFolder);
686
+
687
+ // The env itself is not important for the menu. However, the application config
688
+ // uses environment placeholders and therefore we need to provide the variables for it.
689
+ // TODO: Remove after all repositories migrated to NCR.
690
+ const cloudEnvironment = doesCloudEnvironmentExist({
691
+ dotenvPath,
692
+ cloudEnvironment: storageBucketsConfig.clusterContexts['ctp_staging_gcp_europe-west1_v1']
693
+ }) ? storageBucketsConfig.clusterContexts['ctp_staging_gcp_europe-west1_v1'] : 'ctp-gcp-staging';
536
694
  const processEnv = _objectSpread$1(_objectSpread$1({}, loadDotenvFiles({
537
695
  dotenvPath,
538
- // The env itself is not important for the menu. However, the application config
539
- // uses environment placeholders and therefore we need to provide the variables for it.
540
- // TODO: Remove after all repositories migrated to NCR.
541
- cloudEnvironment: doesCloudEnvironmentExist({
542
- dotenvPath,
543
- cloudEnvironment: '.env.ctp_staging_gcp_europe-west1_v1'
544
- }) ? 'ctp_staging_gcp_europe-west1_v1' : 'ctp-gcp-staging'
696
+ cloudEnvironment
545
697
  })), {}, {
546
698
  // Again, make sure that the environment is "development", otherwise
547
699
  // the menu config won't be available.
@@ -557,7 +709,7 @@ async function command$2(cliFlags, cwd) {
557
709
  });
558
710
  const applicationMenu = mapApplicationMenuConfigToGraqhQLMenuJson(applicationRuntimeConfig);
559
711
  const formattedJson = _JSON$stringify__default["default"](applicationMenu, null, 2);
560
- fs__default["default"].writeFileSync(path__default["default"].join(applicationDirectory, 'menu.json'), formattedJson, {
712
+ fs__default$1["default"].writeFileSync(path__default["default"].join(applicationDirectory, 'menu.json'), formattedJson, {
561
713
  encoding: 'utf8'
562
714
  });
563
715
  }
@@ -569,7 +721,7 @@ async function command$1(cliFlags) {
569
721
  var _context, _context2;
570
722
  // The last build's JSON becomes the first rollback
571
723
  // while all previous rollbacks remain but are sliced.
572
- const lastVersionResponse = await fetch__default["default"](cliFlags.versionUrl);
724
+ const lastVersionResponse = await fetch(cliFlags.versionUrl);
573
725
  const lastVersionJson = await lastVersionResponse.json();
574
726
  const previousBuild = lastVersionJson && {
575
727
  buildNumber: lastVersionJson.buildNumber,
@@ -590,7 +742,7 @@ async function command$1(cliFlags) {
590
742
  // Logging to stdout which is from where it will be picked
591
743
  // up by the caller (a bash script).
592
744
  if (cliFlags.outFile) {
593
- fs__default["default"].writeFileSync(cliFlags.outFile, formattedJson, {
745
+ fs__default$1["default"].writeFileSync(cliFlags.outFile, formattedJson, {
594
746
  encoding: 'utf8'
595
747
  });
596
748
  } else {
@@ -711,14 +863,14 @@ async function command(cliFlags) {
711
863
  const menuJsonPath = cliFlags.inputFile;
712
864
  const isAppbarMenu = cliFlags.navigation === 'top';
713
865
  if (!menuJsonPath) throw new Error(`--input-file cannot be empty. please provide the path of compiled menu.json`);
714
- if (!fs__default["default"].existsSync(menuJsonPath)) throw new Error(`The menu.json file doesn't exist: ${menuJsonPath}`);
715
- const menuJson = fs__default["default"].readFileSync(menuJsonPath, 'utf-8');
866
+ if (!fs__default$1["default"].existsSync(menuJsonPath)) throw new Error(`The menu.json file doesn't exist: ${menuJsonPath}`);
867
+ const menuJson = fs__default$1["default"].readFileSync(menuJsonPath, 'utf-8');
716
868
  return validateMenu(JSON.parse(menuJson), isAppbarMenu ? appbarMenuSchema : navbarMenuSchema);
717
869
  }
718
870
 
719
871
  var pkgJson = {
720
872
  name: "@commercetools-frontend/application-cli",
721
- version: "1.8.1",
873
+ version: "2.1.0",
722
874
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
723
875
  keywords: [
724
876
  "commercetools",
@@ -741,28 +893,28 @@ var pkgJson = {
741
893
  },
742
894
  dependencies: {
743
895
  "@babel/core": "^7.22.11",
744
- "@babel/runtime": "^7.21.0",
745
896
  "@babel/runtime-corejs3": "^7.21.0",
746
- "@commercetools-frontend/application-config": "22.11.0",
747
- "@commercetools-frontend/constants": "22.11.0",
748
- "@commercetools-frontend/l10n": "22.11.0",
897
+ "@babel/runtime": "^7.21.0",
898
+ "@commercetools-frontend/application-config": "22.16.0",
899
+ "@commercetools-frontend/constants": "22.16.0",
900
+ "@commercetools-frontend/l10n": "22.16.0",
749
901
  "@manypkg/find-root": "2.2.1",
750
902
  cac: "^6.7.14",
751
- cosmiconfig: "8.3.6",
752
- dotenv: "16.3.1",
903
+ cosmiconfig: "9.0.0",
904
+ dotenv: "16.3.2",
753
905
  execa: "5.1.1",
754
906
  jsonschema: "^1.4.1",
755
- listr2: "6.6.1",
756
- "node-fetch": "2.7.0"
907
+ listr2: "8.0.1",
908
+ "node-fetch": "2.7.0",
909
+ "ts-deepmerge": "7.0.0"
757
910
  },
758
911
  devDependencies: {
759
912
  "@tsconfig/node20": "20.1.2",
760
- "@types/node": "20.8.0",
761
- "@types/node-fetch": "2.6.2",
913
+ "@types/node": "20.11.5",
762
914
  typescript: "5.2.2"
763
915
  },
764
916
  engines: {
765
- node: ">=14",
917
+ node: ">=18",
766
918
  npm: ">=6"
767
919
  },
768
920
  publishConfig: {