@kontent-ai/migration-toolkit 2.9.1 → 3.0.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +19 -17
  2. package/dist/core/config.js +3 -3
  3. package/dist/core/config.js.map +1 -1
  4. package/dist/core/helpers/workflow-helper.d.ts +1 -1
  5. package/dist/core/helpers/workflow-helper.js +28 -26
  6. package/dist/core/helpers/workflow-helper.js.map +1 -1
  7. package/dist/core/logs/loggers.d.ts +1 -1
  8. package/dist/core/logs/loggers.js +15 -15
  9. package/dist/core/logs/loggers.js.map +1 -1
  10. package/dist/core/models/core.models.d.ts +27 -22
  11. package/dist/core/models/error.models.d.ts +14 -0
  12. package/dist/core/models/error.models.js +25 -0
  13. package/dist/core/models/error.models.js.map +1 -0
  14. package/dist/core/models/log.models.d.ts +2 -2
  15. package/dist/core/models/migration.models.d.ts +14 -14
  16. package/dist/core/models/migration.schema.d.ts +9 -9
  17. package/dist/core/models/migration.schema.js +28 -28
  18. package/dist/core/models/migration.schema.js.map +1 -1
  19. package/dist/core/utils/array.utils.d.ts +1 -1
  20. package/dist/core/utils/array.utils.js +4 -3
  21. package/dist/core/utils/array.utils.js.map +1 -1
  22. package/dist/core/utils/binary-data.utils.d.ts +1 -1
  23. package/dist/core/utils/binary-data.utils.js +6 -6
  24. package/dist/core/utils/binary-data.utils.js.map +1 -1
  25. package/dist/core/utils/confirm.utils.d.ts +1 -1
  26. package/dist/core/utils/confirm.utils.js +21 -20
  27. package/dist/core/utils/confirm.utils.js.map +1 -1
  28. package/dist/core/utils/error.utils.d.ts +1 -1
  29. package/dist/core/utils/error.utils.js +16 -14
  30. package/dist/core/utils/error.utils.js.map +1 -1
  31. package/dist/core/utils/external-id.utils.js +1 -1
  32. package/dist/core/utils/external-id.utils.js.map +1 -1
  33. package/dist/core/utils/global.utils.d.ts +3 -3
  34. package/dist/core/utils/global.utils.js +20 -18
  35. package/dist/core/utils/global.utils.js.map +1 -1
  36. package/dist/core/utils/http.utils.d.ts +2 -2
  37. package/dist/core/utils/http.utils.js +4 -4
  38. package/dist/core/utils/http.utils.js.map +1 -1
  39. package/dist/core/utils/management-client-utils.d.ts +4 -4
  40. package/dist/core/utils/management-client-utils.js +34 -34
  41. package/dist/core/utils/management-client-utils.js.map +1 -1
  42. package/dist/core/utils/processing-utils.d.ts +4 -4
  43. package/dist/core/utils/processing-utils.js +13 -13
  44. package/dist/core/utils/processing-utils.js.map +1 -1
  45. package/dist/core/utils/run.utils.d.ts +2 -2
  46. package/dist/core/utils/run.utils.js +7 -7
  47. package/dist/core/utils/run.utils.js.map +1 -1
  48. package/dist/export/context/export-context-fetcher.d.ts +1 -1
  49. package/dist/export/context/export-context-fetcher.js +92 -62
  50. package/dist/export/context/export-context-fetcher.js.map +1 -1
  51. package/dist/export/export-manager.d.ts +2 -2
  52. package/dist/export/export-manager.js +46 -37
  53. package/dist/export/export-manager.js.map +1 -1
  54. package/dist/export/export.models.d.ts +21 -2
  55. package/dist/export/utils/export.utils.d.ts +1 -1
  56. package/dist/export/utils/export.utils.js +3 -2
  57. package/dist/export/utils/export.utils.js.map +1 -1
  58. package/dist/file/file-manager.d.ts +2 -2
  59. package/dist/file/file-manager.js +7 -7
  60. package/dist/file/file-manager.js.map +1 -1
  61. package/dist/import/comparers/asset-comparer.d.ts +2 -2
  62. package/dist/import/comparers/asset-comparer.js +12 -11
  63. package/dist/import/comparers/asset-comparer.js.map +1 -1
  64. package/dist/import/context/import-context-fetcher.d.ts +1 -1
  65. package/dist/import/context/import-context-fetcher.js +77 -73
  66. package/dist/import/context/import-context-fetcher.js.map +1 -1
  67. package/dist/import/import-manager.d.ts +1 -1
  68. package/dist/import/import-manager.js +59 -56
  69. package/dist/import/import-manager.js.map +1 -1
  70. package/dist/import/import.models.d.ts +6 -2
  71. package/dist/import/importers/assets-importer.d.ts +3 -3
  72. package/dist/import/importers/assets-importer.js +46 -43
  73. package/dist/import/importers/assets-importer.js.map +1 -1
  74. package/dist/import/importers/content-items-importer.d.ts +3 -3
  75. package/dist/import/importers/content-items-importer.js +28 -25
  76. package/dist/import/importers/content-items-importer.js.map +1 -1
  77. package/dist/import/importers/language-variant-importer.d.ts +3 -3
  78. package/dist/import/importers/language-variant-importer.js +45 -45
  79. package/dist/import/importers/language-variant-importer.js.map +1 -1
  80. package/dist/import/importers/workflow-importer.d.ts +3 -2
  81. package/dist/import/importers/workflow-importer.js +58 -54
  82. package/dist/import/importers/workflow-importer.js.map +1 -1
  83. package/dist/import/utils/import.utils.d.ts +1 -1
  84. package/dist/import/utils/import.utils.js +3 -2
  85. package/dist/import/utils/import.utils.js.map +1 -1
  86. package/dist/index.d.ts +11 -7
  87. package/dist/index.js +10 -8
  88. package/dist/index.js.map +1 -1
  89. package/dist/metadata.js +3 -3
  90. package/dist/metadata.js.map +1 -1
  91. package/dist/node/cli/actions/export-action.d.ts +1 -1
  92. package/dist/node/cli/actions/export-action.js +28 -23
  93. package/dist/node/cli/actions/export-action.js.map +1 -1
  94. package/dist/node/cli/actions/import-action.d.ts +1 -1
  95. package/dist/node/cli/actions/import-action.js +15 -12
  96. package/dist/node/cli/actions/import-action.js.map +1 -1
  97. package/dist/node/cli/actions/migrate-action.d.ts +1 -1
  98. package/dist/node/cli/actions/migrate-action.js +25 -22
  99. package/dist/node/cli/actions/migrate-action.js.map +1 -1
  100. package/dist/node/cli/app.js +13 -12
  101. package/dist/node/cli/app.js.map +1 -1
  102. package/dist/node/cli/args/args-fetcher.d.ts +1 -1
  103. package/dist/node/cli/args/args-fetcher.js +14 -13
  104. package/dist/node/cli/args/args-fetcher.js.map +1 -1
  105. package/dist/node/cli/args/args-setter.d.ts +1 -1
  106. package/dist/node/cli/args/args-setter.js +8 -6
  107. package/dist/node/cli/args/args-setter.js.map +1 -1
  108. package/dist/node/cli/cli.models.d.ts +2 -2
  109. package/dist/node/cli/commands.js +68 -56
  110. package/dist/node/cli/commands.js.map +1 -1
  111. package/dist/toolkit/elements-builder.d.ts +1 -1
  112. package/dist/toolkit/elements-builder.js +12 -12
  113. package/dist/toolkit/elements-builder.js.map +1 -1
  114. package/dist/toolkit/export.d.ts +2 -2
  115. package/dist/toolkit/export.js +8 -8
  116. package/dist/toolkit/export.js.map +1 -1
  117. package/dist/toolkit/file.d.ts +2 -1
  118. package/dist/toolkit/file.js +18 -16
  119. package/dist/toolkit/file.js.map +1 -1
  120. package/dist/toolkit/import.d.ts +1 -1
  121. package/dist/toolkit/import.js +12 -12
  122. package/dist/toolkit/import.js.map +1 -1
  123. package/dist/toolkit/migrate.d.ts +13 -4
  124. package/dist/toolkit/migrate.js +15 -13
  125. package/dist/toolkit/migrate.js.map +1 -1
  126. package/dist/translation/extraction/items-extraction.processor.d.ts +5 -4
  127. package/dist/translation/extraction/items-extraction.processor.js +73 -35
  128. package/dist/translation/extraction/items-extraction.processor.js.map +1 -1
  129. package/dist/translation/helpers/export-placeholder.utils.d.ts +11 -0
  130. package/dist/translation/helpers/export-placeholder.utils.js +11 -0
  131. package/dist/translation/helpers/export-placeholder.utils.js.map +1 -0
  132. package/dist/translation/helpers/rich-text.processor.d.ts +6 -6
  133. package/dist/translation/helpers/rich-text.processor.js +38 -38
  134. package/dist/translation/helpers/rich-text.processor.js.map +1 -1
  135. package/dist/translation/transforms/export-transforms.d.ts +2 -2
  136. package/dist/translation/transforms/export-transforms.js +93 -67
  137. package/dist/translation/transforms/export-transforms.js.map +1 -1
  138. package/dist/translation/transforms/import-transforms.d.ts +2 -2
  139. package/dist/translation/transforms/import-transforms.js +38 -40
  140. package/dist/translation/transforms/import-transforms.js.map +1 -1
  141. package/dist/zip/zip-manager.d.ts +4 -3
  142. package/dist/zip/zip-manager.js +9 -9
  143. package/dist/zip/zip-manager.js.map +1 -1
  144. package/dist/zip/zip-packager.d.ts +2 -2
  145. package/dist/zip/zip-packager.js +19 -17
  146. package/dist/zip/zip-packager.js.map +1 -1
  147. package/dist/zip/zip-transformer.d.ts +3 -2
  148. package/dist/zip/zip-transformer.js +16 -15
  149. package/dist/zip/zip-transformer.js.map +1 -1
  150. package/dist/zip/zip.models.d.ts +2 -2
  151. package/lib/core/config.ts +6 -6
  152. package/lib/core/helpers/workflow-helper.ts +190 -185
  153. package/lib/core/logs/loggers.ts +52 -52
  154. package/lib/core/models/core.models.ts +128 -119
  155. package/lib/core/models/error.models.ts +41 -0
  156. package/lib/core/models/log.models.ts +20 -20
  157. package/lib/core/models/migration.models.ts +54 -54
  158. package/lib/core/models/migration.schema.ts +108 -108
  159. package/lib/core/utils/array.utils.ts +43 -42
  160. package/lib/core/utils/binary-data.utils.ts +16 -16
  161. package/lib/core/utils/confirm.utils.ts +106 -105
  162. package/lib/core/utils/error.utils.ts +69 -72
  163. package/lib/core/utils/external-id.utils.ts +4 -4
  164. package/lib/core/utils/global.utils.ts +81 -75
  165. package/lib/core/utils/http.utils.ts +23 -23
  166. package/lib/core/utils/management-client-utils.ts +186 -186
  167. package/lib/core/utils/processing-utils.ts +82 -82
  168. package/lib/core/utils/run.utils.ts +50 -50
  169. package/lib/export/context/export-context-fetcher.ts +472 -447
  170. package/lib/export/export-manager.ts +233 -232
  171. package/lib/export/export.models.ts +71 -56
  172. package/lib/export/utils/export.utils.ts +9 -7
  173. package/lib/file/file-manager.ts +28 -28
  174. package/lib/import/comparers/asset-comparer.ts +107 -106
  175. package/lib/import/context/import-context-fetcher.ts +462 -462
  176. package/lib/import/import-manager.ts +243 -240
  177. package/lib/import/import.models.ts +69 -67
  178. package/lib/import/importers/assets-importer.ts +240 -236
  179. package/lib/import/importers/content-items-importer.ts +126 -122
  180. package/lib/import/importers/language-variant-importer.ts +324 -328
  181. package/lib/import/importers/workflow-importer.ts +372 -367
  182. package/lib/import/utils/import.utils.ts +9 -7
  183. package/lib/index.ts +12 -8
  184. package/lib/metadata.ts +3 -4
  185. package/lib/node/cli/actions/export-action.ts +43 -38
  186. package/lib/node/cli/actions/import-action.ts +32 -29
  187. package/lib/node/cli/actions/migrate-action.ts +49 -46
  188. package/lib/node/cli/app.ts +21 -21
  189. package/lib/node/cli/args/args-fetcher.ts +55 -54
  190. package/lib/node/cli/args/args-setter.ts +34 -32
  191. package/lib/node/cli/cli.models.ts +17 -17
  192. package/lib/node/cli/commands.ts +165 -153
  193. package/lib/toolkit/elements-builder.ts +69 -69
  194. package/lib/toolkit/export.ts +21 -21
  195. package/lib/toolkit/file.ts +59 -53
  196. package/lib/toolkit/import.ts +32 -32
  197. package/lib/toolkit/migrate.ts +60 -49
  198. package/lib/translation/extraction/items-extraction.processor.ts +203 -173
  199. package/lib/translation/helpers/export-placeholder.utils.ts +10 -0
  200. package/lib/translation/helpers/rich-text.processor.ts +311 -311
  201. package/lib/translation/transforms/export-transforms.ts +313 -279
  202. package/lib/translation/transforms/import-transforms.ts +188 -191
  203. package/lib/zip/zip-manager.ts +28 -27
  204. package/lib/zip/zip-packager.ts +75 -73
  205. package/lib/zip/zip-transformer.ts +112 -107
  206. package/lib/zip/zip.models.ts +7 -7
  207. package/package.json +91 -84
  208. package/dist/core/index.d.ts +0 -16
  209. package/dist/core/index.js +0 -17
  210. package/dist/core/index.js.map +0 -1
  211. package/dist/export/index.d.ts +0 -2
  212. package/dist/export/index.js +0 -3
  213. package/dist/export/index.js.map +0 -1
  214. package/dist/file/index.d.ts +0 -1
  215. package/dist/file/index.js +0 -2
  216. package/dist/file/index.js.map +0 -1
  217. package/dist/import/index.d.ts +0 -2
  218. package/dist/import/index.js +0 -3
  219. package/dist/import/index.js.map +0 -1
  220. package/dist/toolkit/index.d.ts +0 -5
  221. package/dist/toolkit/index.js +0 -6
  222. package/dist/toolkit/index.js.map +0 -1
  223. package/dist/translation/index.d.ts +0 -4
  224. package/dist/translation/index.js +0 -5
  225. package/dist/translation/index.js.map +0 -1
  226. package/dist/zip/index.d.ts +0 -4
  227. package/dist/zip/index.js +0 -5
  228. package/dist/zip/index.js.map +0 -1
  229. package/lib/core/index.ts +0 -18
  230. package/lib/export/index.ts +0 -2
  231. package/lib/file/index.ts +0 -1
  232. package/lib/import/index.ts +0 -2
  233. package/lib/toolkit/index.ts +0 -5
  234. package/lib/translation/index.ts +0 -4
  235. package/lib/zip/index.ts +0 -4
