@kontent-ai/migration-toolkit 2.9.1 → 3.0.0-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 (235) hide show
  1. package/README.md +19 -17
  2. package/dist/core/config.js +3 -3
  3. package/dist/core/config.js.map +1 -1
  4. package/dist/core/helpers/workflow-helper.d.ts +1 -1
  5. package/dist/core/helpers/workflow-helper.js +28 -26
  6. package/dist/core/helpers/workflow-helper.js.map +1 -1
  7. package/dist/core/logs/loggers.d.ts +1 -1
  8. package/dist/core/logs/loggers.js +15 -15
  9. package/dist/core/logs/loggers.js.map +1 -1
  10. package/dist/core/models/core.models.d.ts +27 -22
  11. package/dist/core/models/error.models.d.ts +14 -0
  12. package/dist/core/models/error.models.js +25 -0
  13. package/dist/core/models/error.models.js.map +1 -0
  14. package/dist/core/models/log.models.d.ts +2 -2
  15. package/dist/core/models/migration.models.d.ts +14 -14
  16. package/dist/core/models/migration.schema.d.ts +9 -9
  17. package/dist/core/models/migration.schema.js +28 -28
  18. package/dist/core/models/migration.schema.js.map +1 -1
  19. package/dist/core/utils/array.utils.d.ts +1 -1
  20. package/dist/core/utils/array.utils.js +4 -3
  21. package/dist/core/utils/array.utils.js.map +1 -1
  22. package/dist/core/utils/binary-data.utils.d.ts +1 -1
  23. package/dist/core/utils/binary-data.utils.js +6 -6
  24. package/dist/core/utils/binary-data.utils.js.map +1 -1
  25. package/dist/core/utils/confirm.utils.d.ts +1 -1
  26. package/dist/core/utils/confirm.utils.js +21 -20
  27. package/dist/core/utils/confirm.utils.js.map +1 -1
  28. package/dist/core/utils/error.utils.d.ts +1 -1
  29. package/dist/core/utils/error.utils.js +16 -14
  30. package/dist/core/utils/error.utils.js.map +1 -1
  31. package/dist/core/utils/external-id.utils.js +1 -1
  32. package/dist/core/utils/external-id.utils.js.map +1 -1
  33. package/dist/core/utils/global.utils.d.ts +3 -3
  34. package/dist/core/utils/global.utils.js +20 -18
  35. package/dist/core/utils/global.utils.js.map +1 -1
  36. package/dist/core/utils/http.utils.d.ts +2 -2
  37. package/dist/core/utils/http.utils.js +4 -4
  38. package/dist/core/utils/http.utils.js.map +1 -1
  39. package/dist/core/utils/management-client-utils.d.ts +4 -4
  40. package/dist/core/utils/management-client-utils.js +34 -34
  41. package/dist/core/utils/management-client-utils.js.map +1 -1
  42. package/dist/core/utils/processing-utils.d.ts +4 -4
  43. package/dist/core/utils/processing-utils.js +13 -13
  44. package/dist/core/utils/processing-utils.js.map +1 -1
  45. package/dist/core/utils/run.utils.d.ts +2 -2
  46. package/dist/core/utils/run.utils.js +7 -7
  47. package/dist/core/utils/run.utils.js.map +1 -1
  48. package/dist/export/context/export-context-fetcher.d.ts +1 -1
  49. package/dist/export/context/export-context-fetcher.js +92 -62
  50. package/dist/export/context/export-context-fetcher.js.map +1 -1
  51. package/dist/export/export-manager.d.ts +2 -2
  52. package/dist/export/export-manager.js +46 -37
  53. package/dist/export/export-manager.js.map +1 -1
  54. package/dist/export/export.models.d.ts +21 -2
  55. package/dist/export/utils/export.utils.d.ts +1 -1
  56. package/dist/export/utils/export.utils.js +3 -2
  57. package/dist/export/utils/export.utils.js.map +1 -1
  58. package/dist/file/file-manager.d.ts +2 -2
  59. package/dist/file/file-manager.js +7 -7
  60. package/dist/file/file-manager.js.map +1 -1
  61. package/dist/import/comparers/asset-comparer.d.ts +2 -2
  62. package/dist/import/comparers/asset-comparer.js +12 -11
  63. package/dist/import/comparers/asset-comparer.js.map +1 -1
  64. package/dist/import/context/import-context-fetcher.d.ts +1 -1
  65. package/dist/import/context/import-context-fetcher.js +77 -73
  66. package/dist/import/context/import-context-fetcher.js.map +1 -1
  67. package/dist/import/import-manager.d.ts +1 -1
  68. package/dist/import/import-manager.js +59 -56
  69. package/dist/import/import-manager.js.map +1 -1
  70. package/dist/import/import.models.d.ts +6 -2
  71. package/dist/import/importers/assets-importer.d.ts +3 -3
  72. package/dist/import/importers/assets-importer.js +46 -43
  73. package/dist/import/importers/assets-importer.js.map +1 -1
  74. package/dist/import/importers/content-items-importer.d.ts +3 -3
  75. package/dist/import/importers/content-items-importer.js +28 -25
  76. package/dist/import/importers/content-items-importer.js.map +1 -1
  77. package/dist/import/importers/language-variant-importer.d.ts +3 -3
  78. package/dist/import/importers/language-variant-importer.js +45 -45
  79. package/dist/import/importers/language-variant-importer.js.map +1 -1
  80. package/dist/import/importers/workflow-importer.d.ts +3 -2
  81. package/dist/import/importers/workflow-importer.js +58 -54
  82. package/dist/import/importers/workflow-importer.js.map +1 -1
  83. package/dist/import/utils/import.utils.d.ts +1 -1
  84. package/dist/import/utils/import.utils.js +3 -2
  85. package/dist/import/utils/import.utils.js.map +1 -1
  86. package/dist/index.d.ts +11 -7
  87. package/dist/index.js +10 -8
  88. package/dist/index.js.map +1 -1
  89. package/dist/metadata.js +3 -3
  90. package/dist/metadata.js.map +1 -1
  91. package/dist/node/cli/actions/export-action.d.ts +1 -1
  92. package/dist/node/cli/actions/export-action.js +28 -23
  93. package/dist/node/cli/actions/export-action.js.map +1 -1
  94. package/dist/node/cli/actions/import-action.d.ts +1 -1
  95. package/dist/node/cli/actions/import-action.js +15 -12
  96. package/dist/node/cli/actions/import-action.js.map +1 -1
  97. package/dist/node/cli/actions/migrate-action.d.ts +1 -1
  98. package/dist/node/cli/actions/migrate-action.js +25 -22
  99. package/dist/node/cli/actions/migrate-action.js.map +1 -1
  100. package/dist/node/cli/app.js +13 -12
  101. package/dist/node/cli/app.js.map +1 -1
  102. package/dist/node/cli/args/args-fetcher.d.ts +1 -1
  103. package/dist/node/cli/args/args-fetcher.js +14 -13
  104. package/dist/node/cli/args/args-fetcher.js.map +1 -1
  105. package/dist/node/cli/args/args-setter.d.ts +1 -1
  106. package/dist/node/cli/args/args-setter.js +8 -6
  107. package/dist/node/cli/args/args-setter.js.map +1 -1
  108. package/dist/node/cli/cli.models.d.ts +2 -2
  109. package/dist/node/cli/commands.js +68 -56
  110. package/dist/node/cli/commands.js.map +1 -1
  111. package/dist/toolkit/elements-builder.d.ts +1 -1
  112. package/dist/toolkit/elements-builder.js +12 -12
  113. package/dist/toolkit/elements-builder.js.map +1 -1
  114. package/dist/toolkit/export.d.ts +2 -2
  115. package/dist/toolkit/export.js +8 -8
  116. package/dist/toolkit/export.js.map +1 -1
  117. package/dist/toolkit/file.d.ts +2 -1
  118. package/dist/toolkit/file.js +18 -16
  119. package/dist/toolkit/file.js.map +1 -1
  120. package/dist/toolkit/import.d.ts +1 -1
  121. package/dist/toolkit/import.js +12 -12
  122. package/dist/toolkit/import.js.map +1 -1
  123. package/dist/toolkit/migrate.d.ts +13 -4
  124. package/dist/toolkit/migrate.js +15 -13
  125. package/dist/toolkit/migrate.js.map +1 -1
  126. package/dist/translation/extraction/items-extraction.processor.d.ts +5 -4
  127. package/dist/translation/extraction/items-extraction.processor.js +73 -35
  128. package/dist/translation/extraction/items-extraction.processor.js.map +1 -1
  129. package/dist/translation/helpers/export-placeholder.utils.d.ts +11 -0
  130. package/dist/translation/helpers/export-placeholder.utils.js +11 -0
  131. package/dist/translation/helpers/export-placeholder.utils.js.map +1 -0
  132. package/dist/translation/helpers/rich-text.processor.d.ts +6 -6
  133. package/dist/translation/helpers/rich-text.processor.js +38 -38
  134. package/dist/translation/helpers/rich-text.processor.js.map +1 -1
  135. package/dist/translation/transforms/export-transforms.d.ts +2 -2
  136. package/dist/translation/transforms/export-transforms.js +93 -67
  137. package/dist/translation/transforms/export-transforms.js.map +1 -1
  138. package/dist/translation/transforms/import-transforms.d.ts +2 -2
  139. package/dist/translation/transforms/import-transforms.js +38 -40
  140. package/dist/translation/transforms/import-transforms.js.map +1 -1
  141. package/dist/zip/zip-manager.d.ts +4 -3
  142. package/dist/zip/zip-manager.js +9 -9
  143. package/dist/zip/zip-manager.js.map +1 -1
  144. package/dist/zip/zip-packager.d.ts +2 -2
  145. package/dist/zip/zip-packager.js +19 -17
  146. package/dist/zip/zip-packager.js.map +1 -1
  147. package/dist/zip/zip-transformer.d.ts +3 -2
  148. package/dist/zip/zip-transformer.js +16 -15
  149. package/dist/zip/zip-transformer.js.map +1 -1
  150. package/dist/zip/zip.models.d.ts +2 -2
  151. package/lib/core/config.ts +6 -6
  152. package/lib/core/helpers/workflow-helper.ts +190 -185
  153. package/lib/core/logs/loggers.ts +52 -52
  154. package/lib/core/models/core.models.ts +128 -119
  155. package/lib/core/models/error.models.ts +41 -0
  156. package/lib/core/models/log.models.ts +20 -20
  157. package/lib/core/models/migration.models.ts +54 -54
  158. package/lib/core/models/migration.schema.ts +108 -108
  159. package/lib/core/utils/array.utils.ts +43 -42
  160. package/lib/core/utils/binary-data.utils.ts +16 -16
  161. package/lib/core/utils/confirm.utils.ts +106 -105
  162. package/lib/core/utils/error.utils.ts +69 -72
  163. package/lib/core/utils/external-id.utils.ts +4 -4
  164. package/lib/core/utils/global.utils.ts +81 -75
  165. package/lib/core/utils/http.utils.ts +23 -23
  166. package/lib/core/utils/management-client-utils.ts +186 -186
  167. package/lib/core/utils/processing-utils.ts +82 -82
  168. package/lib/core/utils/run.utils.ts +50 -50
  169. package/lib/export/context/export-context-fetcher.ts +472 -447
  170. package/lib/export/export-manager.ts +233 -232
  171. package/lib/export/export.models.ts +71 -56
  172. package/lib/export/utils/export.utils.ts +9 -7
  173. package/lib/file/file-manager.ts +28 -28
  174. package/lib/import/comparers/asset-comparer.ts +107 -106
  175. package/lib/import/context/import-context-fetcher.ts +462 -462
  176. package/lib/import/import-manager.ts +243 -240
  177. package/lib/import/import.models.ts +69 -67
  178. package/lib/import/importers/assets-importer.ts +240 -236
  179. package/lib/import/importers/content-items-importer.ts +126 -122
  180. package/lib/import/importers/language-variant-importer.ts +324 -328
  181. package/lib/import/importers/workflow-importer.ts +372 -367
  182. package/lib/import/utils/import.utils.ts +9 -7
  183. package/lib/index.ts +12 -8
  184. package/lib/metadata.ts +3 -4
  185. package/lib/node/cli/actions/export-action.ts +43 -38
  186. package/lib/node/cli/actions/import-action.ts +32 -29
  187. package/lib/node/cli/actions/migrate-action.ts +49 -46
  188. package/lib/node/cli/app.ts +21 -21
  189. package/lib/node/cli/args/args-fetcher.ts +55 -54
  190. package/lib/node/cli/args/args-setter.ts +34 -32
  191. package/lib/node/cli/cli.models.ts +17 -17
  192. package/lib/node/cli/commands.ts +165 -153
  193. package/lib/toolkit/elements-builder.ts +69 -69
  194. package/lib/toolkit/export.ts +21 -21
  195. package/lib/toolkit/file.ts +59 -53
  196. package/lib/toolkit/import.ts +32 -32
  197. package/lib/toolkit/migrate.ts +60 -49
  198. package/lib/translation/extraction/items-extraction.processor.ts +203 -173
  199. package/lib/translation/helpers/export-placeholder.utils.ts +10 -0
  200. package/lib/translation/helpers/rich-text.processor.ts +311 -311
  201. package/lib/translation/transforms/export-transforms.ts +313 -279
  202. package/lib/translation/transforms/import-transforms.ts +188 -191
  203. package/lib/zip/zip-manager.ts +28 -27
  204. package/lib/zip/zip-packager.ts +75 -73
  205. package/lib/zip/zip-transformer.ts +112 -107
  206. package/lib/zip/zip.models.ts +7 -7
  207. package/package.json +91 -84
  208. package/dist/core/index.d.ts +0 -16
  209. package/dist/core/index.js +0 -17
  210. package/dist/core/index.js.map +0 -1
  211. package/dist/export/index.d.ts +0 -2
  212. package/dist/export/index.js +0 -3
  213. package/dist/export/index.js.map +0 -1
  214. package/dist/file/index.d.ts +0 -1
  215. package/dist/file/index.js +0 -2
  216. package/dist/file/index.js.map +0 -1
  217. package/dist/import/index.d.ts +0 -2
  218. package/dist/import/index.js +0 -3
  219. package/dist/import/index.js.map +0 -1
  220. package/dist/toolkit/index.d.ts +0 -5
  221. package/dist/toolkit/index.js +0 -6
  222. package/dist/toolkit/index.js.map +0 -1
  223. package/dist/translation/index.d.ts +0 -4
  224. package/dist/translation/index.js +0 -5
  225. package/dist/translation/index.js.map +0 -1
  226. package/dist/zip/index.d.ts +0 -4
  227. package/dist/zip/index.js +0 -5
  228. package/dist/zip/index.js.map +0 -1
  229. package/lib/core/index.ts +0 -18
  230. package/lib/export/index.ts +0 -2
  231. package/lib/file/index.ts +0 -1
  232. package/lib/import/index.ts +0 -2
  233. package/lib/toolkit/index.ts +0 -5
  234. package/lib/translation/index.ts +0 -4
  235. package/lib/zip/index.ts +0 -4
