@contentstack/cli-cm-import 1.30.1 → 1.31.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.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/lib/commands/cm/stacks/import.d.ts +0 -1
- package/lib/commands/cm/stacks/import.js +4 -17
- package/lib/config/index.js +1 -1
- package/lib/import/modules/composable-studio.d.ts +1 -0
- package/lib/import/modules/composable-studio.js +7 -0
- package/lib/import/modules/content-types.d.ts +3 -1
- package/lib/import/modules/content-types.js +32 -1
- package/lib/import/modules/entries.d.ts +2 -0
- package/lib/import/modules/entries.js +32 -1
- package/lib/import/modules/global-fields.d.ts +1 -1
- package/lib/import/modules/global-fields.js +1 -1
- package/lib/import/modules/locales.d.ts +1 -1
- package/lib/import/modules/locales.js +1 -1
- package/lib/import/modules-js/assets.js +1 -1
- package/lib/import/modules-js/entries.js +1 -1
- package/lib/import/modules-js/environments.js +1 -1
- package/lib/import/modules-js/extensions.js +1 -1
- package/lib/import/modules-js/global-fields.js +1 -1
- package/lib/import/modules-js/labels.js +1 -1
- package/lib/import/modules-js/locales.js +1 -1
- package/lib/import/modules-js/marketplace-apps.js +1 -1
- package/lib/import/modules-js/webhooks.js +1 -1
- package/lib/import/modules-js/workflows.js +1 -1
- package/lib/types/index.d.ts +0 -19
- package/lib/utils/common-helper.d.ts +1 -1
- package/lib/utils/common-helper.js +1 -1
- package/lib/utils/content-type-helper.d.ts +1 -1
- package/lib/utils/content-type-helper.js +1 -1
- package/lib/utils/extension-helper.js +1 -1
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/login-handler.d.ts +1 -1
- package/lib/utils/login-handler.js +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +5 -5
package/LICENSE
CHANGED
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.
|
|
50
|
+
@contentstack/cli-cm-import/1.31.0 linux-x64 node-v22.21.1
|
|
51
51
|
$ csdx --help [COMMAND]
|
|
52
52
|
USAGE
|
|
53
53
|
$ csdx COMMAND
|
|
@@ -6,6 +6,7 @@ const import_1 = require("../../../import");
|
|
|
6
6
|
const utils_1 = require("../../../utils");
|
|
7
7
|
class ImportCommand extends cli_command_1.Command {
|
|
8
8
|
async run() {
|
|
9
|
+
var _a, _b;
|
|
9
10
|
// setup import config
|
|
10
11
|
// initialize the importer
|
|
11
12
|
// start import
|
|
@@ -15,9 +16,9 @@ class ImportCommand extends cli_command_1.Command {
|
|
|
15
16
|
const { flags } = await this.parse(ImportCommand);
|
|
16
17
|
importConfig = await (0, utils_1.setupImportConfig)(flags);
|
|
17
18
|
// Prepare the context object
|
|
18
|
-
|
|
19
|
-
importConfig.context =
|
|
20
|
-
//
|
|
19
|
+
(0, cli_utilities_1.createLogContext)(((_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.command) || 'cm:stacks:export', importConfig.apiKey, importConfig.authenticationMethod);
|
|
20
|
+
importConfig.context = { module: '' };
|
|
21
|
+
//log.info(`Using Cli Version: ${this.context?.cliVersion}`, importConfig.context);
|
|
21
22
|
// Note setting host to create cma client
|
|
22
23
|
importConfig.host = this.cmaHost;
|
|
23
24
|
importConfig.region = this.region;
|
|
@@ -51,20 +52,6 @@ class ImportCommand extends cli_command_1.Command {
|
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
|
-
// Create export context object
|
|
55
|
-
createImportContext(apiKey, authenticationMethod) {
|
|
56
|
-
var _a, _b, _c;
|
|
57
|
-
return {
|
|
58
|
-
command: ((_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.command) || 'cm:stacks:import',
|
|
59
|
-
module: '',
|
|
60
|
-
userId: cli_utilities_1.configHandler.get('userUid') || '',
|
|
61
|
-
email: cli_utilities_1.configHandler.get('email') || '',
|
|
62
|
-
sessionId: (_c = this.context) === null || _c === void 0 ? void 0 : _c.sessionId,
|
|
63
|
-
apiKey: apiKey || '',
|
|
64
|
-
orgId: cli_utilities_1.configHandler.get('oauthOrgUid') || '',
|
|
65
|
-
authenticationMethod: authenticationMethod || 'Basic Auth',
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
55
|
}
|
|
69
56
|
exports.default = ImportCommand;
|
|
70
57
|
ImportCommand.description = cli_utilities_1.messageHandler.parse('Import content from a stack');
|
package/lib/config/index.js
CHANGED
|
@@ -33,6 +33,7 @@ const config = {
|
|
|
33
33
|
'stack',
|
|
34
34
|
'assets',
|
|
35
35
|
'taxonomies',
|
|
36
|
+
'composable-studio',
|
|
36
37
|
'extensions',
|
|
37
38
|
'marketplace-apps',
|
|
38
39
|
'global-fields',
|
|
@@ -44,7 +45,6 @@ const config = {
|
|
|
44
45
|
'variant-entries',
|
|
45
46
|
'labels',
|
|
46
47
|
'webhooks',
|
|
47
|
-
'composable-studio',
|
|
48
48
|
],
|
|
49
49
|
locales: {
|
|
50
50
|
dirName: 'locales',
|
|
@@ -12,6 +12,7 @@ class ImportComposableStudio {
|
|
|
12
12
|
this.composableStudioConfig = importConfig.modules['composable-studio'];
|
|
13
13
|
// Setup paths
|
|
14
14
|
this.composableStudioPath = (0, node_path_1.join)(this.importConfig.backupDir, this.composableStudioConfig.dirName);
|
|
15
|
+
this.projectMapperPath = (0, node_path_1.join)(this.importConfig.backupDir, 'mapper', this.composableStudioConfig.dirName);
|
|
15
16
|
this.composableStudioFilePath = (0, node_path_1.join)(this.composableStudioPath, this.composableStudioConfig.fileName);
|
|
16
17
|
this.envUidMapperPath = (0, node_path_1.join)(this.importConfig.backupDir, 'mapper', 'environments', 'uid-mapping.json');
|
|
17
18
|
this.envUidMapper = {};
|
|
@@ -179,6 +180,12 @@ class ImportComposableStudio {
|
|
|
179
180
|
if (response.status >= 200 && response.status < 300) {
|
|
180
181
|
projectCreated = true;
|
|
181
182
|
cli_utilities_1.log.debug(`Project created successfully with UID: ${(_c = response.data) === null || _c === void 0 ? void 0 : _c.uid}`, this.importConfig.context);
|
|
183
|
+
// Create mapper directory if it doesn't exist
|
|
184
|
+
await utils_1.fsUtil.makeDirectory(this.projectMapperPath);
|
|
185
|
+
// write the project to file
|
|
186
|
+
const projectFileSuccessPath = (0, node_path_1.join)(this.projectMapperPath, this.composableStudioConfig.fileName);
|
|
187
|
+
utils_1.fsUtil.writeFile(projectFileSuccessPath, response.data);
|
|
188
|
+
cli_utilities_1.log.debug(`Project written to: ${projectFileSuccessPath}`, this.importConfig.context);
|
|
182
189
|
}
|
|
183
190
|
else {
|
|
184
191
|
throw new Error(`API call failed with status ${response.status}: ${JSON.stringify(response.data)}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Contentstack Import
|
|
3
|
-
* Copyright (c)
|
|
3
|
+
* Copyright (c) 2026 Contentstack LLC
|
|
4
4
|
* MIT Licensed
|
|
5
5
|
*/
|
|
6
6
|
import { ModuleClassParams } from '../../types';
|
|
@@ -34,6 +34,8 @@ export default class ContentTypesImport extends BaseClass {
|
|
|
34
34
|
taxonomies: Record<string, unknown>;
|
|
35
35
|
private extPendingPath;
|
|
36
36
|
private isExtensionsUpdate;
|
|
37
|
+
private composableStudioSuccessPath;
|
|
38
|
+
private composableStudioExportPath;
|
|
37
39
|
constructor({ importConfig, stackAPIClient }: ModuleClassParams);
|
|
38
40
|
start(): Promise<any>;
|
|
39
41
|
seedCTs(): Promise<any>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/* eslint-disable no-prototype-builtins */
|
|
3
3
|
/*!
|
|
4
4
|
* Contentstack Import
|
|
5
|
-
* Copyright (c)
|
|
5
|
+
* Copyright (c) 2026 Contentstack LLC
|
|
6
6
|
* MIT Licensed
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -34,6 +34,15 @@ class ContentTypesImport extends base_class_1.default {
|
|
|
34
34
|
['schema.json', 'true'],
|
|
35
35
|
['.DS_Store', 'true'],
|
|
36
36
|
]);
|
|
37
|
+
// Initialize composable studio paths if config exists
|
|
38
|
+
if (this.importConfig.modules['composable-studio']) {
|
|
39
|
+
this.composableStudioSuccessPath = path.join((0, cli_utilities_1.sanitizePath)(this.importConfig.data), 'mapper', this.importConfig.modules['composable-studio'].dirName, this.importConfig.modules['composable-studio'].fileName);
|
|
40
|
+
this.composableStudioExportPath = path.join((0, cli_utilities_1.sanitizePath)(this.importConfig.data), this.importConfig.modules['composable-studio'].dirName, this.importConfig.modules['composable-studio'].fileName);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.composableStudioSuccessPath = '';
|
|
44
|
+
this.composableStudioExportPath = '';
|
|
45
|
+
}
|
|
37
46
|
this.cTs = [];
|
|
38
47
|
this.createdCTs = [];
|
|
39
48
|
this.titleToUIdMap = new Map();
|
|
@@ -59,6 +68,28 @@ class ContentTypesImport extends base_class_1.default {
|
|
|
59
68
|
return;
|
|
60
69
|
}
|
|
61
70
|
cli_utilities_1.log.debug(`Found ${this.cTs.length} content types to import`, this.importConfig.context);
|
|
71
|
+
// If success file doesn't exist but export file does, skip the composition content type
|
|
72
|
+
// Only check if composable studio paths are configured
|
|
73
|
+
if (this.composableStudioSuccessPath &&
|
|
74
|
+
this.composableStudioExportPath &&
|
|
75
|
+
!utils_1.fileHelper.fileExistsSync(this.composableStudioSuccessPath) &&
|
|
76
|
+
utils_1.fileHelper.fileExistsSync(this.composableStudioExportPath)) {
|
|
77
|
+
const exportedProject = utils_1.fileHelper.readFileSync(this.composableStudioExportPath);
|
|
78
|
+
if (exportedProject === null || exportedProject === void 0 ? void 0 : exportedProject.contentTypeUid) {
|
|
79
|
+
const originalCount = this.cTs.length;
|
|
80
|
+
this.cTs = this.cTs.filter((ct) => {
|
|
81
|
+
const shouldSkip = ct.uid === exportedProject.contentTypeUid;
|
|
82
|
+
if (shouldSkip) {
|
|
83
|
+
cli_utilities_1.log.info(`Skipping content type '${ct.uid}' as Composable Studio project was not created successfully`, this.importConfig.context);
|
|
84
|
+
}
|
|
85
|
+
return !shouldSkip;
|
|
86
|
+
});
|
|
87
|
+
const skippedCount = originalCount - this.cTs.length;
|
|
88
|
+
if (skippedCount > 0) {
|
|
89
|
+
cli_utilities_1.log.debug(`Filtered out ${skippedCount} composition content type(s) from import`, this.importConfig.context);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
62
93
|
await utils_1.fsUtil.makeDirectory(this.cTsMapperPath);
|
|
63
94
|
cli_utilities_1.log.debug('Created content types mapper directory.', this.importConfig.context);
|
|
64
95
|
this.installedExtensions = (utils_1.fsUtil.readFile(this.marketplaceAppMapperPath) || { extension_uid: {} }).extension_uid;
|
|
@@ -38,6 +38,8 @@ export default class EntriesImport extends BaseClass {
|
|
|
38
38
|
locale: string;
|
|
39
39
|
entry_uid: string;
|
|
40
40
|
}>;
|
|
41
|
+
private composableStudioSuccessPath;
|
|
42
|
+
private composableStudioExportPath;
|
|
41
43
|
constructor({ importConfig, stackAPIClient }: ModuleClassParams);
|
|
42
44
|
start(): Promise<any>;
|
|
43
45
|
/**
|
|
@@ -4,7 +4,7 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
/* eslint-disable no-prototype-builtins */
|
|
5
5
|
/*!
|
|
6
6
|
* Contentstack Import
|
|
7
|
-
* Copyright (c)
|
|
7
|
+
* Copyright (c) 2026 Contentstack LLC
|
|
8
8
|
* MIT Licensed
|
|
9
9
|
*/
|
|
10
10
|
const path = tslib_1.__importStar(require("path"));
|
|
@@ -31,6 +31,15 @@ class EntriesImport extends base_class_1.default {
|
|
|
31
31
|
this.entriesPath = path.resolve((0, cli_utilities_1.sanitizePath)(importConfig.data), (0, cli_utilities_1.sanitizePath)(this.entriesConfig.dirName));
|
|
32
32
|
this.cTsPath = path.resolve((0, cli_utilities_1.sanitizePath)(importConfig.data), (0, cli_utilities_1.sanitizePath)(importConfig.modules['content-types'].dirName));
|
|
33
33
|
this.localesPath = path.resolve((0, cli_utilities_1.sanitizePath)(importConfig.data), (0, cli_utilities_1.sanitizePath)(importConfig.modules.locales.dirName), (0, cli_utilities_1.sanitizePath)(importConfig.modules.locales.fileName));
|
|
34
|
+
// Initialize composable studio paths if config exists
|
|
35
|
+
if (this.importConfig.modules['composable-studio']) {
|
|
36
|
+
this.composableStudioSuccessPath = path.join((0, cli_utilities_1.sanitizePath)(this.importConfig.data), 'mapper', this.importConfig.modules['composable-studio'].dirName, this.importConfig.modules['composable-studio'].fileName);
|
|
37
|
+
this.composableStudioExportPath = path.join((0, cli_utilities_1.sanitizePath)(this.importConfig.data), this.importConfig.modules['composable-studio'].dirName, this.importConfig.modules['composable-studio'].fileName);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.composableStudioSuccessPath = '';
|
|
41
|
+
this.composableStudioExportPath = '';
|
|
42
|
+
}
|
|
34
43
|
this.importConcurrency = this.entriesConfig.importConcurrency || importConfig.importConcurrency;
|
|
35
44
|
this.entriesUidMapper = {};
|
|
36
45
|
this.modifiedCTs = [];
|
|
@@ -52,6 +61,28 @@ class EntriesImport extends base_class_1.default {
|
|
|
52
61
|
return;
|
|
53
62
|
}
|
|
54
63
|
cli_utilities_1.log.debug(`Found ${this.cTs.length} content types for entry import`, this.importConfig.context);
|
|
64
|
+
// If success file doesn't exist but export file does, skip the composition entries
|
|
65
|
+
// Only check if composable studio paths are configured
|
|
66
|
+
if (this.composableStudioSuccessPath &&
|
|
67
|
+
this.composableStudioExportPath &&
|
|
68
|
+
!utils_1.fileHelper.fileExistsSync(this.composableStudioSuccessPath) &&
|
|
69
|
+
utils_1.fileHelper.fileExistsSync(this.composableStudioExportPath)) {
|
|
70
|
+
const exportedProject = utils_1.fileHelper.readFileSync(this.composableStudioExportPath);
|
|
71
|
+
if (exportedProject === null || exportedProject === void 0 ? void 0 : exportedProject.contentTypeUid) {
|
|
72
|
+
const originalCount = this.cTs.length;
|
|
73
|
+
this.cTs = this.cTs.filter((ct) => {
|
|
74
|
+
const shouldSkip = ct.uid === exportedProject.contentTypeUid;
|
|
75
|
+
if (shouldSkip) {
|
|
76
|
+
cli_utilities_1.log.info(`Skipping entries for content type '${ct.uid}' as Composable Studio project was not created successfully`, this.importConfig.context);
|
|
77
|
+
}
|
|
78
|
+
return !shouldSkip;
|
|
79
|
+
});
|
|
80
|
+
const skippedCount = originalCount - this.cTs.length;
|
|
81
|
+
if (skippedCount > 0) {
|
|
82
|
+
cli_utilities_1.log.debug(`Filtered out ${skippedCount} composition content type(s) from entry import`, this.importConfig.context);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
55
86
|
this.installedExtensions = (utils_1.fsUtil.readFile(this.marketplaceAppMapperPath) || { extension_uid: {} }).extension_uid;
|
|
56
87
|
cli_utilities_1.log.debug('Loaded installed extensions for entry processing.', this.importConfig.context);
|
|
57
88
|
this.assetUidMapper = utils_1.fsUtil.readFile(this.assetUidMapperPath) || {};
|
package/lib/types/index.d.ts
CHANGED
|
@@ -98,15 +98,7 @@ export interface ComposableStudioProject {
|
|
|
98
98
|
updatedAt?: string;
|
|
99
99
|
}
|
|
100
100
|
export interface Context {
|
|
101
|
-
command: string;
|
|
102
101
|
module: string;
|
|
103
|
-
userId: string | undefined;
|
|
104
|
-
email: string | undefined;
|
|
105
|
-
sessionId: string | undefined;
|
|
106
|
-
clientId?: string | undefined;
|
|
107
|
-
apiKey: string;
|
|
108
|
-
orgId: string;
|
|
109
|
-
authenticationMethod?: string;
|
|
110
102
|
}
|
|
111
103
|
export { default as DefaultConfig } from './default-config';
|
|
112
104
|
export { default as ImportConfig } from './import-config';
|
|
@@ -117,14 +109,3 @@ export type ExtensionType = {
|
|
|
117
109
|
scope: Record<string, unknown>;
|
|
118
110
|
title: string;
|
|
119
111
|
};
|
|
120
|
-
export interface Context {
|
|
121
|
-
command: string;
|
|
122
|
-
module: string;
|
|
123
|
-
userId: string | undefined;
|
|
124
|
-
email: string | undefined;
|
|
125
|
-
sessionId: string | undefined;
|
|
126
|
-
clientId?: string | undefined;
|
|
127
|
-
apiKey: string;
|
|
128
|
-
orgId: string;
|
|
129
|
-
authenticationMethod?: string;
|
|
130
|
-
}
|
|
@@ -42,7 +42,7 @@ export declare const schemaTemplate: {
|
|
|
42
42
|
};
|
|
43
43
|
/*!
|
|
44
44
|
* Contentstack Import
|
|
45
|
-
* Copyright (c)
|
|
45
|
+
* Copyright (c) 2026 Contentstack LLC
|
|
46
46
|
* MIT Licensed
|
|
47
47
|
*/
|
|
48
48
|
export declare const suppressSchemaReference: (schema: any, flag: any) => void;
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.lookupExtension = void 0;
|
|
7
7
|
/*!
|
|
8
8
|
* Contentstack Import
|
|
9
|
-
* Copyright (c)
|
|
9
|
+
* Copyright (c) 2026 Contentstack LLC
|
|
10
10
|
* MIT Licensed
|
|
11
11
|
*/
|
|
12
12
|
const node_path_1 = require("node:path");
|
package/lib/utils/logger.d.ts
CHANGED
package/lib/utils/logger.js
CHANGED
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentstack/cli-cm-import",
|
|
3
3
|
"description": "Contentstack CLI plugin to import content into stack",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.31.0",
|
|
5
5
|
"author": "Contentstack",
|
|
6
6
|
"bugs": "https://github.com/contentstack/cli/issues",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@contentstack/cli-audit": "~1.
|
|
9
|
-
"@contentstack/cli-command": "~1.7.
|
|
10
|
-
"@contentstack/cli-utilities": "~1.
|
|
8
|
+
"@contentstack/cli-audit": "~1.17.0",
|
|
9
|
+
"@contentstack/cli-command": "~1.7.1",
|
|
10
|
+
"@contentstack/cli-utilities": "~1.16.0",
|
|
11
11
|
"@contentstack/management": "~1.22.0",
|
|
12
|
-
"@contentstack/cli-variants": "~1.3.
|
|
12
|
+
"@contentstack/cli-variants": "~1.3.6",
|
|
13
13
|
"@oclif/core": "^4.3.0",
|
|
14
14
|
"big-json": "^3.2.0",
|
|
15
15
|
"bluebird": "^3.7.2",
|