@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,133 +1,211 @@
1
- import chalk from 'chalk';
2
- import type { Logger } from '../models/log.models.js';
3
- import { getMigrationManagementClient, managementClientUtils } from './management-client-utils.js';
1
+ import type { EnvironmentModels } from "@kontent-ai/management-sdk";
2
+ import chalk from "chalk";
3
+ import { match, P } from "ts-pattern";
4
+ import { MigrationToolkitError } from "../models/error.models.js";
5
+ import type { Logger } from "../models/log.models.js";
6
+ import { getMigrationManagementClient, managementClientUtils } from "./management-client-utils.js";
4
7
 
5
8
  export async function confirmExportAsync(data: {
6
- readonly force: boolean;
7
- readonly environmentId: string;
8
- readonly apiKey: string;
9
- readonly logger: Logger;
10
- readonly dataToExport: {
11
- readonly itemsCount: number;
12
- };
9
+ readonly force: boolean;
10
+ readonly environmentId: string;
11
+ readonly apiKey: string;
12
+ readonly logger: Logger;
13
+ readonly skipMissingReferences: boolean;
14
+ readonly dataToExport: {
15
+ readonly itemsCount: number;
16
+ };
13
17
  }): Promise<void> {
14
- const environment = await managementClientUtils(
15
- getMigrationManagementClient({
16
- environmentId: data.environmentId,
17
- apiKey: data.apiKey
18
- }),
19
- data.logger
20
- ).getEnvironmentAsync();
18
+ const environment = await managementClientUtils(
19
+ getMigrationManagementClient({
20
+ environmentId: data.environmentId,
21
+ apiKey: data.apiKey,
22
+ }),
23
+ data.logger,
24
+ ).getEnvironmentAsync();
21
25
 
22
- const text: string = `Are you sure to export '${chalk.cyan(data.dataToExport.itemsCount)}' content ${getItemsPluralText(
23
- data.dataToExport.itemsCount
24
- )} from ${chalk.yellow(environment.name)} (${chalk.magenta(environment.environment)})?`;
26
+ const text = getConfirmText({
27
+ action: "export",
28
+ itemsCount: data.dataToExport.itemsCount,
29
+ sourceEnvironment: environment,
30
+ skipMissingReferences: data.skipMissingReferences,
31
+ });
25
32
 
26
- await confirmAsync({
27
- force: data.force,
28
- logger: data.logger,
29
- action: 'Export',
30
- message: text
31
- });
33
+ await confirmAsync({
34
+ force: data.force,
35
+ logger: data.logger,
36
+ action: "Export",
37
+ message: text,
38
+ });
32
39
  }
33
40
 