@@ -1,90 +1,105 @@
1
1
  import type {
2
- AssetFolderModels,
3
- CollectionModels,
4
- ContentItemModels,
5
- LanguageModels,
6
- LanguageVariantModels,
7
- ManagementClient,
8
- SharedModels,
9
- TaxonomyModels,
10
- WorkflowModels
11
- } from '@kontent-ai/management-sdk';
2
+ AssetFolderModels,
3
+ CollectionModels,
4
+ ContentItemModels,
5
+ LanguageModels,
6
+ LanguageVariantModels,
7
+ ManagementClient,
8
+ SharedModels,
9
+ TaxonomyModels,
10
+ WorkflowModels,
11
+ } from "@kontent-ai/management-sdk";
12
12
  import type {
13
- AssetStateInSourceEnvironmentById,
14
- FlattenedContentType,
15
- FlattenedContentTypeElement,
16
- ItemStateInSourceEnvironmentById,
17
- Logger,
18
- ManagementClientConfig,
19
- MigrationComponent,
20
- MigrationElementTransformData,
21
- MigrationUrlSlugMode,
22
- ReferencedDataInLanguageVariants
23
- } from '../core/index.js';
13
+ AssetStateInSourceEnvironmentById,
14
+ FlattenedContentType,
15
+ FlattenedContentTypeElement,
16
+ ItemStateInSourceEnvironmentById,
17
+ ReferencedDataInLanguageVariants,
18
+ } from "../core/models/core.models.js";
19
+ import type { Logger } from "../core/models/log.models.js";
20
+ import type { MigrationComponent, MigrationElementTransformData, MigrationUrlSlugMode } from "../core/models/migration.models.js";
21
+ import type { ManagementClientConfig } from "../core/utils/management-client-utils.js";
24
22
 
