@commercetools-frontend/application-cli 1.8.1 → 2.0.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.
package/README.md CHANGED
@@ -23,11 +23,11 @@ pnpm application-cli compile-deployments \
23
23
  --build-revision=<git_sha>
24
24
  ```
25
25
 
26
- The environments to compile the deployments for must be specified in a `google-storage-buckets` [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) file for example `google-storage-buckets.config.cjs` with the bucket region mapping to multiple environments. For example:
26
+ The environments to compile the deployments for must be specified in a `storage-buckets` [cosmiconfig](https://github.com/davidtheclark/cosmiconfig) file for example `storage-buckets.config.cjs` with the bucket region mapping to multiple environments. For example:
27
27
 
28
28
  ```js
29
29
  /**
30
- * @type {import('@commercetools-frontend/application-cli').TGoogleStorageBucketsConfig}
30
+ * @type {import('@commercetools-frontend/application-cli').TStorageBucketsConfig}
31
31
  */
32
32
  module.exports = {
33
33
  'merchant-center-north-america': ['gcp-production-us'],
@@ -64,7 +64,7 @@ The configuration also supports an expanded version in which each cloud environm
64
64
 
65
65
  ```js
66
66
  /**
67
- * @type {import('@commercetools-frontend/application-cli').TGoogleStorageBucketsConfig}
67
+ * @type {import('@commercetools-frontend/application-cli').TStorageBucketsConfig}
68
68
  */
69
69
  module.exports = {
70
70
  'merchant-center-europe': [
@@ -1,2 +1,2 @@
1
1
  export * from "../../dist/declarations/src/cli";
2
- //# sourceMappingURL=commercetools-frontend-application-cli-cli.cjs.d.ts.map
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2V0b29scy1mcm9udGVuZC1hcHBsaWNhdGlvbi1jbGktY2xpLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGlzdC9kZWNsYXJhdGlvbnMvc3JjL2NsaS5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=
@@ -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,53 @@ 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');
18
+ var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
19
+ var _flatInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/flat');
19
20
  var fs = require('fs');
20
21
  var path = require('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 _possibleConstructorReturn = require('@babel/runtime-corejs3/helpers/possibleConstructorReturn');
27
+ var _get = require('@babel/runtime-corejs3/helpers/get');
28
+ var _getPrototypeOf = require('@babel/runtime-corejs3/helpers/getPrototypeOf');
29
+ var _inherits = require('@babel/runtime-corejs3/helpers/inherits');
30
+ var _classCallCheck = require('@babel/runtime-corejs3/helpers/classCallCheck');
31
+ var _createClass = require('@babel/runtime-corejs3/helpers/createClass');
32
+ var _Reflect$construct = require('@babel/runtime-corejs3/core-js-stable/reflect/construct');
25
33
  var dotenv = require('dotenv');
26
34
  var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
27
35
  var _JSON$stringify = require('@babel/runtime-corejs3/core-js-stable/json/stringify');
28
36
  var applicationConfig = require('@commercetools-frontend/application-config');
29
37
  var l10n = require('@commercetools-frontend/l10n');
30
38
  var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/slice');
31
- var fetch = require('node-fetch');
32
39
  var jsonschema = require('jsonschema');
33
40
 
34
41
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
35
42
 
36
43
  var _Object$keys__default = /*#__PURE__*/_interopDefault(_Object$keys);
37
44
  var _Object$getOwnPropertySymbols__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertySymbols);
45
+ var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
38
46
  var _Object$getOwnPropertyDescriptor__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptor);
39
47
  var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
40
48
  var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptors);
41
49
  var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
42
50
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
43
- var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
44
51
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
45
52
  var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
46
- var _concatInstanceProperty__default = /*#__PURE__*/_interopDefault(_concatInstanceProperty);
53
+ var _Set__default = /*#__PURE__*/_interopDefault(_Set);
54
+ var _flatInstanceProperty__default = /*#__PURE__*/_interopDefault(_flatInstanceProperty);
47
55
  var fs__default = /*#__PURE__*/_interopDefault(fs);
48
56
  var path__default = /*#__PURE__*/_interopDefault(path);
49
57
  var execa__default = /*#__PURE__*/_interopDefault(execa);
58
+ var _Reflect$construct__default = /*#__PURE__*/_interopDefault(_Reflect$construct);
50
59
  var dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
51
60
  var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
52
61
  var _JSON$stringify__default = /*#__PURE__*/_interopDefault(_JSON$stringify);
53
62
  var _sliceInstanceProperty__default = /*#__PURE__*/_interopDefault(_sliceInstanceProperty);
54
- var fetch__default = /*#__PURE__*/_interopDefault(fetch);
55
63
 
56
64
  function getApplicationDirectory(cwd) {
57
65
  return fs__default["default"].realpathSync(cwd);
@@ -66,19 +74,167 @@ function isCI() {
66
74
  return process.env.CI === true || process.env.CI === 'true';
67
75
  }
68
76
 
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
77
+ 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; }
78
+ 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; }
79
+ function _callSuper(_this, derived, args) {
80
+ function isNativeReflectConstruct() {
81
+ if (typeof Reflect === "undefined" || !_Reflect$construct__default["default"]) return false;
82
+ if (_Reflect$construct__default["default"].sham) return false;
83
+ if (typeof Proxy === "function") return true;
84
+ try {
85
+ return !Boolean.prototype.valueOf.call(_Reflect$construct__default["default"](Boolean, [], function () {}));
86
+ } catch (e) {
87
+ return false;
88
+ }
89
+ }
90
+ derived = _getPrototypeOf(derived);
91
+ return _possibleConstructorReturn(_this, isNativeReflectConstruct() ? _Reflect$construct__default["default"](derived, args || [], _getPrototypeOf(_this).constructor) : derived.apply(_this, args));
92
+ }
93
+ let StorageProvider = /*#__PURE__*/function () {
94
+ function StorageProvider() {
95
+ _classCallCheck(this, StorageProvider);
96
+ }
97
+ _createClass(StorageProvider, [{
98
+ key: "getBucketNamespace",
99
+ value:
100
+ /**
101
+ * Construct the storage bucket URL for the specific application and cloud environment.
102
+ *
103
+ * 1. Static assets are uploaded to `:bucketRegion/:prNumber?/:applicationName`
104
+ * 2. The application index is uploaded to `:bucketRegion/:prNumber?/:applicationName/:cloudEnvironment`
105
+ *
106
+ * This allows all cloud environments sharing the same static assets while each application's index
107
+ * is uploaded with different headers (e.g. CSP rules).
108
+ */
109
+ function getBucketNamespace(prNumber) {
110
+ if (!prNumber) return;
111
+ if (prNumber === 'merchant-center-preview') return prNumber;
112
+ return `mc-${prNumber}`;
113
+ }
114
+
115
+ /**
116
+ * Construct the storage bucket URL for the specific application and cloud environment.
117
+ */
118
+ }, {
119
+ key: "getAssetsBucketUrl",
120
+ value: function getAssetsBucketUrl(_ref) {
121
+ var _context;
122
+ let bucketProtocol = _ref.bucketProtocol,
123
+ bucketRegion = _ref.bucketRegion,
124
+ bucketNamespace = _ref.bucketNamespace,
125
+ applicationName = _ref.applicationName;
126
+ const assetsBucketUrl = _filterInstanceProperty__default["default"](_context = [bucketRegion, bucketNamespace, applicationName]).call(_context, Boolean).join('/');
127
+ return `${bucketProtocol}${assetsBucketUrl}`;
128
+ }
129
+ }, {
130
+ key: "getApplicationIndexBucketUrl",
131
+ value: function getApplicationIndexBucketUrl(_ref2) {
132
+ let bucketProtocol = _ref2.bucketProtocol,
133
+ bucketRegion = _ref2.bucketRegion,
134
+ bucketNamespace = _ref2.bucketNamespace,
135
+ prNumber = _ref2.prNumber,
136
+ applicationName = _ref2.applicationName,
137
+ bucketEnvironment = _ref2.bucketEnvironment;
138
+ const applicationAssetsBucketUrl = this.getAssetsBucketUrl({
139
+ bucketProtocol,
140
+ bucketRegion,
141
+ bucketNamespace,
142
+ prNumber,
143
+ applicationName
144
+ });
145
+ const applicationIndexBucketUrl = `${applicationAssetsBucketUrl}/${bucketEnvironment}`;
146
+ return applicationIndexBucketUrl;
147
+ }
148
+ }, {
149
+ key: "getCdnUrl",
150
+ value: function getCdnUrl(_ref3) {
151
+ var _context2;
152
+ let publicBaseUrl = _ref3.publicBaseUrl,
153
+ bucketRegion = _ref3.bucketRegion,
154
+ prNumber = _ref3.prNumber,
155
+ applicationName = _ref3.applicationName;
156
+ return _filterInstanceProperty__default["default"](_context2 = [publicBaseUrl, bucketRegion, this.getBucketNamespace(prNumber), applicationName]).call(_context2, Boolean).join('/');
157
+ }
158
+ }]);
159
+ return StorageProvider;
160
+ }();
161
+ let GoogleStorageProvider = /*#__PURE__*/function (_StorageProvider) {
162
+ _inherits(GoogleStorageProvider, _StorageProvider);
163
+ function GoogleStorageProvider() {
164
+ _classCallCheck(this, GoogleStorageProvider);
165
+ return _callSuper(this, GoogleStorageProvider, arguments);
166
+ }
167
+ _createClass(GoogleStorageProvider, [{
168
+ key: "getTag",
169
+ value: function getTag() {
170
+ return 'gs';
171
+ }
172
+ }, {
173
+ key: "getProtocol",
174
+ value: function getProtocol() {
175
+ return 'gs://';
176
+ }
177
+ }, {
178
+ key: "getPublicBaseUrl",
179
+ value: function getPublicBaseUrl() {
180
+ return 'https://storage.googleapis.com';
181
+ }
182
+ }, {
183
+ key: "getCdnUrl",
184
+ value: function getCdnUrl(config) {
185
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getCdnUrl", this).call(this, _objectSpread$4({
186
+ publicBaseUrl: this.getPublicBaseUrl()
187
+ }, config));
188
+ }
189
+ }, {
190
+ key: "getAssetsBucketUrl",
191
+ value: function getAssetsBucketUrl(config) {
192
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getAssetsBucketUrl", this).call(this, _objectSpread$4({
193
+ bucketProtocol: this.getProtocol(),
194
+ bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
195
+ }, config));
196
+ }
197
+ }, {
198
+ key: "getApplicationIndexBucketUrl",
199
+ value: function getApplicationIndexBucketUrl(config) {
200
+ return _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getApplicationIndexBucketUrl", this).call(this, _objectSpread$4({
201
+ bucketProtocol: this.getProtocol(),
202
+ bucketNamespace: _get(_getPrototypeOf(GoogleStorageProvider.prototype), "getBucketNamespace", this).call(this, config.prNumber)
203
+ }, config));
204
+ }
205
+ }]);
206
+ return GoogleStorageProvider;
207
+ }(StorageProvider); // TODO: to be implemented.
208
+ function getStorageProvider(storageProvider) {
209
+ switch (storageProvider) {
210
+ case 'gs':
211
+ return new GoogleStorageProvider();
212
+ default:
213
+ throw new Error(`Storage provider ${storageProvider} not supported`);
214
+ }
215
+ }
216
+
217
+ let GoogleStorageUploadScriptsGenerator = /*#__PURE__*/function () {
218
+ function GoogleStorageUploadScriptsGenerator() {
219
+ _classCallCheck(this, GoogleStorageUploadScriptsGenerator);
220
+ }
221
+ _createClass(GoogleStorageUploadScriptsGenerator, [{
222
+ key: "getApplicationIndexUploadScript",
223
+ value: function getApplicationIndexUploadScript(_ref) {
224
+ let packageManagerName = _ref.packageManagerName,
225
+ bucketUrl = _ref.bucketUrl,
226
+ cdnUrl = _ref.cdnUrl,
227
+ bucketEnvironment = _ref.bucketEnvironment,
228
+ buildRevision = _ref.buildRevision,
229
+ buildNumber = _ref.buildNumber,
230
+ applicationIndexOutFile = _ref.applicationIndexOutFile;
231
+ return `
232
+ #!/usr/bin/env bash
78
233
 
79
234
  set -e
80
235
 
81
- echo "Uploading compiled ${applicationIndexOutFile} to bucket ${bucketUrl}"
236
+ echo "Uploading compiled ${applicationIndexOutFile} to Google Storage bucket ${bucketUrl}"
237
+
82
238
  gcloud storage cp \\
83
239
  "$(dirname "$0")/${applicationIndexOutFile}" \\
84
240
  "${bucketUrl}/" \\
@@ -101,14 +257,15 @@ gcloud storage cp \\
101
257
  --content-type="application/json" \\
102
258
  --cache-control="public,max-age=0,no-transform"
103
259
  `;
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
260
+ }
261
+ }, {
262
+ key: "getProductionBundlesUploadScript",
263
+ value: function getProductionBundlesUploadScript(_ref2) {
264
+ let bucketUrl = _ref2.bucketUrl,
265
+ assetsPath = _ref2.assetsPath,
266
+ skipMenu = _ref2.skipMenu;
267
+ return `
268
+ #!/usr/bin/env bash
112
269
 
113
270
  set -e
114
271
 
@@ -121,7 +278,7 @@ set -e
121
278
  # "valid" lifetime of an asset to be cached.
122
279
  # 4. The '-n' will skip uploading existing files and prevents them to
123
280
  # be overwritten
124
- echo "Uploading static assets to bucket ${bucketUrl}"
281
+ echo "Uploading static assets to Google Storage bucket ${bucketUrl}"
125
282
 
126
283
  gcloud storage cp \\
127
284
  ${assetsPath}/public/{*.css,*.js,*.js.map,*.png,*.html,robots.txt} \\
@@ -160,7 +317,17 @@ else
160
317
  --cache-control="public,max-age=0,no-transform"
161
318
  fi
162
319
  `;
163
- return uploadScriptContent;
320
+ }
321
+ }]);
322
+ return GoogleStorageUploadScriptsGenerator;
323
+ }(); // TODO: To be implemented.
324
+ function getUploadScriptsGenerator(storageProvider) {
325
+ switch (storageProvider) {
326
+ case 'gs':
327
+ return new GoogleStorageUploadScriptsGenerator();
328
+ default:
329
+ throw new Error(`Storage provider ${storageProvider} not supported`);
330
+ }
164
331
  }
165
332
 
166
333
  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; }
@@ -201,14 +368,10 @@ function loadDotenvFiles(_ref) {
201
368
  }
202
369
 
203
370
  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
- }
371
+ 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; }
372
+ const buckedConfigExplorer = cosmiconfig.cosmiconfig('storage-buckets', {
373
+ searchStrategy: 'project'
374
+ });
212
375
  function writeUploadScriptFile(_ref) {
213
376
  let fileName = _ref.fileName,
214
377
  fileContent = _ref.fileContent,
@@ -219,56 +382,15 @@ function writeUploadScriptFile(_ref) {
219
382
  encoding: 'utf8'
220
383
  });
221
384
  }
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({
385
+ async function compileApplicationAssets(_ref2) {
386
+ let cliFlags = _ref2.cliFlags,
387
+ storageProvider = _ref2.storageProvider,
388
+ uploadScriptsGenerator = _ref2.uploadScriptsGenerator,
389
+ bucketRegion = _ref2.bucketRegion,
390
+ paths = _ref2.paths;
391
+ const applicationAssetsUploadScriptContent = uploadScriptsGenerator.getProductionBundlesUploadScript({
392
+ storageProvider,
393
+ bucketUrl: storageProvider.getAssetsBucketUrl({
272
394
  bucketRegion,
273
395
  prNumber: cliFlags.prNumber,
274
396
  applicationName: cliFlags.applicationName
@@ -281,16 +403,18 @@ async function compileApplicationAssets(_ref5) {
281
403
  writeUploadScriptFile({
282
404
  fileName: applicationAssetsUploadScriptFileName,
283
405
  fileContent: applicationAssetsUploadScriptContent,
284
- filePath: paths.deploymentsPath
406
+ filePath: path__default["default"].join(paths.deploymentsPath, storageProvider.getTag())
285
407
  });
286
408
  }
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);
409
+ async function compileEnvironmentApplicationIndexes(_ref3) {
410
+ let cliFlags = _ref3.cliFlags,
411
+ storageProvider = _ref3.storageProvider,
412
+ uploadScriptsGenerator = _ref3.uploadScriptsGenerator,
413
+ paths = _ref3.paths,
414
+ bucketRegion = _ref3.bucketRegion,
415
+ cloudEnvironment = _ref3.cloudEnvironment,
416
+ bucketEnvironment = _ref3.bucketEnvironment;
417
+ const cloudEnvironmentDeploymentPath = path__default["default"].join(paths.deploymentsPath, storageProvider.getTag(), cloudEnvironment);
294
418
  // Ensure the folder exists
295
419
  const createDeploymentsFolderResult = await execa__default["default"]('mkdir', ['-p', cloudEnvironmentDeploymentPath], {
296
420
  encoding: 'utf8'
@@ -300,7 +424,7 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
300
424
  }
301
425
 
302
426
  // Construct the proper CDN URL for the specific application
303
- const cdnUrl = getCdnUrl({
427
+ const cdnUrl = storageProvider.getCdnUrl({
304
428
  bucketRegion,
305
429
  prNumber: cliFlags.prNumber,
306
430
  applicationName: cliFlags.applicationName
@@ -343,9 +467,10 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
343
467
  if (compileResult.failed) {
344
468
  throw new Error(compileResult.stderr);
345
469
  }
346
- const applicationIndexUploadScriptContent = createApplicationIndexUploadScript({
470
+ const applicationIndexUploadScriptContent = uploadScriptsGenerator.getApplicationIndexUploadScript({
471
+ storageProvider,
347
472
  packageManagerName: cliFlags.packageManagerName,
348
- bucketUrl: getApplicationIndexBucketUrl({
473
+ bucketUrl: storageProvider.getApplicationIndexBucketUrl({
349
474
  bucketRegion,
350
475
  prNumber: cliFlags.prNumber,
351
476
  applicationName: cliFlags.applicationName,
@@ -357,8 +482,6 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
357
482
  buildNumber: cliFlags.buildNumber,
358
483
  applicationIndexOutFile: cliFlags.applicationIndexOutFile
359
484
  });
360
- // Generate bash scripts to run the `gcloud storage` upload command.
361
-
362
485
  writeUploadScriptFile({
363
486
  fileName: cliFlags.applicationIndexUploadScriptOutFile,
364
487
  fileContent: applicationIndexUploadScriptContent,
@@ -366,23 +489,22 @@ async function compileEnvironmentApplicationIndexes(_ref6) {
366
489
  });
367
490
 
368
491
  // Move the compiled `index.html` to the deployments folder of the related cloud environment.
369
-
370
492
  const moveResult = await execa__default["default"]('mv', [path__default["default"].join(paths.publicAssetsPath, 'index.html'), path__default["default"].join(cloudEnvironmentDeploymentPath, cliFlags.applicationIndexOutFile)]);
371
493
  if (moveResult.failed) {
372
494
  throw new Error(moveResult.stderr);
373
495
  }
374
496
  }
375
497
  async function command$3(cliFlags, cwd) {
376
- var _context3;
498
+ var _context;
377
499
  let cloudEnvironmentsGroupedByBucketRegions;
378
500
  try {
379
501
  // This is the list of the supported cloud environments and their related bucket location.
380
502
  cloudEnvironmentsGroupedByBucketRegions = await buckedConfigExplorer.search();
381
503
  } 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`.');
504
+ throw new Error('Failed loading a storage bucket configuration. Create a cosmiconfig for `storage-buckets` for example `storage-buckets.config.cjs`.');
383
505
  }
