@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,261 +1,279 @@
1
- import type { AssetFolderModels, AssetModels, CollectionModels, ElementModels } from '@kontent-ai/management-sdk';
2
- import chalk from 'chalk';
1
+ import type { AssetFolderModels, AssetModels, CollectionModels, ElementModels } from "@kontent-ai/management-sdk";
2
+ import chalk from "chalk";
3
+ import type { Writeable } from "zod/v3";
4
+ import { getDefaultLogger } from "../core/logs/loggers.js";
5
+ import type { FlattenedContentType, FlattenedContentTypeElement } from "../core/models/core.models.js";
6
+ import { InvalidValueError, MigrationToolkitError } from "../core/models/error.models.js";
3
7
  import type {
4
- FlattenedContentType,
5
- FlattenedContentTypeElement,
6
- MigrationAsset,
7
- MigrationComponent,
8
- MigrationData,
9
- MigrationElements,
10
- MigrationElementTransformData,
11
- MigrationItem,
12
- MigrationItemVersion,
13
- Writeable
14
- } from '../core/index.js';
15
- import {
16
- extractErrorData,
17
- findRequired,
18
- getBinaryDataFromUrlAsync,
19
- getDefaultLogger,
20
- getMigrationManagementClient,
21
- isNotUndefined,
22
- MigrationAssetsSchema,
23
- MigrationItemsSchema,
24
- processItemsAsync
25
- } from '../core/index.js';
26
- import { exportTransforms } from '../translation/index.js';
27
- import { exportContextFetcherAsync } from './context/export-context-fetcher.js';
28
- import type { ExportConfig, ExportContext, ExportItem } from './export.models.js';
8
+ MigrationAsset,
9
+ MigrationComponent,
10
+ MigrationData,
11
+ MigrationElements,
12
+ MigrationElementTransformData,
13
+ MigrationItem,
14
+ MigrationItemVersion,
15
+ } from "../core/models/migration.models.js";
16
+ import { MigrationAssetsSchema, MigrationItemsSchema } from "../core/models/migration.schema.js";
17
+ import { findRequired } from "../core/utils/array.utils.js";
18
+ import { getBinaryDataFromUrlAsync } from "../core/utils/binary-data.utils.js";
19
+ import { extractErrorData } from "../core/utils/error.utils.js";
20
+ import { isNotUndefined } from "../core/utils/global.utils.js";
21
+ import { getMigrationManagementClient } from "../core/utils/management-client-utils.js";
22
+ import { processItemsAsync } from "../core/utils/processing-utils.js";
23
+ import { tryCatch } from "../core/utils/try.utils.js";
24
+ import { exportTransforms } from "../translation/transforms/export-transforms.js";
25
+ import { exportContextFetcherAsync } from "./context/export-context-fetcher.js";
26
+ import type { ExportConfig, ExportContext, ExportItem, ExportItemVersion } from "./export.models.js";
29
27
 