25
23
  export interface ExportContextEnvironmentData {
26
- readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
27
- readonly contentTypes: readonly Readonly<FlattenedContentType>[];
28
- readonly collections: readonly Readonly<CollectionModels.Collection>[];
29
- readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
30
- readonly workflows: readonly Readonly<WorkflowModels.Workflow>[];
31
- readonly taxonomies: readonly Readonly<TaxonomyModels.Taxonomy>[];
24
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
25
+ readonly contentTypes: readonly Readonly<FlattenedContentType>[];
26
+ readonly collections: readonly Readonly<CollectionModels.Collection>[];
27
+ readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
28
+ readonly workflows: readonly Readonly<WorkflowModels.Workflow>[];
29
+ readonly taxonomies: readonly Readonly<TaxonomyModels.Taxonomy>[];
32
30
  }
33
31
 
34
32
  export type ExportElementValue = string | number | SharedModels.ReferenceObject[] | undefined;
35
33
 
36
34
  export interface ExportElement {
37
- readonly value: ExportElementValue;
38
- readonly components: readonly MigrationComponent[];
39
- readonly urlSlugMode: MigrationUrlSlugMode | undefined;
40
- readonly displayTimezone: string | undefined;
35
+ readonly value: ExportElementValue;
36
+ readonly components: readonly MigrationComponent[];
37
+ readonly urlSlugMode: MigrationUrlSlugMode | undefined;
38
+ readonly displayTimezone: string | undefined;
41
39
  }
