@kontent-ai/migration-toolkit 2.2.2 → 2.3.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.
Files changed (80) hide show
  1. package/README.md +10 -9
  2. package/dist/es2022/core/logs/loggers.js +4 -1
  3. package/dist/es2022/core/logs/loggers.js.map +1 -1
  4. package/dist/es2022/core/models/core.models.d.ts +12 -0
  5. package/dist/es2022/core/models/log.models.d.ts +1 -1
  6. package/dist/es2022/core/models/migration.schema.d.ts +12 -12
  7. package/dist/es2022/core/models/migration.schema.js +2 -2
  8. package/dist/es2022/core/models/migration.schema.js.map +1 -1
  9. package/dist/es2022/core/utils/binary-data.utils.d.ts +4 -4
  10. package/dist/es2022/core/utils/binary-data.utils.js +2 -2
  11. package/dist/es2022/core/utils/binary-data.utils.js.map +1 -1
  12. package/dist/es2022/core/utils/global.utils.d.ts +3 -3
  13. package/dist/es2022/core/utils/global.utils.js +1 -1
  14. package/dist/es2022/core/utils/global.utils.js.map +1 -1
  15. package/dist/es2022/core/utils/http.utils.js +0 -3
  16. package/dist/es2022/core/utils/http.utils.js.map +1 -1
  17. package/dist/es2022/core/utils/processing-utils.d.ts +3 -3
  18. package/dist/es2022/core/utils/processing-utils.js +31 -4
  19. package/dist/es2022/core/utils/processing-utils.js.map +1 -1
  20. package/dist/es2022/export/context/export-context-fetcher.js +13 -7
  21. package/dist/es2022/export/context/export-context-fetcher.js.map +1 -1
  22. package/dist/es2022/export/export-manager.js +5 -4
  23. package/dist/es2022/export/export-manager.js.map +1 -1
  24. package/dist/es2022/file/file-manager.d.ts +3 -2
  25. package/dist/es2022/file/file-manager.js.map +1 -1
  26. package/dist/es2022/import/context/import-context-fetcher.js +14 -8
  27. package/dist/es2022/import/context/import-context-fetcher.js.map +1 -1
  28. package/dist/es2022/import/import-manager.d.ts +4 -0
  29. package/dist/es2022/import/import-manager.js +133 -4
  30. package/dist/es2022/import/import-manager.js.map +1 -1
  31. package/dist/es2022/import/import.models.d.ts +15 -5
  32. package/dist/es2022/import/importers/assets-importer.js.map +1 -1
  33. package/dist/es2022/import/importers/content-items-importer.d.ts +3 -3
  34. package/dist/es2022/import/importers/content-items-importer.js +11 -5
  35. package/dist/es2022/import/importers/content-items-importer.js.map +1 -1
  36. package/dist/es2022/import/importers/language-variant-importer.d.ts +4 -4
  37. package/dist/es2022/import/importers/language-variant-importer.js +4 -4
  38. package/dist/es2022/import/importers/language-variant-importer.js.map +1 -1
  39. package/dist/es2022/metadata.js +2 -2
  40. package/dist/es2022/node/cli/actions/import-action.js +3 -1
  41. package/dist/es2022/node/cli/actions/import-action.js.map +1 -1
  42. package/dist/es2022/toolkit/file.js +2 -2
  43. package/dist/es2022/toolkit/file.js.map +1 -1
  44. package/dist/es2022/toolkit/import.js +14 -2
  45. package/dist/es2022/toolkit/import.js.map +1 -1
  46. package/dist/es2022/translation/extraction/items-extraction.processor.d.ts +1 -1
  47. package/dist/es2022/translation/extraction/items-extraction.processor.js.map +1 -1
  48. package/dist/es2022/zip/zip-manager.d.ts +2 -2
  49. package/dist/es2022/zip/zip-manager.js.map +1 -1
  50. package/dist/es2022/zip/zip-packager.js +3 -4
  51. package/dist/es2022/zip/zip-packager.js.map +1 -1
  52. package/dist/es2022/zip/zip-transformer.js.map +1 -1
  53. package/dist/es2022/zip/zip.models.d.ts +4 -4
  54. package/lib/core/logs/loggers.ts +5 -1
  55. package/lib/core/models/core.models.ts +16 -0
  56. package/lib/core/models/log.models.ts +1 -1
  57. package/lib/core/models/migration.schema.ts +2 -2
  58. package/lib/core/utils/binary-data.utils.ts +6 -6
  59. package/lib/core/utils/global.utils.ts +8 -5
  60. package/lib/core/utils/http.utils.ts +1 -4
  61. package/lib/core/utils/processing-utils.ts +48 -18
  62. package/lib/export/context/export-context-fetcher.ts +67 -60
  63. package/lib/export/export-manager.ts +58 -56
  64. package/lib/file/file-manager.ts +4 -3
  65. package/lib/import/context/import-context-fetcher.ts +18 -13
  66. package/lib/import/import-manager.ts +174 -10
  67. package/lib/import/import.models.ts +20 -4
  68. package/lib/import/importers/assets-importer.ts +3 -9
  69. package/lib/import/importers/content-items-importer.ts +18 -17
  70. package/lib/import/importers/language-variant-importer.ts +32 -34
  71. package/lib/metadata.ts +2 -2
  72. package/lib/node/cli/actions/import-action.ts +3 -1
  73. package/lib/toolkit/file.ts +2 -2
  74. package/lib/toolkit/import.ts +16 -2
  75. package/lib/translation/extraction/items-extraction.processor.ts +3 -3
  76. package/lib/zip/zip-manager.ts +2 -2
  77. package/lib/zip/zip-packager.ts +3 -4
  78. package/lib/zip/zip-transformer.ts +1 -1
  79. package/lib/zip/zip.models.ts +3 -3
  80. package/package.json +13 -13