384
506
  if (!cloudEnvironmentsGroupedByBucketRegions) {
385
- throw new Error('Failed loading a Google Bucket configuration');
507
+ throw new Error('Failed loading a storage bucket configuration');
386
508
  }
387
509
  const applicationDirectory = getApplicationDirectory(cwd);
388
510
  let assetsPath;
@@ -398,45 +520,67 @@ async function command$3(cliFlags, cwd) {
398
520
  dotenvPath: cliFlags.dotenvFolder && path__default["default"].join(monorepoRoot.rootDir, cliFlags.dotenvFolder),
399
521
  assetsPath
400
522
  };
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];
523
+ const defaultStorageProviders = ['gs'];
524
+ const taskList = new listr2.Listr(_mapInstanceProperty__default["default"](_context = _Object$entries__default["default"](cloudEnvironmentsGroupedByBucketRegions.config)).call(_context, _ref4 => {
525
+ let _ref5 = _slicedToArray(_ref4, 2),
526
+ bucketRegion = _ref5[0],
527
+ bucketEnvironmentConfigs = _ref5[1];
405
528
  return {
406
529
  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
- }
530
+ task: (_bucketRegionCtx, bucketRegionTask) => {
531
+ var _context2;
532
+ // NOTE: Application assets need to be compiled
533
+ // for all storage providers once per region.
534
+ const allStorageProvidersForBucketRegion = [...new _Set__default["default"](_flatInstanceProperty__default["default"](_context2 = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => bucketEnvironmentConfig.storageProviders || defaultStorageProviders)).call(_context2))];
535
+ const allApplicationAssetTasks = _mapInstanceProperty__default["default"](allStorageProvidersForBucketRegion).call(allStorageProvidersForBucketRegion, storageProviderTag => {
536
+ const storageProvider = getStorageProvider(storageProviderTag);
537
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
419
538
  return {
420
- title: `Compiling application index for environment ${cloudEnvironment} and bucket ${bucketEnvironment}`,
421
- task: () => compileEnvironmentApplicationIndexes({
539
+ title: `Compiling application assets for '${storageProviderTag}'`,
540
+ task: () => compileApplicationAssets({
422
541
  cliFlags,
423
- paths,
542
+ storageProvider,
543
+ uploadScriptsGenerator,
424
544
  bucketRegion,
425
- cloudEnvironment,
426
- bucketEnvironment
545
+ paths
427
546
  })
428
547
  };
429
- })).call(_context4, {
430
- title: `Compiling application assets`,
431
- task: () => compileApplicationAssets({
432
- cliFlags,
433
- bucketRegion,
434
- paths
435
- })
436
- }));
548
+ });
549
+ const allApplicationIndexTasks = _mapInstanceProperty__default["default"](bucketEnvironmentConfigs).call(bucketEnvironmentConfigs, bucketEnvironmentConfig => {
550
+ const cloudEnvironment = bucketEnvironmentConfig.cloudEnvironment,
551
+ bucketEnvironment = bucketEnvironmentConfig.bucketEnvironment,
552
+ storageProviders = bucketEnvironmentConfig.storageProviders;
553
+ return {
554
+ title: `Compiling for cloud environment '${cloudEnvironment}'`,
555
+ task: (_storageProviderCtx, storageProviderTask) => {
556
+ var _context3;
557
+ const applicationIndexTasksForStorageProviders = _mapInstanceProperty__default["default"](_context3 = storageProviders || defaultStorageProviders).call(_context3, storageProviderTag => {
558
+ const storageProvider = getStorageProvider(storageProviderTag);
559
+ const uploadScriptsGenerator = getUploadScriptsGenerator(storageProviderTag);
560
+ return {
561
+ title: `Compiling application index for storage provider '${storageProviderTag}'`,
562
+ task: () => {
563
+ return compileEnvironmentApplicationIndexes({
564
+ cliFlags,
565
+ storageProvider,
566
+ uploadScriptsGenerator,
567
+ paths,
568
+ bucketRegion,
569
+ cloudEnvironment,
570
+ bucketEnvironment
571
+ });
572
+ }
573
+ };
574
+ });
575
+ return storageProviderTask.newListr(applicationIndexTasksForStorageProviders);
576
+ }
577
+ };
578
+ });
579
+ return bucketRegionTask.newListr([...allApplicationIndexTasks, ...allApplicationAssetTasks]);
437
580
  }