42
40
 
43
41
  export type ExportTransformFunc = (data: {
44
- readonly typeElement: FlattenedContentTypeElement;
45
- readonly exportElement: ExportElement;
46
- readonly context: ExportContext;
42
+ readonly typeElement: FlattenedContentTypeElement;
43
+ readonly exportElement: ExportElement;
44
+ readonly context: ExportContext;
47
45
  }) => MigrationElementTransformData;
48
46
 
49
47
  export interface ExportContext {
50
- readonly environmentData: ExportContextEnvironmentData;
51
- readonly referencedData: ReferencedDataInLanguageVariants;
52
- readonly getItemStateInSourceEnvironment: (id: string) => ItemStateInSourceEnvironmentById;
53
- readonly getAssetStateInSourceEnvironment: (id: string) => AssetStateInSourceEnvironmentById;
54
- readonly exportItems: readonly ExportItem[];
55
- readonly getElement: GetFlattenedElementByIds;
48
+ readonly environmentData: ExportContextEnvironmentData;
49
+ readonly referencedData: ReferencedDataInLanguageVariants;
50
+ readonly getItemStateInSourceEnvironment: (id: string) => ItemStateInSourceEnvironmentById;
51
+ readonly getAssetStateInSourceEnvironment: (id: string) => AssetStateInSourceEnvironmentById;
52
+ readonly exportItems: readonly ExportItem[];
53
+ readonly getElement: GetFlattenedElementByIds;
54
+ readonly exportContextOptions: ExportContextOptions;
56
55
  }
