@contentstack/cli-cm-bulk-publish 1.4.9 → 1.5.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
@@ -18,7 +18,7 @@ $ npm install -g @contentstack/cli-cm-bulk-publish
18
18
  $ csdx COMMAND
19
19
  running command...
20
20
  $ csdx (--version)
21
- @contentstack/cli-cm-bulk-publish/1.4.9 darwin-arm64 node-v22.2.0
21
+ @contentstack/cli-cm-bulk-publish/1.5.0 darwin-arm64 node-v22.2.0
22
22
  $ csdx --help [COMMAND]
23
23
  USAGE
24
24
  $ csdx COMMAND
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@contentstack/cli-cm-bulk-publish",
3
3
  "description": "Contentstack CLI plugin for bulk publish actions",
4
- "version": "1.4.9",
4
+ "version": "1.5.0",
5
5
  "author": "Contentstack",
6
6
  "bugs": "https://github.com/contentstack/cli/issues",
7
7
  "dependencies": {
@@ -6,6 +6,7 @@ const { performBulkPublish, publishAsset, initializeLogger } = require('../consu
6
6
  const retryFailedLogs = require('../util/retryfailed');
7
7
  const { validateFile } = require('../util/fs');
8
8
  const { isEmpty } = require('../util');
9
+ const { fetchBulkPublishLimit } = require('../util/common-utility');
9
10
 
10
11
  const queue = getQueue();
11
12
  let logFileName;
@@ -14,7 +15,7 @@ let filePath;
14
15
 
15
16
  /* eslint-disable no-param-reassign */
16
17
 
17
- async function getAssets(stack, folder, bulkPublish, environments, locale, apiVersion, skip = 0) {
18
+ async function getAssets(stack, folder, bulkPublish, environments, locale, apiVersion, bulkPublishLimit, skip = 0) {
18
19
  return new Promise((resolve, reject) => {
19
20
  let queryParams = {
20
21
  folder: folder,
@@ -33,18 +34,27 @@ async function getAssets(stack, folder, bulkPublish, environments, locale, apiVe
33
34
  let assets = assetResponse.items;
34
35
  for (let index = 0; index < assetResponse.items.length; index++) {
35
36
  if (assets[index].is_dir === true) {
36
- await getAssets(stack, assets[index].uid, bulkPublish, environments, locale, apiVersion, 0);
37
+ await getAssets(
38
+ stack,
39
+ assets[index].uid,
40
+ bulkPublish,
41
+ environments,
42
+ locale,
43
+ apiVersion,
44
+ bulkPublishLimit,
45
+ 0,
46
+ );
37
47
  continue;
38
48
  }
39
49
  if (bulkPublish) {
40
- if (bulkPublishSet.length < 10) {
50
+ if (bulkPublishSet.length < bulkPublishLimit) {
41
51
  bulkPublishSet.push({
42
52
  uid: assets[index].uid,
43
53
  locale,
44
54
  publish_details: assets[index].publish_details || [],
45
55
  });
46
56
  }
47
- if (bulkPublishSet.length === 10) {
57
+ if (bulkPublishSet.length === bulkPublishLimit) {
48
58
  await queue.Enqueue({
49
59
  assets: bulkPublishSet,
50
60
  Type: 'asset',
@@ -56,7 +66,11 @@ async function getAssets(stack, folder, bulkPublish, environments, locale, apiVe
56
66
  bulkPublishSet = [];
57
67
  }
58
68
 
59
- if (assetResponse.items.length - 1 === index && bulkPublishSet.length > 0 && bulkPublishSet.length < 10) {
69
+ if (
70
+ assetResponse.items.length - 1 === index &&
71
+ bulkPublishSet.length > 0 &&
72
+ bulkPublishSet.length < bulkPublishLimit
73
+ ) {
60
74
  await queue.Enqueue({
61
75
  assets: bulkPublishSet,
62
76
  Type: 'asset',
@@ -81,7 +95,7 @@ async function getAssets(stack, folder, bulkPublish, environments, locale, apiVe
81
95
  if (skip === assetResponse.count) {
82
96
  return resolve(true);
83
97
  }
84
- await getAssets(stack, folder, bulkPublish, environments, locale, apiVersion, skip);
98
+ await getAssets(stack, folder, bulkPublish, environments, locale, apiVersion, bulkPublishLimit, skip);
85
99
  return resolve();
86
100
  } else {
87
101
  resolve();
@@ -133,8 +147,9 @@ async function start({ retryFailed, bulkPublish, environments, folderUid, locale
133
147
  }
134
148
  } else if (folderUid) {
135
149
  setConfig(config, bulkPublish);
150
+ const bulkPublishLimit = fetchBulkPublishLimit(stack?.org_uid);
136
151
  for (const element of locales) {
137
- await getAssets(stack, folderUid, bulkPublish, environments, element, apiVersion);
152
+ await getAssets(stack, folderUid, bulkPublish, environments, element, apiVersion, bulkPublishLimit);
138
153
  }
139
154
  }
140
155
  }
@@ -8,6 +8,7 @@ const { performBulkPublish, publishEntry, initializeLogger } = require('../consu
8
8
  const retryFailedLogs = require('../util/retryfailed');
9
9
  const { validateFile } = require('../util/fs');
10
10
  const { isEmpty } = require('../util');
11
+ const { fetchBulkPublishLimit } = require('../util/common-utility');
11
12
 
12
13
  const queue = getQueue();
13
14
 
@@ -18,7 +19,16 @@ let allContentTypes = [];
18
19
  let bulkPublishSet = [];
19
20
  let filePath;
20
21
 
21
- async function getEntries(stack, contentType, locale, bulkPublish, environments, apiVersion, skip = 0) {
22
+ async function getEntries(
23
+ stack,
24
+ contentType,
25
+ locale,
26
+ bulkPublish,
27
+ environments,
28
+ apiVersion,
29
+ bulkPublishLimit,
30
+ skip = 0,
31
+ ) {
22
32
  return new Promise((resolve, reject) => {
23
33
  skipCount = skip;
24
34
 
@@ -39,7 +49,7 @@ async function getEntries(stack, contentType, locale, bulkPublish, environments,
39
49
  let entries = entriesResponse.items;
40
50
  for (let index = 0; index < entriesResponse.items.length; index++) {
41
51
  if (bulkPublish) {
42
- if (bulkPublishSet.length < 10) {
52
+ if (bulkPublishSet.length < bulkPublishLimit) {
43
53
  bulkPublishSet.push({
44
54
  uid: entries[index].uid,
45
55
  content_type: contentType,
@@ -48,21 +58,21 @@ async function getEntries(stack, contentType, locale, bulkPublish, environments,
48
58
  });
49
59
  }
50
60
 
51
- if (bulkPublishSet.length === 10) {
61
+ if (bulkPublishSet.length === bulkPublishLimit) {
52
62
  await queue.Enqueue({
53
63
  entries: bulkPublishSet,
54
64
  locale,
55
65
  Type: 'entry',
56
66
  environments: environments,
57
67
  stack: stack,
58
- apiVersion
68
+ apiVersion,
59
69
  });
60
70
  bulkPublishSet = [];
61
71
  }
62
72
 
63
73
  if (
64
74
  index === entriesResponse.items.length - 1 &&
65
- bulkPublishSet.length <= 10 &&
75
+ bulkPublishSet.length <= bulkPublishLimit &&
66
76
  bulkPublishSet.length > 0
67
77
  ) {
68
78
  await queue.Enqueue({
@@ -71,7 +81,7 @@ async function getEntries(stack, contentType, locale, bulkPublish, environments,
71
81
  Type: 'entry',
72
82
  environments: environments,
73
83
  stack: stack,
74
- apiVersion
84
+ apiVersion,
75
85
  });
76
86
  bulkPublishSet = [];
77
87
  } // bulkPublish
@@ -92,7 +102,16 @@ async function getEntries(stack, contentType, locale, bulkPublish, environments,
92
102
  bulkPublishSet = [];
93
103
  return resolve();
94
104
  }
95
- await getEntries(stack, contentType, locale, bulkPublish, environments, apiVersion, skipCount);
105
+ await getEntries(
106
+ stack,
107
+ contentType,
108
+ locale,
109
+ bulkPublish,
110
+ environments,
111
+ apiVersion,
112
+ bulkPublishLimit,
113
+ skipCount,
114
+ );
96
115
  return resolve();
97
116
  })
98
117
  .catch((error) => reject(error));
@@ -170,10 +189,19 @@ async function start(
170
189
  } else {
171
190
  allContentTypes = contentTypes;
172
191
  }
192
+ const bulkPublishLimit = fetchBulkPublishLimit(stack?.org_uid);
173
193
  for (let loc = 0; loc < locales.length; loc += 1) {
174
194
  for (let i = 0; i < allContentTypes.length; i += 1) {
175
195
  /* eslint-disable no-await-in-loop */
176
- await getEntries(stack, allContentTypes[i].uid || allContentTypes[i], locales[loc], bulkPublish, environments, apiVersion);
196
+ await getEntries(
197
+ stack,
198
+ allContentTypes[i].uid || allContentTypes[i],
199
+ locales[loc],
200
+ bulkPublish,
201
+ environments,
202
+ apiVersion,
203
+ bulkPublishLimit,
204
+ );
177
205
  /* eslint-enable no-await-in-loop */
178
206
  }
179
207
  }
@@ -15,12 +15,18 @@ async function getStack(data) {
15
15
  stackOptions.api_key = tokenDetails.apiKey;
16
16
  } else if (data.stackApiKey) {
17
17
  if (!isAuthenticated()) {
18
- throw new Error('Please login to proceed further. Or use `--alias` instead of `--stack-api-key` to proceed without logging in.')
18
+ throw new Error(
19
+ 'Please login to proceed further. Or use `--alias` instead of `--stack-api-key` to proceed without logging in.',
20
+ );
19
21
  }
20
22
  stackOptions.api_key = data.stackApiKey;
21
23
  }
22
24
  const managementClient = await managementSDKClient(options);
23
25
  const stack = managementClient.stack(stackOptions);
26
+ if (data.stackApiKey && isAuthenticated()) {
27
+ const stackDetails = await stack.fetch();
28
+ stack.org_uid = stackDetails.org_uid;
29
+ }
24
30
  stack.alias = data.alias;
25
31
  stack.host = data.host;
26
32
  return stack;
@@ -0,0 +1,30 @@
1
+ const { configHandler, cliux } = require('@contentstack/cli-utilities');
2
+
3
+ function fetchBulkPublishLimit(orgUid) {
4
+ const plan = configHandler.get('rateLimit');
5
+ let bulkPublishLimit = 1; // Default limit according to the default plan
6
+
7
+ if (plan) {
8
+ const orgPlan = plan[orgUid]?.bulkLimit;
9
+ const defaultPlan = plan['default']?.bulkLimit;
10
+
11
+ if (orgPlan?.value && orgPlan?.utilize) {
12
+ bulkPublishLimit = Math.ceil((orgPlan.value * orgPlan.utilize) / 100);
13
+ } else if (defaultPlan?.value && defaultPlan?.utilize) {
14
+ bulkPublishLimit = Math.ceil((defaultPlan.value * defaultPlan.utilize) / 100);
15
+ }
16
+ } else {
17
+ cliux.print(
18
+ 'Bulk publish limit not found in config. Using default limit. Please set the limit using $csdx config:set:rate-limit',
19
+ { color: 'yellow' },
20
+ );
21
+ // TODO: Update the link once the rate-limit documentation is ready
22
+ cliux.print(
23
+ 'Suggestions: To set the rate limit, visit https://www.contentstack.com/docs/developers/cli#get-started-with-contentstack-command-line-interface-cli',
24
+ { color: 'blue' },
25
+ );
26
+ }
27
+ return bulkPublishLimit;
28
+ }
29
+
30
+ module.exports = { fetchBulkPublishLimit };