@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.
- package/README.md +19 -17
- package/dist/core/config.js +3 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/helpers/workflow-helper.d.ts +1 -1
- package/dist/core/helpers/workflow-helper.js +28 -26
- package/dist/core/helpers/workflow-helper.js.map +1 -1
- package/dist/core/logs/loggers.d.ts +1 -1
- package/dist/core/logs/loggers.js +15 -15
- package/dist/core/logs/loggers.js.map +1 -1
- package/dist/core/models/core.models.d.ts +27 -22
- package/dist/core/models/error.models.d.ts +14 -0
- package/dist/core/models/error.models.js +25 -0
- package/dist/core/models/error.models.js.map +1 -0
- package/dist/core/models/log.models.d.ts +2 -2
- package/dist/core/models/migration.models.d.ts +14 -14
- package/dist/core/models/migration.schema.d.ts +9 -9
- package/dist/core/models/migration.schema.js +28 -28
- package/dist/core/models/migration.schema.js.map +1 -1
- package/dist/core/utils/array.utils.d.ts +1 -1
- package/dist/core/utils/array.utils.js +4 -3
- package/dist/core/utils/array.utils.js.map +1 -1
- package/dist/core/utils/binary-data.utils.d.ts +1 -1
- package/dist/core/utils/binary-data.utils.js +6 -6
- package/dist/core/utils/binary-data.utils.js.map +1 -1
- package/dist/core/utils/confirm.utils.d.ts +1 -1
- package/dist/core/utils/confirm.utils.js +21 -20
- package/dist/core/utils/confirm.utils.js.map +1 -1
- package/dist/core/utils/error.utils.d.ts +1 -1
- package/dist/core/utils/error.utils.js +16 -14
- package/dist/core/utils/error.utils.js.map +1 -1
- package/dist/core/utils/external-id.utils.js +1 -1
- package/dist/core/utils/external-id.utils.js.map +1 -1
- package/dist/core/utils/global.utils.d.ts +3 -3
- package/dist/core/utils/global.utils.js +20 -18
- package/dist/core/utils/global.utils.js.map +1 -1
- package/dist/core/utils/http.utils.d.ts +2 -2
- package/dist/core/utils/http.utils.js +4 -4
- package/dist/core/utils/http.utils.js.map +1 -1
- package/dist/core/utils/management-client-utils.d.ts +4 -4
- package/dist/core/utils/management-client-utils.js +34 -34
- package/dist/core/utils/management-client-utils.js.map +1 -1
- package/dist/core/utils/processing-utils.d.ts +4 -4
- package/dist/core/utils/processing-utils.js +13 -13
- package/dist/core/utils/processing-utils.js.map +1 -1
- package/dist/core/utils/run.utils.d.ts +2 -2
- package/dist/core/utils/run.utils.js +7 -7
- package/dist/core/utils/run.utils.js.map +1 -1
- package/dist/export/context/export-context-fetcher.d.ts +1 -1
- package/dist/export/context/export-context-fetcher.js +92 -62
- package/dist/export/context/export-context-fetcher.js.map +1 -1
- package/dist/export/export-manager.d.ts +2 -2
- package/dist/export/export-manager.js +46 -37
- package/dist/export/export-manager.js.map +1 -1
- package/dist/export/export.models.d.ts +21 -2
- package/dist/export/utils/export.utils.d.ts +1 -1
- package/dist/export/utils/export.utils.js +3 -2
- package/dist/export/utils/export.utils.js.map +1 -1
- package/dist/file/file-manager.d.ts +2 -2
- package/dist/file/file-manager.js +7 -7
- package/dist/file/file-manager.js.map +1 -1
- package/dist/import/comparers/asset-comparer.d.ts +2 -2
- package/dist/import/comparers/asset-comparer.js +12 -11
- package/dist/import/comparers/asset-comparer.js.map +1 -1
- package/dist/import/context/import-context-fetcher.d.ts +1 -1
- package/dist/import/context/import-context-fetcher.js +77 -73
- package/dist/import/context/import-context-fetcher.js.map +1 -1
- package/dist/import/import-manager.d.ts +1 -1
- package/dist/import/import-manager.js +59 -56
- package/dist/import/import-manager.js.map +1 -1
- package/dist/import/import.models.d.ts +6 -2
- package/dist/import/importers/assets-importer.d.ts +3 -3
- package/dist/import/importers/assets-importer.js +46 -43
- package/dist/import/importers/assets-importer.js.map +1 -1
- package/dist/import/importers/content-items-importer.d.ts +3 -3
- package/dist/import/importers/content-items-importer.js +28 -25
- package/dist/import/importers/content-items-importer.js.map +1 -1
- package/dist/import/importers/language-variant-importer.d.ts +3 -3
- package/dist/import/importers/language-variant-importer.js +45 -45
- package/dist/import/importers/language-variant-importer.js.map +1 -1
- package/dist/import/importers/workflow-importer.d.ts +3 -2
- package/dist/import/importers/workflow-importer.js +58 -54
- package/dist/import/importers/workflow-importer.js.map +1 -1
- package/dist/import/utils/import.utils.d.ts +1 -1
- package/dist/import/utils/import.utils.js +3 -2
- package/dist/import/utils/import.utils.js.map +1 -1
- package/dist/index.d.ts +11 -7
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/metadata.js +3 -3
- package/dist/metadata.js.map +1 -1
- package/dist/node/cli/actions/export-action.d.ts +1 -1
- package/dist/node/cli/actions/export-action.js +28 -23
- package/dist/node/cli/actions/export-action.js.map +1 -1
- package/dist/node/cli/actions/import-action.d.ts +1 -1
- package/dist/node/cli/actions/import-action.js +15 -12
- package/dist/node/cli/actions/import-action.js.map +1 -1
- package/dist/node/cli/actions/migrate-action.d.ts +1 -1
- package/dist/node/cli/actions/migrate-action.js +25 -22
- package/dist/node/cli/actions/migrate-action.js.map +1 -1
- package/dist/node/cli/app.js +13 -12
- package/dist/node/cli/app.js.map +1 -1
- package/dist/node/cli/args/args-fetcher.d.ts +1 -1
- package/dist/node/cli/args/args-fetcher.js +14 -13
- package/dist/node/cli/args/args-fetcher.js.map +1 -1
- package/dist/node/cli/args/args-setter.d.ts +1 -1
- package/dist/node/cli/args/args-setter.js +8 -6
- package/dist/node/cli/args/args-setter.js.map +1 -1
- package/dist/node/cli/cli.models.d.ts +2 -2
- package/dist/node/cli/commands.js +68 -56
- package/dist/node/cli/commands.js.map +1 -1
- package/dist/toolkit/elements-builder.d.ts +1 -1
- package/dist/toolkit/elements-builder.js +12 -12
- package/dist/toolkit/elements-builder.js.map +1 -1
- package/dist/toolkit/export.d.ts +2 -2
- package/dist/toolkit/export.js +8 -8
- package/dist/toolkit/export.js.map +1 -1
- package/dist/toolkit/file.d.ts +2 -1
- package/dist/toolkit/file.js +18 -16
- package/dist/toolkit/file.js.map +1 -1
- package/dist/toolkit/import.d.ts +1 -1
- package/dist/toolkit/import.js +12 -12
- package/dist/toolkit/import.js.map +1 -1
- package/dist/toolkit/migrate.d.ts +13 -4
- package/dist/toolkit/migrate.js +15 -13
- package/dist/toolkit/migrate.js.map +1 -1
- package/dist/translation/extraction/items-extraction.processor.d.ts +5 -4
- package/dist/translation/extraction/items-extraction.processor.js +73 -35
- package/dist/translation/extraction/items-extraction.processor.js.map +1 -1
- package/dist/translation/helpers/export-placeholder.utils.d.ts +11 -0
- package/dist/translation/helpers/export-placeholder.utils.js +11 -0
- package/dist/translation/helpers/export-placeholder.utils.js.map +1 -0
- package/dist/translation/helpers/rich-text.processor.d.ts +6 -6
- package/dist/translation/helpers/rich-text.processor.js +38 -38
- package/dist/translation/helpers/rich-text.processor.js.map +1 -1
- package/dist/translation/transforms/export-transforms.d.ts +2 -2
- package/dist/translation/transforms/export-transforms.js +93 -67
- package/dist/translation/transforms/export-transforms.js.map +1 -1
- package/dist/translation/transforms/import-transforms.d.ts +2 -2
- package/dist/translation/transforms/import-transforms.js +38 -40
- package/dist/translation/transforms/import-transforms.js.map +1 -1
- package/dist/zip/zip-manager.d.ts +4 -3
- package/dist/zip/zip-manager.js +9 -9
- package/dist/zip/zip-manager.js.map +1 -1
- package/dist/zip/zip-packager.d.ts +2 -2
- package/dist/zip/zip-packager.js +19 -17
- package/dist/zip/zip-packager.js.map +1 -1
- package/dist/zip/zip-transformer.d.ts +3 -2
- package/dist/zip/zip-transformer.js +16 -15
- package/dist/zip/zip-transformer.js.map +1 -1
- package/dist/zip/zip.models.d.ts +2 -2
- package/lib/core/config.ts +6 -6
- package/lib/core/helpers/workflow-helper.ts +190 -185
- package/lib/core/logs/loggers.ts +52 -52
- package/lib/core/models/core.models.ts +128 -119
- package/lib/core/models/error.models.ts +41 -0
- package/lib/core/models/log.models.ts +20 -20
- package/lib/core/models/migration.models.ts +54 -54
- package/lib/core/models/migration.schema.ts +108 -108
- package/lib/core/utils/array.utils.ts +43 -42
- package/lib/core/utils/binary-data.utils.ts +16 -16
- package/lib/core/utils/confirm.utils.ts +106 -105
- package/lib/core/utils/error.utils.ts +69 -72
- package/lib/core/utils/external-id.utils.ts +4 -4
- package/lib/core/utils/global.utils.ts +81 -75
- package/lib/core/utils/http.utils.ts +23 -23
- package/lib/core/utils/management-client-utils.ts +186 -186
- package/lib/core/utils/processing-utils.ts +82 -82
- package/lib/core/utils/run.utils.ts +50 -50
- package/lib/export/context/export-context-fetcher.ts +472 -447
- package/lib/export/export-manager.ts +233 -232
- package/lib/export/export.models.ts +71 -56
- package/lib/export/utils/export.utils.ts +9 -7
- package/lib/file/file-manager.ts +28 -28
- package/lib/import/comparers/asset-comparer.ts +107 -106
- package/lib/import/context/import-context-fetcher.ts +462 -462
- package/lib/import/import-manager.ts +243 -240
- package/lib/import/import.models.ts +69 -67
- package/lib/import/importers/assets-importer.ts +240 -236
- package/lib/import/importers/content-items-importer.ts +126 -122
- package/lib/import/importers/language-variant-importer.ts +324 -328
- package/lib/import/importers/workflow-importer.ts +372 -367
- package/lib/import/utils/import.utils.ts +9 -7
- package/lib/index.ts +12 -8
- package/lib/metadata.ts +3 -4
- package/lib/node/cli/actions/export-action.ts +43 -38
- package/lib/node/cli/actions/import-action.ts +32 -29
- package/lib/node/cli/actions/migrate-action.ts +49 -46
- package/lib/node/cli/app.ts +21 -21
- package/lib/node/cli/args/args-fetcher.ts +55 -54
- package/lib/node/cli/args/args-setter.ts +34 -32
- package/lib/node/cli/cli.models.ts +17 -17
- package/lib/node/cli/commands.ts +165 -153
- package/lib/toolkit/elements-builder.ts +69 -69
- package/lib/toolkit/export.ts +21 -21
- package/lib/toolkit/file.ts +59 -53
- package/lib/toolkit/import.ts +32 -32
- package/lib/toolkit/migrate.ts +60 -49
- package/lib/translation/extraction/items-extraction.processor.ts +203 -173
- package/lib/translation/helpers/export-placeholder.utils.ts +10 -0
- package/lib/translation/helpers/rich-text.processor.ts +311 -311
- package/lib/translation/transforms/export-transforms.ts +313 -279
- package/lib/translation/transforms/import-transforms.ts +188 -191
- package/lib/zip/zip-manager.ts +28 -27
- package/lib/zip/zip-packager.ts +75 -73
- package/lib/zip/zip-transformer.ts +112 -107
- package/lib/zip/zip.models.ts +7 -7
- package/package.json +91 -84
- package/dist/core/index.d.ts +0 -16
- package/dist/core/index.js +0 -17
- package/dist/core/index.js.map +0 -1
- package/dist/export/index.d.ts +0 -2
- package/dist/export/index.js +0 -3
- package/dist/export/index.js.map +0 -1
- package/dist/file/index.d.ts +0 -1
- package/dist/file/index.js +0 -2
- package/dist/file/index.js.map +0 -1
- package/dist/import/index.d.ts +0 -2
- package/dist/import/index.js +0 -3
- package/dist/import/index.js.map +0 -1
- package/dist/toolkit/index.d.ts +0 -5
- package/dist/toolkit/index.js +0 -6
- package/dist/toolkit/index.js.map +0 -1
- package/dist/translation/index.d.ts +0 -4
- package/dist/translation/index.js +0 -5
- package/dist/translation/index.js.map +0 -1
- package/dist/zip/index.d.ts +0 -4
- package/dist/zip/index.js +0 -5
- package/dist/zip/index.js.map +0 -1
- package/lib/core/index.ts +0 -18
- package/lib/export/index.ts +0 -2
- package/lib/file/index.ts +0 -1
- package/lib/import/index.ts +0 -2
- package/lib/toolkit/index.ts +0 -5
- package/lib/translation/index.ts +0 -4
- package/lib/zip/index.ts +0 -4
|
@@ -1,333 +1,329 @@
|
|
|
1
|
-
import type { LanguageVariantElements, LanguageVariantModels, ManagementClient, WorkflowModels } from
|
|
2
|
-
import chalk from
|
|
3
|
-
import { match } from
|
|
1
|
+
import type { LanguageVariantElements, LanguageVariantModels, ManagementClient, WorkflowModels } from "@kontent-ai/management-sdk";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { match } from "ts-pattern";
|
|
4
|
+
import { workflowHelper } from "../../core/helpers/workflow-helper.js";
|
|
4
5
|
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from
|
|
13
|
-
import {
|
|
14
|
-
import { importTransforms } from
|
|
15
|
-
import type { ImportContext, ImportedItem, ImportedLanguageVariant } from
|
|
16
|
-
import { throwErrorForMigrationItem } from
|
|
17
|
-
import { workflowImporter as workflowImporterInit } from
|
|
6
|
+
LanguageVariantSchedulesStateValues,
|
|
7
|
+
LanguageVariantStateInTargetEnvironmentByCodename,
|
|
8
|
+
} from "../../core/models/core.models.js";
|
|
9
|
+
import type { Logger, LogSpinnerData } from "../../core/models/log.models.js";
|
|
10
|
+
import type { MigrationElement, MigrationItem, MigrationItemVersion } from "../../core/models/migration.models.js";
|
|
11
|
+
import { findRequired } from "../../core/utils/array.utils.js";
|
|
12
|
+
import { isNotUndefined } from "../../core/utils/global.utils.js";
|
|
13
|
+
import { processItemsAsync } from "../../core/utils/processing-utils.js";
|
|
14
|
+
import { runMapiRequestAsync } from "../../core/utils/run.utils.js";
|
|
15
|
+
import { importTransforms } from "../../translation/transforms/import-transforms.js";
|
|
16
|
+
import type { ImportContext, ImportedItem, ImportedLanguageVariant } from "../import.models.js";
|
|
17
|
+
import { throwErrorForMigrationItem } from "../utils/import.utils.js";
|
|
18
|
+
import { workflowImporter as workflowImporterInit } from "./workflow-importer.js";
|
|
18
19
|
|
|
19
20
|
export function languageVariantImporter(config: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
readonly logger: Logger;
|
|
22
|
+
readonly preparedContentItems: readonly ImportedItem[];
|
|
23
|
+
readonly importContext: ImportContext;
|
|
24
|
+
readonly client: Readonly<ManagementClient>;
|
|
24
25
|
}) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
return {
|
|
331
|
-
importAsync
|
|
332
|
-
};
|
|
26
|
+
const workflowImporter = workflowImporterInit({
|
|
27
|
+
logger: config.logger,
|
|
28
|
+
managementClient: config.client,
|
|
29
|
+
workflows: config.importContext.environmentData.workflows,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const upsertLanguageVariantAsync = async (data: {
|
|
33
|
+
readonly workflow: Readonly<WorkflowModels.Workflow>;
|
|
34
|
+
readonly logSpinner: LogSpinnerData;
|
|
35
|
+
readonly migrationItem: MigrationItem;
|
|
36
|
+
readonly migrationItemVersion: MigrationItemVersion;
|
|
37
|
+
readonly preparedContentItem: ImportedItem;
|
|
38
|
+
}): Promise<Readonly<LanguageVariantModels.ContentItemLanguageVariant>> => {
|
|
39
|
+
return await runMapiRequestAsync({
|
|
40
|
+
logger: config.logger,
|
|
41
|
+
func: async () => {
|
|
42
|
+
return (
|
|
43
|
+
await config.client
|
|
44
|
+
.upsertLanguageVariant()
|
|
45
|
+
.byItemCodename(data.preparedContentItem.inputItem.system.codename)
|
|
46
|
+
.byLanguageCodename(data.migrationItem.system.language.codename)
|
|
47
|
+
.withData(() => {
|
|
48
|
+
return {
|
|
49
|
+
elements: Object.entries(data.migrationItemVersion.elements).map(([codename, migrationElement]) => {
|
|
50
|
+
return getElementContract(data.migrationItem, migrationElement, codename);
|
|
51
|
+
}),
|
|
52
|
+
workflow: {
|
|
53
|
+
workflow_identifier: {
|
|
54
|
+
codename: data.workflow.codename,
|
|
55
|
+
},
|
|
56
|
+
step_identifier: {
|
|
57
|
+
codename: data.workflow.steps[0].codename, // use always first step
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
})
|
|
62
|
+
.toPromise()
|
|
63
|
+
).data;
|
|
64
|
+
},
|
|
65
|
+
action: "upsert",
|
|
66
|
+
type: "languageVariant",
|
|
67
|
+
logSpinner: data.logSpinner,
|
|
68
|
+
itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const categorizeVersions = (
|
|
73
|
+
migrationItem: MigrationItem,
|
|
74
|
+
): { publishedVersion: MigrationItemVersion | undefined; draftVersion: MigrationItemVersion | undefined } => {
|
|
75
|
+
const workflow = workflowHelper(config.importContext.environmentData.workflows).getWorkflowByCodename(
|
|
76
|
+
migrationItem.system.workflow.codename,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const publishedVersions = migrationItem.versions.filter((version) =>
|
|
80
|
+
isPublishedWorkflowStep(version.workflow_step.codename, workflow),
|
|
81
|
+
);
|
|
82
|
+
const draftVersions = migrationItem.versions.filter(
|
|
83
|
+
(version) => !isPublishedWorkflowStep(version.workflow_step.codename, workflow),
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
if (publishedVersions.length > 1) {
|
|
87
|
+
throwErrorForMigrationItem(
|
|
88
|
+
migrationItem,
|
|
89
|
+
`There can be only 1 published version. There are '${publishedVersions.length}' published versions for the item.`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (draftVersions.length > 1) {
|
|
94
|
+
throwErrorForMigrationItem(
|
|
95
|
+
migrationItem,
|
|
96
|
+
`There can be only 1 draft version. There are '${draftVersions.length}' draft versions for the item.`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
draftVersion: draftVersions[0],
|
|
102
|
+
publishedVersion: publishedVersions[0],
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const importVersionAsync = async (data: {
|
|
107
|
+
readonly logSpinner: LogSpinnerData;
|
|
108
|
+
readonly migrationItem: MigrationItem;
|
|
109
|
+
readonly migrationItemVersion: MigrationItemVersion;
|
|
110
|
+
readonly preparedContentItem: ImportedItem;
|
|
111
|
+
readonly createNewVersion?: boolean;
|
|
112
|
+
}): Promise<Readonly<LanguageVariantModels.ContentItemLanguageVariant>> => {
|
|
113
|
+
// validate workflow
|
|
114
|
+
const { step, workflow } = workflowHelper(config.importContext.environmentData.workflows).getWorkflowAndStepByCodenames({
|
|
115
|
+
workflowCodename: data.migrationItem.system.workflow.codename,
|
|
116
|
+
stepCodename: data.migrationItemVersion.workflow_step.codename,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// create new version if necessary. This is needed when both draft & published version are imported
|
|
120
|
+
if (data.createNewVersion) {
|
|
121
|
+
await workflowImporter.createNewVersionOfLanguageVariantAsync({
|
|
122
|
+
logSpinner: data.logSpinner,
|
|
123
|
+
migrationItem: data.migrationItem,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// upsert language variant
|
|
127
|
+
const languageVariant = await upsertLanguageVariantAsync({
|
|
128
|
+
logSpinner: data.logSpinner,
|
|
129
|
+
migrationItem: data.migrationItem,
|
|
130
|
+
preparedContentItem: data.preparedContentItem,
|
|
131
|
+
migrationItemVersion: data.migrationItemVersion,
|
|
132
|
+
workflow,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// set workflow accordingly (publish, move to workflow step, archive ...)
|
|
136
|
+
await workflowImporter.setWorkflowOfLanguageVariantAsync({
|
|
137
|
+
logSpinner: data.logSpinner,
|
|
138
|
+
migrationItem: data.migrationItem,
|
|
139
|
+
workflowCodename: workflow.codename,
|
|
140
|
+
stepCodename: step.codename,
|
|
141
|
+
migrationItemVersion: data.migrationItemVersion,
|
|
142
|
+
languageVariant: languageVariant,
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// set scheduling
|
|
146
|
+
await workflowImporter.setScheduledStateOfLanguageVariantAsync({
|
|
147
|
+
logSpinner: data.logSpinner,
|
|
148
|
+
migrationItem: data.migrationItem,
|
|
149
|
+
migrationItemVersion: data.migrationItemVersion,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
return languageVariant;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const importLanguageVariantAsync = async (
|
|
156
|
+
logSpinner: LogSpinnerData,
|
|
157
|
+
migrationItem: MigrationItem,
|
|
158
|
+
preparedContentItem: ImportedItem,
|
|
159
|
+
): Promise<readonly LanguageVariantModels.ContentItemLanguageVariant[]> => {
|
|
160
|
+
const { draftVersion, publishedVersion } = categorizeVersions(migrationItem);
|
|
161
|
+
|
|
162
|
+
// get initial state of language variant from target env
|
|
163
|
+
const targetVariantState = config.importContext.getLanguageVariantStateInTargetEnvironment(
|
|
164
|
+
migrationItem.system.codename,
|
|
165
|
+
migrationItem.system.language.codename,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
// prepare language variant for import (unpublish, create new version, un-schedule ...)
|
|
169
|
+
await prepareTargetEnvironmentVariantForImportAsync({
|
|
170
|
+
logSpinner,
|
|
171
|
+
migrationItem,
|
|
172
|
+
targetVariantState,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// first import published version if it exists
|
|
176
|
+
const publishedLanguageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant> | undefined = publishedVersion
|
|
177
|
+
? await importVersionAsync({
|
|
178
|
+
logSpinner: logSpinner,
|
|
179
|
+
migrationItem: migrationItem,
|
|
180
|
+
preparedContentItem: preparedContentItem,
|
|
181
|
+
migrationItemVersion: publishedVersion,
|
|
182
|
+
})
|
|
183
|
+
: undefined;
|
|
184
|
+
|
|
185
|
+
// if target env contains published version & imported version not, unpublish it from the target env
|
|
186
|
+
if (targetVariantState.publishedLanguageVariant && !publishedVersion) {
|
|
187
|
+
await workflowImporter.unpublishLanguageVariantAsync({
|
|
188
|
+
logSpinner,
|
|
189
|
+
migrationItem,
|
|
190
|
+
});
|
|
191
|
+
await workflowImporter.moveToDraftStepAsync({
|
|
192
|
+
logSpinner,
|
|
193
|
+
migrationItem,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const draftLanguageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant> | undefined = draftVersion
|
|
197
|
+
? await importVersionAsync({
|
|
198
|
+
logSpinner: logSpinner,
|
|
199
|
+
migrationItem: migrationItem,
|
|
200
|
+
preparedContentItem: preparedContentItem,
|
|
201
|
+
migrationItemVersion: draftVersion,
|
|
202
|
+
createNewVersion: !!publishedLanguageVariant,
|
|
203
|
+
})
|
|
204
|
+
: undefined;
|
|
205
|
+
|
|
206
|
+
return [publishedLanguageVariant, draftLanguageVariant].filter(isNotUndefined);
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
const cancelScheduledStateAsync = async (data: {
|
|
210
|
+
readonly logSpinner: LogSpinnerData;
|
|
211
|
+
readonly migrationItem: MigrationItem;
|
|
212
|
+
readonly scheduledState: LanguageVariantSchedulesStateValues;
|
|
213
|
+
}): Promise<void> => {
|
|
214
|
+
const changeWorkflowData = {
|
|
215
|
+
logSpinner: data.logSpinner,
|
|
216
|
+
migrationItem: data.migrationItem,
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
await match(data.scheduledState)
|
|
220
|
+
.with("scheduledPublish", async () => {
|
|
221
|
+
// cancel scheduled publish if language variant is scheduled to be published
|
|
222
|
+
await workflowImporter.cancelScheduledPublishAsync(changeWorkflowData);
|
|
223
|
+
})
|
|
224
|
+
.with("scheduledUnpublish", async () => {
|
|
225
|
+
// cancel scheduled unpublish if language variant is scheduled to be unpublished
|
|
226
|
+
await workflowImporter.cancelScheduledUnpublishAsync(changeWorkflowData);
|
|
227
|
+
})
|
|
228
|
+
.otherwise(() => {});
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const prepareTargetEnvironmentVariantForImportAsync = async (data: {
|
|
232
|
+
readonly logSpinner: LogSpinnerData;
|
|
233
|
+
readonly migrationItem: MigrationItem;
|
|
234
|
+
readonly targetVariantState: LanguageVariantStateInTargetEnvironmentByCodename;
|
|
235
|
+
}): Promise<void> => {
|
|
236
|
+
// when language variant exists in target env, we need to prepare it for import by unscheduling, moving to draft etc...
|
|
237
|
+
// we use draft language variant if it exists, otherwise we use published language variant
|
|
238
|
+
const languageVariantToPrepare = data.targetVariantState.draftLanguageVariant ?? data.targetVariantState.publishedLanguageVariant;
|
|
239
|
+
|
|
240
|
+
if (!languageVariantToPrepare) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// there is likely a bug which causes /published endpoint to return invalid scheduled state
|
|
245
|
+
// use conditions below to determine scheduled state to use - this will be fixed in future
|
|
246
|
+
if (languageVariantToPrepare.workflowState?.scheduledState) {
|
|
247
|
+
await cancelScheduledStateAsync({
|
|
248
|
+
logSpinner: data.logSpinner,
|
|
249
|
+
migrationItem: data.migrationItem,
|
|
250
|
+
scheduledState: languageVariantToPrepare.workflowState.scheduledState,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const changeWorkflowData = {
|
|
255
|
+
logSpinner: data.logSpinner,
|
|
256
|
+
migrationItem: data.migrationItem,
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
await match(languageVariantToPrepare.workflowState?.workflowState)
|
|
260
|
+
.with("published", async () => {
|
|
261
|
+
// create new version if language variant is published
|
|
262
|
+
await workflowImporter.createNewVersionOfLanguageVariantAsync(changeWorkflowData);
|
|
263
|
+
})
|
|
264
|
+
.with("archived", async () => {
|
|
265
|
+
// move to draft step if language variant is archived
|
|
266
|
+
await workflowImporter.moveToDraftStepAsync(changeWorkflowData);
|
|
267
|
+
})
|
|
268
|
+
.otherwise(() => {});
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const isPublishedWorkflowStep = (stepCodename: string, workflow: Readonly<WorkflowModels.Workflow>): boolean => {
|
|
272
|
+
return workflow.publishedStep.codename === stepCodename;
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const getElementContract = (
|
|
276
|
+
migrationItem: MigrationItem,
|
|
277
|
+
element: MigrationElement,
|
|
278
|
+
elementCodename: string,
|
|
279
|
+
): Readonly<LanguageVariantElements.ILanguageVariantElementBase> => {
|
|
280
|
+
const importTransformResult = importTransforms[
|
|
281
|
+
config.importContext.getElement(migrationItem.system.type.codename, elementCodename, element.type).type
|
|
282
|
+
]({
|
|
283
|
+
elementCodename: elementCodename,
|
|
284
|
+
importContext: config.importContext,
|
|
285
|
+
migrationItems: config.importContext.categorizedImportData.contentItems,
|
|
286
|
+
elementData: element,
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
return importTransformResult;
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
const importAsync = async (): Promise<readonly ImportedLanguageVariant[]> => {
|
|
293
|
+
config.logger.log({
|
|
294
|
+
type: "info",
|
|
295
|
+
message: `Importing '${chalk.yellow(
|
|
296
|
+
config.importContext.categorizedImportData.contentItems.length.toString(),
|
|
297
|
+
)}' language variants`,
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
return await processItemsAsync<MigrationItem, readonly Readonly<LanguageVariantModels.ContentItemLanguageVariant>[]>({
|
|
301
|
+
action: "Importing language variants",
|
|
302
|
+
logger: config.logger,
|
|
303
|
+
parallelLimit: 1,
|
|
304
|
+
items: config.importContext.categorizedImportData.contentItems,
|
|
305
|
+
itemInfo: (input) => {
|
|
306
|
+
return {
|
|
307
|
+
itemType: "languageVariant",
|
|
308
|
+
title: input.system.name,
|
|
309
|
+
partA: input.system.language.codename,
|
|
310
|
+
};
|
|
311
|
+
},
|
|
312
|
+
processAsync: async (migrationItem, logSpinner) => {
|
|
313
|
+
const contentItem = findRequired(
|
|
314
|
+
config.preparedContentItems,
|
|
315
|
+
(item) => item.inputItem.system.codename === migrationItem.system.codename,
|
|
316
|
+
`Missing content item with codename '${chalk.red(
|
|
317
|
+
migrationItem.system.codename,
|
|
318
|
+
)}'. Content item should have been prepepared.`,
|
|
319
|
+
);
|
|
320
|
+
|
|
321
|
+
return await importLanguageVariantAsync(logSpinner, migrationItem, contentItem);
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
return {
|
|
327
|
+
importAsync,
|
|
328
|
+
};
|
|
333
329
|
}
|