438
581
  };
439
582
  }), {
583
+ // @ts-ignore
440
584
  renderer: isCI() ? 'verbose' : 'default'
441
585
  });
442
586
  await taskList.run();
@@ -569,7 +713,7 @@ async function command$1(cliFlags) {
569
713
  var _context, _context2;
570
714
  // The last build's JSON becomes the first rollback
571
715
  // while all previous rollbacks remain but are sliced.
572
- const lastVersionResponse = await fetch__default["default"](cliFlags.versionUrl);
716
+ const lastVersionResponse = await fetch(cliFlags.versionUrl);
573
717
  const lastVersionJson = await lastVersionResponse.json();
574
718
  const previousBuild = lastVersionJson && {
575
719
  buildNumber: lastVersionJson.buildNumber,
@@ -718,7 +862,7 @@ async function command(cliFlags) {
718
862
 
719
863
  var pkgJson = {
720
864
  name: "@commercetools-frontend/application-cli",
721
- version: "1.8.1",
865
+ version: "2.0.0",
722
866
  description: "Internal CLI to manage Merchant Center application deployments across various environments.",
723
867
  keywords: [
724
868
  "commercetools",
@@ -743,26 +887,25 @@ var pkgJson = {
743
887
  "@babel/core": "^7.22.11",
744
888
  "@babel/runtime": "^7.21.0",
745
889
  "@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",
890
+ "@commercetools-frontend/application-config": "22.16.0",
891
+ "@commercetools-frontend/constants": "22.16.0",
892
+ "@commercetools-frontend/l10n": "22.16.0",
749
893
  "@manypkg/find-root": "2.2.1",
750
894
  cac: "^6.7.14",
751
- cosmiconfig: "8.3.6",
752
- dotenv: "16.3.1",
895
+ cosmiconfig: "9.0.0",
896
+ dotenv: "16.3.2",
753
897
  execa: "5.1.1",
754
898
  jsonschema: "^1.4.1",
755
- listr2: "6.6.1",
899
+ listr2: "8.0.1",
756
900
  "node-fetch": "2.7.0"
757
901
  },
758
902
  devDependencies: {
759
903
  "@tsconfig/node20": "20.1.2",
760
- "@types/node": "20.8.0",
761
- "@types/node-fetch": "2.6.2",
904
+ "@types/node": "20.11.5",
762
905
  typescript: "5.2.2"
763
906
  },
764
907
  engines: {
765
- node: ">=14",
908
+ node: ">=18",
766
909
  npm: ">=6"
767
910
  },
768
911
  publishConfig: {