@contentstack/cli-cm-bulk-publish 0.1.1-beta.5 → 1.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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +525 -318
  3. package/oclif.manifest.json +1 -1
  4. package/package.json +26 -11
  5. package/src/commands/cm/assets/publish.js +233 -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 +587 -362
  22. package/src/producer/add-fields.js +204 -179
  23. package/src/producer/cross-publish.js +175 -98
  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 +15 -16
  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,144 +3,175 @@
3
3
  /* eslint-disable camelcase */
4
4
  /* eslint-disable max-depth */
5
5
  /* eslint-disable no-console */
6
- const {getQueue} = require('../util/queue')
7
- const {performBulkPublish, publishEntry, initializeLogger} = require('../consumer/publish')
8
- const retryFailedLogs = require('../util/retryfailed')
9
- const {validateFile} = require('../util/fs')
10
- const {isEmpty} = require('../util')
6
+ const { getQueue } = require('../util/queue');
7
+ const { performBulkPublish, publishEntry, initializeLogger } = require('../consumer/publish');
8
+ const retryFailedLogs = require('../util/retryfailed');
9
+ const { validateFile } = require('../util/fs');
10
+ const { isEmpty } = require('../util');
11
11
 
12
- const queue = getQueue()
12
+ const queue = getQueue();
13
13
 
14
- let skipCount
15
- let logFileName
16
- let contentTypesList = []
17
- let allContentTypes = []
18
- let bulkPublishSet = []
19
- let filePath
14
+ let skipCount;
15
+ let logFileName;
16
+ let contentTypesList = [];
17
+ let allContentTypes = [];
18
+ let bulkPublishSet = [];
19
+ let filePath;
20
20
 
21
21
  async function getEntries(stack, contentType, locale, bulkPublish, environments, skip = 0) {
22
22
  return new Promise((resolve, reject) => {
23
- skipCount = skip
23
+ skipCount = skip;
24
24
 
25
25
  let queryParams = {
26
- locale: (locale || 'en-us'),
26
+ locale: locale || 'en-us',
27
27
  include_count: true,
28
28
  skip: skipCount,
29
29
  include_publish_details: true,
30
- }
30
+ };
31
31
 
32
- stack.contentType(contentType).entry().query(queryParams).find()
33
- .then(async entriesResponse => {
34
- skipCount += entriesResponse.items.length
35
- let entries = entriesResponse.items
36
- for (let index = 0; index < entriesResponse.items.length; index++) {
37
- if (bulkPublish) {
38
- if (bulkPublishSet.length < 10) {
39
- bulkPublishSet.push({
40
- uid: entries[index].uid,
41
- content_type: contentType,
42
- locale,
43
- publish_details: entries[index].publish_details || [],
44
- })
45
- }
32
+ stack
33
+ .contentType(contentType)
34
+ .entry()
35
+ .query(queryParams)
36
+ .find()
37
+ .then(async (entriesResponse) => {
38
+ skipCount += entriesResponse.items.length;
39
+ let entries = entriesResponse.items;
40
+ for (let index = 0; index < entriesResponse.items.length; index++) {
41
+ if (bulkPublish) {
42
+ if (bulkPublishSet.length < 10) {
43
+ bulkPublishSet.push({
44
+ uid: entries[index].uid,
45
+ content_type: contentType,
46
+ locale,
47
+ publish_details: entries[index].publish_details || [],
48
+ });
49
+ }
46
50
 
47
- if (bulkPublishSet.length === 10) {
48
- await queue.Enqueue({
49
- entries: bulkPublishSet, locale, Type: 'entry', environments: environments, stack: stack
50
- })
51
- bulkPublishSet = []
52
- }
51
+ if (bulkPublishSet.length === 10) {
52
+ await queue.Enqueue({
53
+ entries: bulkPublishSet,
54
+ locale,
55
+ Type: 'entry',
56
+ environments: environments,
57
+ stack: stack,
58
+ });
59
+ bulkPublishSet = [];
60
+ }
53
61
 
54
- if (index === entriesResponse.items.length - 1 && bulkPublishSet.length <= 10 && bulkPublishSet.length > 0) {
62
+ if (
63
+ index === entriesResponse.items.length - 1 &&
64
+ bulkPublishSet.length <= 10 &&
65
+ bulkPublishSet.length > 0
66
+ ) {
67
+ await queue.Enqueue({
68
+ entries: bulkPublishSet,
69
+ locale,
70
+ Type: 'entry',
71
+ environments: environments,
72
+ stack: stack,
73
+ });
74
+ bulkPublishSet = [];
75
+ } // bulkPublish
76
+ } else {
55
77
  await queue.Enqueue({
56
- entries: bulkPublishSet, locale, Type: 'entry', environments: environments, stack: stack
57
- })
58
- bulkPublishSet = []
59
- } // bulkPublish
60
- } else {
61
- await queue.Enqueue({
62
- content_type: contentType, publish_details: entries[index].publish_details || [], environments: environments, entryUid: entries[index].uid, locale, Type: 'entry', stack: stack
63
- })
78
+ content_type: contentType,
79
+ publish_details: entries[index].publish_details || [],
80
+ environments: environments,
81
+ entryUid: entries[index].uid,
82
+ locale,
83
+ Type: 'entry',
84
+ stack: stack,
85
+ });
86
+ }
64
87
  }
65
- }
66
88
 
67
- if (entriesResponse.count === skipCount) {
68
- bulkPublishSet = []
69
- return resolve()
70
- }
71
- await getEntries(stack, contentType, locale, bulkPublish, environments, skipCount)
72
- return resolve()
73
- })
74
- .catch(error => reject(error))
75
- })
89
+ if (entriesResponse.count === skipCount) {
90
+ bulkPublishSet = [];
91
+ return resolve();
92
+ }
93
+ await getEntries(stack, contentType, locale, bulkPublish, environments, skipCount);
94
+ return resolve();
95
+ })
96
+ .catch((error) => reject(error));
97
+ });
76
98
  }