57
56
 
58
57
  export interface SourceExportItem {
59
- readonly itemCodename: string;
60
- readonly languageCodename: string;
58
+ readonly itemCodename: string;
59
+ readonly languageCodename: string;
60
+ }
61
+
62
+ export interface ExportContextOptions {
63
+ /**
64
+ * When enabled, the export process will skip missing items and assets instead of throwing errors.
65
+ * Missing references will be filtered out from the exported data.
66
+ * Default: false
67
+ */
68
+ readonly skipMissingReferences?: boolean;
61
69
  }
62
70
 
63
71
  export interface ExportConfig extends ManagementClientConfig {
64
- readonly exportItems: readonly SourceExportItem[];
65
- readonly logger?: Logger;
72
+ readonly exportItems: readonly SourceExportItem[];
73
+ readonly logger?: Logger;
74
+ /**
75
+ * When enabled, the export process will skip missing items and assets instead of throwing errors.
76
+ * Missing references will be filtered out from the exported data.
77
+ * Default: false
78
+ */
79
+ readonly skipMissingReferences?: boolean;
66
80
  }
67
81
 
68
82
  export interface DefaultExportContextConfig {
69
- readonly logger: Logger;
70
- readonly exportItems: readonly SourceExportItem[];
71
- readonly managementClient: Readonly<ManagementClient>;
83
+ readonly logger: Logger;
84
+ readonly exportItems: readonly SourceExportItem[];
85
+ readonly managementClient: Readonly<ManagementClient>;
86
+ readonly skipMissingReferences: boolean;
72
87
  }
73
88
 
74
89
  export type GetFlattenedElementByIds = (contentTypeId: string, elementId: string) => FlattenedContentTypeElement;
75
90
 
76
91
  export interface ExportItemVersion {
77
- readonly workflowStepCodename: string;
78
- readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
92
+ readonly workflowStepCodename: string;
93
+ readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
79
94
  }
80
95
 