@@ -1,196 +1,196 @@
1
- import type { IRetryStrategyOptions } from '@kontent-ai/core-sdk';
1
+ import type { IRetryStrategyOptions } from "@kontent-ai/core-sdk";
2
2
  import type {
3
- AssetFolderModels,
4
- CollectionModels,
5
- ContentTypeModels,
6
- ContentTypeSnippetModels,
7
- EnvironmentModels,
8
- LanguageModels,
9
- ManagementClient,
10
- TaxonomyModels,
11
- WorkflowModels
12
- } from '@kontent-ai/management-sdk';
13
- import { createManagementClient } from '@kontent-ai/management-sdk';
14
- import chalk from 'chalk';
15
- import { coreConfig } from '../config.js';
16
- import type { FlattenedContentType, FlattenedContentTypeElement } from '../models/core.models.js';
17
- import type { LogSpinnerData, Logger } from '../models/log.models.js';
18
- import { findRequired } from './array.utils.js';
19
- import { isNotUndefined } from './global.utils.js';
20
- import { defaultHttpService, defaultRetryStrategy } from './http.utils.js';
21
- import { runMapiRequestAsync } from './run.utils.js';
3
+ AssetFolderModels,
4
+ CollectionModels,
5
+ ContentTypeModels,
6
+ ContentTypeSnippetModels,
7
+ EnvironmentModels,
8
+ LanguageModels,
9
+ ManagementClient,
10
+ TaxonomyModels,
11
+ WorkflowModels,
12
+ } from "@kontent-ai/management-sdk";
13
+ import { createManagementClient } from "@kontent-ai/management-sdk";
14
+ import chalk from "chalk";
15
+ import { coreConfig } from "../config.js";
16
+ import type { FlattenedContentType, FlattenedContentTypeElement } from "../models/core.models.js";
17
+ import type { Logger, LogSpinnerData } from "../models/log.models.js";
18
+ import { findRequired } from "./array.utils.js";
19
+ import { isNotUndefined } from "./global.utils.js";
20
+ import { defaultHttpService, defaultRetryStrategy } from "./http.utils.js";
21
+ import { runMapiRequestAsync } from "./run.utils.js";
22
22
 
