@contentstack/cli-cm-bulk-publish 0.1.1-beta.5 → 1.0.1

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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +522 -318
  3. package/oclif.manifest.json +1 -1
  4. package/package.json +26 -11
  5. package/src/commands/cm/assets/publish.js +243 -0
  6. package/src/commands/cm/assets/unpublish.js +179 -0
  7. package/src/commands/cm/bulk-publish/cross-publish.js +181 -67
  8. package/src/commands/cm/bulk-publish/index.js +5 -6
  9. package/src/commands/cm/entries/publish-modified.js +197 -0
  10. package/src/commands/cm/entries/publish-non-localized-fields.js +208 -0
  11. package/src/commands/cm/entries/publish-only-unpublished.js +109 -0
  12. package/src/commands/cm/entries/publish.js +254 -0
  13. package/src/commands/cm/entries/unpublish.js +184 -0
  14. package/src/commands/cm/entries/update-and-publish.js +191 -0
  15. package/src/commands/cm/stacks/publish-clear-logs.js +82 -0
  16. package/src/commands/cm/stacks/publish-configure.js +46 -0
  17. package/src/commands/cm/stacks/publish-revert.js +102 -0
  18. package/src/commands/cm/stacks/publish.js +110 -0
  19. package/src/commands/cm/stacks/unpublish.js +282 -0
  20. package/src/config/index.js +18 -57
  21. package/src/consumer/publish.js +589 -362
  22. package/src/producer/add-fields.js +204 -179
  23. package/src/producer/cross-publish.js +177 -99
  24. package/src/producer/nonlocalized-field-changes.js +225 -194
  25. package/src/producer/publish-assets.js +97 -83
  26. package/src/producer/publish-edits.js +113 -88
  27. package/src/producer/publish-entries.js +121 -90
  28. package/src/producer/publish-unpublished-env.js +114 -90
  29. package/src/producer/revert.js +261 -230
  30. package/src/producer/unpublish.js +154 -97
  31. package/src/services/publish-only-unpublished.js +130 -0
  32. package/src/util/client.js +14 -15
  33. package/src/util/command-helper.js +25 -0
  34. package/src/util/fs.js +10 -11
  35. package/src/util/index.js +38 -36
  36. package/src/util/logger.js +21 -25
  37. package/src/util/queue.js +13 -13
  38. package/src/util/retryfailed.js +8 -4
  39. package/src/util/store.js +43 -47
  40. package/src/commands/cm/bulk-publish/add-fields.js +0 -122
  41. package/src/commands/cm/bulk-publish/assets.js +0 -122
  42. package/src/commands/cm/bulk-publish/clear.js +0 -65
  43. package/src/commands/cm/bulk-publish/configure.js +0 -44
  44. package/src/commands/cm/bulk-publish/entries.js +0 -131
  45. package/src/commands/cm/bulk-publish/entry-edits.js +0 -129
  46. package/src/commands/cm/bulk-publish/nonlocalized-field-changes.js +0 -121
  47. package/src/commands/cm/bulk-publish/revert.js +0 -81
  48. package/src/commands/cm/bulk-publish/unpublish.js +0 -169
  49. package/src/commands/cm/bulk-publish/unpublished-entries.js +0 -127
  50. package/src/util/request.js +0 -59
@@ -3,43 +3,39 @@
3
3
  /* eslint-disable camelcase */
4
4
  /* eslint-disable complexity */
5
5
  /* eslint-disable max-params */
6
- const {getQueue} = require('../util/queue')
7
- const defaults = require('../config/defaults.json')
8
- const req = require('../util/request')
9
- const {
10
- performBulkPublish, publishEntry, publishAsset, initializeLogger,
11
- } = require('../consumer/publish')
12
- const retryFailedLogs = require('../util/retryfailed')
13
- const {validateFile} = require('../util/fs')
14
- const queue = getQueue()
15
- const entryQueue = getQueue()
16
- const assetQueue = getQueue()
17
- const {setDelayForBulkPublish} = require('../util')
18
- const {Command} = require('@contentstack/cli-command')
19
- const command = new Command()
20
- const {isEmpty} = require('../util')
21
-
22
- let bulkPublishSet = []
23
- let bulkPublishAssetSet = []
24
- let changedFlag = false
25
- let logFileName
26
- let filePath
6
+ const { getQueue } = require('../util/queue');
7
+ const defaults = require('../config/defaults.json');
8
+ const { performBulkPublish, publishEntry, publishAsset, initializeLogger } = require('../consumer/publish');
9
+ const retryFailedLogs = require('../util/retryfailed');
10
+ const { validateFile } = require('../util/fs');
11
+ const queue = getQueue();
12
+ const entryQueue = getQueue();
13
+ const assetQueue = getQueue();
14
+ const { Command } = require('@contentstack/cli-command');
15
+ const command = new Command();
16
+ const { isEmpty } = require('../util');
17
+
18
+ let bulkPublishSet = [];
19
+ let bulkPublishAssetSet = [];
20
+ let changedFlag = false;
21
+ let logFileName;
22
+ let filePath;
27
23
 