34
41
  export async function confirmMigrateAsync(data: {
35
- readonly force: boolean;
36
- readonly sourceEnvironment: {
37
- readonly environmentId: string;
38
- readonly apiKey: string;
39
- };
40
- readonly targetEnvironment: {
41
- readonly environmentId: string;
42
- readonly apiKey: string;
43
- };
44
- readonly logger: Logger;
45
- readonly dataToMigrate: {
46
- readonly itemsCount: number;
47
- };
42
+ readonly force: boolean;
43
+ readonly sourceEnvironment: {
44
+ readonly environmentId: string;
45
+ readonly apiKey: string;
46
+ };
47
+ readonly targetEnvironment: {
48
+ readonly environmentId: string;
49
+ readonly apiKey: string;
50
+ };
51
+ readonly skipMissingReferences: boolean;
52
+ readonly logger: Logger;
53
+ readonly dataToMigrate: {
54
+ readonly itemsCount: number;
55
+ };
48
56
  }): Promise<void> {
49
- const sourceEnvironment = await managementClientUtils(
50
- getMigrationManagementClient({
51
- environmentId: data.sourceEnvironment.environmentId,
52
- apiKey: data.sourceEnvironment.apiKey
53
- }),
54
- data.logger
55
- ).getEnvironmentAsync();
56
- const targetEnvironment = await managementClientUtils(
57
- getMigrationManagementClient({
58
- environmentId: data.targetEnvironment.environmentId,
59
- apiKey: data.targetEnvironment.apiKey
60
- }),
61
- data.logger
62
- ).getEnvironmentAsync();
57
+ const sourceEnvironment = await managementClientUtils(
58
+ getMigrationManagementClient({
59
+ environmentId: data.sourceEnvironment.environmentId,
60
+ apiKey: data.sourceEnvironment.apiKey,
61
+ }),
62
+ data.logger,
63
+ ).getEnvironmentAsync();
64
+ const targetEnvironment = await managementClientUtils(
65
+ getMigrationManagementClient({
66
+ environmentId: data.targetEnvironment.environmentId,
67
+ apiKey: data.targetEnvironment.apiKey,
68
+ }),
69
+ data.logger,
70
+ ).getEnvironmentAsync();
63
71
 
64
- const text: string = `Are you sure to migrate '${chalk.cyan(data.dataToMigrate.itemsCount)}' ${getItemsPluralText(
65
- data.dataToMigrate.itemsCount
66
- )} from ${chalk.yellow(sourceEnvironment.name)} (${chalk.magenta(sourceEnvironment.environment)}) to environment ${chalk.yellow(
67
- targetEnvironment.name
68
- )} (${chalk.magenta(targetEnvironment.environment)}) ?`;
72
+ const text = getConfirmText({
73
+ action: "migrate",
74
+ itemsCount: data.dataToMigrate.itemsCount,
75
+ sourceEnvironment,
76
+ targetEnvironment,
77
+ skipMissingReferences: data.skipMissingReferences,
78
+ });
69
79
 
70
- await confirmAsync({
71
- force: data.force,
72
- logger: data.logger,
73
- action: 'Migrate',
74
- message: text
75
- });
80
+ await confirmAsync({
81
+ force: data.force,
82
+ logger: data.logger,
83
+ action: "Migrate",
84
+ message: text,
85
+ });
76
86
  }
77
87
 
78
88
  export async function confirmImportAsync(data: {
79
- readonly force: boolean;
80
- readonly environmentId: string;
81
- readonly apiKey: string;
82
- readonly logger: Logger;
89
+ readonly force: boolean;
90
+ readonly environmentId: string;
91
+ readonly apiKey: string;
92
+ readonly logger: Logger;
83
93
  }): Promise<void> {
84
- const environment = await managementClientUtils(
85
- getMigrationManagementClient({
86
- environmentId: data.environmentId,
87
- apiKey: data.apiKey
88
- }),
89
- data.logger
90
- ).getEnvironmentAsync();
94
+ const environment = await managementClientUtils(
95
+ getMigrationManagementClient({
96
+ environmentId: data.environmentId,
97
+ apiKey: data.apiKey,
98
+ }),
99
+ data.logger,
100
+ ).getEnvironmentAsync();
91
101
 
92
- const text: string = `Are you sure to import data into ${chalk.yellow(environment.name)} (${chalk.magenta(environment.environment)})?`;
102
+ const text = getConfirmText({
103
+ action: "import",
104
+ targetEnvironment: environment,
105
+ itemsCount: undefined,
106
+ });
93
107
 
94
- await confirmAsync({
95
- force: data.force,
96
- logger: data.logger,
97
- action: 'Import',
98
- message: text
99
- });
108
+ await confirmAsync({
109
+ force: data.force,
110
+ logger: data.logger,
111
+ action: "Import",
112
+ message: text,
113
+ });
100
114
  }
101
115
 