23
23
  export interface ManagementClientConfig {
24
- readonly environmentId: string;
25
- readonly apiKey: string;
26
- readonly retryStrategy?: Readonly<IRetryStrategyOptions>;
27
- readonly baseUrl?: string;
24
+ readonly environmentId: string;
25
+ readonly apiKey: string;
26
+ readonly retryStrategy?: Readonly<IRetryStrategyOptions>;
27
+ readonly baseUrl?: string;
28
28
  }
29
29
 
30
30
  export function getMigrationManagementClient(config: ManagementClientConfig): Readonly<ManagementClient> {
31
- return createManagementClient({
32
- environmentId: config.environmentId,
33
- retryStrategy: config.retryStrategy ?? defaultRetryStrategy,
34
- httpService: defaultHttpService,
35
- apiKey: config.apiKey,
36
- baseUrl: config.baseUrl,
37
- headers: [
38
- {
39
- header: coreConfig.kontentTrackingHeaderName,
40
- value: coreConfig.kontentTrackingHeaderValue
41
- }
42
- ]
43
- });
31
+ return createManagementClient({
32
+ environmentId: config.environmentId,
33
+ retryStrategy: config.retryStrategy ?? defaultRetryStrategy,
34
+ httpService: defaultHttpService,
35
+ apiKey: config.apiKey,
36
+ baseUrl: config.baseUrl,
37
+ headers: [
38
+ {
39
+ header: coreConfig.kontentTrackingHeaderName,
40
+ value: coreConfig.kontentTrackingHeaderValue,
41
+ },
42
+ ],
43
+ });
44
44
  }