30
28
  export function exportManager(config: ExportConfig) {
31
- const logger = config.logger ?? getDefaultLogger();
32
- const managementClient = getMigrationManagementClient(config);
29
+ const logger = config.logger ?? getDefaultLogger();
30
+ const managementClient = getMigrationManagementClient(config);
33
31
 
34
- const getMigrationItems = (context: ExportContext): readonly MigrationItem[] => {
35
- return context.exportItems.map<MigrationItem>((exportItem) => mapToMigrationItem(context, exportItem));
36
- };
32
+ const getMigrationItems = (context: ExportContext): readonly MigrationItem[] => {
33
+ return context.exportItems.map<MigrationItem>((exportItem) => mapToMigrationItem(context, exportItem));
34
+ };
37
35
 
38
- const mapToMigrationItem = (context: ExportContext, exportItem: ExportItem): Readonly<MigrationItem> => {
39
- const migrationItem: MigrationItem = {
40
- system: {
41
- name: exportItem.contentItem.name,
42
- codename: exportItem.contentItem.codename,
43
- language: { codename: exportItem.language.codename },
44
- type: { codename: exportItem.contentType.contentTypeCodename },
45
- collection: { codename: exportItem.collection.codename },
46
- workflow: {
47
- codename: exportItem.workflow.codename
48
- }
49
- },
50
- versions: exportItem.versions.map<MigrationItemVersion>((version) => {
51
- return {
52
- elements: getMigrationElements(context, exportItem.contentType, version.languageVariant.elements),
53
- schedule: {
54
- publish_time: version.languageVariant.schedule.publishTime ?? undefined,
55
- publish_display_timezone: version.languageVariant.schedule.publishDisplayTimezone ?? undefined,
56
- unpublish_display_timezone: version.languageVariant.schedule.unpublishDisplayTimezone ?? undefined,
57
- unpublish_time: version.languageVariant.schedule.unpublishTime ?? undefined
58
- },
59
- workflow_step: {
60
- codename: version.workflowStepCodename
61
- }
62
- };
63
- })
64
- };
36
+ const mapToMigrationItem = (context: ExportContext, exportItem: ExportItem): Readonly<MigrationItem> => {
37
+ const migrationItem: MigrationItem = {
38
+ system: {
39
+ name: exportItem.contentItem.name,
40
+ codename: exportItem.contentItem.codename,
41
+ language: { codename: exportItem.language.codename },
42
+ type: { codename: exportItem.contentType.contentTypeCodename },
43
+ collection: { codename: exportItem.collection.codename },
44
+ workflow: {
45
+ codename: exportItem.workflow.codename,
46
+ },
47
+ },
48
+ versions: exportItem.versions.map<MigrationItemVersion>((version) => {
49
+ const migrationItemVersion: MigrationItemVersion = {
50
+ elements: getMigrationElements(exportItem, version, context, exportItem.contentType, version.languageVariant.elements),
51
+ schedule: {
52
+ publish_time: version.languageVariant.schedule.publishTime ?? undefined,
53
+ publish_display_timezone: version.languageVariant.schedule.publishDisplayTimezone ?? undefined,
54
+ unpublish_display_timezone: version.languageVariant.schedule.unpublishDisplayTimezone ?? undefined,
55
+ unpublish_time: version.languageVariant.schedule.unpublishTime ?? undefined,
56
+ },
57
+ workflow_step: {
58
+ codename: version.workflowStepCodename,
59
+ },
60
+ };
65
61
 
66
- return migrationItem;
67
- };
62
+ return migrationItemVersion;
63
+ }),
64
+ };
68
65
 
69
- const mapToMigrationComponent = (
70
- context: ExportContext,
71
- component: Readonly<ElementModels.ContentItemElementComponent>
72
- ): MigrationComponent => {
73
- const componentType = context.environmentData.contentTypes.find((m) => m.contentTypeId === component.type.id);
66
+ return migrationItem;
67
+ };
74
68
 
75
- if (!componentType) {
76
- throw Error(`Could not find content type with id '${chalk.red(component.type.id)}' for component '${chalk.red(component.id)}'`);
77
- }
69
+ const mapToMigrationComponent = (
70
+ exportItem: ExportItem,
71
+ exportItemVersion: ExportItemVersion,
72
+ context: ExportContext,
73
+ component: Readonly<ElementModels.ContentItemElementComponent>,
74
+ ): MigrationComponent => {
75
+ const componentType = context.environmentData.contentTypes.find((m) => m.contentTypeId === component.type.id);
78
76
 
79
- const migrationItem: MigrationComponent = {
80
- system: {
81
- id: component.id,
82
- type: {
83
- codename: componentType.contentTypeCodename
84
- }
85
- },
86
- elements: getMigrationElements(context, componentType, component.elements)
87
- };
77
+ if (!componentType) {
78
+ throw new MigrationToolkitError(
79
+ "missingContentType",
80
+ `Could not find content type with id '${chalk.red(component.type.id)}' for component '${chalk.red(component.id)}'`,
81
+ );
82
+ }
88
83
 
89
- return migrationItem;
90
- };
84
+ const migrationItem: MigrationComponent = {
85
+ system: {
86
+ id: component.id,
87
+ type: {
88
+ codename: componentType.contentTypeCodename,
89
+ },
90
+ },
91
+ elements: getMigrationElements(exportItem, exportItemVersion, context, componentType, component.elements),
92
+ };
91
93
 
92
- const getMigrationElements = (
93
- context: ExportContext,
94
- contentType: FlattenedContentType,
95
- elements: readonly Readonly<ElementModels.ContentItemElement>[]
96
- ): MigrationElements => {
97
- return contentType.elements
98
- .toSorted((a, b) => {
99
- if (a.codename < b.codename) {
100
- return -1;
101
- }
102
- if (a.codename > b.codename) {
103
- return 1;
104
- }
105
- return 0;
106
- })
107
- .reduce<Writeable<MigrationElements>>((model, typeElement) => {
108
- const itemElement = findRequired(
109
- elements,
110
- (m) => m.element.id === typeElement.id,
111
- `Could not find element '${chalk.red(typeElement.codename)}'`
112
- );
94
+ return migrationItem;
95
+ };
113
96
 
114
- model[typeElement.codename] = {
115
- type: typeElement.type,
116
- ...getMigrationElementToStore({
117
- context: context,
118
- contentType: contentType,
119
- exportElement: itemElement,
120
- typeElement: typeElement
121
- })
122
- };
97
+ const getMigrationElements = (
98
+ exportItem: ExportItem,
99
+ exportItemVersion: ExportItemVersion,
100
+ context: ExportContext,
101
+ contentType: FlattenedContentType,
102
+ elements: readonly Readonly<ElementModels.ContentItemElement>[],
103
+ ): MigrationElements => {
104
+ return contentType.elements
105
+ .toSorted((a, b) => {
106
+ if (a.codename < b.codename) {
107
+ return -1;
108
+ }
109
+ if (a.codename > b.codename) {
110
+ return 1;
111
+ }
112
+ return 0;
113
+ })
114
+ .reduce<Writeable<MigrationElements>>((model, typeElement) => {
115
+ const itemElement = findRequired(
116
+ elements,
117
+ (m) => m.element.id === typeElement.id,
118
+ `Could not find element '${chalk.red(typeElement.codename)}'`,
119
+ );
123
120
 
124
- return model;
125
- }, {});
126
- };
121
+ model[typeElement.codename] = {
122
+ type: typeElement.type,
123
+ ...getMigrationElementToStore({
124
+ exportItem: exportItem,
125
+ exportItemVersion: exportItemVersion,
126
+ context: context,
127
+ contentType: contentType,
128
+ exportElement: itemElement,
129
+ typeElement: typeElement,
130
+ }),
131
+ };
127
132
 
128
- const getMigrationElementToStore = (data: {
129
- readonly context: ExportContext;
130
- readonly contentType: FlattenedContentType;
131
- readonly typeElement: FlattenedContentTypeElement;
132
- readonly exportElement: ElementModels.ContentItemElement;
133
- }): MigrationElementTransformData => {
134
- try {
135
- return exportTransforms[data.typeElement.type]({
136
- context: data.context,
137
- typeElement: data.typeElement,
138
- exportElement: {
139
- components: data.exportElement.components.map((component) => mapToMigrationComponent(data.context, component)),
140
- value: data.exportElement.value,
141
- urlSlugMode: data.exportElement.mode,
142
- displayTimezone: data.exportElement.display_timezone ?? undefined
143
- }
144
- });
145
- } catch (error) {
146
- const errorData = extractErrorData(error);
147
- let jsonValue = 'n/a';
133
+ return model;
134
+ }, {});
135
+ };
148
136
 
149
- try {
150
- jsonValue = JSON.stringify(data.exportElement.value);
151
- } catch (jsonError) {
152
- console.error(`Failed to convert json value`, jsonError);
153
- }
137
+ const getMigrationElementToStore = (data: {
138
+ readonly exportItem: ExportItem;
139
+ readonly exportItemVersion: ExportItemVersion;
140
+ readonly context: ExportContext;
141
+ readonly contentType: FlattenedContentType;
142
+ readonly typeElement: FlattenedContentTypeElement;
143
+ readonly exportElement: ElementModels.ContentItemElement;
144
+ }): MigrationElementTransformData => {
145
+ const {
146
+ success,
147
+ data: migrationElement,
148
+ error,
149
+ } = tryCatch(() =>
150
+ exportTransforms[data.typeElement.type]({
151
+ context: data.context,
152
+ typeElement: data.typeElement,
153
+ exportElement: {
154
+ components: data.exportElement.components.map((component) => {
155
+ return mapToMigrationComponent(data.exportItem, data.exportItemVersion, data.context, component);
156
+ }),
157
+ value: data.exportElement.value,
158
+ urlSlugMode: data.exportElement.mode,
159
+ displayTimezone: data.exportElement.display_timezone ?? undefined,
160
+ },
161
+ }),
162
+ );
154
163
 
155
- throw new Error(
156
- `Failed to map value of element '${chalk.yellow(data.typeElement.codename)}' of type '${chalk.cyan(
157
- data.typeElement.type
158
- )}'. Value: ${chalk.bgMagenta(jsonValue)}. Message: ${errorData.message}`
159
- );
160
- }
161
- };
164
+ if (!success) {
165
+ const errorData = extractErrorData(error);
162
166
 
163
- const exportAssetsAsync = async (context: ExportContext): Promise<readonly Readonly<MigrationAsset>[]> => {
164
- const assets = Array.from(context.referencedData.assetIds)
165
- .map<Readonly<AssetModels.Asset> | undefined>((assetId) => context.getAssetStateInSourceEnvironment(assetId).asset)
166
- .filter(isNotUndefined);
167
+ throw new InvalidValueError({
168
+ element: data.typeElement,
169
+ contentType: data.contentType,
170
+ exportItem: data.exportItem,
171
+ exportItemVersion: data.exportItemVersion,
172
+ value: data.exportElement.value,
173
+ errorData: errorData,
174
+ });
175
+ }
167
176
 
168
- return await getMigrationAssetsWithBinaryDataAsync(assets, context);
169
- };
177
+ return migrationElement;
178
+ };
170
179
 
171
- const getMigrationAssetsWithBinaryDataAsync = async (
172
- assets: readonly Readonly<AssetModels.Asset>[],
173
- context: ExportContext
174
- ): Promise<readonly MigrationAsset[]> => {
175
- logger.log({
176
- type: 'info',
177
- message: `Preparing to download '${chalk.yellow(assets.length.toString())}' assets`
178
- });
180
+ const exportAssetsAsync = async (context: ExportContext): Promise<readonly Readonly<MigrationAsset>[]> => {
181
+ const assets = Array.from(context.referencedData.assetIds)
182
+ .map<Readonly<AssetModels.Asset> | undefined>((assetId) => context.getAssetStateInSourceEnvironment(assetId).data)
183
+ .filter(isNotUndefined);
179
184
 
180
- return (
181
- await processItemsAsync<Readonly<AssetModels.Asset>, MigrationAsset>({
182
- action: 'Downloading assets',
183
- logger: logger,
184
- parallelLimit: 5,
185
- itemInfo: (input) => {
186
- return {
187
- title: input.codename,
188
- itemType: 'asset'
189
- };
190
- },
191
- items: assets,
192
- processAsync: async (asset, logSpinner) => {
193
- const assetCollection: Readonly<CollectionModels.Collection> | undefined = context.environmentData.collections.find(
194
- (m) => m.id === asset.collection?.reference?.id
195
- );
196
- const assetFolder: Readonly<AssetFolderModels.AssetFolder> | undefined = context.environmentData.assetFolders.find(
197
- (m) => m.id === asset.folder?.id
198
- );
185
+ return await getMigrationAssetsWithBinaryDataAsync(assets, context);
186
+ };
199
187
 
200
- logSpinner({
201
- type: 'download',
202
- message: `${asset.url}`
203
- });
188
+ const getMigrationAssetsWithBinaryDataAsync = async (
189
+ assets: readonly Readonly<AssetModels.Asset>[],
190
+ context: ExportContext,
191
+ ): Promise<readonly MigrationAsset[]> => {
192
+ logger.log({
193
+ type: "info",
194
+ message: `Preparing to download '${chalk.yellow(assets.length.toString())}' assets`,
195
+ });
204
196
 
205
- const migrationAsset: MigrationAsset = {
206
- filename: asset.fileName,
207
- title: asset.title ?? '',
208
- codename: asset.codename,
209
- binary_data: (await getBinaryDataFromUrlAsync(asset.url)).data,
210
- collection: assetCollection ? { codename: assetCollection.codename } : undefined,
211
- folder: assetFolder ? { codename: assetFolder.codename } : undefined,
212
- descriptions: asset.descriptions.map((description) => {
213
- const language = findRequired(
214
- context.environmentData.languages,
215
- (language) => language.id === description.language.id,
216
- `Could not find language with id '${chalk.red(description.language.id)}' requested by asset '${chalk.red(
217
- asset.codename
218
- )}'`
219
- );
197
+ return (
198
+ await processItemsAsync<Readonly<AssetModels.Asset>, MigrationAsset>({
199
+ action: "Downloading assets",
200
+ logger: logger,
201
+ parallelLimit: 5,
202
+ itemInfo: (input) => {
203
+ return {
204
+ title: input.codename,
205
+ itemType: "asset",
206
+ };
207
+ },
208
+ items: assets,
209
+ processAsync: async (asset, logSpinner) => {
210
+ const assetCollection: Readonly<CollectionModels.Collection> | undefined = context.environmentData.collections.find(
211
+ (m) => m.id === asset.collection?.reference?.id,
212
+ );
213
+ const assetFolder: Readonly<AssetFolderModels.AssetFolder> | undefined = context.environmentData.assetFolders.find(
214
+ (m) => m.id === asset.folder?.id,
215
+ );
220
216
 
221
- return {
222
- description: description.description ?? undefined,
223
- language: {
224
- codename: language.codename
225
- }
226
- };
227
- })
228
- };
217
+ logSpinner({
218
+ type: "download",
219
+ message: `${asset.url}`,
220
+ });
229
221
 
230
- return migrationAsset;
231
- }
232
- })
233
- )
234
- .filter((m) => m.state === 'valid')
235
- .map((m) => m.outputItem);
236
- };
222
+ const migrationAsset: MigrationAsset = {
223
+ filename: asset.fileName,
224
+ title: asset.title ?? "",
225
+ codename: asset.codename,
226
+ binary_data: (await getBinaryDataFromUrlAsync(asset.url)).data,
227
+ collection: assetCollection ? { codename: assetCollection.codename } : undefined,
228
+ folder: assetFolder ? { codename: assetFolder.codename } : undefined,
229
+ descriptions: asset.descriptions.map((description) => {
230
+ const language = findRequired(
231
+ context.environmentData.languages,
232
+ (language) => language.id === description.language.id,
233
+ `Could not find language with id '${chalk.red(description.language.id)}' requested by asset '${chalk.red(
234
+ asset.codename,
235
+ )}'`,
236
+ );
237
237
 
238
- return {
239
- async exportAsync(): Promise<MigrationData> {
240
- const exportContext = await (
241
- await exportContextFetcherAsync({
242
- exportItems: config.exportItems,
243
- logger: logger,
244
- managementClient: managementClient
245
- })
246
- ).getExportContextAsync();
238
+ return {
239
+ description: description.description ?? undefined,
240
+ language: {
241
+ codename: language.codename,
242
+ },
243
+ };
244
+ }),
245
+ };
247
246
 
248
- const migrationData: MigrationData = {
249
- items: MigrationItemsSchema.parse(getMigrationItems(exportContext)),
250
- assets: MigrationAssetsSchema.parse(await exportAssetsAsync(exportContext))
251
- };
247
+ return migrationAsset;
248
+ },
249
+ })
250
+ )
251
+ .filter((m) => m.state === "valid")
252
+ .map((m) => m.outputItem);
253
+ };
252
254
 
253
- logger.log({
254
- type: 'completed',
255
- message: `Finished export`
256
- });
255
+ return {
256
+ async exportAsync(): Promise<MigrationData> {
257
+ const exportContext = await (
258
+ await exportContextFetcherAsync({
259
+ exportItems: config.exportItems,
260
+ logger: logger,
261
+ managementClient: managementClient,
262
+ skipMissingReferences: config.skipMissingReferences ?? false,
263
+ })
264
+ ).getExportContextAsync();
257
265
 
258
- return migrationData;
259
- }
260
- };
266
+ const migrationData: MigrationData = {
267
+ items: MigrationItemsSchema.parse(getMigrationItems(exportContext)),
268
+ assets: MigrationAssetsSchema.parse(await exportAssetsAsync(exportContext)),
269
+ };
270
+
271
+ logger.log({
272
+ type: "completed",
273
+ message: `Finished export`,
274
+ });
275
+
276
+ return migrationData;
277
+ },
278
+ };
261
279
  }