102
116
  async function confirmAsync(data: {
103
- readonly action: string;
104
- readonly message: string;
105
- readonly force: boolean;
106
- readonly logger: Logger;
117
+ readonly action: string;
118
+ readonly message: string;
119
+ readonly force: boolean;
120
+ readonly logger: Logger;
107
121
  }): Promise<void> {
108
- // Prompts is imported dynamically because it's a node.js only module and would not work if user
109
- // tried using this library in a browser
110
- const prompts = await import('prompts');
122
+ // Prompts is imported dynamically because it's a node.js only module and would not work if user
123
+ // tried using this library in a browser
124
+ const prompts = await import("prompts");
111
125
 
112
- if (data.force) {
113
- data.logger.log({
114
- type: 'info',
115
- message: `Skipping confirmation`
116
- });
117
- return;
118
- }
126
+ if (data.force) {
127
+ data.logger.log({
128
+ type: "info",
129
+ message: `Skipping confirmation`,
130
+ });
131
+ return;
132
+ }
119
133
 
120
- const confirmed = await prompts.default({
121
- type: 'confirm',
122
- name: 'confirm',
123
- message: `${chalk.cyan(data.action)}: ${data.message}`
124
- });
134
+ const confirmed = await prompts.default({
135
+ type: "confirm",
136
+ name: "confirm",
137
+ message: `${chalk.cyan(data.action)}: ${data.message}`,
138
+ });
125
139
 
126
- if (!confirmed.confirm) {
127
- throw Error(`Confirmation refused.`);
128
- }
140
+ if (!confirmed.confirm) {
141
+ throw new MigrationToolkitError("confirmationRefused", `Confirmation refused.`);
142
+ }
129
143
  }
130
144
 