45
45
 
46
46
  export function managementClientUtils(client: Readonly<ManagementClient>, logger: Logger) {
47
- const getEnvironmentAsync = async (): Promise<EnvironmentModels.EnvironmentInformationModel> => {
48
- return (await client.environmentInformation().toPromise()).data.project;
49
- };
50
-
51
- const getAllLanguagesAsync = async (logSpinner: LogSpinnerData): Promise<readonly LanguageModels.LanguageModel[]> => {
52
- return await runMapiRequestAsync({
53
- logSpinner: logSpinner,
54
- logger: logger,
55
- func: async () => (await client.listLanguages().toAllPromise()).data.items,
56
- action: 'list',
57
- type: 'language'
58
- });
59
- };
60
-
61
- const getAllCollectionsAsync = async (logSpinner: LogSpinnerData): Promise<readonly CollectionModels.Collection[]> => {
62
- return await runMapiRequestAsync({
63
- logger: logger,
64
- logSpinner: logSpinner,
65
- func: async () => (await client.listCollections().toPromise()).data.collections,
66
- action: 'list',
67
- type: 'collection'
68
- });
69
- };
70
-
71
- const getAllWorkflowsAsync = async (logSpinner: LogSpinnerData): Promise<readonly WorkflowModels.Workflow[]> => {
72
- return await runMapiRequestAsync({
73
- logger: logger,
74
- logSpinner: logSpinner,
75
- func: async () => (await client.listWorkflows().toPromise()).data,
76
- action: 'list',
77
- type: 'workflow'
78
- });
79
- };
80
-
81
- const getAllTaxonomiesAsync = async (logSpinner: LogSpinnerData): Promise<readonly TaxonomyModels.Taxonomy[]> => {
82
- return await runMapiRequestAsync({
83
- logger: logger,
84
- logSpinner: logSpinner,
85
- func: async () => (await client.listTaxonomies().toAllPromise()).data.items,
86
- action: 'list',
87
- type: 'taxonomy'
88
- });
89
- };
90
-
91
- const getAllAssetFoldersAsync = async (logSpinner: LogSpinnerData): Promise<readonly AssetFolderModels.AssetFolder[]> => {
92
- return await runMapiRequestAsync({
93
- logger: logger,
94
- logSpinner: logSpinner,
95
- func: async () => (await client.listAssetFolders().toPromise()).data.items,
96
- action: 'list',
97
- type: 'assetFolder'
98
- });
99
- };
100
-
101
- const getContentTypeElements = (
102
- contentType: ContentTypeModels.ContentType,
103
- contentTypeSnippets: readonly ContentTypeSnippetModels.ContentTypeSnippet[]
104
- ): readonly FlattenedContentTypeElement[] => {
105
- return contentType.elements
106
- .flatMap((element) => {
107
- if (!element.codename || !element.id) {
108
- return undefined;
109
- }
110
-
111
- if (element.type === 'guidelines') {
112
- return undefined;
113
- }
114
-
115
- if (element.type === 'snippet') {
116
- const snippetElement = element;
117
-
118
- // replace snippet element with actual elements
119
- const contentTypeSnippet = findRequired(
120
- contentTypeSnippets,
121
- (snippet) => snippet.id === snippetElement.snippet.id,
122
- `Could not find content type snippet for element. This snippet is referenced in type '${chalk.red(
123
- contentType.codename
124
- )}'`
125
- );
126
-
127
- return contentTypeSnippet.elements.map((snippetElement) => {
128
- if (snippetElement.type === 'guidelines' || snippetElement.type === 'snippet') {
129
- return undefined;
130
- }
131
- if (!snippetElement.codename || !snippetElement.id) {
132
- return undefined;
133
- }
134
-
135
- const flattenedElement: FlattenedContentTypeElement = {
136
- codename: snippetElement.codename,
137
- type: snippetElement.type,
138
- id: snippetElement.id,
139
- element: snippetElement
140
- };
141
-
142
- return flattenedElement;
143
- });
144
- }
145
- const flattenedElement: FlattenedContentTypeElement = {
146
- codename: element.codename,
147
- id: element.id,
148
- type: element.type,
149
- element: element
150
- };
151
-
152
- return flattenedElement;
153
- })
154
- .filter(isNotUndefined);
155
- };
156
-
157
- const getFlattenedContentTypesAsync = async (logSpinner: LogSpinnerData): Promise<readonly FlattenedContentType[]> => {
158
- const contentTypes = await runMapiRequestAsync({
159
- logger: logger,
160
- logSpinner: logSpinner,
161
- func: async () => (await client.listContentTypes().toAllPromise()).data.items,
162
- action: 'list',
163
- type: 'contentType'
164
- });
165
-
166
- const contentTypeSnippets = await runMapiRequestAsync({
167
- logger: logger,
168
- logSpinner: logSpinner,
169
- func: async () => (await client.listContentTypeSnippets().toAllPromise()).data.items,
170
- action: 'list',
171
- type: 'contentTypeSnippet'
172
- });
173
-
174
- return [
175
- ...contentTypes.map((contentType) => {
176
- const importType: FlattenedContentType = {
177
- contentTypeCodename: contentType.codename,
178
- contentTypeId: contentType.id,
179
- elements: getContentTypeElements(contentType, contentTypeSnippets)
180
- };
181
-
182
- return importType;
183
- })
184
- ];
185
- };
186
-
187
- return {
188
- getAllCollectionsAsync,
189
- getAllLanguagesAsync,
190
- getAllWorkflowsAsync,
191
- getAllTaxonomiesAsync,
192
- getFlattenedContentTypesAsync,
193
- getEnvironmentAsync,
194
- getAllAssetFoldersAsync
195
- };
47
+ const getEnvironmentAsync = async (): Promise<EnvironmentModels.EnvironmentInformationModel> => {
48
+ return (await client.environmentInformation().toPromise()).data.project;
49
+ };
50
+
51
+ const getAllLanguagesAsync = async (logSpinner: LogSpinnerData): Promise<readonly LanguageModels.LanguageModel[]> => {
52
+ return await runMapiRequestAsync({
53
+ logSpinner: logSpinner,
54
+ logger: logger,
55
+ func: async () => (await client.listLanguages().toAllPromise()).data.items,
56
+ action: "list",
57
+ type: "language",
58
+ });
59
+ };
60
+
61
+ const getAllCollectionsAsync = async (logSpinner: LogSpinnerData): Promise<readonly CollectionModels.Collection[]> => {
62
+ return await runMapiRequestAsync({
63
+ logger: logger,
64
+ logSpinner: logSpinner,
65
+ func: async () => (await client.listCollections().toPromise()).data.collections,
66
+ action: "list",
67
+ type: "collection",
68
+ });
69
+ };
70
+
71
+ const getAllWorkflowsAsync = async (logSpinner: LogSpinnerData): Promise<readonly WorkflowModels.Workflow[]> => {
72
+ return await runMapiRequestAsync({
73
+ logger: logger,
74
+ logSpinner: logSpinner,
75
+ func: async () => (await client.listWorkflows().toPromise()).data,
76
+ action: "list",
77
+ type: "workflow",
78
+ });
79
+ };
80
+
81
+ const getAllTaxonomiesAsync = async (logSpinner: LogSpinnerData): Promise<readonly TaxonomyModels.Taxonomy[]> => {
82
+ return await runMapiRequestAsync({
83
+ logger: logger,
84
+ logSpinner: logSpinner,
85
+ func: async () => (await client.listTaxonomies().toAllPromise()).data.items,
86
+ action: "list",
87
+ type: "taxonomy",
88
+ });
89
+ };
90
+
91
+ const getAllAssetFoldersAsync = async (logSpinner: LogSpinnerData): Promise<readonly AssetFolderModels.AssetFolder[]> => {
92
+ return await runMapiRequestAsync({
93
+ logger: logger,
94
+ logSpinner: logSpinner,
95
+ func: async () => (await client.listAssetFolders().toPromise()).data.items,
96
+ action: "list",
97
+ type: "assetFolder",
98
+ });
99
+ };
100
+
101
+ const getContentTypeElements = (
102
+ contentType: ContentTypeModels.ContentType,
103
+ contentTypeSnippets: readonly ContentTypeSnippetModels.ContentTypeSnippet[],
104
+ ): readonly FlattenedContentTypeElement[] => {
105
+ return contentType.elements
106
+ .flatMap((element) => {
107
+ if (!(element.codename && element.id)) {
108
+ return undefined;
109
+ }
110
+
111
+ if (element.type === "guidelines") {
112
+ return undefined;
113
+ }
114
+
115
+ if (element.type === "snippet") {
116
+ const snippetElement = element;
117
+
118
+ // replace snippet element with actual elements
119
+ const contentTypeSnippet = findRequired(
120
+ contentTypeSnippets,
121
+ (snippet) => snippet.id === snippetElement.snippet.id,
122
+ `Could not find content type snippet for element. This snippet is referenced in type '${chalk.red(
123
+ contentType.codename,
124
+ )}'`,
125
+ );
126
+
127
+ return contentTypeSnippet.elements.map((snippetElement) => {
128
+ if (snippetElement.type === "guidelines" || snippetElement.type === "snippet") {
129
+ return undefined;
130
+ }
131
+ if (!(snippetElement.codename && snippetElement.id)) {
132
+ return undefined;
133
+ }
134
+
135
+ const flattenedElement: FlattenedContentTypeElement = {
136
+ codename: snippetElement.codename,
137
+ type: snippetElement.type,
138
+ id: snippetElement.id,
139
+ element: snippetElement,
140
+ };
141
+
142
+ return flattenedElement;
143
+ });
144
+ }
145
+ const flattenedElement: FlattenedContentTypeElement = {
146
+ codename: element.codename,
147
+ id: element.id,
148
+ type: element.type,
149
+ element: element,
150
+ };
151
+
152
+ return flattenedElement;
153
+ })
154
+ .filter(isNotUndefined);
155
+ };
156
+
157
+ const getFlattenedContentTypesAsync = async (logSpinner: LogSpinnerData): Promise<readonly FlattenedContentType[]> => {
158
+ const contentTypes = await runMapiRequestAsync({
159
+ logger: logger,
160
+ logSpinner: logSpinner,
161
+ func: async () => (await client.listContentTypes().toAllPromise()).data.items,
162
+ action: "list",
163
+ type: "contentType",
164
+ });
165
+
166
+ const contentTypeSnippets = await runMapiRequestAsync({
167
+ logger: logger,
168
+ logSpinner: logSpinner,
169
+ func: async () => (await client.listContentTypeSnippets().toAllPromise()).data.items,
170
+ action: "list",
171
+ type: "contentTypeSnippet",
172
+ });
173
+
174
+ return [
175
+ ...contentTypes.map((contentType) => {
176
+ const importType: FlattenedContentType = {
177
+ contentTypeCodename: contentType.codename,
178
+ contentTypeId: contentType.id,
179
+ elements: getContentTypeElements(contentType, contentTypeSnippets),
180
+ };
181
+
182
+ return importType;
183
+ }),
184
+ ];
185
+ };
186
+
187
+ return {
188
+ getAllCollectionsAsync,
189
+ getAllLanguagesAsync,
190
+ getAllWorkflowsAsync,
191
+ getAllTaxonomiesAsync,
192
+ getFlattenedContentTypesAsync,
193
+ getEnvironmentAsync,
194
+ getAllAssetFoldersAsync,
195
+ };
196
196
  }