28
24
  function getQueryParams(filter) {
29
- let queryString = ''
30
- Object.keys(filter).forEach(key => {
25
+ let queryString = '';
26
+ Object.keys(filter).forEach((key) => {
31
27
  if (filter[key]) {
32
- queryString = `${queryString}&${key}=${filter[key]}`
28
+ queryString = `${queryString}&${key}=${filter[key]}`;
33
29
  }
34
- })
30
+ });
35
31
 
36
- return queryString
32
+ return queryString;
37
33
  }
38
34
 
39
35
  async function bulkAction(stack, items, bulkPublish, filter, destEnv) {
40
- return new Promise(async resolve => {
36
+ return new Promise(async (resolve) => {
41
37
  for (let index = 0; index < items.length; index++) {
42
- changedFlag = true
38
+ changedFlag = true;
43
39
 
44
40
  if (bulkPublish) {
45
41
  if (bulkPublishSet.length < 10 && items[index].type === 'entry_published') {
@@ -48,7 +44,7 @@ async function bulkAction(stack, items, bulkPublish, filter, destEnv) {
48
44
  content_type: items[index].content_type_uid,
49
45
  locale: items[index].data.locale || 'en-us',
50
46
  publish_details: [items[index].data.publish_details] || [],
51
- })
47
+ });
52
48
  }
53
49
 
54
50
  if (bulkPublishAssetSet.length < 10 && items[index].type === 'asset_published') {
@@ -56,148 +52,230 @@ async function bulkAction(stack, items, bulkPublish, filter, destEnv) {
56
52
  uid: items[index].data.uid,
57
53
  version: items[index].data._version,
58
54
  publish_details: [items[index].data.publish_details] || [],
59
- })
55
+ });
60
56
  }
61
57
 
62
58
  if (bulkPublishAssetSet.length === 10) {
63
59
  await queue.Enqueue({
64
- assets: bulkPublishAssetSet, Type: 'asset', locale: filter.locale, environments: destEnv, stack: stack
65
- })
66
- bulkPublishAssetSet = []
60
+ assets: bulkPublishAssetSet,
61
+ Type: 'asset',
62
+ locale: filter.locale,
63
+ environments: destEnv,
64
+ stack: stack,
65
+ });
66
+ bulkPublishAssetSet = [];
67
67
  }
68
68
 
69
69
  if (bulkPublishSet.length === 10) {
70
70
  await queue.Enqueue({
71
- entries: bulkPublishSet, locale: filter.locale, Type: 'entry', environments: destEnv, stack: stack
72
- })
73
- bulkPublishSet = []
71
+ entries: bulkPublishSet,
72
+ locale: filter.locale,
73
+ Type: 'entry',
74
+ environments: destEnv,
75
+ stack: stack,
76
+ });
77
+ bulkPublishSet = [];
74
78
  }
75
79
 
76
80
  if (index === items.length - 1 && bulkPublishAssetSet.length <= 10 && bulkPublishAssetSet.length > 0) {
77
81
  await queue.Enqueue({
78
- assets: bulkPublishAssetSet, Type: 'asset', locale: filter.locale, environments: destEnv, stack: stack
79
- })
80
- bulkPublishAssetSet = []
82
+ assets: bulkPublishAssetSet,
83
+ Type: 'asset',
84
+ locale: filter.locale,
85
+ environments: destEnv,
86
+ stack: stack,
87
+ });
88
+ bulkPublishAssetSet = [];
81
89
  }
82
90
 
83
91
  if (index === items.length - 1 && bulkPublishSet.length <= 10 && bulkPublishSet.length > 0) {
84
92
  await queue.Enqueue({
85
- entries: bulkPublishSet, locale: filter.locale, Type: 'entry', environments: destEnv, stack: stack
86
- })
87
- bulkPublishSet = []
93
+ entries: bulkPublishSet,
94
+ locale: filter.locale,
95
+ Type: 'entry',
96
+ environments: destEnv,
97
+ stack: stack,
98
+ });
99
+ bulkPublishSet = [];
88
100
  }
89
101
  } else {
90
102
  if (items[index].type === 'entry_published') {
91
103
  await entryQueue.Enqueue({
92
- content_type: items[index].content_type_uid, publish_details: [items[index].data.publish_details], environments: destEnv, entryUid: items[index].data.uid, locale: items[index].data.locale || 'en-us', Type: 'entry', stack: stack
93
- })
104
+ content_type: items[index].content_type_uid,
105
+ publish_details: [items[index].data.publish_details],
106
+ environments: destEnv,
107
+ entryUid: items[index].data.uid,
108
+ locale: items[index].data.locale || 'en-us',
109
+ Type: 'entry',
110
+ stack: stack,
111
+ });
94
112
  }
