@kontent-ai/migration-toolkit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/.npmignore +13 -0
  2. package/LICENSE.md +9 -0
  3. package/README.md +272 -0
  4. package/dist/es2022/core/helpers/workflow-helper.d.ts +37 -0
  5. package/dist/es2022/core/helpers/workflow-helper.js +67 -0
  6. package/dist/es2022/core/helpers/workflow-helper.js.map +1 -0
  7. package/dist/es2022/core/index.d.ts +15 -0
  8. package/dist/es2022/core/index.js +16 -0
  9. package/dist/es2022/core/index.js.map +1 -0
  10. package/dist/es2022/core/logs/loggers.d.ts +2 -0
  11. package/dist/es2022/core/logs/loggers.js +69 -0
  12. package/dist/es2022/core/logs/loggers.js.map +1 -0
  13. package/dist/es2022/core/models/core.models.d.ts +91 -0
  14. package/dist/es2022/core/models/core.models.js +2 -0
  15. package/dist/es2022/core/models/core.models.js.map +1 -0
  16. package/dist/es2022/core/models/log.models.d.ts +15 -0
  17. package/dist/es2022/core/models/log.models.js +2 -0
  18. package/dist/es2022/core/models/log.models.js.map +1 -0
  19. package/dist/es2022/core/models/migration.models.d.ts +136 -0
  20. package/dist/es2022/core/models/migration.models.js +2 -0
  21. package/dist/es2022/core/models/migration.models.js.map +1 -0
  22. package/dist/es2022/core/utils/array.utils.d.ts +5 -0
  23. package/dist/es2022/core/utils/array.utils.js +27 -0
  24. package/dist/es2022/core/utils/array.utils.js.map +1 -0
  25. package/dist/es2022/core/utils/binary-data.utils.d.ts +5 -0
  26. package/dist/es2022/core/utils/binary-data.utils.js +21 -0
  27. package/dist/es2022/core/utils/binary-data.utils.js.map +1 -0
  28. package/dist/es2022/core/utils/confirm.utils.d.ts +31 -0
  29. package/dist/es2022/core/utils/confirm.utils.js +73 -0
  30. package/dist/es2022/core/utils/confirm.utils.js.map +1 -0
  31. package/dist/es2022/core/utils/error.utils.d.ts +4 -0
  32. package/dist/es2022/core/utils/error.utils.js +50 -0
  33. package/dist/es2022/core/utils/error.utils.js.map +1 -0
  34. package/dist/es2022/core/utils/external-id.utils.d.ts +5 -0
  35. package/dist/es2022/core/utils/external-id.utils.js +5 -0
  36. package/dist/es2022/core/utils/external-id.utils.js.map +1 -0
  37. package/dist/es2022/core/utils/global.utils.d.ts +14 -0
  38. package/dist/es2022/core/utils/global.utils.js +45 -0
  39. package/dist/es2022/core/utils/global.utils.js.map +1 -0
  40. package/dist/es2022/core/utils/http.utils.d.ts +3 -0
  41. package/dist/es2022/core/utils/http.utils.js +29 -0
  42. package/dist/es2022/core/utils/http.utils.js.map +1 -0
  43. package/dist/es2022/core/utils/management-client-utils.d.ts +19 -0
  44. package/dist/es2022/core/utils/management-client-utils.js +129 -0
  45. package/dist/es2022/core/utils/management-client-utils.js.map +1 -0
  46. package/dist/es2022/core/utils/processing-utils.d.ts +12 -0
  47. package/dist/es2022/core/utils/processing-utils.js +39 -0
  48. package/dist/es2022/core/utils/processing-utils.js.map +1 -0
  49. package/dist/es2022/core/utils/run.utils.d.ts +10 -0
  50. package/dist/es2022/core/utils/run.utils.js +37 -0
  51. package/dist/es2022/core/utils/run.utils.js.map +1 -0
  52. package/dist/es2022/export/context/export-context-fetcher.d.ts +4 -0
  53. package/dist/es2022/export/context/export-context-fetcher.js +289 -0
  54. package/dist/es2022/export/context/export-context-fetcher.js.map +1 -0
  55. package/dist/es2022/export/export-manager.d.ts +5 -0
  56. package/dist/es2022/export/export-manager.js +167 -0
  57. package/dist/es2022/export/export-manager.js.map +1 -0
  58. package/dist/es2022/export/export.models.d.ts +55 -0
  59. package/dist/es2022/export/export.models.js +2 -0
  60. package/dist/es2022/export/export.models.js.map +1 -0
  61. package/dist/es2022/export/index.d.ts +2 -0
  62. package/dist/es2022/export/index.js +3 -0
  63. package/dist/es2022/export/index.js.map +1 -0
  64. package/dist/es2022/export/utils/export.utils.d.ts +2 -0
  65. package/dist/es2022/export/utils/export.utils.js +5 -0
  66. package/dist/es2022/export/utils/export.utils.js.map +1 -0
  67. package/dist/es2022/file/file-manager.d.ts +5 -0
  68. package/dist/es2022/file/file-manager.js +29 -0
  69. package/dist/es2022/file/file-manager.js.map +1 -0
  70. package/dist/es2022/file/index.d.ts +1 -0
  71. package/dist/es2022/file/index.js +2 -0
  72. package/dist/es2022/file/index.js.map +1 -0
  73. package/dist/es2022/import/comparers/asset-comparer.d.ts +12 -0
  74. package/dist/es2022/import/comparers/asset-comparer.js +65 -0
  75. package/dist/es2022/import/comparers/asset-comparer.js.map +1 -0
  76. package/dist/es2022/import/context/import-context-fetcher.d.ts +4 -0
  77. package/dist/es2022/import/context/import-context-fetcher.js +235 -0
  78. package/dist/es2022/import/context/import-context-fetcher.js.map +1 -0
  79. package/dist/es2022/import/import-manager.d.ts +4 -0
  80. package/dist/es2022/import/import-manager.js +80 -0
  81. package/dist/es2022/import/import-manager.js.map +1 -0
  82. package/dist/es2022/import/import.models.d.ts +45 -0
  83. package/dist/es2022/import/import.models.js +2 -0
  84. package/dist/es2022/import/import.models.js.map +1 -0
  85. package/dist/es2022/import/importers/assets-importer.d.ts +10 -0
  86. package/dist/es2022/import/importers/assets-importer.js +175 -0
  87. package/dist/es2022/import/importers/assets-importer.js.map +1 -0
  88. package/dist/es2022/import/importers/content-items-importer.d.ts +10 -0
  89. package/dist/es2022/import/importers/content-items-importer.js +97 -0
  90. package/dist/es2022/import/importers/content-items-importer.js.map +1 -0
  91. package/dist/es2022/import/importers/language-variant-importer.d.ts +11 -0
  92. package/dist/es2022/import/importers/language-variant-importer.js +215 -0
  93. package/dist/es2022/import/importers/language-variant-importer.js.map +1 -0
  94. package/dist/es2022/import/importers/workflow-importer.d.ts +18 -0
  95. package/dist/es2022/import/importers/workflow-importer.js +122 -0
  96. package/dist/es2022/import/importers/workflow-importer.js.map +1 -0
  97. package/dist/es2022/import/index.d.ts +2 -0
  98. package/dist/es2022/import/index.js +3 -0
  99. package/dist/es2022/import/index.js.map +1 -0
  100. package/dist/es2022/import/utils/import.utils.d.ts +2 -0
  101. package/dist/es2022/import/utils/import.utils.js +5 -0
  102. package/dist/es2022/import/utils/import.utils.js.map +1 -0
  103. package/dist/es2022/index.d.ts +8 -0
  104. package/dist/es2022/index.js +10 -0
  105. package/dist/es2022/index.js.map +1 -0
  106. package/dist/es2022/metadata.d.ts +5 -0
  107. package/dist/es2022/metadata.js +6 -0
  108. package/dist/es2022/metadata.js.map +1 -0
  109. package/dist/es2022/node/cli/actions/export-action.d.ts +2 -0
  110. package/dist/es2022/node/cli/actions/export-action.js +40 -0
  111. package/dist/es2022/node/cli/actions/export-action.js.map +1 -0
  112. package/dist/es2022/node/cli/actions/import-action.d.ts +2 -0
  113. package/dist/es2022/node/cli/actions/import-action.js +29 -0
  114. package/dist/es2022/node/cli/actions/import-action.js.map +1 -0
  115. package/dist/es2022/node/cli/actions/migrate-action.d.ts +2 -0
  116. package/dist/es2022/node/cli/actions/migrate-action.js +47 -0
  117. package/dist/es2022/node/cli/actions/migrate-action.js.map +1 -0
  118. package/dist/es2022/node/cli/app.d.ts +2 -0
  119. package/dist/es2022/node/cli/app.js +27 -0
  120. package/dist/es2022/node/cli/app.js.map +1 -0
  121. package/dist/es2022/node/cli/args/args-fetcher.d.ts +2 -0
  122. package/dist/es2022/node/cli/args/args-fetcher.js +46 -0
  123. package/dist/es2022/node/cli/args/args-fetcher.js.map +1 -0
  124. package/dist/es2022/node/cli/args/args-setter.d.ts +2 -0
  125. package/dist/es2022/node/cli/args/args-setter.js +31 -0
  126. package/dist/es2022/node/cli/args/args-setter.js.map +1 -0
  127. package/dist/es2022/node/cli/cli.models.d.ts +24 -0
  128. package/dist/es2022/node/cli/cli.models.js +2 -0
  129. package/dist/es2022/node/cli/cli.models.js.map +1 -0
  130. package/dist/es2022/node/cli/commands.d.ts +1 -0
  131. package/dist/es2022/node/cli/commands.js +157 -0
  132. package/dist/es2022/node/cli/commands.js.map +1 -0
  133. package/dist/es2022/toolkit/elements-builder.d.ts +14 -0
  134. package/dist/es2022/toolkit/elements-builder.js +69 -0
  135. package/dist/es2022/toolkit/elements-builder.js.map +1 -0
  136. package/dist/es2022/toolkit/export.d.ts +3 -0
  137. package/dist/es2022/toolkit/export.js +21 -0
  138. package/dist/es2022/toolkit/export.js.map +1 -0
  139. package/dist/es2022/toolkit/file.d.ts +12 -0
  140. package/dist/es2022/toolkit/file.js +50 -0
  141. package/dist/es2022/toolkit/file.js.map +1 -0
  142. package/dist/es2022/toolkit/import.d.ts +2 -0
  143. package/dist/es2022/toolkit/import.js +21 -0
  144. package/dist/es2022/toolkit/import.js.map +1 -0
  145. package/dist/es2022/toolkit/index.d.ts +5 -0
  146. package/dist/es2022/toolkit/index.js +6 -0
  147. package/dist/es2022/toolkit/index.js.map +1 -0
  148. package/dist/es2022/toolkit/migrate.d.ts +21 -0
  149. package/dist/es2022/toolkit/migrate.js +39 -0
  150. package/dist/es2022/toolkit/migrate.js.map +1 -0
  151. package/dist/es2022/translation/extraction/items-extraction.processor.d.ts +24 -0
  152. package/dist/es2022/translation/extraction/items-extraction.processor.js +108 -0
  153. package/dist/es2022/translation/extraction/items-extraction.processor.js.map +1 -0
  154. package/dist/es2022/translation/helpers/rich-text.processor.d.ts +22 -0
  155. package/dist/es2022/translation/helpers/rich-text.processor.js +209 -0
  156. package/dist/es2022/translation/helpers/rich-text.processor.js.map +1 -0
  157. package/dist/es2022/translation/index.d.ts +4 -0
  158. package/dist/es2022/translation/index.js +5 -0
  159. package/dist/es2022/translation/index.js.map +1 -0
  160. package/dist/es2022/translation/transforms/export-transforms.d.ts +3 -0
  161. package/dist/es2022/translation/transforms/export-transforms.js +196 -0
  162. package/dist/es2022/translation/transforms/export-transforms.js.map +1 -0
  163. package/dist/es2022/translation/transforms/import-transforms.d.ts +7 -0
  164. package/dist/es2022/translation/transforms/import-transforms.js +183 -0
  165. package/dist/es2022/translation/transforms/import-transforms.js.map +1 -0
  166. package/dist/es2022/zip/index.d.ts +4 -0
  167. package/dist/es2022/zip/index.js +5 -0
  168. package/dist/es2022/zip/index.js.map +1 -0
  169. package/dist/es2022/zip/zip-manager.d.ts +6 -0
  170. package/dist/es2022/zip/zip-manager.js +27 -0
  171. package/dist/es2022/zip/zip-manager.js.map +1 -0
  172. package/dist/es2022/zip/zip-packager.d.ts +3 -0
  173. package/dist/es2022/zip/zip-packager.js +69 -0
  174. package/dist/es2022/zip/zip-packager.js.map +1 -0
  175. package/dist/es2022/zip/zip-transformer.d.ts +6 -0
  176. package/dist/es2022/zip/zip-transformer.js +82 -0
  177. package/dist/es2022/zip/zip-transformer.js.map +1 -0
  178. package/dist/es2022/zip/zip.models.d.ts +13 -0
  179. package/dist/es2022/zip/zip.models.js +2 -0
  180. package/dist/es2022/zip/zip.models.js.map +1 -0
  181. package/lib/core/helpers/workflow-helper.ts +104 -0
  182. package/lib/core/index.ts +17 -0
  183. package/lib/core/logs/loggers.ts +80 -0
  184. package/lib/core/models/core.models.ts +134 -0
  185. package/lib/core/models/log.models.ts +31 -0
  186. package/lib/core/models/migration.models.ts +165 -0
  187. package/lib/core/utils/array.utils.ts +49 -0
  188. package/lib/core/utils/binary-data.utils.ts +29 -0
  189. package/lib/core/utils/confirm.utils.ts +139 -0
  190. package/lib/core/utils/error.utils.ts +65 -0
  191. package/lib/core/utils/external-id.utils.ts +9 -0
  192. package/lib/core/utils/global.utils.ts +59 -0
  193. package/lib/core/utils/http.utils.ts +35 -0
  194. package/lib/core/utils/management-client-utils.ts +182 -0
  195. package/lib/core/utils/processing-utils.ts +71 -0
  196. package/lib/core/utils/run.utils.ts +51 -0
  197. package/lib/export/context/export-context-fetcher.ts +475 -0
  198. package/lib/export/export-manager.ts +249 -0
  199. package/lib/export/export.models.ts +87 -0
  200. package/lib/export/index.ts +2 -0
  201. package/lib/export/utils/export.utils.ts +10 -0
  202. package/lib/file/file-manager.ts +37 -0
  203. package/lib/file/index.ts +1 -0
  204. package/lib/import/comparers/asset-comparer.ts +113 -0
  205. package/lib/import/context/import-context-fetcher.ts +367 -0
  206. package/lib/import/import-manager.ts +103 -0
  207. package/lib/import/import.models.ts +84 -0
  208. package/lib/import/importers/assets-importer.ts +239 -0
  209. package/lib/import/importers/content-items-importer.ts +142 -0
  210. package/lib/import/importers/language-variant-importer.ts +342 -0
  211. package/lib/import/importers/workflow-importer.ts +159 -0
  212. package/lib/import/index.ts +2 -0
  213. package/lib/import/utils/import.utils.ts +10 -0
  214. package/lib/index.ts +9 -0
  215. package/lib/metadata.ts +6 -0
  216. package/lib/node/cli/actions/export-action.ts +45 -0
  217. package/lib/node/cli/actions/import-action.ts +34 -0
  218. package/lib/node/cli/actions/migrate-action.ts +52 -0
  219. package/lib/node/cli/app.ts +29 -0
  220. package/lib/node/cli/args/args-fetcher.ts +61 -0
  221. package/lib/node/cli/args/args-setter.ts +35 -0
  222. package/lib/node/cli/cli.models.ts +28 -0
  223. package/lib/node/cli/commands.ts +161 -0
  224. package/lib/toolkit/elements-builder.ts +84 -0
  225. package/lib/toolkit/export.ts +21 -0
  226. package/lib/toolkit/file.ts +70 -0
  227. package/lib/toolkit/import.ts +21 -0
  228. package/lib/toolkit/index.ts +5 -0
  229. package/lib/toolkit/migrate.ts +71 -0
  230. package/lib/translation/extraction/items-extraction.processor.ts +181 -0
  231. package/lib/translation/helpers/rich-text.processor.ts +300 -0
  232. package/lib/translation/index.ts +4 -0
  233. package/lib/translation/transforms/export-transforms.ts +253 -0
  234. package/lib/translation/transforms/import-transforms.ts +215 -0
  235. package/lib/zip/index.ts +4 -0
  236. package/lib/zip/zip-manager.ts +33 -0
  237. package/lib/zip/zip-packager.ts +86 -0
  238. package/lib/zip/zip-transformer.ts +105 -0
  239. package/lib/zip/zip.models.ts +12 -0
  240. package/package.json +88 -0