81
96
  export interface ExportItem {
82
- readonly requestItem: SourceExportItem;
83
- readonly versions: readonly ExportItemVersion[];
84
- readonly contentItem: Readonly<ContentItemModels.ContentItem>;
97
+ readonly requestItem: SourceExportItem;
98
+ readonly versions: readonly ExportItemVersion[];
99
+ readonly contentItem: Readonly<ContentItemModels.ContentItem>;
85
100
 
86
- readonly collection: Readonly<CollectionModels.Collection>;
87
- readonly language: Readonly<LanguageModels.LanguageModel>;
88
- readonly workflow: Readonly<WorkflowModels.Workflow>;
89
- readonly contentType: Readonly<FlattenedContentType>;
101
+ readonly collection: Readonly<CollectionModels.Collection>;
102
+ readonly language: Readonly<LanguageModels.LanguageModel>;
103
+ readonly workflow: Readonly<WorkflowModels.Workflow>;
104
+ readonly contentType: Readonly<FlattenedContentType>;
90
105
  }
@@ -1,10 +1,12 @@
1
- import chalk from 'chalk';
2
- import type { SourceExportItem } from '../export.models.js';
1
+ import chalk from "chalk";
2
+ import { MigrationToolkitError } from "../../core/models/error.models.js";
3
+ import type { SourceExportItem } from "../export.models.js";
3
4
 
4
5
  export function throwErrorForItemRequest(itemRequest: SourceExportItem, message: string): never {
5
- throw Error(
6
- `Export failed for item '${chalk.yellow(itemRequest.itemCodename)}' in language '${chalk.cyan(
7
- itemRequest.languageCodename
8
- )}'. Reason: ${message}`
9
- );
6
+ throw new MigrationToolkitError(
7
+ "exportFailedForItem",
8
+ `Export failed for item '${chalk.yellow(itemRequest.itemCodename)}' in language '${chalk.cyan(
9
+ itemRequest.languageCodename,
10
+ )}'. Reason: ${message}`,
11
+ );
10
12
  }
@@ -1,38 +1,38 @@
1
- import type { Buffer as BufferProxy } from 'buffer';
2
- import chalk from 'chalk';
3
- import { promises } from 'fs';
4
- import type { Logger } from '../core/index.js';
1
+ import { promises } from "node:fs";
2
+ import type { Buffer as BufferProxy } from "buffer";
3
+ import chalk from "chalk";
4
+ import type { Logger } from "../core/models/log.models.js";
5
5
 
6
6
  export function fileManager(logger: Logger) {
7
- const getFilePath = (filename: string): string => {
8
- return `./${filename}`;
9
- };
7
+ const getFilePath = (filename: string): string => {
8
+ return `./${filename}`;
9
+ };
10
10
 
11
- const loadFileAsync = async (filename: string): Promise<BufferProxy> => {
12
- const filePath = getFilePath(filename);
11
+ const loadFileAsync = async (filename: string): Promise<BufferProxy> => {
12
+ const filePath = getFilePath(filename);
13
13
 
14
- logger.log({
15
- type: 'readFs',
16
- message: `Reading file '${chalk.yellow(filePath)}'`
17
- });
14
+ logger.log({
15
+ type: "readFs",
16
+ message: `Reading file '${chalk.yellow(filePath)}'`,
17
+ });
18
18
 
19
- const file = await promises.readFile(filePath);
19
+ const file = await promises.readFile(filePath);
20
20
 
21
- return file;
22
- };
21
+ return file;
22
+ };
23
23
 
24
- const writeFileAsync = async (fileNameWithoutExtension: string, content: string | BufferProxy): Promise<void> => {
25
- const filePath = getFilePath(fileNameWithoutExtension);
24
+ const writeFileAsync = async (fileNameWithoutExtension: string, content: string | BufferProxy): Promise<void> => {
25
+ const filePath = getFilePath(fileNameWithoutExtension);
26
26
 
27
- logger.log({
28
- type: 'writeFs',
29
- message: `Storing file '${chalk.yellow(filePath)}'`
30
- });
31
- await promises.writeFile(filePath, content);
32
- };
27
+ logger.log({
28
+ type: "writeFs",
29
+ message: `Storing file '${chalk.yellow(filePath)}'`,
30
+ });
31
+ await promises.writeFile(filePath, content);
32
+ };
33
33
 
34
- return {
35
- loadFileAsync,
36
- writeFileAsync
37
- };
34
+ return {
35
+ loadFileAsync,
36
+ writeFileAsync,
37
+ };
38
38
  }
