@contentstack/cli-cm-import 1.1.0 → 1.2.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.
- package/README.md +4 -3
- package/oclif.manifest.json +1 -1
- package/package.json +8 -7
- package/src/app.js +90 -106
- package/src/commands/cm/stacks/import.js +8 -1
- package/src/config/default.js +9 -4
- package/src/lib/import/assets.js +291 -296
- package/src/lib/import/content-types.js +171 -246
- package/src/lib/import/custom-roles.js +110 -93
- package/src/lib/import/entries.js +216 -174
- package/src/lib/import/environments.js +40 -50
- package/src/lib/import/extensions.js +35 -41
- package/src/lib/import/global-fields.js +56 -68
- package/src/lib/import/labels.js +62 -61
- package/src/lib/import/locales.js +61 -64
- package/src/lib/import/marketplace-apps.js +293 -290
- package/src/lib/import/webhooks.js +45 -51
- package/src/lib/import/workflows.js +72 -62
- package/src/lib/util/extensionsUidReplace.js +9 -9
- package/src/lib/util/fs.js +91 -12
- package/src/lib/util/index.js +39 -3
- package/src/lib/util/log.js +7 -5
- package/src/lib/util/login.js +2 -1
- package/src/lib/util/lookupReplaceAssets.js +22 -10
- package/src/lib/util/lookupReplaceEntries.js +60 -60
- package/src/lib/util/marketplace-app-helper.js +25 -6
package/src/lib/import/labels.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
17
|
-
|
|
17
|
+
const config = require('../../config/default');
|
|
18
|
+
const stack = require('../util/contentstack-management-sdk');
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
labelsFolderPath = path.resolve(config.data, labelConfig.dirName);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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.
|
|
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.
|
|
118
|
-
|
|
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
|
|
125
|
-
|
|
124
|
+
updateLabels() {
|
|
125
|
+
const self = this;
|
|
126
126
|
return new Promise(function (resolve, reject) {
|
|
127
|
-
let labelsObj = helper.
|
|
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
|
-
|
|
17
|
+
const { formatError } = require('../util');
|
|
17
18
|
let config = require('../../config/default');
|
|
18
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
49
|
-
|
|
47
|
+
|
|
50
48
|
if (fs.existsSync(langUidMapperPath)) {
|
|
51
|
-
self.langUidMapper = helper.
|
|
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.
|
|
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
|
-
.
|
|
102
|
+
.updateLocales(langUids)
|
|
106
103
|
.then(() => {
|
|
107
|
-
helper.
|
|
108
|
-
addlogs(config, chalk.green('Languages have been imported successfully!'), 'success');
|
|
109
|
-
|
|
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
|
-
|
|
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.
|
|
118
|
-
addlogs(config, chalk.red('Language import failed'), 'error');
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
145
|
+
addlogs(self.config, formatError(error), 'error');
|
|
146
|
+
reject(error);
|
|
148
147
|
});
|
|
149
148
|
});
|
|
150
|
-
}
|
|
149
|
+
}
|
|
151
150
|
};
|
|
152
|
-
|
|
153
|
-
module.exports = new importLanguages();
|