95
113
  if (items[index].type === 'asset_published') {
96
114
  await assetQueue.Enqueue({
97
- assetUid: items[index].data.uid, publish_details: [items[index].data.publish_details], environments: destEnv, Type: 'asset', stack: stack
98
- })
115
+ assetUid: items[index].data.uid,
116
+ publish_details: [items[index].data.publish_details],
117
+ locale: filter.locale,
118
+ environments: destEnv,
119
+ Type: 'asset',
120
+ stack: stack,
121
+ });
99
122
  }
100
123
  }
101
124
  }
102
- return resolve()
103
- })
125
+ return resolve();
126
+ });
104
127
  }
105
128
 
106
- async function getSyncEntries(stack, config, queryParams, bulkPublish, filter, deliveryToken, destEnv, paginationToken = null) {
129
+ async function getSyncEntries(
130
+ stack,
131
+ config,
132
+ queryParams,
133
+ bulkPublish,
134
+ filter,
135
+ deliveryToken,
136
+ destEnv,
137
+ paginationToken = null,
138
+ ) {
107
139
  return new Promise(async (resolve, reject) => {
108
140
  try {
109
- let tokenDetails = command.getToken(config.alias)
110
- const conf = {
111
- uri: `${config.cda}/v${defaults.apiVersion}/stacks/sync?${paginationToken ? `pagination_token=${paginationToken}` : 'init=true'}${queryParams}`,
112
- headers: {
113
- api_key: tokenDetails.apiKey,
114
- access_token: deliveryToken,
115
- },
141
+ const tokenDetails = command.getToken(config.alias);
142
+ const queryParamsObj = {};
143
+ const pairs = queryParams.split('&').filter((e) => e !== null && e !== '' && e !== undefined);
144
+ for (let i in pairs) {
145
+ const split = pairs[i].split('=');
146
+ queryParamsObj[decodeURIComponent(split[0])] = decodeURIComponent(split[1]);
147
+ }
148
+
149
+ const Stack = new command.deliveryAPIClient.Stack({
150
+ api_key: tokenDetails.apiKey,
151
+ delivery_token: deliveryToken,
152
+ environment: queryParamsObj.environment,
153
+ branch: config.branch,
154
+ });
155
+
156
+ const syncData = {};
157
+
158
+ if (paginationToken) {
159
+ syncData['pagination_token'] = paginationToken;
160
+ } else {
161
+ syncData['init'] = true;
162
+ }
163
+ if (queryParamsObj.locale) {
164
+ syncData['locale'] = queryParamsObj.locale;
116
165
  }
117
- const entriesResponse = await req(conf)
166
+ if (queryParamsObj.type) {
167
+ syncData['type'] = queryParamsObj.type;
168
+ }
169
+
170
+ const entriesResponse = await Stack.sync(syncData);
171
+
118
172
  if (entriesResponse.items.length > 0) {
119
- await bulkAction(stack, entriesResponse.items, bulkPublish, filter, destEnv)
173
+ await bulkAction(stack, entriesResponse.items, bulkPublish, filter, destEnv);
120
174
  }
121
175
  if (!entriesResponse.pagination_token) {
122
- if (!changedFlag) console.log('No Entries/Assets Found published on specified environment')
123
- return resolve()
176
+ if (!changedFlag) console.log('No Entries/Assets Found published on specified environment');
177
+ return resolve();
124
178
  }
125
179
  setTimeout(async () => {
126
- await getSyncEntries(stack, config, queryParams, bulkPublish, filter, deliveryToken, destEnv, entriesResponse.pagination_token)
127
- }, 3000)
180
+ await getSyncEntries(
181
+ stack,
182
+ config,
183
+ queryParams,
184
+ bulkPublish,
185
+ filter,
186
+ deliveryToken,
187
+ destEnv,
188
+ entriesResponse.pagination_token,
189
+ );
190
+ }, 3000);
191
+ return resolve();
128
192
  } catch (error) {
129
- reject(error)
193
+ reject(error);
130
194
  }
131
- return resolve()
132
- })
195
+ });
133
196
  }
134
197
 
