@kontent-ai/migration-toolkit 2.9.1 → 3.0.0-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.
Files changed (239) 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 +29 -22
  11. package/dist/core/models/error.models.d.ts +26 -0
  12. package/dist/core/models/error.models.js +104 -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 +17 -19
  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 +3 -1
  26. package/dist/core/utils/confirm.utils.js +92 -24
  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 +37 -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/core/utils/try.utils.d.ts +14 -0
  49. package/dist/core/utils/try.utils.js +18 -0
  50. package/dist/core/utils/try.utils.js.map +1 -0
  51. package/dist/export/context/export-context-fetcher.d.ts +1 -1
  52. package/dist/export/context/export-context-fetcher.js +92 -62
  53. package/dist/export/context/export-context-fetcher.js.map +1 -1
  54. package/dist/export/export-manager.d.ts +2 -2
  55. package/dist/export/export-manager.js +73 -59
  56. package/dist/export/export-manager.js.map +1 -1
  57. package/dist/export/export.models.d.ts +21 -2
  58. package/dist/export/utils/export.utils.d.ts +1 -1
  59. package/dist/export/utils/export.utils.js +3 -2
  60. package/dist/export/utils/export.utils.js.map +1 -1
  61. package/dist/file/file-manager.d.ts +2 -2
  62. package/dist/file/file-manager.js +7 -7
  63. package/dist/file/file-manager.js.map +1 -1
  64. package/dist/import/comparers/asset-comparer.d.ts +2 -2
  65. package/dist/import/comparers/asset-comparer.js +12 -11
  66. package/dist/import/comparers/asset-comparer.js.map +1 -1
  67. package/dist/import/context/import-context-fetcher.d.ts +1 -1
  68. package/dist/import/context/import-context-fetcher.js +77 -73
  69. package/dist/import/context/import-context-fetcher.js.map +1 -1
  70. package/dist/import/import-manager.d.ts +1 -1
  71. package/dist/import/import-manager.js +59 -56
  72. package/dist/import/import-manager.js.map +1 -1
  73. package/dist/import/import.models.d.ts +6 -2
  74. package/dist/import/importers/assets-importer.d.ts +3 -3
  75. package/dist/import/importers/assets-importer.js +46 -43
  76. package/dist/import/importers/assets-importer.js.map +1 -1
  77. package/dist/import/importers/content-items-importer.d.ts +3 -3
  78. package/dist/import/importers/content-items-importer.js +28 -25
  79. package/dist/import/importers/content-items-importer.js.map +1 -1
  80. package/dist/import/importers/language-variant-importer.d.ts +3 -3
  81. package/dist/import/importers/language-variant-importer.js +45 -45
  82. package/dist/import/importers/language-variant-importer.js.map +1 -1
  83. package/dist/import/importers/workflow-importer.d.ts +3 -2
  84. package/dist/import/importers/workflow-importer.js +58 -54
  85. package/dist/import/importers/workflow-importer.js.map +1 -1
  86. package/dist/import/utils/import.utils.d.ts +1 -1
  87. package/dist/import/utils/import.utils.js +3 -2
  88. package/dist/import/utils/import.utils.js.map +1 -1
  89. package/dist/index.d.ts +11 -7
  90. package/dist/index.js +10 -8
  91. package/dist/index.js.map +1 -1
  92. package/dist/metadata.js +3 -3
  93. package/dist/metadata.js.map +1 -1
  94. package/dist/node/cli/actions/export-action.d.ts +1 -1
  95. package/dist/node/cli/actions/export-action.js +29 -23
  96. package/dist/node/cli/actions/export-action.js.map +1 -1
  97. package/dist/node/cli/actions/import-action.d.ts +1 -1
  98. package/dist/node/cli/actions/import-action.js +15 -12
  99. package/dist/node/cli/actions/import-action.js.map +1 -1
  100. package/dist/node/cli/actions/migrate-action.d.ts +1 -1
  101. package/dist/node/cli/actions/migrate-action.js +26 -22
  102. package/dist/node/cli/actions/migrate-action.js.map +1 -1
  103. package/dist/node/cli/app.js +13 -12
  104. package/dist/node/cli/app.js.map +1 -1
  105. package/dist/node/cli/args/args-fetcher.d.ts +1 -1
  106. package/dist/node/cli/args/args-fetcher.js +14 -13
  107. package/dist/node/cli/args/args-fetcher.js.map +1 -1
  108. package/dist/node/cli/args/args-setter.d.ts +1 -1
  109. package/dist/node/cli/args/args-setter.js +8 -6
  110. package/dist/node/cli/args/args-setter.js.map +1 -1
  111. package/dist/node/cli/cli.models.d.ts +2 -2
  112. package/dist/node/cli/commands.js +68 -56
  113. package/dist/node/cli/commands.js.map +1 -1
  114. package/dist/toolkit/elements-builder.d.ts +1 -1
  115. package/dist/toolkit/elements-builder.js +12 -12
  116. package/dist/toolkit/elements-builder.js.map +1 -1
  117. package/dist/toolkit/export.d.ts +2 -2
  118. package/dist/toolkit/export.js +8 -8
  119. package/dist/toolkit/export.js.map +1 -1
  120. package/dist/toolkit/file.d.ts +2 -1
  121. package/dist/toolkit/file.js +18 -16
  122. package/dist/toolkit/file.js.map +1 -1
  123. package/dist/toolkit/import.d.ts +1 -1
  124. package/dist/toolkit/import.js +12 -12
  125. package/dist/toolkit/import.js.map +1 -1
  126. package/dist/toolkit/migrate.d.ts +13 -4
  127. package/dist/toolkit/migrate.js +15 -13
  128. package/dist/toolkit/migrate.js.map +1 -1
  129. package/dist/translation/extraction/items-extraction.processor.d.ts +5 -4
  130. package/dist/translation/extraction/items-extraction.processor.js +73 -35
  131. package/dist/translation/extraction/items-extraction.processor.js.map +1 -1
  132. package/dist/translation/helpers/export-placeholder.utils.d.ts +11 -0
  133. package/dist/translation/helpers/export-placeholder.utils.js +11 -0
  134. package/dist/translation/helpers/export-placeholder.utils.js.map +1 -0
  135. package/dist/translation/helpers/rich-text.processor.d.ts +6 -6
  136. package/dist/translation/helpers/rich-text.processor.js +38 -38
  137. package/dist/translation/helpers/rich-text.processor.js.map +1 -1
  138. package/dist/translation/transforms/export-transforms.d.ts +2 -2
  139. package/dist/translation/transforms/export-transforms.js +93 -67
  140. package/dist/translation/transforms/export-transforms.js.map +1 -1
  141. package/dist/translation/transforms/import-transforms.d.ts +2 -2
  142. package/dist/translation/transforms/import-transforms.js +38 -40
  143. package/dist/translation/transforms/import-transforms.js.map +1 -1
  144. package/dist/zip/zip-manager.d.ts +4 -3
  145. package/dist/zip/zip-manager.js +9 -9
  146. package/dist/zip/zip-manager.js.map +1 -1
  147. package/dist/zip/zip-packager.d.ts +2 -2
  148. package/dist/zip/zip-packager.js +19 -17
  149. package/dist/zip/zip-packager.js.map +1 -1
  150. package/dist/zip/zip-transformer.d.ts +3 -2
  151. package/dist/zip/zip-transformer.js +16 -15
  152. package/dist/zip/zip-transformer.js.map +1 -1
  153. package/dist/zip/zip.models.d.ts +2 -2
  154. package/lib/core/config.ts +6 -6
  155. package/lib/core/helpers/workflow-helper.ts +190 -185
  156. package/lib/core/logs/loggers.ts +52 -52
  157. package/lib/core/models/core.models.ts +130 -119
  158. package/lib/core/models/error.models.ts +148 -0
  159. package/lib/core/models/log.models.ts +20 -20
  160. package/lib/core/models/migration.models.ts +54 -57
  161. package/lib/core/models/migration.schema.ts +108 -108
  162. package/lib/core/utils/array.utils.ts +43 -42
  163. package/lib/core/utils/binary-data.utils.ts +16 -16
  164. package/lib/core/utils/confirm.utils.ts +184 -106
  165. package/lib/core/utils/error.utils.ts +69 -72
  166. package/lib/core/utils/external-id.utils.ts +4 -4
  167. package/lib/core/utils/global.utils.ts +81 -75
  168. package/lib/core/utils/http.utils.ts +23 -23
  169. package/lib/core/utils/management-client-utils.ts +189 -186
  170. package/lib/core/utils/processing-utils.ts +82 -82
  171. package/lib/core/utils/run.utils.ts +50 -50
  172. package/lib/core/utils/try.utils.ts +30 -0
  173. package/lib/export/context/export-context-fetcher.ts +472 -447
  174. package/lib/export/export-manager.ts +250 -232
  175. package/lib/export/export.models.ts +71 -56
  176. package/lib/export/utils/export.utils.ts +9 -7
  177. package/lib/file/file-manager.ts +28 -28
  178. package/lib/import/comparers/asset-comparer.ts +107 -106
  179. package/lib/import/context/import-context-fetcher.ts +462 -462
  180. package/lib/import/import-manager.ts +243 -240
  181. package/lib/import/import.models.ts +69 -67
  182. package/lib/import/importers/assets-importer.ts +240 -236
  183. package/lib/import/importers/content-items-importer.ts +126 -122
  184. package/lib/import/importers/language-variant-importer.ts +324 -328
  185. package/lib/import/importers/workflow-importer.ts +372 -367
  186. package/lib/import/utils/import.utils.ts +9 -7
  187. package/lib/index.ts +12 -8
  188. package/lib/metadata.ts +3 -4
  189. package/lib/node/cli/actions/export-action.ts +44 -38
  190. package/lib/node/cli/actions/import-action.ts +32 -29
  191. package/lib/node/cli/actions/migrate-action.ts +50 -46
  192. package/lib/node/cli/app.ts +21 -21
  193. package/lib/node/cli/args/args-fetcher.ts +55 -54
  194. package/lib/node/cli/args/args-setter.ts +34 -32
  195. package/lib/node/cli/cli.models.ts +17 -17
  196. package/lib/node/cli/commands.ts +165 -153
  197. package/lib/toolkit/elements-builder.ts +69 -69
  198. package/lib/toolkit/export.ts +21 -21
  199. package/lib/toolkit/file.ts +59 -53
  200. package/lib/toolkit/import.ts +32 -32
  201. package/lib/toolkit/migrate.ts +60 -49
  202. package/lib/translation/extraction/items-extraction.processor.ts +203 -173
  203. package/lib/translation/helpers/export-placeholder.utils.ts +10 -0
  204. package/lib/translation/helpers/rich-text.processor.ts +311 -311
  205. package/lib/translation/transforms/export-transforms.ts +313 -279
  206. package/lib/translation/transforms/import-transforms.ts +188 -191
  207. package/lib/zip/zip-manager.ts +28 -27
  208. package/lib/zip/zip-packager.ts +75 -73
  209. package/lib/zip/zip-transformer.ts +112 -107
  210. package/lib/zip/zip.models.ts +7 -7
  211. package/package.json +91 -84
  212. package/dist/core/index.d.ts +0 -16
  213. package/dist/core/index.js +0 -17
  214. package/dist/core/index.js.map +0 -1
  215. package/dist/export/index.d.ts +0 -2
  216. package/dist/export/index.js +0 -3
  217. package/dist/export/index.js.map +0 -1
  218. package/dist/file/index.d.ts +0 -1
  219. package/dist/file/index.js +0 -2
  220. package/dist/file/index.js.map +0 -1
  221. package/dist/import/index.d.ts +0 -2
  222. package/dist/import/index.js +0 -3
  223. package/dist/import/index.js.map +0 -1
  224. package/dist/toolkit/index.d.ts +0 -5
  225. package/dist/toolkit/index.js +0 -6
  226. package/dist/toolkit/index.js.map +0 -1
  227. package/dist/translation/index.d.ts +0 -4
  228. package/dist/translation/index.js +0 -5
  229. package/dist/translation/index.js.map +0 -1
  230. package/dist/zip/index.d.ts +0 -4
  231. package/dist/zip/index.js +0 -5
  232. package/dist/zip/index.js.map +0 -1
  233. package/lib/core/index.ts +0 -18
  234. package/lib/export/index.ts +0 -2
  235. package/lib/file/index.ts +0 -1
  236. package/lib/import/index.ts +0 -2
  237. package/lib/toolkit/index.ts +0 -5
  238. package/lib/translation/index.ts +0 -4
  239. 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
+ }