@@ -0,0 +1,167 @@
1
+ import chalk from 'chalk';
2
+ import { extractErrorData, processItemsAsync, getBinaryDataFromUrlAsync, getDefaultLogger, isNotUndefined, getMigrationManagementClient, findRequired } from '../core/index.js';
3
+ import { exportTransforms } from '../translation/index.js';
4
+ import { exportContextFetcherAsync } from './context/export-context-fetcher.js';
5
+ export function exportManager(config) {
6
+ const logger = config.logger ?? getDefaultLogger();
7
+ const managementClient = getMigrationManagementClient(config);
8
+ const getMigrationItems = (context) => {
9
+ return context.exportItems.map((exportItem) => mapToMigrationItem(context, exportItem));
10
+ };
11
+ const mapToMigrationItem = (context, exportItem) => {
12
+ const migrationItem = {
13
+ system: {
14
+ name: exportItem.contentItem.name,
15
+ codename: exportItem.contentItem.codename,
16
+ language: { codename: exportItem.language.codename },
17
+ type: { codename: exportItem.contentType.contentTypeCodename },
18
+ collection: { codename: exportItem.collection.codename },
19
+ workflow: {
20
+ codename: exportItem.workflow.codename
21
+ }
22
+ },
23
+ versions: exportItem.versions.map((version) => {
24
+ return {
25
+ elements: getMigrationElements(context, exportItem.contentType, version.languageVariant.elements),
26
+ workflow_step: {
27
+ codename: version.workflowStepCodename
28
+ }
29
+ };
30
+ })
31
+ };
32
+ return migrationItem;
33
+ };
34
+ const mapToMigrationComponent = (context, component) => {
35
+ const componentType = context.environmentData.contentTypes.find((m) => m.contentTypeId === component.type.id);
36
+ if (!componentType) {
37
+ throw Error(`Could not find content type with id '${chalk.red(component.type.id)}' for component '${chalk.red(component.id)}'`);
38
+ }
39
+ const migrationItem = {
40
+ system: {
41
+ id: component.id,
42
+ type: {
43
+ codename: componentType.contentTypeCodename
44
+ }
45
+ },
46
+ elements: getMigrationElements(context, componentType, component.elements)
47
+ };
48
+ return migrationItem;
49
+ };
50
+ const getMigrationElements = (context, contentType, elements) => {
51
+ return contentType.elements
52
+ .toSorted((a, b) => {
53
+ if (a.codename < b.codename) {
54
+ return -1;
55
+ }
56
+ if (a.codename > b.codename) {
57
+ return 1;
58
+ }
59
+ return 0;
60
+ })
61
+ .reduce((model, typeElement) => {
62
+ const itemElement = findRequired(elements, (m) => m.element.id === typeElement.id, `Could not find element '${chalk.red(typeElement.codename)}'`);
63
+ model[typeElement.codename] = {
64
+ type: typeElement.type,
65
+ value: getValueToStoreFromElement({
66
+ context: context,
67
+ contentType: contentType,
68
+ exportElement: itemElement,
69
+ typeElement: typeElement
70
+ })
71
+ };
72
+ return model;
73
+ }, {});
74
+ };
75
+ const getValueToStoreFromElement = (data) => {
76
+ try {
77
+ return exportTransforms[data.typeElement.type]({
78
+ context: data.context,
79
+ typeElement: data.typeElement,
80
+ exportElement: {
81
+ components: data.exportElement.components.map((component) => mapToMigrationComponent(data.context, component)),
82
+ value: data.exportElement.value,
83
+ urlSlugMode: data.exportElement.mode
84
+ }
85
+ });
86
+ }
87
+ catch (error) {
88
+ const errorData = extractErrorData(error);
89
+ let jsonValue = 'n/a';
90
+ try {
91
+ jsonValue = JSON.stringify(data.exportElement.value);
92
+ }
93
+ catch (jsonError) {
94
+ console.error(`Failed to convert json value`, jsonError);
95
+ }
96
+ throw new Error(`Failed to map value of element '${chalk.yellow(data.typeElement.codename)}' of type '${chalk.cyan(data.typeElement.type)}'. Value: ${chalk.bgMagenta(jsonValue)}. Message: ${errorData.message}`);
97
+ }
98
+ };
99
+ const exportAssetsAsync = async (context) => {
100
+ const assets = Array.from(context.referencedData.assetIds)
101
+ .map((assetId) => context.getAssetStateInSourceEnvironment(assetId).asset)
102
+ .filter(isNotUndefined);
103
+ return await getMigrationAssetsWithBinaryDataAsync(assets, context);
104
+ };
105
+ const getMigrationAssetsWithBinaryDataAsync = async (assets, context) => {
106
+ logger.log({
107
+ type: 'info',
108
+ message: `Preparing to download '${chalk.yellow(assets.length.toString())}' assets`
109
+ });
110
+ return await processItemsAsync({
111
+ action: 'Downloading assets',
112
+ logger: logger,
113
+ parallelLimit: 5,
114
+ itemInfo: (input) => {
115
+ return {
116
+ title: input.codename,
117
+ itemType: 'asset'
118
+ };
119
+ },
120
+ items: assets,
121
+ processAsync: async (asset, logSpinner) => {
122
+ const assetCollection = context.environmentData.collections.find((m) => m.id === asset.collection?.reference?.id);
123
+ logSpinner({
124
+ type: 'download',
125
+ message: `${asset.url}`
126
+ });
127
+ const binaryData = await getBinaryDataFromUrlAsync(asset.url);
128
+ const migrationAsset = {
129
+ filename: asset.fileName,
130
+ title: asset.title ?? '',
131
+ codename: asset.codename,
132
+ binaryData: binaryData.data,
133
+ collection: assetCollection ? { codename: assetCollection.codename } : undefined,
134
+ descriptions: asset.descriptions.map((description) => {
135
+ const language = findRequired(context.environmentData.languages, (language) => language.id === description.language.id, `Could not find language with id '${chalk.red(description.language.id)}' requested by asset '${chalk.red(asset.codename)}'`);
136
+ return {
137
+ description: description.description ?? undefined,
138
+ language: {
139
+ codename: language.codename
140
+ }
141
+ };
142
+ })
143
+ };
144
+ return migrationAsset;
145
+ }
146
+ });
147
+ };
148
+ return {
149
+ async exportAsync() {
150
+ const exportContext = await (await exportContextFetcherAsync({
151
+ exportItems: config.exportItems,
152
+ logger: logger,
153
+ managementClient: managementClient
154
+ })).getExportContextAsync();
155
+ const migrationData = {
156
+ items: getMigrationItems(exportContext),
157
+ assets: await exportAssetsAsync(exportContext)
158
+ };
159
+ logger.log({
160
+ type: 'completed',
161
+ message: `Finished export`
162
+ });
163
+ return migrationData;
164
+ }
165
+ };
166
+ }
167
+ //# sourceMappingURL=export-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-manager.js","sourceRoot":"","sources":["../../../lib/export/export-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Logger, FlattenedContentType, AssetStateInSourceEnvironmentById, FlattenedContentTypeElement, ItemStateInSourceEnvironmentById, ReferencedDataInLanguageVariants, MigrationElementValue, MigrationComponent, MigrationUrlSlugMode, ManagementClientConfig } from '../core/index.js';
2
+ import { LanguageVariantModels, ContentItemModels, WorkflowModels, CollectionModels, LanguageModels, TaxonomyModels, ManagementClient, SharedModels } from '@kontent-ai/management-sdk';
3
+ export interface ExportContextEnvironmentData {
4
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
5
+ readonly contentTypes: readonly Readonly<FlattenedContentType>[];
6
+ readonly collections: readonly Readonly<CollectionModels.Collection>[];
7
+ readonly workflows: readonly Readonly<WorkflowModels.Workflow>[];
8
+ readonly taxonomies: readonly Readonly<TaxonomyModels.Taxonomy>[];
9
+ }
10
+ export type ExportElementValue = string | number | SharedModels.ReferenceObject[] | undefined;
11
+ export interface ExportElement {
12
+ readonly value: ExportElementValue;
13
+ readonly components: readonly MigrationComponent[];
14
+ readonly urlSlugMode: MigrationUrlSlugMode | undefined;
15
+ }
16
+ export type ExportTransformFunc = (data: {
17
+ readonly typeElement: FlattenedContentTypeElement;
18
+ readonly exportElement: ExportElement;
19
+ readonly context: ExportContext;
20
+ }) => MigrationElementValue;
21
+ export interface ExportContext {
22
+ readonly environmentData: ExportContextEnvironmentData;
23
+ readonly referencedData: ReferencedDataInLanguageVariants;
24
+ readonly getItemStateInSourceEnvironment: (id: string) => ItemStateInSourceEnvironmentById;
25
+ readonly getAssetStateInSourceEnvironment: (id: string) => AssetStateInSourceEnvironmentById;
26
+ readonly exportItems: readonly ExportItem[];
27
+ readonly getElement: GetFlattenedElementByIds;
28
+ }
29
+ export interface SourceExportItem {
30
+ readonly itemCodename: string;
31
+ readonly languageCodename: string;
32
+ }
33
+ export interface ExportConfig extends ManagementClientConfig {
34
+ readonly exportItems: readonly SourceExportItem[];
35
+ readonly logger?: Logger;
36
+ }
37
+ export interface DefaultExportContextConfig {
38
+ readonly logger: Logger;
39
+ readonly exportItems: readonly SourceExportItem[];
40
+ readonly managementClient: Readonly<ManagementClient>;
41
+ }
42
+ export type GetFlattenedElementByIds = (contentTypeId: string, elementId: string) => FlattenedContentTypeElement;
43
+ export interface ExportItemVersion {
44
+ readonly workflowStepCodename: string;
45
+ readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
46
+ }
47
+ export interface ExportItem {
48
+ readonly requestItem: SourceExportItem;
49
+ readonly versions: readonly ExportItemVersion[];
50
+ readonly contentItem: Readonly<ContentItemModels.ContentItem>;
51
+ readonly collection: Readonly<CollectionModels.Collection>;
52
+ readonly language: Readonly<LanguageModels.LanguageModel>;
53
+ readonly workflow: Readonly<WorkflowModels.Workflow>;
54
+ readonly contentType: Readonly<FlattenedContentType>;
55
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export.models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.models.js","sourceRoot":"","sources":["../../../lib/export/export.models.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './export.models.js';
2
+ export * from './export-manager.js';
@@ -0,0 +1,3 @@
1
+ export * from './export.models.js';
2
+ export * from './export-manager.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/export/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { SourceExportItem } from '../export.models.js';
2
+ export declare function throwErrorForItemRequest(itemRequest: SourceExportItem, message: string): never;
@@ -0,0 +1,5 @@
1
+ import chalk from 'chalk';
2
+ export function throwErrorForItemRequest(itemRequest, message) {
3
+ throw Error(`Export failed for item '${chalk.yellow(itemRequest.itemCodename)}' in language '${chalk.cyan(itemRequest.languageCodename)}'. Reason: ${message}`);
4
+ }
5
+ //# sourceMappingURL=export.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.utils.js","sourceRoot":"","sources":["../../../../lib/export/utils/export.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,wBAAwB,CAAC,WAA6B,EAAE,OAAe;IACnF,MAAM,KAAK,CACP,2BAA2B,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,kBAAkB,KAAK,CAAC,IAAI,CACzF,WAAW,CAAC,gBAAgB,CAC/B,cAAc,OAAO,EAAE,CAC3B,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Logger } from '../core/index.js';
2
+ export declare function fileManager(logger: Logger): {
3
+ loadFileAsync: (filename: string) => Promise<Buffer>;
4
+ writeFileAsync: (fileNameWithoutExtension: string, content: string | Buffer) => Promise<void>;
5
+ };
@@ -0,0 +1,29 @@
1
+ import chalk from 'chalk';
2
+ import { promises } from 'fs';
3
+ export function fileManager(logger) {
4
+ const getFilePath = (filename) => {
5
+ return `./${filename}`;
6
+ };
7
+ const loadFileAsync = async (filename) => {
8
+ const filePath = getFilePath(filename);
9
+ logger.log({
10
+ type: 'readFs',
11
+ message: `Reading file '${chalk.yellow(filePath)}'`
12
+ });
13
+ const file = await promises.readFile(filePath);
14
+ return file;
15
+ };
16
+ const writeFileAsync = async (fileNameWithoutExtension, content) => {
17
+ const filePath = getFilePath(fileNameWithoutExtension);
18
+ logger.log({
19
+ type: 'writeFs',
20
+ message: `Storing file '${chalk.yellow(filePath)}'`
21
+ });
22
+ await promises.writeFile(filePath, content);
23
+ };
24
+ return {
25
+ loadFileAsync,
26
+ writeFileAsync
27
+ };
28
+ }
29
+ //# sourceMappingURL=file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.js","sourceRoot":"","sources":["../../../lib/file/file-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAE9B,MAAM,UAAU,WAAW,CAAC,MAAc;IACtC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE;QAC7C,OAAO,KAAK,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,QAAgB,EAAmB,EAAE;QAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,iBAAiB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;SACtD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE/C,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAAE,wBAAgC,EAAE,OAAwB,EAAiB,EAAE;QACvG,MAAM,QAAQ,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAEvD,MAAM,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,iBAAiB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;SACtD,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,OAAO;QACH,aAAa;QACb,cAAc;KACjB,CAAC;AACN,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './file-manager.js';
@@ -0,0 +1,2 @@
1
+ export * from './file-manager.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/file/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { AssetModels, CollectionModels, LanguageModels } from '@kontent-ai/management-sdk';
2
+ import { MigrationAsset } from '../../core/index.js';
3
+ export declare function shouldUpdateAsset(data: {
4
+ readonly migrationAsset: MigrationAsset;
5
+ readonly targetAsset: Readonly<AssetModels.Asset>;
6
+ readonly collections: readonly Readonly<CollectionModels.Collection>[];
7
+ readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
8
+ }): boolean;
9
+ export declare function shouldReplaceBinaryFile(data: {
10
+ readonly migrationAsset: MigrationAsset;
11
+ readonly targetAsset: Readonly<AssetModels.Asset>;
12
+ }): boolean;
@@ -0,0 +1,65 @@
1
+ import { findRequired, geSizeInBytes } from '../../core/index.js';
2
+ import deepEqual from 'deep-equal';
3
+ export function shouldUpdateAsset(data) {
4
+ if (!isInSameCollection(data)) {
5
+ return true;
6
+ }
7
+ if (!areDescriptionsIdentical(data)) {
8
+ return true;
9
+ }
10
+ if (!isTitleIdentical(data)) {
11
+ return true;
12
+ }
13
+ if (!isBinaryFileIdentical(data)) {
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ export function shouldReplaceBinaryFile(data) {
19
+ if (!isBinaryFileIdentical(data)) {
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ function isBinaryFileIdentical(data) {
25
+ const sourceFileSize = geSizeInBytes(data.migrationAsset.binaryData);
26
+ const targetFileSize = data.targetAsset.size;
27
+ const sourceFilename = data.migrationAsset.filename;
28
+ const targetFilename = data.targetAsset.fileName;
29
+ return sourceFileSize === targetFileSize && sourceFilename === targetFilename;
30
+ }
31
+ function isTitleIdentical(data) {
32
+ const sourceTitle = data.migrationAsset.title?.length ? data.migrationAsset.title : undefined;
33
+ const targetTitle = data.targetAsset.title?.length ? data.targetAsset.title : undefined;
34
+ return sourceTitle === targetTitle;
35
+ }
36
+ function isInSameCollection(data) {
37
+ return (data.collections.find((m) => m.id === data.targetAsset.collection?.reference?.id)?.codename ===
38
+ data.migrationAsset.collection?.codename);
39
+ }
40
+ function areDescriptionsIdentical(data) {
41
+ const sourceMigrationDescriptions = (data.migrationAsset.descriptions ?? [])
42
+ .map((description) => {
43
+ return {
44
+ description: description.description?.length ? description.description : undefined,
45
+ language: {
46
+ codename: description.language.codename
47
+ }
48
+ };
49
+ })
50
+ .toSorted();
51
+ const targetMigrationDescriptions = mapToMigrationDescriptions(data).toSorted();
52
+ return deepEqual(sourceMigrationDescriptions, targetMigrationDescriptions);
53
+ }
54
+ function mapToMigrationDescriptions(data) {
55
+ return data.targetAsset.descriptions.map((description) => {
56
+ const languageId = description.language.id;
57
+ return {
58
+ description: description.description?.length ? description.description : undefined,
59
+ language: {
60
+ codename: findRequired(data.languages, (language) => language.id === languageId, `Could not find language with id '${languageId}'`).codename
61
+ }
62
+ };
63
+ });
64
+ }
65
+ //# sourceMappingURL=asset-comparer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-comparer.js","sourceRoot":"","sources":["../../../../lib/import/comparers/asset-comparer.ts"],"names":[],"mappings":"AACA,OAAO,EAA6C,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7G,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAAC,IAKjC;IACG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAGvC;IACG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,qBAAqB,CAAC,IAG9B;IACG,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAE7C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAEjD,OAAO,cAAc,KAAK,cAAc,IAAI,cAAc,KAAK,cAAc,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAGzB;IACG,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAExF,OAAO,WAAW,KAAK,WAAW,CAAC;AACvC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAI3B;IACG,OAAO,CACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,QAAQ;QAC3F,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAC3C,CAAC;AACN,CAAC;AAED,SAAS,wBAAwB,CAAC,IAIjC;IACG,MAAM,2BAA2B,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,IAAI,EAAE,CAAC;SACvE,GAAG,CAA4B,CAAC,WAAW,EAAE,EAAE;QAC5C,OAAO;YACH,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAClF,QAAQ,EAAE;gBACN,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ;aAC1C;SACJ,CAAC;IACN,CAAC,CAAC;SACD,QAAQ,EAAE,CAAC;IAChB,MAAM,2BAA2B,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEhF,OAAO,SAAS,CAAC,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,0BAA0B,CAAC,IAGnC;IACG,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACrD,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAE3C,OAAO;YACH,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAClF,QAAQ,EAAE;gBACN,QAAQ,EAAE,YAAY,CAClB,IAAI,CAAC,SAAS,EACd,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,EACxC,oCAAoC,UAAU,GAAG,CACpD,CAAC,QAAQ;aACb;SACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ImportContext, ImportContextConfig } from '../import.models.js';
2
+ export declare function importContextFetcherAsync(config: ImportContextConfig): Promise<{
3
+ getImportContextAsync: () => Promise<ImportContext>;
4
+ }>;
@@ -0,0 +1,235 @@
1
+ import { findRequired, is404Error, isNotUndefined, managementClientUtils, processItemsAsync, runMapiRequestAsync, workflowHelper } from '../../core/index.js';
2
+ import { itemsExtractionProcessor } from '../../translation/index.js';
3
+ import chalk from 'chalk';
4
+ export async function importContextFetcherAsync(config) {
5
+ const getEnvironmentDataAsync = async () => {
6
+ const mapiUtils = managementClientUtils(config.managementClient, config.logger);
7
+ return await config.logger.logWithSpinnerAsync(async (spinnerData) => {
8
+ spinnerData({ type: 'info', message: `Loading environment data` });
9
+ const environmentData = {
10
+ collections: await mapiUtils.getAllCollectionsAsync(spinnerData),
11
+ languages: await mapiUtils.getAllLanguagesAsync(spinnerData),
12
+ workflows: await mapiUtils.getAllWorkflowsAsync(spinnerData),
13
+ types: await mapiUtils.getFlattenedContentTypesAsync(spinnerData)
14
+ };
15
+ spinnerData({ type: 'info', message: `Environmental data loaded` });
16
+ return environmentData;
17
+ });
18
+ };
19
+ const environmentData = await getEnvironmentDataAsync();
20
+ const getElement = () => {
21
+ const getFlattenedElement = (contentTypeCodename, elementCodename, sourceType) => {
22
+ const contentType = findRequired(environmentData.types, (type) => type.contentTypeCodename === contentTypeCodename, `Content type with codename '${chalk.red(contentTypeCodename)}' was not found.`);
23
+ const element = findRequired(contentType.elements, (element) => element.codename === elementCodename, `Element type with codename '${chalk.red(elementCodename)}' was not found in content type '${chalk.red(contentTypeCodename)}'. Available elements are '${contentType.elements
24
+ .map((element) => chalk.yellow(element.codename))
25
+ .join(', ')}'`);
26
+ if (sourceType !== element.type) {
27
+ throw Error(`Element '${chalk.red(element.codename)}' in content type '${chalk.yellow(contentType.contentTypeCodename)}' is of type '${chalk.red(element.type)}', but source type is '${chalk.yellow(sourceType)}'.`);
28
+ }
29
+ return element;
30
+ };
31
+ return getFlattenedElement;
32
+ };
33
+ const getLanguageVariantsAsync = async (migrationItems) => {
34
+ return (await processItemsAsync({
35
+ action: 'Fetching language variants',
36
+ logger: config.logger,
37
+ parallelLimit: 1,
38
+ items: migrationItems,
39
+ itemInfo: (item) => {
40
+ return {
41
+ itemType: 'languageVariant',
42
+ title: `${item.system.codename} (${item.system.language.codename})`
43
+ };
44
+ },
45
+ processAsync: async (item, logSpinner) => {
46
+ try {
47
+ const languageVariant = await runMapiRequestAsync({
48
+ logger: config.logger,
49
+ func: async () => (await config.managementClient
50
+ .viewLanguageVariant()
51
+ .byItemCodename(item.system.codename)
52
+ .byLanguageCodename(item.system.language.codename)
53
+ .toPromise()).data,
54
+ action: 'view',
55
+ type: 'languageVariant',
56
+ logSpinner: logSpinner,
57
+ itemName: `codename -> ${item.system.codename} (${item.system.language.codename})`
58
+ });
59
+ return {
60
+ languageVariant: languageVariant,
61
+ migrationItem: item
62
+ };
63
+ }
64
+ catch (error) {
65
+ if (!is404Error(error)) {
66
+ throw error;
67
+ }
68
+ return undefined;
69
+ }
70
+ }
71
+ })).filter(isNotUndefined);
72
+ };
73
+ const getContentItemsByCodenamesAsync = async (itemCodenames) => {
74
+ return (await processItemsAsync({
75
+ action: 'Fetching content items',
76
+ logger: config.logger,
77
+ parallelLimit: 1,
78
+ items: Array.from(itemCodenames),
79
+ itemInfo: (codename) => {
80
+ return {
81
+ itemType: 'contentItem',
82
+ title: codename
83
+ };
84
+ },
85
+ processAsync: async (codename, logSpinner) => {
86
+ try {
87
+ return await runMapiRequestAsync({
88
+ logger: config.logger,
89
+ func: async () => (await config.managementClient.viewContentItem().byItemCodename(codename).toPromise()).data,
90
+ action: 'view',
91
+ type: 'contentItem',
92
+ logSpinner: logSpinner,
93
+ itemName: `codename -> ${codename}`
94
+ });
95
+ }
96
+ catch (error) {
97
+ if (!is404Error(error)) {
98
+ throw error;
99
+ }
100
+ return undefined;
101
+ }
102
+ }
103
+ })).filter(isNotUndefined);
104
+ };
105
+ const getAssetsByCodenamesAsync = async (assetCodenames) => {
106
+ return (await processItemsAsync({
107
+ action: 'Fetching assets',
108
+ logger: config.logger,
109
+ parallelLimit: 1,
110
+ items: Array.from(assetCodenames),
111
+ itemInfo: (codename) => {
112
+ return {
113
+ itemType: 'asset',
114
+ title: codename
115
+ };
116
+ },
117
+ processAsync: async (codename, logSpinner) => {
118
+ try {
119
+ return await runMapiRequestAsync({
120
+ logger: config.logger,
121
+ func: async () => (await config.managementClient.viewAsset().byAssetCodename(codename).toPromise()).data,
122
+ action: 'view',
123
+ type: 'asset',
124
+ logSpinner: logSpinner,
125
+ itemName: `codename -> ${codename}`
126
+ });
127
+ }
128
+ catch (error) {
129
+ if (!is404Error(error)) {
130
+ throw error;
131
+ }
132
+ return undefined;
133
+ }
134
+ }
135
+ })).filter(isNotUndefined);
136
+ };
137
+ const getVariantStatesAsync = async (migrationItems) => {
138
+ const variants = await getLanguageVariantsAsync(migrationItems);
139
+ return migrationItems.map((migrationItem) => {
140
+ const variant = variants.find((m) => m.migrationItem.system.codename === migrationItem.system.codename &&
141
+ m.migrationItem.system.language === migrationItem.system.language);
142
+ const variantWorkflowId = variant?.languageVariant?.workflow?.workflowIdentifier?.id;
143
+ const variantStepId = variant?.languageVariant?.workflow?.stepIdentifier?.id;
144
+ const workflow = environmentData.workflows.find((workflow) => workflow.id === variantWorkflowId);
145
+ return {
146
+ itemCodename: migrationItem.system.codename,
147
+ languageCodename: migrationItem.system.language.codename,
148
+ languageVariant: variant?.languageVariant,
149
+ workflow: workflow,
150
+ step: workflow
151
+ ? workflowHelper(environmentData.workflows).getWorkflowStep(workflow, {
152
+ errorMessage: `Could not workflow step with id '${chalk.red(variantStepId)}' in workflow '${chalk.yellow(workflow.codename)}'`,
153
+ match: (step) => step.id == variantStepId
154
+ })
155
+ : undefined,
156
+ state: variant ? 'exists' : 'doesNotExists'
157
+ };
158
+ });
159
+ };
160
+ const getItemStatesAsync = async (itemCodenames) => {
161
+ const items = await getContentItemsByCodenamesAsync(itemCodenames);
162
+ return Array.from(itemCodenames).map((codename) => {
163
+ const item = items.find((m) => m.codename === codename);
164
+ return {
165
+ itemCodename: codename,
166
+ item: item,
167
+ state: item ? 'exists' : 'doesNotExists',
168
+ externalIdToUse: config.externalIdGenerator.contentItemExternalId(codename)
169
+ };
170
+ });
171
+ };
172
+ const getAssetStatesAsync = async (assetCodenames) => {
173
+ const assets = await getAssetsByCodenamesAsync(assetCodenames);
174
+ return Array.from(assetCodenames).map((codename) => {
175
+ const asset = assets.find((m) => m.codename === codename);
176
+ return {
177
+ assetCodename: codename,
178
+ asset: asset,
179
+ state: asset ? 'exists' : 'doesNotExists',
180
+ externalIdToUse: config.externalIdGenerator.assetExternalId(codename)
181
+ };
182
+ });
183
+ };
184
+ const getImportContextAsync = async () => {
185
+ const getElementByCodenames = getElement();
186
+ const referencedData = itemsExtractionProcessor().extractReferencedItemsFromMigrationItems(config.migrationData.items.reduce((items, item) => {
187
+ return [
188
+ ...items,
189
+ ...item.versions.map((version) => {
190
+ const extractionItem = {
191
+ contentTypeCodename: item.system.type.codename,
192
+ elements: version.elements
193
+ };
194
+ return extractionItem;
195
+ })
196
+ ];
197
+ }, []), getElementByCodenames);
198
+ // fetch all items, including referenced items in content
199
+ const itemCodenamesToCheckInTargetEnv = new Set([
200
+ ...referencedData.itemCodenames,
201
+ ...config.migrationData.items.map((m) => m.system.codename)
202
+ ]);
203
+ // fetch all assets, including referenced assets in content
204
+ const assetCodenamesToCheckInTargetEnv = new Set([
205
+ ...referencedData.assetCodenames,
206
+ ...config.migrationData.assets.map((m) => m.codename)
207
+ ]);
208
+ // prepare state of objects in target environment
209
+ const itemStates = await getItemStatesAsync(itemCodenamesToCheckInTargetEnv);
210
+ const variantStates = await getVariantStatesAsync(config.migrationData.items);
211
+ const assetStates = await getAssetStatesAsync(assetCodenamesToCheckInTargetEnv);
212
+ return {
213
+ environmentData,
214
+ referencedData,
215
+ categorizedImportData: {
216
+ assets: config.migrationData.assets,
217
+ contentItems: config.migrationData.items
218
+ },
219
+ getItemStateInTargetEnvironment: (itemCodename) => {
220
+ return findRequired(itemStates, (state) => state.itemCodename === itemCodename, `Invalid state for item '${chalk.red(itemCodename)}'. It is expected that all item states will be initialized`);
221
+ },
222
+ getLanguageVariantStateInTargetEnvironment: (itemCodename, languageCodename) => {
223
+ return findRequired(variantStates, (state) => state.itemCodename === itemCodename && state.languageCodename === languageCodename, `Invalid state for language variant '${chalk.red(itemCodename)}' in language '${chalk.red(languageCodename)}'. It is expected that all variant states will be initialized`);
224
+ },
225
+ getAssetStateInTargetEnvironment: (assetCodename) => {
226
+ return findRequired(assetStates, (state) => state.assetCodename === assetCodename, `Invalid state for asset '${chalk.red(assetCodename)}'. It is expected that all asset states will be initialized`);
227
+ },
228
+ getElement: getElementByCodenames
229
+ };
230
+ };
231
+ return {
232
+ getImportContextAsync
233
+ };
234
+ }
235
+ //# sourceMappingURL=import-context-fetcher.js.map