135
198
  function setConfig(conf, bp) {
136
199
  if (bp) {
137
- logFileName = 'bulk-cross-publish'
138
- queue.consumer = performBulkPublish
200
+ logFileName = 'bulk-cross-publish';
201
+ queue.consumer = performBulkPublish;
139
202
  } else {
140
- logFileName = 'cross-publish'
141
- entryQueue.consumer = publishEntry
142
- assetQueue.consumer = publishAsset
203
+ logFileName = 'cross-publish';
204
+ entryQueue.consumer = publishEntry;
205
+ assetQueue.consumer = publishAsset;
143
206
  }
144
207
 
145
- queue.config = conf
146
- entryQueue.config = conf
147
- assetQueue.config = conf
148
- filePath = initializeLogger(logFileName)
208
+ queue.config = conf;
209
+ entryQueue.config = conf;
210
+ assetQueue.config = conf;
211
+ filePath = initializeLogger(logFileName);
149
212
  }
150
213
 
151
- async function start({retryFailed, bulkPublish, filter, deliveryToken, contentType, environment, locale, onlyAssets, onlyEntries, destEnv, f_types}, stack, config) {
214
+ async function start(
215
+ {
216
+ retryFailed,
217
+ bulkPublish,
218
+ _filter,
219
+ deliveryToken,
220
+ contentType,
221
+ environment,
222
+ locale,
223
+ onlyAssets,
224
+ onlyEntries,
225
+ destEnv,
226
+ f_types,
227
+ },
228
+ stack,
229
+ config,
230
+ ) {
152
231
  process.on('beforeExit', async () => {
153
- const isErrorLogEmpty = await isEmpty(`${filePath}.error`)
154
- const isSuccessLogEmpty = await isEmpty(`${filePath}.success`)
232
+ const isErrorLogEmpty = await isEmpty(`${filePath}.error`);
233
+ const isSuccessLogEmpty = await isEmpty(`${filePath}.success`);
155
234
  if (!isErrorLogEmpty) {
156
- console.log(`The error log for this session is stored at ${filePath}.error`)
235
+ console.log(`The error log for this session is stored at ${filePath}.error`);
157
236
  } else if (!isSuccessLogEmpty) {
158
- console.log(`The success log for this session is stored at ${filePath}.success`)
237
+ console.log(`The success log for this session is stored at ${filePath}.success`);
159
238
  }
160
- process.exit(0)
161
- })
239
+ process.exit(0);
240
+ });
162
241
 
163
242
  if (retryFailed) {
164
243
  if (typeof retryFailed === 'string' && retryFailed.length > 0) {
165
244
  if (!validateFile(retryFailed, ['cross-publish', 'bulk-cross-publish'])) {
166
- return false
245
+ return false;
167
246
  }
168
247
 
169
- bulkPublish = retryFailed.match(new RegExp('bulk')) ? true : false
170
- setConfig(config, bulkPublish)
248
+ const bulkPublishFlag = retryFailed.match(/bulk/) ? true : false;
249
+ setConfig(config, bulkPublishFlag);
171
250
 
172
- if (bulkPublish) {
173
- await retryFailedLogs(retryFailed, queue, 'bulk')
251
+ if (bulkPublishFlag) {
252
+ await retryFailedLogs(retryFailed, queue, 'bulk');
174
253
  } else {
175
- await retryFailedLogs(retryFailed, {entryQueue, assetQueue}, 'publish')
254
+ await retryFailedLogs(retryFailed, { entryQueue, assetQueue }, 'publish');
176
255
  }
177
256
  }
178
257
  } else {
179
258
  let filter = {
180
259
  environment,
181
260
  locale,
182
- }
183
- if (f_types)
184
- filter.type = f_types
261
+ };
262
+ if (f_types) filter.type = f_types;
185
263
  // filter.type = (f_types) ? f_types : types // types mentioned in the config file (f_types) are given preference
186
264
  if (contentType) {
187
- filter.content_type_uid = contentType
188
- filter.type = 'entry_published'
265
+ filter.content_type_uid = contentType;
266
+ filter.type = 'entry_published';
189
267
  }
190
268
  if (onlyAssets) {
191
- filter.type = 'asset_published'
192
- delete filter.content_type_uid
269
+ filter.type = 'asset_published';
270
+ delete filter.content_type_uid;
193
271
  }
194
272
  if (onlyEntries) {
195
- filter.type = 'entry_published'
273
+ filter.type = 'entry_published';
196
274
  }
197
- setConfig(config, bulkPublish)
275
+ setConfig(config, bulkPublish);
198
276
  // filter.type = (f_types) ? f_types : types // types mentioned in the config file (f_types) are given preference
199
- const queryParams = getQueryParams(filter)
200
- await getSyncEntries(stack, config, queryParams, bulkPublish, filter, deliveryToken, destEnv)
277
+ const queryParams = getQueryParams(filter);
278
+ await getSyncEntries(stack, config, queryParams, bulkPublish, filter, deliveryToken, destEnv);
201
279
  }
202
280
  }
203
281
 
@@ -206,4 +284,4 @@ module.exports = {
206
284
  setConfig,
207
285
  getQueryParams,
208
286
  start,
209
- }
287
+ };