@contentstack/cli-cm-bulk-publish 1.4.8 → 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 +1 -1
- package/package.json +3 -3
- package/src/producer/publish-assets.js +22 -7
- package/src/producer/publish-entries.js +36 -8
- package/src/util/client.js +7 -1
- package/src/util/common-utility.js +30 -0
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.
|
|
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,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentstack/cli-cm-bulk-publish",
|
|
3
3
|
"description": "Contentstack CLI plugin for bulk publish actions",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.0",
|
|
5
5
|
"author": "Contentstack",
|
|
6
6
|
"bugs": "https://github.com/contentstack/cli/issues",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@contentstack/cli-command": "~1.2
|
|
9
|
-
"@contentstack/cli-utilities": "~1.
|
|
8
|
+
"@contentstack/cli-command": "~1.3.2",
|
|
9
|
+
"@contentstack/cli-utilities": "~1.8.0",
|
|
10
10
|
"bluebird": "^3.7.2",
|
|
11
11
|
"chalk": "^4.1.2",
|
|
12
12
|
"dotenv": "^16.1.4",
|
|
@@ -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(
|
|
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 <
|
|
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 ===
|
|
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 (
|
|
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(
|
|
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 <
|
|
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 ===
|
|
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 <=
|
|
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(
|
|
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(
|
|
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
|
}
|
package/src/util/client.js
CHANGED
|
@@ -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(
|
|
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 };
|