@@ -1,101 +1,101 @@
1
- import chalk from 'chalk';
2
- import pLimit from 'p-limit';
3
- import type { ItemInfo, ItemProcessingResult } from '../models/core.models.js';
4
- import type { LogSpinnerData, Logger } from '../models/log.models.js';
1
+ import chalk from "chalk";
2
+ import pLimit from "p-limit";
3
+ import type { ItemInfo, ItemProcessingResult } from "../models/core.models.js";
4
+ import type { Logger, LogSpinnerData } from "../models/log.models.js";
5
5
 
6
6
  type ProcessSetAction =
7
- | 'Fetching assets'
8
- | 'Downloading assets'
9
- | 'Fetching content items'
10
- | 'Preparing content items & language variants'
11
- | 'Importing content items'
12
- | 'Importing language variants'
13
- | 'Fetching language variants'
14
- | 'Upserting assets'
15
- | 'Uploading assets';
7
+ | "Fetching assets"
8
+ | "Downloading assets"
9
+ | "Fetching content items"
10
+ | "Preparing content items & language variants"
11
+ | "Importing content items"
12
+ | "Importing language variants"
13
+ | "Fetching language variants"
14
+ | "Upserting assets"
15
+ | "Uploading assets";
16
16
 
17
17
  export async function processItemsAsync<InputItem, OutputItem>(data: {
18
- readonly action: ProcessSetAction;
19
- readonly logger: Logger;
20
- readonly items: Readonly<InputItem[]>;
21
- readonly parallelLimit: number;
22
- readonly processAsync: (item: Readonly<InputItem>, logSpinner: LogSpinnerData) => Promise<Readonly<OutputItem> | '404'>;
23
- readonly itemInfo: (item: Readonly<InputItem>) => ItemInfo;
18
+ readonly action: ProcessSetAction;
19
+ readonly logger: Logger;
20
+ readonly items: Readonly<InputItem[]>;
21
+ readonly parallelLimit: number;
22
+ readonly processAsync: (item: Readonly<InputItem>, logSpinner: LogSpinnerData) => Promise<Readonly<OutputItem> | "404">;
23
+ readonly itemInfo: (item: Readonly<InputItem>) => ItemInfo;
24
24
  }): Promise<readonly ItemProcessingResult<InputItem, OutputItem>[]> {
25
- if (!data.items.length) {
26
- return [];
27
- }
25
+ if (!data.items.length) {
26
+ return [];
27
+ }
28
28
 
29
- const firstItemInfo = data.itemInfo(data.items[0]);
29
+ const firstItemInfo = data.itemInfo(data.items[0]);
30
30
 
31
- return await data.logger.logWithSpinnerAsync(async (logSpinner) => {
32
- const limit = pLimit(data.parallelLimit);
33
- let processedItemsCount: number = 1;
31
+ return await data.logger.logWithSpinnerAsync(async (logSpinner) => {
32
+ const limit = pLimit(data.parallelLimit);
33
+ let processedItemsCount: number = 1;
34
34
 
35
- const requests: readonly Promise<ItemProcessingResult<InputItem, OutputItem>>[] = data.items.map((item) =>
36
- limit(() => {
37
- return data
38
- .processAsync(item, logSpinner)
39
- .then<OutputItem | '404'>((output) => {
40
- const itemInfo = data.itemInfo(item);
41
- const prefix = getPercentagePrefix(processedItemsCount, data.items.length);
35
+ const requests: readonly Promise<ItemProcessingResult<InputItem, OutputItem>>[] = data.items.map((item) =>
36
+ limit(() => {
37
+ return data
38
+ .processAsync(item, logSpinner)
39
+ .then<OutputItem | "404">((output) => {
40
+ const itemInfo = data.itemInfo(item);
41
+ const prefix = getPercentagePrefix(processedItemsCount, data.items.length);
42
42
 
43
- logSpinner({
44
- prefix: prefix,
45
- message: itemInfo.title,
46
- type: itemInfo.itemType
47
- });
43
+ logSpinner({
44
+ prefix: prefix,
45
+ message: itemInfo.title,
46
+ type: itemInfo.itemType,
47
+ });
48
48
 
49
- processedItemsCount++;
50
- return output;
51
- })
52
- .then<ItemProcessingResult<InputItem, OutputItem>>((outputItem) => {
53
- if (outputItem === '404') {
54
- return {
55
- state: '404',
56
- inputItem: item
57
- };
58
- }
59
- return {
60
- inputItem: item,
61
- outputItem: outputItem,
62
- state: 'valid'
63
- };
64
- })
65
- .catch<ItemProcessingResult<InputItem, OutputItem>>((error) => {
66
- return {
67
- state: 'error',
68
- inputItem: item,
69
- error: error
70
- };
71
- });
72
- })
73
- );
49
+ processedItemsCount++;
50
+ return output;
51
+ })
52
+ .then<ItemProcessingResult<InputItem, OutputItem>>((outputItem) => {
53
+ if (outputItem === "404") {
54
+ return {
55
+ state: "404",
56
+ inputItem: item,
57
+ };
58
+ }
59
+ return {
60
+ inputItem: item,
61
+ outputItem: outputItem,
62
+ state: "valid",
63
+ };
64
+ })
65
+ .catch<ItemProcessingResult<InputItem, OutputItem>>((error) => {
66
+ return {
67
+ state: "error",
68
+ inputItem: item,
69
+ error: error,
70
+ };
71
+ });
72
+ }),
73
+ );
74
74
 
75
- // log processing of first item as progress is set after each item finishes
76
- logSpinner({
77
- prefix: getPercentagePrefix(0, data.items.length),
78
- message: firstItemInfo.title,
79
- type: firstItemInfo.itemType
80
- });
75
+ // log processing of first item as progress is set after each item finishes
76
+ logSpinner({
77
+ prefix: getPercentagePrefix(0, data.items.length),
78
+ message: firstItemInfo.title,
79
+ type: firstItemInfo.itemType,
80
+ });
81
81
 
82
- // Only '<parallelLimit>' promises at a time
83
- const resultItems = await Promise.all(requests);
82
+ // Only '<parallelLimit>' promises at a time
83
+ const resultItems = await Promise.all(requests);
84
84
 
85
- const failedItemsCount = resultItems.filter((m) => m.state === 'error').length;
86
- const failedText = failedItemsCount ? ` Failed '${chalk.red(failedItemsCount)}' items` : ``;
85
+ const failedItemsCount = resultItems.filter((m) => m.state === "error").length;
86
+ const failedText = failedItemsCount ? ` Failed '${chalk.red(failedItemsCount)}' items` : ``;
87
87
 
88
- logSpinner({
89
- type: 'info',
90
- message: `Completed '${chalk.yellow(data.action)}'. Successfully processed '${chalk.green(
91
- resultItems.filter((m) => m.state === 'valid').length
92
- )}' items.${failedText}`
93
- });
88
+ logSpinner({
89
+ type: "info",
90
+ message: `Completed '${chalk.yellow(data.action)}'. Successfully processed '${chalk.green(
91
+ resultItems.filter((m) => m.state === "valid").length,
92
+ )}' items.${failedText}`,
93
+ });
94
94
 
95
- return resultItems;
96
- });
95
+ return resultItems;
96
+ });
97
97
  }
98
98
 
99
99
  function getPercentagePrefix(processedItems: number, totalCount: number): string {
100
- return chalk.gray(`${Math.round((processedItems / totalCount) * 100)}%`);
100
+ return chalk.gray(`${Math.round((processedItems / totalCount) * 100)}%`);
101
101
  }