131
- function getItemsPluralText(count: number): string {
132
- return count === 1 ? 'item' : 'items';
145
+ function getConfirmText({
146
+ action,
147
+ itemsCount,
148
+ sourceEnvironment,
149
+ targetEnvironment,
150
+ skipMissingReferences,
151
+ }: {
152
+ readonly action: "export" | "import" | "migrate";
153
+ readonly skipMissingReferences?: boolean;
154
+ readonly itemsCount?: number;
155
+ readonly sourceEnvironment?: EnvironmentModels.EnvironmentInformationModel;
156
+ readonly targetEnvironment?: EnvironmentModels.EnvironmentInformationModel;
157
+ }): string {
158
+ const lines: readonly string[] = [
159
+ `\n${"=".repeat(70)}`,
160
+ ...match(action)
161
+ .returnType<readonly string[]>()
162
+ .with("export", () => [
163
+ `${chalk.cyan("📤 Source environment:")}`,
164
+ ` ${chalk.gray("├─")} Name: ${chalk.yellow.bold(sourceEnvironment?.name)}`,
165
+ ` ${chalk.gray("├─")} Environment: ${chalk.green.bold(sourceEnvironment?.environment)}`,
166
+ ` ${chalk.gray("└─")} ID: ${chalk.dim(sourceEnvironment?.id)}`,
167
+ ])
168
+ .with("import", () => [
169
+ `${chalk.cyan("📥 Target environment:")}`,
170
+ ` ${chalk.gray("├─")} Name: ${chalk.yellow.bold(targetEnvironment?.name)}`,
171
+ ` ${chalk.gray("├─")} Environment: ${chalk.green.bold(targetEnvironment?.environment)}`,
172
+ ` ${chalk.gray("└─")} ID: ${chalk.dim(targetEnvironment?.id)}`,
173
+ ])
174
+ .with("migrate", () => [
175
+ `${chalk.cyan("📤 Source environment:")}`,
176
+ ` ${chalk.gray("├─")} Name: ${chalk.yellow.bold(sourceEnvironment?.name)}`,
177
+ ` ${chalk.gray("├─")} Environment: ${chalk.green.bold(sourceEnvironment?.environment)}`,
178
+ ` ${chalk.gray("└─")} ID: ${chalk.dim(sourceEnvironment?.id)}`,
179
+ `${chalk.cyan("📥 Target environment:")}`,
180
+ ` ${chalk.gray("├─")} Name: ${chalk.yellow.bold(targetEnvironment?.name)}`,
181
+ ` ${chalk.gray("├─")} Environment: ${chalk.green.bold(targetEnvironment?.environment)}`,
182
+ ` ${chalk.gray("└─")} ID: ${chalk.dim(targetEnvironment?.id)}`,
183
+ ])
184
+ .exhaustive(),
185
+ "\n",
186
+ ...match(itemsCount)
187
+ .returnType<readonly string[]>()
188
+ .with(P.nonNullable, (itemsCount) => [
189
+ `${chalk.cyan("📦 Items to process:")}`,
190
+ ` ${chalk.gray("├─")} Count: ${chalk.green.bold(itemsCount)}`,
191
+ "",
192
+ ])
193
+ .otherwise(() => []),
194
+ ...match(action)
195
+ .returnType<readonly string[]>()
196
+ .with(P.union("export", "migrate"), () => [
197
+ `${chalk.cyan("⚙️ Configuration:")}`,
198
+ ` ${chalk.gray("└─")} Skip missing references: ${chalk.green.bold(skipMissingReferences ? "Yes" : "No")}`,
199
+ "",
200
+ ])
201
+ .otherwise(() => []),
202
+ `${chalk.yellow("⚠")} ${match(action)
203
+ .returnType<string>()
204
+ .with("export", () => "Are you sure you want to export the data?")
205
+ .with("import", () => "Are you sure you want to import the data?")
206
+ .with("migrate", () => "Are you sure you want to migrate the data?")
207
+ .exhaustive()}`,
208
+ ];
209
+
210
+ return lines.join("\n");
133
211
  }
@@ -1,88 +1,85 @@
1
- import { SharedModels } from '@kontent-ai/management-sdk';
2
- import chalk from 'chalk';
3
- import { match } from 'ts-pattern';
4
- import { ZodError } from 'zod';
5
- import type { ErrorData, OriginalManagementError } from '../models/core.models.js';
1
+ import { SharedModels } from "@kontent-ai/management-sdk";
2
+ import chalk from "chalk";
3
+ import { match } from "ts-pattern";
4
+ import { ZodError } from "zod";
5
+ import type { ErrorData, OriginalManagementError } from "../models/core.models.js";
6
6
 
7
7
  export function extractErrorData(error: unknown): ErrorData {
8
- return match(error)
9
- .returnType<ErrorData>()
10
- .when(
11
- (error) => error instanceof SharedModels.ContentManagementBaseKontentError,
12
- (error) => {
13
- const originalError = error.originalError as OriginalManagementError | undefined;
8
+ return match(error)
9
+ .returnType<ErrorData>()
10
+ .when(
11
+ (error) => error instanceof SharedModels.ContentManagementBaseKontentError,
12
+ (error) => {
13
+ const originalError = error.originalError as OriginalManagementError | undefined;
14
14
 
15
- return {
16
- isUnknownError: false,
17
- error: error,
18
- message: `${error.message} ${error.validationErrors.map((m) => m.message).join(', ')}`,
19
- requestUrl: originalError?.response?.config?.url,
20
- requestData: originalError?.response?.config?.data
21
- };
22
- }
23
- )
24
- .when(
25
- (error) => error instanceof ZodError,
26
- (error) => {
27
- return {
28
- isUnknownError: false,
29
- error: error,
30
- message: `Found '${chalk.red(error.issues.length)}' parsing errors: \n${error.issues.reduce<string>(
31
- (current, issue, index) => {
32
- return (current += `\n${index + 1}. ${chalk.red(issue.message)} (${chalk.yellow('path')}: ${issue.path.join(
33
- ','
34
- )})`);
35
- },
36
- ''
37
- )}`
38
- };
39
- }
40
- )
41
- .when(
42
- (error) => error instanceof Error,
43
- (error) => {
44
- return {
45
- isUnknownError: false,
46
- error: error,
47
- message: error.message
48
- };
49
- }
50
- )
51
- .otherwise((error) => {
52
- return {
53
- isUnknownError: true,
54
- error: error,
55
- message: `Unknown error`
56
- };
57
- });
15
+ return {
16
+ isUnknownError: false,
17
+ error: error,
18
+ message: `${error.message} ${error.validationErrors.map((m) => m.message).join(", ")}`,
19
+ requestUrl: originalError?.response?.config?.url,
20
+ requestData: originalError?.response?.config?.data,
21
+ };
22
+ },
23
+ )
24
+ .when(
25
+ (error) => error instanceof ZodError,
26
+ (error) => {
27
+ const parsingErrorsMsg = error.issues.reduce<string>((current, issue, index) => {
28
+ const message = `\n${index + 1}. ${chalk.red(issue.message)} (${chalk.yellow("path")}: ${issue.path.join(",")})`;
29
+ return `${current}${message}`;
30
+ }, "");
31
+ return {
32
+ isUnknownError: false,
33
+ error: error,
34
+ message: `Found '${chalk.red(error.issues.length)}' parsing errors: \n${parsingErrorsMsg}`,
35
+ };
36
+ },
37
+ )
38
+ .when(
39
+ (error) => error instanceof Error,
40
+ (error) => {
41
+ return {
42
+ isUnknownError: false,
43
+ error: error,
44
+ message: error.message,
45
+ };
46
+ },
47
+ )
48
+ .otherwise((error) => {
49
+ return {
50
+ isUnknownError: true,
51
+ error: error,
52
+ message: `Unknown error`,
53
+ };
54
+ });
58
55
  }
59
56
 
60
57
  export function is404Error(error: unknown): boolean {
61
- if (error instanceof SharedModels.ContentManagementBaseKontentError) {
62
- const originalError = error.originalError as OriginalManagementError | undefined;
58
+ if (error instanceof SharedModels.ContentManagementBaseKontentError) {
59
+ const originalError = error.originalError as OriginalManagementError | undefined;
63
60
 
64
- if (originalError?.response?.status === 404) {
65
- return true;
66
- }
67
- }
61
+ if (originalError?.response?.status === 404) {
62
+ return true;
63
+ }
64
+ }
68
65
 
69
- return false;
66
+ return false;
70
67
  }
71
68
 
72
69
  export function handleError(error: unknown): void {
73
- const errorData = extractErrorData(error);
70
+ const errorData = extractErrorData(error);
74
71
 
75
- if (errorData.isUnknownError) {
76
- console.error(error);
77
- }
72
+ if (errorData.isUnknownError) {
73
+ console.error(error);
74
+ }
78
75
 
79
- if (errorData.requestData) {
80
- console.log(`${chalk.red('Request data')}: ${errorData.requestData}`);
81
- }
76
+ if (errorData.requestData) {
77
+ console.log(`${chalk.red("Request data")}: ${errorData.requestData}`);
78
+ }
82
79
 
83
- if (errorData.requestUrl) {
84
- console.log(`${chalk.red('Request url')}: ${errorData.requestUrl}`);
85
- }
80
+ if (errorData.requestUrl) {
81
+ console.log(`${chalk.red("Request url")}: ${errorData.requestUrl}`);
82
+ }
86
83
 
87
- console.error(`${chalk.red('Error:')} ${errorData.message}`);
84
+ console.error(errorData.message);
88
85
  }
@@ -1,9 +1,9 @@
1
1
  export interface ExternalIdGenerator {
2
- readonly assetExternalId: (codename: string) => string;
3
- readonly contentItemExternalId: (codename: string) => string;
2
+ readonly assetExternalId: (codename: string) => string;
3
+ readonly contentItemExternalId: (codename: string) => string;
4
4
  }
5
5
 
6
6
  export const defaultExternalIdGenerator: ExternalIdGenerator = {
7
- assetExternalId: (codename) => `asset_${codename}`,
8
- contentItemExternalId: (codename) => `item_${codename}`
7
+ assetExternalId: (codename) => `asset_${codename}`,
8
+ contentItemExternalId: (codename) => `item_${codename}`,
9
9
  };