@@ -1,106 +1,107 @@
1
- import type { AssetFolderModels, AssetModels, CollectionModels, LanguageModels } from '@kontent-ai/management-sdk';
2
- import deepEqual from 'deep-equal';
3
- import type { MigrationAsset, MigrationAssetDescription } from '../../core/index.js';
4
- import { findRequired, geSizeInBytes } from '../../core/index.js';
5
-
6
- export function shouldUpdateAsset(data: {
7
- readonly migrationAsset: MigrationAsset;
8
- readonly targetAsset: Readonly<AssetModels.Asset>;
9
- readonly collections: readonly Readonly<CollectionModels.Collection>[];
10
- readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
11
- readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
12
- }): boolean {
13
- return (
14
- !isInSameCollection(data) ||
15
- !areDescriptionsIdentical(data) ||
16
- !isTitleIdentical(data) ||
17
- !isFolderIdentical(data) ||
18
- !isBinaryFileIdentical(data)
19
- );
20
- }
21
-
22
- export function shouldReplaceBinaryFile(data: {
23
- readonly migrationAsset: MigrationAsset;
24
- readonly targetAsset: Readonly<AssetModels.Asset>;
25
- }): boolean {
26
- return !isBinaryFileIdentical(data);
27
- }
28
-
29
- function isBinaryFileIdentical(data: {
30
- readonly migrationAsset: MigrationAsset;
31
- readonly targetAsset: Readonly<AssetModels.Asset>;
32
- }): boolean {
33
- const sourceFileSize = geSizeInBytes(data.migrationAsset.binary_data);
34
- const targetFileSize = data.targetAsset.size;
35
-
36
- const sourceFilename = data.migrationAsset.filename;
37
- const targetFilename = data.targetAsset.fileName;
38
-
39
- return sourceFileSize === targetFileSize && sourceFilename === targetFilename;
40
- }
41
-
42
- function isFolderIdentical(data: {
43
- readonly migrationAsset: MigrationAsset;
44
- readonly targetAsset: Readonly<AssetModels.Asset>;
45
- readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
46
- }): boolean {
47
- return data.assetFolders.find((m) => m.id === data.targetAsset.folder?.id)?.codename === data.migrationAsset.folder?.codename;
48
- }
49
-
50
- function isTitleIdentical(data: { readonly migrationAsset: MigrationAsset; readonly targetAsset: Readonly<AssetModels.Asset> }): boolean {
51
- const sourceTitle = data.migrationAsset.title?.length ? data.migrationAsset.title : undefined;
52
- const targetTitle = data.targetAsset.title?.length ? data.targetAsset.title : undefined;
53
-
54
- return sourceTitle === targetTitle;
55
- }
56
-
57
- function isInSameCollection(data: {
58
- readonly migrationAsset: MigrationAsset;
59
- readonly targetAsset: Readonly<AssetModels.Asset>;
60
- readonly collections: readonly Readonly<CollectionModels.Collection>[];
61
- }): boolean {
62
- return (
63
- data.collections.find((m) => m.id === data.targetAsset.collection?.reference?.id)?.codename ===
64
- data.migrationAsset.collection?.codename
65
- );
66
- }
67
-
68
- function areDescriptionsIdentical(data: {
69
- readonly migrationAsset: MigrationAsset;
70
- readonly targetAsset: Readonly<AssetModels.Asset>;
71
- readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
72
- }): boolean {
73
- const sourceMigrationDescriptions = (data.migrationAsset.descriptions ?? [])
74
- .map<MigrationAssetDescription>((description) => {
75
- return {
76
- description: description.description?.length ? description.description : undefined,
77
- language: {
78
- codename: description.language.codename
79
- }
80
- };
81
- })
82
- .toSorted();
83
- const targetMigrationDescriptions = mapToMigrationDescriptions(data).toSorted();
84
-
85
- return deepEqual(sourceMigrationDescriptions, targetMigrationDescriptions);
86
- }
87
-
88
- function mapToMigrationDescriptions(data: {
89
- readonly targetAsset: Readonly<AssetModels.Asset>;
90
- readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
91
- }): MigrationAssetDescription[] {
92
- return data.targetAsset.descriptions.map((description) => {
93
- const languageId = description.language.id;
94
-
95
- return {
96
- description: description.description?.length ? description.description : undefined,
97
- language: {
98
- codename: findRequired(
99
- data.languages,
100
- (language) => language.id === languageId,
101
- `Could not find language with id '${languageId}'`
102
- ).codename
103
- }
104
- };
105
- });
106
- }
1
+ import type { AssetFolderModels, AssetModels, CollectionModels, LanguageModels } from "@kontent-ai/management-sdk";
2
+ import deepEqual from "deep-equal";
3
+ import type { MigrationAsset, MigrationAssetDescription } from "../../core/models/migration.models.js";
4
+ import { findRequired } from "../../core/utils/array.utils.js";
5
+ import { geSizeInBytes } from "../../core/utils/binary-data.utils.js";
6
+
7
+ export function shouldUpdateAsset(data: {
8
+ readonly migrationAsset: MigrationAsset;
9
+ readonly targetAsset: Readonly<AssetModels.Asset>;
10
+ readonly collections: readonly Readonly<CollectionModels.Collection>[];
11
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
12
+ readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
13
+ }): boolean {
14
+ return !(
15
+ isInSameCollection(data) &&
16
+ areDescriptionsIdentical(data) &&
17
+ isTitleIdentical(data) &&
18
+ isFolderIdentical(data) &&
19
+ isBinaryFileIdentical(data)
20
+ );
21
+ }
22
+
23
+ export function shouldReplaceBinaryFile(data: {
24
+ readonly migrationAsset: MigrationAsset;
25
+ readonly targetAsset: Readonly<AssetModels.Asset>;
26
+ }): boolean {
27
+ return !isBinaryFileIdentical(data);
28
+ }
29
+
30
+ function isBinaryFileIdentical(data: {
31
+ readonly migrationAsset: MigrationAsset;
32
+ readonly targetAsset: Readonly<AssetModels.Asset>;
33
+ }): boolean {
34
+ const sourceFileSize = geSizeInBytes(data.migrationAsset.binary_data);
35
+ const targetFileSize = data.targetAsset.size;
36
+
37
+ const sourceFilename = data.migrationAsset.filename;
38
+ const targetFilename = data.targetAsset.fileName;
39
+
40
+ return sourceFileSize === targetFileSize && sourceFilename === targetFilename;
41
+ }
42
+
43
+ function isFolderIdentical(data: {
44
+ readonly migrationAsset: MigrationAsset;
45
+ readonly targetAsset: Readonly<AssetModels.Asset>;
46
+ readonly assetFolders: readonly Readonly<AssetFolderModels.AssetFolder>[];
47
+ }): boolean {
48
+ return data.assetFolders.find((m) => m.id === data.targetAsset.folder?.id)?.codename === data.migrationAsset.folder?.codename;
49
+ }
50
+
51
+ function isTitleIdentical(data: { readonly migrationAsset: MigrationAsset; readonly targetAsset: Readonly<AssetModels.Asset> }): boolean {
52
+ const sourceTitle = data.migrationAsset.title?.length ? data.migrationAsset.title : undefined;
53
+ const targetTitle = data.targetAsset.title?.length ? data.targetAsset.title : undefined;
54
+
55
+ return sourceTitle === targetTitle;
56
+ }
57
+
58
+ function isInSameCollection(data: {
59
+ readonly migrationAsset: MigrationAsset;
60
+ readonly targetAsset: Readonly<AssetModels.Asset>;
61
+ readonly collections: readonly Readonly<CollectionModels.Collection>[];
62
+ }): boolean {
63
+ return (
64
+ data.collections.find((m) => m.id === data.targetAsset.collection?.reference?.id)?.codename ===
65
+ data.migrationAsset.collection?.codename
66
+ );
67
+ }
68
+
69
+ function areDescriptionsIdentical(data: {
70
+ readonly migrationAsset: MigrationAsset;
71
+ readonly targetAsset: Readonly<AssetModels.Asset>;
72
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
73
+ }): boolean {
74
+ const sourceMigrationDescriptions = (data.migrationAsset.descriptions ?? [])
75
+ .map<MigrationAssetDescription>((description) => {
76
+ return {
77
+ description: description.description?.length ? description.description : undefined,
78
+ language: {
79
+ codename: description.language.codename,
80
+ },
81
+ };
82
+ })
83
+ .toSorted();
84
+ const targetMigrationDescriptions = mapToMigrationDescriptions(data).toSorted();
85
+
86
+ return deepEqual(sourceMigrationDescriptions, targetMigrationDescriptions);
87
+ }
88
+
89
+ function mapToMigrationDescriptions(data: {
90
+ readonly targetAsset: Readonly<AssetModels.Asset>;
91
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
92
+ }): MigrationAssetDescription[] {
93
+ return data.targetAsset.descriptions.map((description) => {
94
+ const languageId = description.language.id;
95
+
96
+ return {
97
+ description: description.description?.length ? description.description : undefined,
98
+ language: {
99
+ codename: findRequired(
100
+ data.languages,
101
+ (language) => language.id === languageId,
102
+ `Could not find language with id '${languageId}'`,
103
+ ).codename,
104
+ },
105
+ };
106
+ });
107
+ }