@contentstack/cli-cm-import 1.1.0 → 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,56 +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));
49
-
47
+
50
48
  if (fs.existsSync(langUidMapperPath)) {
51
- self.langUidMapper = helper.readFile(langUidMapperPath);
49
+ self.langUidMapper = helper.readFileSync(langUidMapperPath);
52
50
  self.langUidMapper = self.langUidMapper || {};
53
51
  }
54
52
 
55
53
  return new Promise(function (resolve, reject) {
56
54
  if (self.languages === undefined || isEmpty(self.languages)) {
57
- addlogs(config, chalk.white('No Languages Found'), 'success');
55
+ addlogs(self.config, chalk.white('No Languages Found'), 'success');
58
56
  return resolve({ empty: true });
59
57
  }
60
58
  let langUids = Object.keys(self.languages);
@@ -62,7 +60,7 @@ importLanguages.prototype = {
62
60
  langUids,
63
61
  function (langUid) {
64
62
  let lang = self.languages[langUid];
65
- if (!self.langUidMapper.hasOwnProperty(langUid) && lang.code !== masterLanguage) {
63
+ if (!self.langUidMapper.hasOwnProperty(langUid) && lang.code !== self.masterLanguage) {
66
64
  let requestOption = {
67
65
  locale: {
68
66
  code: lang.code,
@@ -70,69 +68,71 @@ importLanguages.prototype = {
70
68
  },
71
69
  };
72
70
 
73
- return client
74
- .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 })
75
73
  .locale()
76
74
  .create(requestOption)
77
75
  .then((locale) => {
78
76
  self.success.push(locale.items);
79
77
  self.langUidMapper[langUid] = locale.uid;
80
- helper.writeFile(langUidMapperPath, self.langUidMapper);
78
+ helper.writeFileSync(langUidMapperPath, self.langUidMapper);
81
79
  })
82
80
  .catch(function (err) {
83
81
  let error = JSON.parse(err.message);
84
82
  if (error.hasOwnProperty('errorCode') && error.errorCode === 247) {
85
- addlogs(config, error.errors.code[0], 'success');
86
- return;
83
+ addlogs(self.config, error.errors.code[0], 'success');
84
+ return err;
87
85
  }
88
86
  self.fails.push(lang);
89
- 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');
90
89
  });
91
90
  } else {
92
91
  // the language has already been created
93
- addlogs(config, chalk.yellow("The language: '" + lang.code + "' already exists."), 'error');
92
+ addlogs(self.config, chalk.yellow("The language: '" + lang.code + "' already exists."), 'error');
94
93
  }
95
94
 
96
95
  // import 2 languages at a time
97
96
  },
98
- {
99
- concurrency: reqConcurrency,
100
- },
97
+ { concurrency: self.reqConcurrency },
101
98
  )
102
99
  .then(function () {
103
100
  // languages have imported successfully
104
101
  self
105
- .update_locales(langUids)
102
+ .updateLocales(langUids)
106
103
  .then(() => {
107
- helper.writeFile(langSuccessPath, self.success);
108
- addlogs(config, chalk.green('Languages have been imported successfully!'), 'success');
109
- return resolve();
104
+ helper.writeFileSync(langSuccessPath, self.success);
105
+ addlogs(self.config, chalk.green('Languages have been imported successfully!'), 'success');
106
+ resolve();
110
107
  })
111
108
  .catch(function (error) {
112
- return reject(error);
109
+ addlogs(self.config, formatError(error), 'error');
110
+ reject(error);
113
111
  });
114
112
  })
115
113
  .catch(function (error) {
116
114
  // error while importing languages
117
- helper.writeFile(langFailsPath, self.fails);
118
- addlogs(config, chalk.red('Language import failed'), 'error');
119
- 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');
120
119
  });
121
120
  });
122
- },
123
- update_locales: function (langUids) {
121
+ }
122
+
123
+ updateLocales(langUids) {
124
124
  let self = this;
125
125
  return new Promise(function (resolve, reject) {
126
126
  Promise.all(
127
127
  langUids.map(async (langUid) => {
128
128
  let lang = {};
129
- let requireKeys = config.modules.locales.requiredKeys;
129
+ let requireKeys = self.config.modules.locales.requiredKeys;
130
130
  let _lang = self.languages[langUid];
131
131
  requireKeys.forEach((e) => {
132
132
  lang[e] = _lang[e];
133
133
  });
134
- let langobj = client
135
- .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 })
136
136
  .locale(lang.code);
137
137
  Object.assign(langobj, cloneDeep(lang));
138
138
  langobj.update().then(() => {
@@ -140,14 +140,11 @@ importLanguages.prototype = {
140
140
  });
141
141
  }),
142
142
  )
143
- .then(() => {
144
- return resolve();
145
- })
143
+ .then(resolve)
146
144
  .catch((error) => {
147
- return reject(error);
145
+ addlogs(self.config, formatError(error), 'error');
146
+ reject(error);
148
147
  });
149
148
  });
150
- },
149
+ }
151
150
  };
152
-
153
- module.exports = new importLanguages();