77
99
 
78
100
  async function getContentTypes(stack, skip = 0, contentTypes = []) {
79
101
  return new Promise((resolve, reject) => {
80
- skipCount = skip
81
- contentTypesList = contentTypes
82
- stack.contentType().query({include_count: true, skip: skipCount}).find().then(contentTypeResponse => {
83
- if (contentTypeResponse.items.length > 0) {
84
- contentTypesList = [...contentTypesList, ...contentTypeResponse.items]
85
- skipCount += contentTypeResponse.items.length
86
- if (skipCount < contentTypeResponse.count) {
87
- getContentTypes(stack, skipCount, contentTypesList)
102
+ skipCount = skip;
103
+ contentTypesList = contentTypes;
104
+ stack
105
+ .contentType()
106
+ .query({ include_count: true, skip: skipCount })
107
+ .find()
108
+ .then((contentTypeResponse) => {
109
+ if (contentTypeResponse.items.length > 0) {
110
+ contentTypesList = [...contentTypesList, ...contentTypeResponse.items];
111
+ skipCount += contentTypeResponse.items.length;
112
+ if (skipCount < contentTypeResponse.count) {
113
+ getContentTypes(stack, skipCount, contentTypesList);
114
+ }
115
+ resolve(contentTypesList);
88
116
  }
89
- resolve(contentTypesList)
90
- }
91
- }).catch(error => reject(error))
92
- })
117
+ })
118
+ .catch((error) => reject(error));
119
+ });
93
120
  }
94
121
 
95
122
  function setConfig(conf, bp) {
96
123
  if (bp) {
97
- queue.consumer = performBulkPublish
98
- logFileName = 'bulk-publish-entries'
124
+ queue.consumer = performBulkPublish;
125
+ logFileName = 'bulk-publish-entries';
99
126
  } else {
100
- queue.consumer = publishEntry
101
- logFileName = 'publish-entries'
127
+ queue.consumer = publishEntry;
128
+ logFileName = 'publish-entries';
102
129
  }
103
- config = conf
104
- queue.config = conf
105
- filePath = initializeLogger(logFileName)
130
+ config = conf;
131
+ queue.config = conf;
132
+ filePath = initializeLogger(logFileName);
106
133
  }
107
134
 
