@contentstack/cli-cm-import 1.0.1 → 1.2.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.
@@ -4,54 +4,55 @@
4
4
  * MIT Licensed
5
5
  */
6
6
 
7
- const mkdirp = require('mkdirp');
8
- const fs = require('fs');
9
7
  const path = require('path');
10
- const Promise = require('bluebird');
11
8
  const chalk = require('chalk');
12
- const {isEmpty} = require('lodash');
9
+ const mkdirp = require('mkdirp');
10
+ const Promise = require('bluebird');
11
+ const { existsSync } = require('fs');
12
+ const { isEmpty, merge } = require('lodash');
13
13
 
14
14
  const helper = require('../util/fs');
15
+ const { formatError } = require('../util');
15
16
  const { addlogs } = require('../util/log');
16
- let config = require('../../config/default');
17
- let stack = require('../util/contentstack-management-sdk');
17
+ const config = require('../../config/default');
18
+ const stack = require('../util/contentstack-management-sdk');
18
19
 
19
- let reqConcurrency = config.concurrency;
20
- let labelConfig = config.modules.labels;
21
- let labelsFolderPath;
22
- let labelMapperPath;
23
- let labelUidMapperPath;
24
- let labelSuccessPath;
25
- let labelFailsPath;
26
- let client;
20
+ module.exports = class ImportLabels {
21
+ config;
22
+ fails = [];
23
+ success = [];
24
+ labelUids = [];
25
+ labelsFolderPath;
26
+ labelUidMapper = {};
27
+ labelConfig = config.modules.labels;
28
+ reqConcurrency = config.concurrency || config.fetchConcurrency || 1;
27
29
 
28
- function importLabels() {
29
- this.fails = [];
30
- this.success = [];
31
- this.labelUidMapper = {};
32
- this.labelUids = [];
33
- if (fs.existsSync(labelUidMapperPath)) {
34
- this.labelUidMapper = helper.readFile(labelUidMapperPath);
35
- this.labelUidMapper = this.labelUidMapper || {};
30
+ constructor(credentialConfig) {
31
+ this.config = merge(config, credentialConfig);
32
+ this.client = stack.Client(config);
36
33
  }
37
- }
38
34
 
39
- importLabels.prototype = {
40
- start: function (credentialConfig) {
41
- let self = this;
42
- config = credentialConfig;
43
- client = stack.Client(config);
44
- addlogs(config, chalk.white('Migrating labels'), 'success');
45
- labelsFolderPath = path.resolve(config.data, labelConfig.dirName);
46
- self.labels = helper.readFile(path.resolve(labelsFolderPath, labelConfig.fileName));
47
- labelMapperPath = path.resolve(config.data, 'mapper', 'labels');
48
- labelUidMapperPath = path.resolve(config.data, 'mapper', 'labels', 'uid-mapping.json');
49
- labelSuccessPath = path.resolve(config.data, 'labels', 'success.json');
50
- labelFailsPath = path.resolve(config.data, 'labels', 'fails.json');
35
+ start() {
36
+ const self = this;
37
+ addlogs(this.config, chalk.white('Migrating labels'), 'success');
38
+ let labelMapperPath = path.resolve(this.config.data, 'mapper', 'labels');
39
+ let labelFailsPath = path.resolve(this.config.data, 'labels', 'fails.json');
40
+ let labelSuccessPath = path.resolve(this.config.data, 'labels', 'success.json');
41
+ this.labelsFolderPath = path.resolve(this.config.data, this.labelConfig.dirName);
42
+ let labelUidMapperPath = path.resolve(this.config.data, 'mapper', 'labels', 'uid-mapping.json');
43
+
44
+ if (existsSync(labelUidMapperPath)) {
45
+ this.labelUidMapper = helper.readFileSync(labelUidMapperPath);
46
+ this.labelUidMapper = this.labelUidMapper || {};
47
+ }
48
+
49
+ self.labels = helper.readFileSync(path.resolve(this.labelsFolderPath, this.labelConfig.fileName));
50
+
51
51
  mkdirp.sync(labelMapperPath);
52
+
52
53
  return new Promise(function (resolve, reject) {
53
54
  if (self.labels == undefined || isEmpty(self.labels)) {
54
- addlogs(config, chalk.white('No Label Found'), 'success');
55
+ addlogs(self.config, chalk.white('No Label Found'), 'success');
55
56
  return resolve({ empty: true });
56
57
  }
57
58
  self.labelUids = Object.keys(self.labels);
@@ -59,72 +60,71 @@ importLabels.prototype = {
59
60
  self.labelUids,
60
61
  function (labelUid) {
61
62
  let label = self.labels[labelUid];
63
+
62
64
  if (label.parent.length != 0) {
63
65
  delete label['parent'];
64
66
  }
65
67
 
66
68
  if (!self.labelUidMapper.hasOwnProperty(labelUid)) {
67
- let requestOption = {
68
- label: label,
69
- };
69
+ let requestOption = { label: label };
70
70
 
71
- return client
72
- .stack({ api_key: config.target_stack, management_token: config.management_token })
71
+ return self.client
72
+ .stack({ api_key: self.config.target_stack, management_token: self.config.management_token })
73
73
  .label()
74
74
  .create(requestOption)
75
75
  .then(function (response) {
76
76
  self.labelUidMapper[labelUid] = response;
77
- helper.writeFile(labelUidMapperPath, self.labelUidMapper);
78
77
  })
79
78
  .catch(function (error) {
80
79
  self.fails.push(label);
81
80
  if (error.errors.name) {
82
- addlogs(config, chalk.red("Label: '" + label.name + "' already exist"), 'error');
81
+ addlogs(self.config, chalk.red("Label: '" + label.name + "' already exist"), 'error');
83
82
  } else {
84
- addlogs(config, chalk.red("Label: '" + label.name + "' failed to be imported\n"), 'error');
83
+ addlogs(self.config, chalk.red("Label: '" + label.name + "' failed to be imported\n"), 'error');
85
84
  }
86
85
  });
87
86
  } else {
88
87
  // the label has already been created
89
88
  addlogs(
90
- config,
89
+ self.config,
91
90
  chalk.white("The label: '" + label.name + "' already exists. Skipping it to avoid duplicates!"),
92
91
  'success',
93
92
  );
94
93
  }
95
94
  // import 1 labels at a time
96
95
  },
97
- {
98
- concurrency: reqConcurrency,
99
- },
96
+ { concurrency: self.reqConcurrency },
100
97
  )
101
98
  .then(function () {
99
+ helper.writeFileSync(labelUidMapperPath, self.labelUidMapper);
102
100
  // eslint-disable-next-line no-undef
103
101
  return self
104
102
  .updateLabels()
105
103
  .then(function () {
106
- helper.writeFile(labelSuccessPath, self.success);
107
- addlogs(config, chalk.green('Labels have been imported successfully!'), 'success');
104
+ helper.writeFileSync(labelSuccessPath, self.success);
105
+ addlogs(self.config, chalk.green('Labels have been imported successfully!'), 'success');
108
106
  return resolve();
109
107
  })
110
108
  .catch(function (error) {
109
+ addlogs(self.config, chalk.red(`Failed to import label ${formatError(error)}`), 'error');
111
110
  // eslint-disable-next-line no-console
112
111
  return reject(error);
113
112
  });
114
113
  })
115
114
  .catch(function (error) {
116
115
  // error while importing labels
117
- helper.writeFile(labelFailsPath, self.fails);
118
- addlogs(config, chalk.red('Label import failed'), 'error');
116
+ helper.writeFileSync(labelUidMapperPath, self.labelUidMapper);
117
+ helper.writeFileSync(labelFailsPath, self.fails);
118
+ addlogs(self.config, chalk.red(`Failed to import label ${formatError(error)}`), 'error');
119
119
  return reject(error);
120
120
  });
121
121
  });
122
- },
122
+ }
123
123
 
124
- updateLabels: function () {
125
- let self = this;
124
+ updateLabels() {
125
+ const self = this;
126
126
  return new Promise(function (resolve, reject) {
127
- let labelsObj = helper.readFile(path.resolve(labelsFolderPath, labelConfig.fileName));
127
+ let labelsObj = helper.readFileSync(path.resolve(self.labelsFolderPath, self.labelConfig.fileName));
128
128
  return Promise.map(
129
129
  self.labelUids,
130
130
  function (labelUid) {
@@ -138,8 +138,8 @@ importLabels.prototype = {
138
138
  label.parent[i] = self.labelUidMapper[parentUids[i]].uid;
139
139
  }
140
140
  }
141
- return client
142
- .stack({ api_key: config.target_stack, management_token: config.management_token })
141
+ return self.client
142
+ .stack({ api_key: self.config.target_stack, management_token: self.config.management_token })
143
143
  .label(newLabelUid.uid)
144
144
  .fetch()
145
145
  .then(function (response) {
@@ -151,17 +151,19 @@ importLabels.prototype = {
151
151
  self.success.push(result);
152
152
  })
153
153
  .catch((error) => {
154
+ addlogs(self.config, formatError(error), 'error');
154
155
  return reject(error);
155
156
  });
156
157
  })
157
158
  .catch(function (error) {
159
+ addlogs(self.config, formatError(error), 'error');
158
160
  return reject(error);
159
161
  });
160
162
  }
161
163
  }
162
164
  },
163
165
  {
164
- concurrency: reqConcurrency,
166
+ concurrency: self.reqConcurrency,
165
167
  },
166
168
  )
167
169
  .then(function () {
@@ -172,6 +174,5 @@ importLabels.prototype = {
172
174
  return reject(error);
173
175
  });
174
176
  });
175
- },
177
+ }
176
178
  };
