@contentstack/cli-cm-import 1.14.0 → 1.14.2

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 CHANGED
@@ -47,7 +47,7 @@ $ npm install -g @contentstack/cli-cm-import
47
47
  $ csdx COMMAND
48
48
  running command...
49
49
  $ csdx (--version)
50
- @contentstack/cli-cm-import/1.14.0 linux-x64 node-v18.19.1
50
+ @contentstack/cli-cm-import/1.14.2 linux-x64 node-v18.19.1
51
51
  $ csdx --help [COMMAND]
52
52
  USAGE
53
53
  $ csdx COMMAND
@@ -26,11 +26,11 @@ class ImportCommand extends cli_command_1.Command {
26
26
  ? `Successfully imported the content to the stack named ${importConfig.stackName} with the API key ${importConfig.apiKey} .`
27
27
  : `The content has been imported to the stack ${importConfig.apiKey} successfully!`, 'success');
28
28
  }
29
- (0, utils_1.log)(importConfig, `The log has been stored at '${node_path_1.default.join(importConfig.backupDir, 'logs', 'import')}'`, 'success');
29
+ (0, utils_1.log)(importConfig, `The log has been stored at '${(0, cli_utilities_1.pathValidator)(node_path_1.default.join(importConfig.backupDir, 'logs', 'import'))}'`, 'success');
30
30
  }
31
31
  catch (error) {
32
- (0, utils_1.log)({ data: backupDir !== null && backupDir !== void 0 ? backupDir : node_path_1.default.join(backupDir || __dirname, 'logs', 'import') }, `Failed to import stack content - ${(0, utils_1.formatError)(error)}`, 'error');
33
- (0, utils_1.log)({ data: backupDir }, `The log has been stored at ${{ data: backupDir } ? node_path_1.default.join(backupDir || __dirname, 'logs', 'import') : node_path_1.default.join(__dirname, 'logs')}`, 'info');
32
+ (0, utils_1.log)({ data: backupDir !== null && backupDir !== void 0 ? backupDir : (0, cli_utilities_1.pathValidator)(node_path_1.default.join(backupDir || __dirname, 'logs', 'import')) }, `Failed to import stack content - ${(0, utils_1.formatError)(error)}`, 'error');
33
+ (0, utils_1.log)({ data: backupDir }, `The log has been stored at ${{ data: backupDir } ? (0, cli_utilities_1.pathValidator)(node_path_1.default.join(backupDir || __dirname, 'logs', 'import')) : (0, cli_utilities_1.pathValidator)(node_path_1.default.join(__dirname, 'logs'))}`, 'info');
34
34
  }
35
35
  }
36
36
  }
@@ -148,7 +148,7 @@ const config = {
148
148
  taxonomies: {
149
149
  dirName: 'taxonomies',
150
150
  fileName: 'taxonomies.json',
151
- }
151
+ },
152
152
  },