108
- async function start({retryFailed, bulkPublish, publishAllContentTypes, contentTypes, locales, environments}, stack, config) {
135
+ async function start(
136
+ { retryFailed, bulkPublish, publishAllContentTypes, contentTypes, locales, environments },
137
+ stack,
138
+ config,
139
+ ) {
109
140
  process.on('beforeExit', async () => {
110
- const isErrorLogEmpty = await isEmpty(`${filePath}.error`)
111
- const isSuccessLogEmpty = await isEmpty(`${filePath}.success`)
141
+ const isErrorLogEmpty = await isEmpty(`${filePath}.error`);
142
+ const isSuccessLogEmpty = await isEmpty(`${filePath}.success`);
112
143
  if (!isErrorLogEmpty) {
113
- console.log(`The error log for this session is stored at ${filePath}.error`)
144
+ console.log(`The error log for this session is stored at ${filePath}.error`);
114
145
  } else if (!isSuccessLogEmpty) {
115
- console.log(`The success log for this session is stored at ${filePath}.success`)
146
+ console.log(`The success log for this session is stored at ${filePath}.success`);
116
147
  }
117
- process.exit(0)
118
- })
148
+ process.exit(0);
149
+ });
119
150
  if (retryFailed) {
120
151
  if (typeof retryFailed === 'string') {
121
152
  if (!validateFile(retryFailed, ['publish-entries', 'bulk-publish-entries'])) {
122
- return false
153
+ return false;
123
154
  }
124
155
 
125
- bulkPublish = retryFailed.match(new RegExp('bulk')) ? true : false
126
- setConfig(config, bulkPublish)
156
+ bulkPublish = retryFailed.match(new RegExp('bulk')) ? true : false;
157
+ setConfig(config, bulkPublish);
127
158
  if (bulkPublish) {
128
- await retryFailedLogs(retryFailed, queue, 'bulk')
159
+ await retryFailedLogs(retryFailed, queue, 'bulk');
129
160
  } else {
130
- await retryFailedLogs(retryFailed, {entryQueue: queue}, 'publish')
161
+ await retryFailedLogs(retryFailed, { entryQueue: queue }, 'publish');
131
162
  }
132
163
  }
133
164
  } else {
134
- setConfig(config, bulkPublish)
165
+ setConfig(config, bulkPublish);
135
166
  if (publishAllContentTypes) {
136
- allContentTypes = await getContentTypes(stack)
167
+ allContentTypes = await getContentTypes(stack);
137
168
  } else {
138
- allContentTypes = contentTypes
169
+ allContentTypes = contentTypes;
139
170
  }
140
171
  for (let loc = 0; loc < locales.length; loc += 1) {
141
172
  for (let i = 0; i < allContentTypes.length; i += 1) {
142
173
  /* eslint-disable no-await-in-loop */
143
- await getEntries(stack, allContentTypes[i].uid || allContentTypes[i], locales[loc], bulkPublish, environments)
174
+ await getEntries(stack, allContentTypes[i].uid || allContentTypes[i], locales[loc], bulkPublish, environments);
144
175
  /* eslint-enable no-await-in-loop */
145
176
  }
146
177
  }
@@ -152,4 +183,4 @@ module.exports = {
152
183
  setConfig,
153
184
  getContentTypes,
154
185
  start,
155
- }
186
+ };
@@ -4,144 +4,168 @@
4
4
  /* eslint-disable no-console */
5
5
  /* eslint-disable new-cap */
6
6
  /* eslint-disable camelcase */
7
- const {getQueue} = require('../util/queue')
8
- const {performBulkPublish, publishEntry, initializeLogger} = require('../consumer/publish')
9
- const retryFailedLogs = require('../util/retryfailed')
10
- const {validateFile} = require('../util/fs')
11
- const {setDelayForBulkPublish} = require('../util')
12
- const {isEmpty} = require('../util')
7
+ const { getQueue } = require('../util/queue');
8
+ const { performBulkPublish, publishEntry, initializeLogger } = require('../consumer/publish');
9
+ const retryFailedLogs = require('../util/retryfailed');
10
+ const { validateFile } = require('../util/fs');
11
+ const { isEmpty } = require('../util');
13
12
 
14
- const queue = getQueue()
15
- let skipCount
16
- let changedFlag = false
17
- let logFileName = 'publish-unpublished-env'
18
- let bulkPublishSet = []
19
- let filePath
13
+ const queue = getQueue();
14
+ let skipCount;
15
+ let changedFlag = false;
16
+ let logFileName = 'publish-unpublished-env';
17
+ let bulkPublishSet = [];
18
+ let filePath;
20
19
 
21
20
  function setConfig(conf, bp) {
22
21
  if (bp) {
23
- logFileName = 'bulk-publish-draft'
24
- queue.consumer = performBulkPublish
22
+ logFileName = 'bulk-publish-draft';
23
+ queue.consumer = performBulkPublish;
25
24
  } else {
26
- logFileName = 'publish-draft'
27
- queue.consumer = publishEntry
25
+ logFileName = 'publish-draft';
26
+ queue.consumer = publishEntry;
28
27
  }
29
- config = conf
30
- queue.config = config
31
- filePath = initializeLogger(logFileName)
28
+ config = conf;
29
+ queue.config = config;
30
+ filePath = initializeLogger(logFileName);
32
31
  }