177
- module.exports = new importLabels();
@@ -5,55 +5,54 @@
5
5
  * MIT Licensed
6
6
  */
7
7
 
8
- let mkdirp = require('mkdirp');
9
8
  let fs = require('fs');
10
9
  let path = require('path');
11
- let Promise = require('bluebird');
12
10
  let chalk = require('chalk');
11
+ let mkdirp = require('mkdirp');
12
+ let Promise = require('bluebird');
13
+ let { isEmpty, merge, cloneDeep } = require('lodash');
13
14
 
14
15
  let helper = require('../util/fs');
15
16
  let { addlogs } = require('../util/log');
16
- let stack = require('../util/contentstack-management-sdk');
17
+ const { formatError } = require('../util');
17
18
  let config = require('../../config/default');
18
- let {isEmpty, cloneDeep} = require('lodash');
19
- let reqConcurrency = config.concurrency;
20
- let langConfig = config.modules.locales;
21
- let langFolderPath;
22
- let langMapperPath;
23
- let langUidMapperPath;
24
- let langSuccessPath;
25
- let langFailsPath;
26
- let client;
19
+ let stack = require('../util/contentstack-management-sdk');
27
20
 
28
- let masterLanguage = config.master_locale;
21
+ module.exports = class ImportLanguages {
22
+ client;
23
+ fails = [];
24
+ success = [];
25
+ langUidMapper = {};
26
+ masterLanguage = config.master_locale;
27
+ langConfig = config.modules.locales;
28
+ reqConcurrency = config.concurrency || config.fetchConcurrency || 1;
29
29
 
30
- function importLanguages() {
31
- this.fails = [];
32
- this.success = [];
33
- this.langUidMapper = {};
34
- }
30
+ constructor(credentialConfig) {
31
+ this.config = merge(config, credentialConfig);
32
+ this.client = stack.Client(this.config);
33
+ }
34
+
35
+ start() {
36
+ addlogs(this.config, 'Migrating languages', 'success');
37
+
38
+ const self = this;
39
+ let langMapperPath = path.resolve(this.config.data, 'mapper', 'languages');
40
+ let langFolderPath = path.resolve(this.config.data, this.langConfig.dirName);
41
+ let langFailsPath = path.resolve(this.config.data, 'mapper', 'languages', 'fails.json');
42
+ let langSuccessPath = path.resolve(this.config.data, 'mapper', 'languages', 'success.json');
43
+ let langUidMapperPath = path.resolve(this.config.data, 'mapper', 'languages', 'uid-mapper.json');
44
+ self.languages = helper.readFileSync(path.resolve(langFolderPath, this.langConfig.fileName));
35
45
 
36
- importLanguages.prototype = {
37
- start: function (credentialConfig) {
38
- addlogs(config, 'Migrating languages', 'success');
39
- let self = this;
40
- config = credentialConfig;
41
- client = stack.Client(config);
42
- langFolderPath = path.resolve(config.data, langConfig.dirName);
43
- langMapperPath = path.resolve(config.data, 'mapper', 'languages');
44
- langUidMapperPath = path.resolve(config.data, 'mapper', 'languages', 'uid-mapper.json');
45
- langSuccessPath = path.resolve(config.data, 'mapper', 'languages', 'success.json');
46
- langFailsPath = path.resolve(config.data, 'mapper', 'languages', 'fails.json');
47
46
  mkdirp.sync(langMapperPath);
48
- self.languages = helper.readFile(path.resolve(langFolderPath, langConfig.fileName));
47
+
49
48
  if (fs.existsSync(langUidMapperPath)) {
50
- self.langUidMapper = helper.readFile(langUidMapperPath);
49
+ self.langUidMapper = helper.readFileSync(langUidMapperPath);
51
50
  self.langUidMapper = self.langUidMapper || {};
52
51
  }
53
52
 
54
53
  return new Promise(function (resolve, reject) {
55
54
  if (self.languages === undefined || isEmpty(self.languages)) {
56
- addlogs(config, chalk.white('No Languages Found'), 'success');
55
+ addlogs(self.config, chalk.white('No Languages Found'), 'success');
57
56
  return resolve({ empty: true });
58
57
  }
59
58
  let langUids = Object.keys(self.languages);
@@ -61,7 +60,7 @@ importLanguages.prototype = {
61
60
  langUids,
62
61
  function (langUid) {
63
62
  let lang = self.languages[langUid];
64
- if (!self.langUidMapper.hasOwnProperty(langUid) && lang.code !== masterLanguage) {
63
+ if (!self.langUidMapper.hasOwnProperty(langUid) && lang.code !== self.masterLanguage) {
65
64
  let requestOption = {
66
65
  locale: {
67
66
  code: lang.code,
@@ -69,69 +68,71 @@ importLanguages.prototype = {
69
68
  },
70
69
  };
71
70
 
72
- return client
73
- .stack({ api_key: config.target_stack, management_token: config.management_token })
71
+ return self.client
72
+ .stack({ api_key: self.config.target_stack, management_token: self.config.management_token })
74
73
  .locale()
75
74
  .create(requestOption)
76
75
  .then((locale) => {
77
76
  self.success.push(locale.items);
78
77
  self.langUidMapper[langUid] = locale.uid;
79
- helper.writeFile(langUidMapperPath, self.langUidMapper);
78
+ helper.writeFileSync(langUidMapperPath, self.langUidMapper);
80
79
  })
81
80
  .catch(function (err) {
82
81
  let error = JSON.parse(err.message);
83
82
  if (error.hasOwnProperty('errorCode') && error.errorCode === 247) {
84
- addlogs(config, error.errors.code[0], 'success');
85
- return;
83
+ addlogs(self.config, error.errors.code[0], 'success');
84
+ return err;
86
85
  }
87
86
  self.fails.push(lang);
88
- addlogs(config, chalk.red("Language: '" + lang.code + "' failed to be import\n"), 'error');
87
+ addlogs(self.config, chalk.red("Language: '" + lang.code + "' failed to be import\n"), 'error');
88
+ addlogs(self.config, formatError(err), 'error');
89
89
  });
90
90
  } else {
91
91
  // the language has already been created
92
- addlogs(config, chalk.yellow("The language: '" + lang.code + "' already exists."), 'error');
92
+ addlogs(self.config, chalk.yellow("The language: '" + lang.code + "' already exists."), 'error');
93
93
  }
94
94
 
95
95
  // import 2 languages at a time
96
96
  },
97
- {
98
- concurrency: reqConcurrency,
99
- },
97
+ { concurrency: self.reqConcurrency },
100
98
  )
101
99
  .then(function () {
102
100
  // languages have imported successfully
103
101
  self
104
- .update_locales(langUids)
102
+ .updateLocales(langUids)
105
103
  .then(() => {
106
- helper.writeFile(langSuccessPath, self.success);
107
- addlogs(config, chalk.green('Languages have been imported successfully!'), 'success');
108
- return resolve();
104
+ helper.writeFileSync(langSuccessPath, self.success);
105
+ addlogs(self.config, chalk.green('Languages have been imported successfully!'), 'success');
106
+ resolve();
109
107
  })
110
108
  .catch(function (error) {
111
- return reject(error);
109
+ addlogs(self.config, formatError(error), 'error');
110
+ reject(error);
112
111
  });
113
112
  })
114
113
  .catch(function (error) {
115
114
  // error while importing languages
116
- helper.writeFile(langFailsPath, self.fails);
117
- addlogs(config, chalk.red('Language import failed'), 'error');
118
- return reject(error);
115
+ helper.writeFileSync(langFailsPath, self.fails);
116
+ addlogs(self.config, chalk.red('Language import failed'), 'error');
117
+ addlogs(self.config, formatError(error), 'error');
118
+ reject('failed to import Languages');
119
119
  });
120
120
  });
121
- },
122
- update_locales: function (langUids) {
121
+ }
122
+
123
+ updateLocales(langUids) {
123
124
  let self = this;
124
125
  return new Promise(function (resolve, reject) {
125
126
  Promise.all(
126
127
  langUids.map(async (langUid) => {
127
128
  let lang = {};
128
- let requireKeys = config.modules.locales.requiredKeys;
129
+ let requireKeys = self.config.modules.locales.requiredKeys;
129
130
  let _lang = self.languages[langUid];
130
131
  requireKeys.forEach((e) => {
131
132
  lang[e] = _lang[e];
132
133
  });
133
- let langobj = client
134
- .stack({ api_key: config.target_stack, management_token: config.management_token })
134
+ let langobj = self.client
135
+ .stack({ api_key: self.config.target_stack, management_token: self.config.management_token })
135
136
  .locale(lang.code);
136
137
  Object.assign(langobj, cloneDeep(lang));
137
138
  langobj.update().then(() => {
@@ -139,14 +140,11 @@ importLanguages.prototype = {
139
140
  });
140
141
  }),
141
142
  )
142
- .then(() => {
143
- return resolve();
144
- })
143
+ .then(resolve)
145
144
  .catch((error) => {
146
- return reject(error);
145
+ addlogs(self.config, formatError(error), 'error');
146
+ reject(error);
147
147
  });
148
148
  });
149
- },
149
+ }
150
150
  };
151
-
152
- module.exports = new importLanguages();