153
153
  languagesCode: [
154
154
  'af-za',
@@ -388,5 +388,12 @@ const config = {
388
388
  // useBackedupDir: '',
389
389
  // backupConcurrency: 10,
390
390
  onlyTSModules: ['taxonomies'],
391
+ auditConfig: {
392
+ noLog: false,
393
+ skipConfirm: true,
394
+ returnResponse: true,
395
+ noTerminalOutput: false,
396
+ config: { basePath: '' }, // To overwrite any build-in config. And this config is equal to --config flag.
397
+ }
391
398
  };
392
399
  exports.default = config;
@@ -39,7 +39,7 @@ class ModuleImporter {
39
39
  // NOTE audit and fix the import content.
40
40
  if (!this.importConfig.skipAudit &&
41
41
  (!this.importConfig.moduleName ||
42
- ['content-types', 'global-fields', 'entries'].includes(this.importConfig.moduleName))) {
42
+ ['content-types', 'global-fields', 'entries', 'extensions', 'workflows'].includes(this.importConfig.moduleName))) {
43
43
  if (!(await this.auditImportData(logger))) {
44
44
  return { noSuccessMsg: true };
45
45
  }
@@ -97,13 +97,8 @@ class ModuleImporter {
97
97
  */
98
98
  async auditImportData(logger) {
99
99
  const basePath = (0, path_1.resolve)(this.importConfig.backupDir, 'logs', 'audit');
100
- const auditConfig = {
101
- noLog: false,
102
- skipConfirm: true,
103
- returnResponse: true,
104
- noTerminalOutput: false,
105
- config: { basePath }, // To overwrite any build-in config. This config is equal to --config flag.
106
- };
100
+ const auditConfig = this.importConfig.auditConfig;
101
+ auditConfig.config.basePath = basePath;
107
102
  try {
108
103
  const args = [
109
104
  '--data-dir',
@@ -118,7 +113,7 @@ class ModuleImporter {
118
113
  }
119
114
  else if (this.importConfig.modules.types.length) {
120
115
  this.importConfig.modules.types
121
- .filter((val) => ['content-types', 'global-fields', 'entries'].includes(val))
116
+ .filter((val) => ['content-types', 'global-fields', 'entries', 'extensions', 'workflows'].includes(val))
122
117
  .forEach((val) => {
123
118
  args.push('--modules', val);
124
119
  });
@@ -196,7 +196,7 @@ class ContentTypesImport extends base_class_1.default {
196
196
  }
197
197
  async updatePendingExtensions() {
198
198
  let apiContent = utils_1.fsUtil.readFile(this.extPendingPath);
199
- if (apiContent.length === 0) {
199
+ if ((apiContent === null || apiContent === void 0 ? void 0 : apiContent.length) === 0) {
200
200
  (0, utils_1.log)(this.importConfig, `No extensions found to be updated.`, 'success');
201
201
  return;
202
202
  }
@@ -146,4 +146,13 @@ export default interface DefaultConfig {
146
146
  createBackupDir?: string;
147
147
  overwriteSupportedModules: string[];
148
148
  onlyTSModules: string[];
149
+ auditConfig?: {
150
+ noLog?: boolean;
151
+ skipConfirm?: boolean;
152
+ returnResponse?: boolean;
153
+ noTerminalOutput?: boolean;
154
+ config?: {
155
+ basePath?: string;
156
+ } & Record<string, any>;
157
+ };
149
158
  }
@@ -234,8 +234,9 @@ const lookupAssets = function (data, mappedAssetUids, mappedAssetUrls, assetUidM
234
234
  assetUrls.forEach(function (assetUrl) {
235
235
  let mappedAssetUrl = mappedAssetUrls[assetUrl];
236
236
  if (typeof mappedAssetUrl !== 'undefined') {
237
- const escapedAssetUrl = assetUrl.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
238
- entry = entry.replace(new RegExp(escapedAssetUrl, 'img'), mappedAssetUrl);
237
+ const sanitizedUrl = (0, cli_utilities_1.escapeRegExp)(assetUrl);
238
+ const escapedMappedUrl = (0, cli_utilities_1.escapeRegExp)(mappedAssetUrl);
239
+ entry = entry.replace(new RegExp(sanitizedUrl, 'img'), escapedMappedUrl);
239
240
  matchedUrls.push(mappedAssetUrl);
240
241
  }
241
242
  else {
@@ -145,7 +145,11 @@ const field_rules_update = (importConfig, ctPath) => {
145
145
  management_token: importConfig.management_token,
146
146
  });
147
147
  let ctObj = stackAPIClient.contentType(schema.uid);
148
- Object.assign(ctObj, _.cloneDeep(schema));
148
+ //NOTE:- Remove this code Object.assign(ctObj, _.cloneDeep(schema)); -> security vulnerabilities due to mass assignment
149
+ const schemaKeys = Object.keys(schema);
150
+ for (const key of schemaKeys) {
151
+ ctObj[key] = _.cloneDeep(schema[key]);
152
+ }
149
153
  ctObj
150
154
  .update()
151
155
  .then(() => {
@@ -10,6 +10,7 @@ const path = tslib_1.__importStar(require("path"));
10
10
  const _ = tslib_1.__importStar(require("lodash"));
11
11
  const config_1 = tslib_1.__importDefault(require("../config"));
12
12
  const fileHelper = tslib_1.__importStar(require("./file-helper"));
13
+ const cli_utilities_1 = require("@contentstack/cli-utilities");
13
14
  // update references in entry object
14
15
  const lookupEntries = function (data, mappedUids, uidMapperPath) {
15
16
  let parent = [];
@@ -198,8 +199,9 @@ const lookupEntries = function (data, mappedUids, uidMapperPath) {
198
199
  let entry = JSON.stringify(data.entry);
199
200
  uids.forEach(function (uid) {
200
201
  if (mappedUids.hasOwnProperty(uid)) {
201
- const escapedUid = uid.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
202
- entry = entry.replace(new RegExp(escapedUid, 'img'), mappedUids[uid]);
202
+ const sanitizedUid = (0, cli_utilities_1.escapeRegExp)(uid);
203
+ const escapedMappedUid = (0, cli_utilities_1.escapeRegExp)(mappedUids[uid]);
204
+ entry = entry.replace(new RegExp(sanitizedUid, 'img'), escapedMappedUid);
203
205
  mapped.push(uid);
204
206
  }
205
207
  else {
@@ -22,6 +22,14 @@ const setupConfig = async (importCmdFlags) => {
22
22
  config = merge_1.default.recursive(config, externalConfig);
23
23
  }
24
24
  config.contentDir = importCmdFlags['data'] || importCmdFlags['data-dir'] || config.data || (await (0, interactive_1.askContentDir)());
25
+ const pattern = /[*$%#<>{}!&?]/g;
26
+ if (pattern.test(config.contentDir)) {
27
+ cli_utilities_1.cliux.print(`\nPlease add a directory path without any of the special characters: (*,&,{,},[,],$,%,<,>,?,!)`, {
28
+ color: 'yellow',
29
+ });
30
+ config.contentDir = await (0, interactive_1.askContentDir)();
31
+ }
32
+ config.contentDir = config.contentDir.replace(/['"]/g, '');
25
33
  config.contentDir = path.resolve(config.contentDir);
26
34
  //Note to support the old key
27
35
  config.data = config.contentDir;
@@ -7,11 +7,13 @@ const path = tslib_1.__importStar(require("path"));
7
7
  const first_1 = tslib_1.__importDefault(require("lodash/first"));
8
8
  const split_1 = tslib_1.__importDefault(require("lodash/split"));
9
9
  const askContentDir = async () => {
10
- const result = await cli_utilities_1.cliux.inquire({
10
+ let result = await cli_utilities_1.cliux.inquire({
11
11
  type: 'input',
12
12
  message: 'Enter the path for the content',
13
13
  name: 'dir',
14
+ validate: cli_utilities_1.validatePath,
14
15
  });
16
+ result = result.replace(/["']/g, '');
15
17
  return path.resolve(result);
16
18
  };
17
19
  exports.askContentDir = askContentDir;
package/lib/utils/log.js CHANGED
@@ -22,7 +22,7 @@ exports.log = log;
22
22
  function initLogger(config) {
23
23
  var _a;
24
24
  if (!logger) {
25
- const basePath = (0, path_1.join)((_a = config === null || config === void 0 ? void 0 : config.data) !== null && _a !== void 0 ? _a : process.cwd(), 'logs', 'import');
25
+ const basePath = (0, cli_utilities_1.pathValidator)((0, path_1.join)((_a = config === null || config === void 0 ? void 0 : config.data) !== null && _a !== void 0 ? _a : process.cwd(), 'logs', 'import'));
26
26
  exports.logger = logger = new cli_utilities_1.Logger(Object.assign(config !== null && config !== void 0 ? config : {}, { basePath }));
27
27
  }
28
28
  return logger;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.14.0",
2
+ "version": "1.14.2",
3
3
  "commands": {
4
4
  "cm:stacks:import": {
5
5
  "id": "cm:stacks:import",
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@contentstack/cli-cm-import",
3
3
  "description": "Contentstack CLI plugin to import content into stack",
4
- "version": "1.14.0",
4
+ "version": "1.14.2",
5
5
  "author": "Contentstack",
6
6
  "bugs": "https://github.com/contentstack/cli/issues",
7
7
  "dependencies": {
8
- "@contentstack/cli-audit": "~1.4.0",
8
+ "@contentstack/cli-audit": "~1.5.0",
9
9
  "@contentstack/cli-command": "~1.2.16",
10
- "@contentstack/cli-utilities": "~1.5.12",
10
+ "@contentstack/cli-utilities": "~1.6.0",
11
11
  "@contentstack/management": "~1.15.3",
12
12
  "@oclif/core": "^2.9.3",
13
13
  "big-json": "^3.2.0",