@@ -1,4 +1,4 @@
1
- import { ContentItemModels, ElementContracts, LanguageVariantModels, ManagementClient, WorkflowModels } from '@kontent-ai/management-sdk';
1
+ import { ElementContracts, LanguageVariantModels, ManagementClient, WorkflowModels } from '@kontent-ai/management-sdk';
2
2
  import chalk from 'chalk';
3
3
  import { match } from 'ts-pattern';
4
4
  import {
@@ -16,13 +16,13 @@ import {
16
16
  workflowHelper
17
17
  } from '../../core/index.js';
18
18
  import { importTransforms } from '../../translation/index.js';
19
- import { ImportContext } from '../import.models.js';
19
+ import { ImportContext, ImportedItem, ImportedLanguageVariant } from '../import.models.js';
20
20
  import { throwErrorForMigrationItem } from '../utils/import.utils.js';
21
21
  import { workflowImporter as workflowImporterInit } from './workflow-importer.js';
22
22
 
23
23
  export function languageVariantImporter(config: {
24
24
  readonly logger: Logger;
25
- readonly preparedContentItems: readonly ContentItemModels.ContentItem[];
25
+ readonly preparedContentItems: readonly ImportedItem[];
26
26
  readonly importContext: ImportContext;
27
27
  readonly client: Readonly<ManagementClient>;
28
28
  }) {
@@ -37,7 +37,7 @@ export function languageVariantImporter(config: {
37
37
  readonly logSpinner: LogSpinnerData;
38
38
  readonly migrationItem: MigrationItem;
39
39
  readonly migrationItemVersion: MigrationItemVersion;
40
- readonly preparedContentItem: Readonly<ContentItemModels.ContentItem>;
40
+ readonly preparedContentItem: ImportedItem;
41
41
  }): Promise<Readonly<LanguageVariantModels.ContentItemLanguageVariant>> => {
42
42
  return await runMapiRequestAsync({
43
43
  logger: config.logger,
@@ -45,7 +45,7 @@ export function languageVariantImporter(config: {
45
45
  return (
46
46
  await config.client
47
47
  .upsertLanguageVariant()
48
- .byItemCodename(data.preparedContentItem.codename)
48
+ .byItemCodename(data.preparedContentItem.inputItem.system.codename)
49
49
  .byLanguageCodename(data.migrationItem.system.language.codename)
50
50
  .withData(() => {
51
51
  return {
@@ -110,7 +110,7 @@ export function languageVariantImporter(config: {
110
110
  readonly logSpinner: LogSpinnerData;
111
111
  readonly migrationItem: MigrationItem;
112
112
  readonly migrationItemVersion: MigrationItemVersion;
113
- readonly preparedContentItem: Readonly<ContentItemModels.ContentItem>;
113
+ readonly preparedContentItem: ImportedItem;
114
114
  readonly createNewVersion?: boolean;
115
115
  }): Promise<Readonly<LanguageVariantModels.ContentItemLanguageVariant>> => {
116
116
  // validate workflow
@@ -158,7 +158,7 @@ export function languageVariantImporter(config: {
158
158
  const importLanguageVariantAsync = async (
159
159
  logSpinner: LogSpinnerData,
160
160
  migrationItem: MigrationItem,
161
- preparedContentItem: Readonly<ContentItemModels.ContentItem>
161
+ preparedContentItem: ImportedItem
162
162
  ): Promise<readonly LanguageVariantModels.ContentItemLanguageVariant[]> => {
163
163
  const { draftVersion, publishedVersion } = categorizeVersions(migrationItem);
164
164
 
@@ -297,7 +297,7 @@ export function languageVariantImporter(config: {
297
297
  return importTransformResult;
298
298
  };
299
299
 
300
- const importAsync = async (): Promise<readonly Readonly<LanguageVariantModels.ContentItemLanguageVariant>[]> => {
300
+ const importAsync = async (): Promise<readonly ImportedLanguageVariant[]> => {
301
301
  config.logger.log({
302
302
  type: 'info',
303
303
  message: `Importing '${chalk.yellow(
@@ -305,32 +305,30 @@ export function languageVariantImporter(config: {
305
305
  )}' language variants`
306
306
  });
307
307
 
308
- return (
309
- await processItemsAsync<MigrationItem, readonly Readonly<LanguageVariantModels.ContentItemLanguageVariant>[]>({
310
- action: 'Importing language variants',
311
- logger: config.logger,
312
- parallelLimit: 1,
313
- items: config.importContext.categorizedImportData.contentItems,
314
- itemInfo: (input) => {
315
- return {
316
- itemType: 'languageVariant',
317
- title: input.system.name,
318
- partA: input.system.language.codename
319
- };
320
- },
321
- processAsync: async (migrationItem, logSpinner) => {
322
- const contentItem = findRequired(
323
- config.preparedContentItems,
324
- (item) => item.codename === migrationItem.system.codename,
325
- `Missing content item with codename '${chalk.red(
326
- migrationItem.system.codename
327
- )}'. Content item should have been prepepared.`
328
- );
329
-
330
- return await importLanguageVariantAsync(logSpinner, migrationItem, contentItem);
331
- }
332
- })
333
- ).flatMap((m) => m.map((s) => s));
308
+ return await processItemsAsync<MigrationItem, readonly Readonly<LanguageVariantModels.ContentItemLanguageVariant>[]>({
309
+ action: 'Importing language variants',
310
+ logger: config.logger,
311
+ parallelLimit: 1,
312
+ items: config.importContext.categorizedImportData.contentItems,
313
+ itemInfo: (input) => {
314
+ return {
315
+ itemType: 'languageVariant',
316
+ title: input.system.name,
317
+ partA: input.system.language.codename
318
+ };
319
+ },
320
+ processAsync: async (migrationItem, logSpinner) => {
321
+ const contentItem = findRequired(
322
+ config.preparedContentItems,
323
+ (item) => item.inputItem.system.codename === migrationItem.system.codename,
324
+ `Missing content item with codename '${chalk.red(
325
+ migrationItem.system.codename
326
+ )}'. Content item should have been prepepared.`
327
+ );
328
+
329
+ return await importLanguageVariantAsync(logSpinner, migrationItem, contentItem);
330
+ }
331
+ });
334
332
  };
335
333
 
336
334
  return {
package/lib/metadata.ts CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  export const libMetadata = {
3
3
  name: '@kontent-ai/migration-toolkit',
4
- timestamp: 'Thu, 07 Nov 2024 07:54:04 GMT',
5
- version: '2.2.2'
4
+ timestamp: 'Thu, 12 Dec 2024 13:23:40 GMT',
5
+ version: '2.3.0'
6
6
  };
@@ -7,6 +7,7 @@ export async function importActionAsync(argsFetcher: CliArgumentsFetcher): Promi
7
7
  const environmentId = argsFetcher.getRequiredArgumentValue('targetEnvironmentId');
8
8
  const apiKey = argsFetcher.getRequiredArgumentValue('targetApiKey');
9
9
  const baseUrl = argsFetcher.getOptionalArgumentValue('baseUrl');
10
+ const createReportFile = argsFetcher.getBooleanArgumentValue('createReportFile', false);
10
11
  const force = argsFetcher.getBooleanArgumentValue('force', false);
11
12
  const filename = argsFetcher.getOptionalArgumentValue('filename') ?? defaultZipFilename;
12
13
 
@@ -27,7 +28,8 @@ export async function importActionAsync(argsFetcher: CliArgumentsFetcher): Promi
27
28
  data: importData,
28
29
  baseUrl: baseUrl,
29
30
  environmentId: environmentId,
30
- apiKey: apiKey
31
+ apiKey: apiKey,
32
+ createReportFile: createReportFile
31
33
  });
32
34
 
33
35
  log.log({ type: 'completed', message: `Import has been successful` });
@@ -1,4 +1,4 @@
1
- import { Buffer } from 'buffer';
1
+ import { Buffer as BufferProxy } from 'buffer';
2
2
  import { defaultZipFilename, executeWithTrackingAsync, getDefaultLogger, Logger, MigrationData } from '../core/index.js';
3
3
  import { fileManager } from '../file/index.js';
4
4
  import { libMetadata } from '../metadata.js';
@@ -33,7 +33,7 @@ export async function storeAsync(config: StoreConfig): Promise<void> {
33
33
  func: async () => {
34
34
  const zipData = await zipManager(logger).createZipAsync(config.data);
35
35
 
36
- if (zipData instanceof Buffer) {
36
+ if (zipData instanceof BufferProxy) {
37
37
  await fileManager(logger).writeFileAsync(filename, zipData);
38
38
  } else {
39
39
  throw Error(`Cannot store '${filename}' on File system because the provided zip is not a Buffer`);
@@ -1,5 +1,7 @@
1
+ import chalk from 'chalk';
2
+ import { writeFile } from 'fs/promises';
1
3
  import { executeWithTrackingAsync } from '../core/index.js';
2
- import { ImportConfig, ImportResult, importManager } from '../import/index.js';
4
+ import { ImportConfig, ImportResult, importManager as _importManager } from '../import/index.js';
3
5
  import { libMetadata } from '../metadata.js';
4
6
 
5
7
  export async function importAsync(config: ImportConfig): Promise<ImportResult> {
@@ -15,7 +17,19 @@ export async function importAsync(config: ImportConfig): Promise<ImportResult> {
15
17
  details: {}
16
18
  },
17
19
  func: async () => {
18
- return await importManager(config).importAsync();
20
+ const importManager = _importManager(config);
21
+ const importResult = await importManager.importAsync();
22
+
23
+ if (config.createReportFile) {
24
+ const reportFile = importManager.getReportFile(importResult);
25
+ await writeFile(reportFile.filename, reportFile.content);
26
+ config.logger?.log({
27
+ type: 'writeFs',
28
+ message: `Report '${chalk.yellow(reportFile.filename)}' was created`
29
+ });
30
+ }
31
+
32
+ return importResult;
19
33
  },
20
34
  logger: config.logger
21
35
  });
@@ -12,7 +12,7 @@ import { GetFlattenedElementByCodenames } from '../../import/index.js';
12
12
  import { richTextProcessor } from '../index.js';
13
13
 
14
14
  export interface ExtractItemById {
15
- readonly elements: Readonly<ElementModels.ContentItemElement>[];
15
+ readonly elements: readonly Readonly<ElementModels.ContentItemElement>[];
16
16
  readonly contentTypeId: string;
17
17
  }
18
18
 
@@ -95,7 +95,7 @@ export function itemsExtractionProcessor() {
95
95
  { itemIds: new Set(), assetIds: new Set() }
96
96
  );
97
97
 
98
- return <ReferencedDataInLanguageVariants>{
98
+ return {
99
99
  itemIds: extractedIds.itemIds,
100
100
  assetIds: extractedIds.assetIds
101
101
  };
@@ -175,7 +175,7 @@ export function itemsExtractionProcessor() {
175
175
  }
176
176
  );
177
177
 
178
- return <ReferencedDataInMigrationItems>{
178
+ return {
179
179
  itemCodenames: extractedCodenames.itemCodenames,
180
180
  assetCodenames: extractedCodenames.assetCodenames
181
181
  };
@@ -1,4 +1,4 @@
1
- import { Buffer } from 'buffer';
1
+ import { Buffer as BufferProxy } from 'buffer';
2
2
  import JSZip from 'jszip';
3
3
  import { Logger, MigrationData, getDefaultLogger } from '../core/index.js';
4
4
  import { zipPackager } from './zip-packager.js';
@@ -17,7 +17,7 @@ export function zipManager(logger?: Logger) {
17
17
  return await zipTransformer(zipPackager(new JSZip()), loggerToUse).transformAsync(migrationData);
18
18
  };
19
19
 
20
- const parseZipAsync = async (zipFile: Buffer): Promise<MigrationData> => {
20
+ const parseZipAsync = async (zipFile: BufferProxy): Promise<MigrationData> => {
21
21
  loggerToUse.log({
22
22
  type: 'info',
23
23
  message: `Parsing zip file`
@@ -1,4 +1,4 @@
1
- import { Buffer } from 'buffer';
1
+ import { Buffer as BufferProxy } from 'buffer';
2
2
  import chalk from 'chalk';
3
3
  import JSZip from 'jszip';
4
4
  import { match } from 'ts-pattern';
@@ -23,7 +23,7 @@ export function zipPackager(jsZip: JSZip): ZipPackager {
23
23
  (data) => data.size
24
24
  )
25
25
  .when(
26
- (data) => data instanceof Buffer,
26
+ (data) => data instanceof BufferProxy,
27
27
  (data) => data.byteLength
28
28
  )
29
29
  .otherwise(() => {
@@ -75,8 +75,7 @@ export function zipPackager(jsZip: JSZip): ZipPackager {
75
75
  return result;
76
76
  },
77
77
  async getBinaryDataAsync(filePath: string): Promise<FileBinaryData | undefined> {
78
- const binaryData = await jsZip.file(filePath)?.async(getZipOutputType());
79
- return binaryData;
78
+ return await jsZip.file(filePath)?.async(getZipOutputType());
80
79
  },
81
80
  async getFileContentAsync(filePath: string): Promise<string | undefined> {
82
81
  return await jsZip.file(filePath)?.async('string');
@@ -21,7 +21,7 @@ export function zipTransformer(zip: ZipPackager, logger?: Logger) {
21
21
  const assetsFilename: string = 'assets.json';
22
22
  const assetsBinaryFolderName: string = 'binary_data';
23
23
 
24
- const getAssetFolderConfig = (asset: MigrationAsset): { partialColder: string; fullPath: string } => {
24
+ const getAssetFolderConfig = (asset: MigrationAsset): { readonly partialColder: string; readonly fullPath: string } => {
25
25
  const codenamePartialFolder: string = asset.codename.slice(0, 2);
26
26
  return {
27
27
  partialColder: codenamePartialFolder,
@@ -1,13 +1,13 @@
1
- import { Buffer } from 'buffer';
1
+ import { Buffer as BufferProxy } from 'buffer';
2
2
  import { Logger } from '../core/index.js';
3
3
 
4
- export type FileBinaryData = Buffer | Blob;
4
+ export type FileBinaryData = BufferProxy | Blob;
5
5
  export type ZipCompressionLevel = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
6
6
 
7
7
  export type ZipPackager = {
8
8
  addFile(filePath: string, data: string | FileBinaryData): void;
9
9
  addFolder(name: string): ZipPackager;
10
- generateZipAsync(config: { logger?: Logger; compressionLevel?: ZipCompressionLevel }): Promise<FileBinaryData>;
10
+ generateZipAsync(config: { readonly logger?: Logger; readonly compressionLevel?: ZipCompressionLevel }): Promise<FileBinaryData>;
11
11
  getBinaryDataAsync(filePath: string): Promise<FileBinaryData | undefined>;
12
12
  getFileContentAsync(filePath: string): Promise<string | undefined>;
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontent-ai/migration-toolkit",
3
- "version": "2.2.2",
3
+ "version": "2.3.0",
4
4
  "description": "This program can be used to import content related data into Kontent.ai from various formats. Additionally, it can also be used to export Kontent.ai data using Delivery API.",
5
5
  "preferGlobal": true,
6
6
  "private": false,
@@ -60,33 +60,33 @@
60
60
  "bytes": "3.1.2",
61
61
  "chalk": "5.3.0",
62
62
  "deep-equal": "2.2.3",
63
- "dotenv": "16.4.5",
63
+ "dotenv": "16.4.7",
64
64
  "jszip": "3.10.1",
65
65
  "mime": "4.0.4",
66
- "ora": "8.1.0",
66
+ "ora": "8.1.1",
67
67
  "p-limit": "6.1.0",
68
68
  "prompts": "2.4.2",
69
69
  "ts-pattern": "5.5.0",
70
70
  "yargs": "17.7.2",
71
- "zod": "3.23.8"
71
+ "zod": "3.24.1"
72
72
  },
73
73
  "devDependencies": {
74
- "@eslint/js": "9.13.0",
74
+ "@eslint/js": "9.16.0",
75
75
  "@types/browser-or-node": "1.3.2",
76
- "@types/bytes": "3.1.4",
76
+ "@types/bytes": "3.1.5",
77
77
  "@types/deep-equal": "1.0.4",
78
78
  "@types/eslint__js": "8.42.3",
79
- "@types/node": "22.8.2",
79
+ "@types/node": "22.10.2",
80
80
  "@types/prompts": "2.4.9",
81
81
  "@types/yargs": "17.0.33",
82
- "@typescript-eslint/eslint-plugin": "8.12.1",
83
- "@typescript-eslint/parser": "8.12.1",
84
- "eslint": "9.13.0",
82
+ "@typescript-eslint/eslint-plugin": "8.18.0",
83
+ "@typescript-eslint/parser": "8.18.0",
84
+ "eslint": "9.16.0",
85
85
  "standard-version": "9.5.0",
86
- "tslib": "2.8.0",
86
+ "tslib": "2.8.1",
87
87
  "tsx": "4.19.2",
88
88
  "typescript": "5.6.3",
89
- "typescript-eslint": "8.12.1",
90
- "vitest": "2.1.4"
89
+ "typescript-eslint": "8.18.0",
90
+ "vitest": "2.1.8"
91
91
  }
92
92
  }