33
32
 
34
33
  async function getEnvironment(stack, environmentName) {
35
34
  return new Promise((resolve, reject) => {
36
- stack.environment(environmentName).fetch()
37
- .then(env => {
38
- resolve(env)
39
- })
40
- .catch(error => reject(error))
41
- })
35
+ stack
36
+ .environment(environmentName)
37
+ .fetch()
38
+ .then((env) => {
39
+ resolve(env);
40
+ })
41
+ .catch((error) => reject(error));
42
+ });
42
43
  }
43
44
 
44
45
  async function getEntries(stack, contentType, environmentUid, locale, bulkPublish, environments, skip = 0) {
45
46
  return new Promise((resolve, reject) => {
46
- skipCount = skip
47
+ skipCount = skip;
47
48
 
48
49
  let queryParams = {
49
50
  include_count: true,
50
51
  skip: skipCount,
51
52
  include_publish_details: true,
52
- }
53
+ };
53
54
 
54
- stack.contentType(contentType).entry().query(queryParams).find()
55
- .then(async responseEntries => {
56
- skipCount += responseEntries.items.length
57
- if (responseEntries.items.length > 0) {
58
- let entries = responseEntries.items
59
- for (let index = 0; index < responseEntries.items.length; index++) {
60
- // const locale = locale || 'en-us'
61
- const publishedEntry = entries[index].publish_details.find(publishEnv => publishEnv.environment === environmentUid && publishEnv.locale === locale)
62
- if (!publishedEntry) {
63
- changedFlag = true
64
- if (bulkPublish) {
65
- if (bulkPublishSet.length < 10) {
66
- bulkPublishSet.push({
67
- uid: entries[index].uid,
55
+ stack
56
+ .contentType(contentType)
57
+ .entry()
58
+ .query(queryParams)
59
+ .find()
60
+ .then(async (responseEntries) => {
61
+ skipCount += responseEntries.items.length;
62
+ if (responseEntries.items.length > 0) {
63
+ let entries = responseEntries.items;
64
+ for (let index = 0; index < responseEntries.items.length; index++) {
65
+ const publishedEntry = entries[index].publish_details.find(
66
+ (publishEnv) => publishEnv.environment === environmentUid && publishEnv.locale === locale,
67
+ );
68
+ if (!publishedEntry) {
69
+ changedFlag = true;
70
+ if (bulkPublish) {
71
+ if (bulkPublishSet.length < 10) {
72
+ bulkPublishSet.push({
73
+ uid: entries[index].uid,
74
+ content_type: contentType,
75
+ locale,
76
+ publish_details: entries[index].publish_details || [],
77
+ });
78
+ }
79
+ } else {
80
+ await queue.Enqueue({
68
81
  content_type: contentType,
82
+ publish_details: entries[index].publish_details,
83
+ environments: environments,
84
+ entryUid: entries[index].uid,
69
85
  locale,
70
- publish_details: entries[index].publish_details || [],
71
- })
86
+ Type: 'entry',
87
+ stack: stack,
88
+ });
72
89
  }
73
- } else {
74
- await queue.Enqueue({
75
- content_type: contentType, publish_details: entries[index].publish_details, environments: environments, entryUid: entries[index].uid, locale, Type: 'entry', stack: stack
76
- })
77
- }
78
- }
79
- if (bulkPublish) {
80
- if (bulkPublishSet.length === 10) {
81
- await queue.Enqueue({
82
- entries: bulkPublishSet, locale, Type: 'entry', environments: environments, stack: stack
83
- })
84
- bulkPublishSet = []
85
90
  }
86
- if (index === responseEntries.items.length - 1 && bulkPublishSet.length < 10 && bulkPublishSet.length > 0) {
87
- await queue.Enqueue({
88
- entries: bulkPublishSet, locale, Type: 'entry', environments: environments, stack: stack
89
- })
90
- bulkPublishSet = []
91
+ if (bulkPublish) {
92
+ if (bulkPublishSet.length === 10) {
93
+ await queue.Enqueue({
94
+ entries: bulkPublishSet,
95
+ locale,
96
+ Type: 'entry',
97
+ environments: environments,
98
+ stack: stack,
99
+ });
100
+ bulkPublishSet = [];
101
+ }
102
+ if (
103
+ index === responseEntries.items.length - 1 &&
104
+ bulkPublishSet.length < 10 &&
105
+ bulkPublishSet.length > 0
106
+ ) {
107
+ await queue.Enqueue({
108
+ entries: bulkPublishSet,
109
+ locale,
110
+ Type: 'entry',
111
+ environments: environments,
112
+ stack: stack,
113
+ });
114
+ bulkPublishSet = [];
115
+ }
91
116
  }
92
117
  }
93
118
  }
94
- }
95
- if (responseEntries.count === skipCount) {
96
- if (!changedFlag) console.log(`No Draft Entries of contentType ${contentType} was found`)
97
- bulkPublishSet = []
98
- return resolve()
99
- }
100
- await getEntries(stack, contentType, environmentUid, locale, bulkPublish, environments, skipCount)
101
- return resolve()
102
- })
103
- .catch(error => {
104
- reject(error)
105
- })
106
- })
119
+ if (responseEntries.count === skipCount) {
120
+ if (!changedFlag) console.log(`No Draft Entries of contentType ${contentType} was found`);
121
+ bulkPublishSet = [];
122
+ return resolve();
123
+ }
124
+ await getEntries(stack, contentType, environmentUid, locale, bulkPublish, environments, skipCount);
125
+ return resolve();
126
+ })
127
+ .catch((error) => {
128
+ reject(error);
129
+ });
130
+ });
107
131
  }
108
132
 
109
- async function start({sourceEnv, environments, locale, contentTypes, bulkPublish, retryFailed}, stack, config) {
133
+ async function start({ sourceEnv, environments, locale, contentTypes, bulkPublish, retryFailed }, stack, config) {
110
134
  process.on('beforeExit', async () => {
111
- const isErrorLogEmpty = await isEmpty(`${filePath}.error`)
112
- const isSuccessLogEmpty = await isEmpty(`${filePath}.success`)
135
+ const isErrorLogEmpty = await isEmpty(`${filePath}.error`);
136
+ const isSuccessLogEmpty = await isEmpty(`${filePath}.success`);
113
137
  if (!isErrorLogEmpty) {
114
- console.log(`The error log for this session is stored at ${filePath}.error`)
138
+ console.log(`The error log for this session is stored at ${filePath}.error`);
115
139
  } else if (!isSuccessLogEmpty) {
116
- console.log(`The success log for this session is stored at ${filePath}.success`)
140
+ console.log(`The success log for this session is stored at ${filePath}.success`);
117
141
  }
118
- process.exit(0)
119
- })
142
+ process.exit(0);
143
+ });
120
144
 
121
145
  if (retryFailed) {
122
146
  if (typeof retryFailed === 'string') {
123
147
  if (!validateFile(retryFailed, ['publish-draft', 'bulk-publish-draft'])) {
124
- return false
148
+ return false;
125
149
  }
126
150
 
127
- bulkPublish = retryFailed.match(new RegExp('bulk')) ? true : false
128
- setConfig(config, bulkPublish)
151
+ bulkPublish = retryFailed.match(new RegExp('bulk')) ? true : false;
152
+ setConfig(config, bulkPublish);
129
153
 
130
154
  if (bulkPublish) {
131
- await retryFailedLogs(retryFailed, queue, 'bulk')
155
+ await retryFailedLogs(retryFailed, queue, 'bulk');
132
156
  } else {
133
- await retryFailedLogs(retryFailed, {entryQueue: queue}, 'publish')
157
+ await retryFailedLogs(retryFailed, { entryQueue: queue }, 'publish');
134
158
  }
135
159
  }
136
160
  } else {
137
- setConfig(config, bulkPublish)
161
+ setConfig(config, bulkPublish);
138
162
  if (sourceEnv) {
139
- const environmentDetails = await getEnvironment(stack, sourceEnv)
163
+ const environmentDetails = await getEnvironment(stack, sourceEnv);
140
164
  for (let i = 0; i < contentTypes.length; i += 1) {
141
165
  /* eslint-disable no-await-in-loop */
142
- await getEntries(stack, contentTypes[i], environmentDetails.uid, locale, bulkPublish, environments)
166
+ await getEntries(stack, contentTypes[i], environmentDetails.uid, locale, bulkPublish, environments);
143
167
  /* eslint-enable no-await-in-loop */
144
- changedFlag = false
168
+ changedFlag = false;
145
169
  }
146
170
  }
147
171
  }
@@ -154,4 +178,4 @@ module.exports = {
154
178
  getEnvironment,
155
179
  setConfig,
156
180
  start,
157
- }
181
+ };