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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +19 -17
  2. package/dist/core/config.js +3 -3
  3. package/dist/core/config.js.map +1 -1
  4. package/dist/core/helpers/workflow-helper.d.ts +1 -1
  5. package/dist/core/helpers/workflow-helper.js +28 -26
  6. package/dist/core/helpers/workflow-helper.js.map +1 -1
  7. package/dist/core/logs/loggers.d.ts +1 -1
  8. package/dist/core/logs/loggers.js +15 -15
  9. package/dist/core/logs/loggers.js.map +1 -1
  10. package/dist/core/models/core.models.d.ts +29 -22
  11. package/dist/core/models/error.models.d.ts +26 -0
  12. package/dist/core/models/error.models.js +104 -0
  13. package/dist/core/models/error.models.js.map +1 -0
  14. package/dist/core/models/log.models.d.ts +2 -2
  15. package/dist/core/models/migration.models.d.ts +17 -19
  16. package/dist/core/models/migration.schema.d.ts +9 -9
  17. package/dist/core/models/migration.schema.js +28 -28
  18. package/dist/core/models/migration.schema.js.map +1 -1
  19. package/dist/core/utils/array.utils.d.ts +1 -1
  20. package/dist/core/utils/array.utils.js +4 -3
  21. package/dist/core/utils/array.utils.js.map +1 -1
  22. package/dist/core/utils/binary-data.utils.d.ts +1 -1
  23. package/dist/core/utils/binary-data.utils.js +6 -6
  24. package/dist/core/utils/binary-data.utils.js.map +1 -1
  25. package/dist/core/utils/confirm.utils.d.ts +3 -1
  26. package/dist/core/utils/confirm.utils.js +92 -24
  27. package/dist/core/utils/confirm.utils.js.map +1 -1
  28. package/dist/core/utils/error.utils.d.ts +1 -1
  29. package/dist/core/utils/error.utils.js +16 -14
  30. package/dist/core/utils/error.utils.js.map +1 -1
  31. package/dist/core/utils/external-id.utils.js +1 -1
  32. package/dist/core/utils/external-id.utils.js.map +1 -1
  33. package/dist/core/utils/global.utils.d.ts +3 -3
  34. package/dist/core/utils/global.utils.js +20 -18
  35. package/dist/core/utils/global.utils.js.map +1 -1
  36. package/dist/core/utils/http.utils.d.ts +2 -2
  37. package/dist/core/utils/http.utils.js +4 -4
  38. package/dist/core/utils/http.utils.js.map +1 -1
  39. package/dist/core/utils/management-client-utils.d.ts +4 -4
  40. package/dist/core/utils/management-client-utils.js +37 -34
  41. package/dist/core/utils/management-client-utils.js.map +1 -1
  42. package/dist/core/utils/processing-utils.d.ts +4 -4
  43. package/dist/core/utils/processing-utils.js +13 -13
  44. package/dist/core/utils/processing-utils.js.map +1 -1
  45. package/dist/core/utils/run.utils.d.ts +2 -2
  46. package/dist/core/utils/run.utils.js +7 -7
  47. package/dist/core/utils/run.utils.js.map +1 -1
  48. package/dist/core/utils/try.utils.d.ts +14 -0
  49. package/dist/core/utils/try.utils.js +18 -0
  50. package/dist/core/utils/try.utils.js.map +1 -0
  51. package/dist/export/context/export-context-fetcher.d.ts +1 -1
  52. package/dist/export/context/export-context-fetcher.js +92 -62
  53. package/dist/export/context/export-context-fetcher.js.map +1 -1
  54. package/dist/export/export-manager.d.ts +2 -2
  55. package/dist/export/export-manager.js +73 -59
  56. package/dist/export/export-manager.js.map +1 -1
  57. package/dist/export/export.models.d.ts +21 -2
  58. package/dist/export/utils/export.utils.d.ts +1 -1
  59. package/dist/export/utils/export.utils.js +3 -2
  60. package/dist/export/utils/export.utils.js.map +1 -1
  61. package/dist/file/file-manager.d.ts +2 -2
  62. package/dist/file/file-manager.js +7 -7
  63. package/dist/file/file-manager.js.map +1 -1
  64. package/dist/import/comparers/asset-comparer.d.ts +2 -2
  65. package/dist/import/comparers/asset-comparer.js +12 -11
  66. package/dist/import/comparers/asset-comparer.js.map +1 -1
  67. package/dist/import/context/import-context-fetcher.d.ts +1 -1
  68. package/dist/import/context/import-context-fetcher.js +77 -73
  69. package/dist/import/context/import-context-fetcher.js.map +1 -1
  70. package/dist/import/import-manager.d.ts +1 -1
  71. package/dist/import/import-manager.js +59 -56
  72. package/dist/import/import-manager.js.map +1 -1
  73. package/dist/import/import.models.d.ts +6 -2
  74. package/dist/import/importers/assets-importer.d.ts +3 -3
  75. package/dist/import/importers/assets-importer.js +46 -43
  76. package/dist/import/importers/assets-importer.js.map +1 -1
  77. package/dist/import/importers/content-items-importer.d.ts +3 -3
  78. package/dist/import/importers/content-items-importer.js +28 -25
  79. package/dist/import/importers/content-items-importer.js.map +1 -1
  80. package/dist/import/importers/language-variant-importer.d.ts +3 -3
  81. package/dist/import/importers/language-variant-importer.js +45 -45
  82. package/dist/import/importers/language-variant-importer.js.map +1 -1
  83. package/dist/import/importers/workflow-importer.d.ts +3 -2
  84. package/dist/import/importers/workflow-importer.js +58 -54
  85. package/dist/import/importers/workflow-importer.js.map +1 -1
  86. package/dist/import/utils/import.utils.d.ts +1 -1
  87. package/dist/import/utils/import.utils.js +3 -2
  88. package/dist/import/utils/import.utils.js.map +1 -1
  89. package/dist/index.d.ts +11 -7
  90. package/dist/index.js +10 -8
  91. package/dist/index.js.map +1 -1
  92. package/dist/metadata.js +3 -3
  93. package/dist/metadata.js.map +1 -1
  94. package/dist/node/cli/actions/export-action.d.ts +1 -1
  95. package/dist/node/cli/actions/export-action.js +29 -23
  96. package/dist/node/cli/actions/export-action.js.map +1 -1
  97. package/dist/node/cli/actions/import-action.d.ts +1 -1
  98. package/dist/node/cli/actions/import-action.js +15 -12
  99. package/dist/node/cli/actions/import-action.js.map +1 -1
  100. package/dist/node/cli/actions/migrate-action.d.ts +1 -1
  101. package/dist/node/cli/actions/migrate-action.js +26 -22
  102. package/dist/node/cli/actions/migrate-action.js.map +1 -1
  103. package/dist/node/cli/app.js +13 -12
  104. package/dist/node/cli/app.js.map +1 -1
  105. package/dist/node/cli/args/args-fetcher.d.ts +1 -1
  106. package/dist/node/cli/args/args-fetcher.js +14 -13
  107. package/dist/node/cli/args/args-fetcher.js.map +1 -1
  108. package/dist/node/cli/args/args-setter.d.ts +1 -1
  109. package/dist/node/cli/args/args-setter.js +8 -6
  110. package/dist/node/cli/args/args-setter.js.map +1 -1
  111. package/dist/node/cli/cli.models.d.ts +2 -2
  112. package/dist/node/cli/commands.js +68 -56
  113. package/dist/node/cli/commands.js.map +1 -1
  114. package/dist/toolkit/elements-builder.d.ts +1 -1
  115. package/dist/toolkit/elements-builder.js +12 -12
  116. package/dist/toolkit/elements-builder.js.map +1 -1
  117. package/dist/toolkit/export.d.ts +2 -2
  118. package/dist/toolkit/export.js +8 -8
  119. package/dist/toolkit/export.js.map +1 -1
  120. package/dist/toolkit/file.d.ts +2 -1
  121. package/dist/toolkit/file.js +18 -16
  122. package/dist/toolkit/file.js.map +1 -1
  123. package/dist/toolkit/import.d.ts +1 -1
  124. package/dist/toolkit/import.js +12 -12
  125. package/dist/toolkit/import.js.map +1 -1
  126. package/dist/toolkit/migrate.d.ts +13 -4
  127. package/dist/toolkit/migrate.js +15 -13
  128. package/dist/toolkit/migrate.js.map +1 -1
  129. package/dist/translation/extraction/items-extraction.processor.d.ts +5 -4
  130. package/dist/translation/extraction/items-extraction.processor.js +73 -35
  131. package/dist/translation/extraction/items-extraction.processor.js.map +1 -1
  132. package/dist/translation/helpers/export-placeholder.utils.d.ts +11 -0
  133. package/dist/translation/helpers/export-placeholder.utils.js +11 -0
  134. package/dist/translation/helpers/export-placeholder.utils.js.map +1 -0
  135. package/dist/translation/helpers/rich-text.processor.d.ts +6 -6
  136. package/dist/translation/helpers/rich-text.processor.js +38 -38
  137. package/dist/translation/helpers/rich-text.processor.js.map +1 -1
  138. package/dist/translation/transforms/export-transforms.d.ts +2 -2
  139. package/dist/translation/transforms/export-transforms.js +93 -67
  140. package/dist/translation/transforms/export-transforms.js.map +1 -1
  141. package/dist/translation/transforms/import-transforms.d.ts +2 -2
  142. package/dist/translation/transforms/import-transforms.js +38 -40
  143. package/dist/translation/transforms/import-transforms.js.map +1 -1
  144. package/dist/zip/zip-manager.d.ts +4 -3
  145. package/dist/zip/zip-manager.js +9 -9
  146. package/dist/zip/zip-manager.js.map +1 -1
  147. package/dist/zip/zip-packager.d.ts +2 -2
  148. package/dist/zip/zip-packager.js +19 -17
  149. package/dist/zip/zip-packager.js.map +1 -1
  150. package/dist/zip/zip-transformer.d.ts +3 -2
  151. package/dist/zip/zip-transformer.js +16 -15
  152. package/dist/zip/zip-transformer.js.map +1 -1
  153. package/dist/zip/zip.models.d.ts +2 -2
  154. package/lib/core/config.ts +6 -6
  155. package/lib/core/helpers/workflow-helper.ts +190 -185
  156. package/lib/core/logs/loggers.ts +52 -52
  157. package/lib/core/models/core.models.ts +130 -119
  158. package/lib/core/models/error.models.ts +148 -0
  159. package/lib/core/models/log.models.ts +20 -20
  160. package/lib/core/models/migration.models.ts +54 -57
  161. package/lib/core/models/migration.schema.ts +108 -108
  162. package/lib/core/utils/array.utils.ts +43 -42
  163. package/lib/core/utils/binary-data.utils.ts +16 -16
  164. package/lib/core/utils/confirm.utils.ts +184 -106
  165. package/lib/core/utils/error.utils.ts +69 -72
  166. package/lib/core/utils/external-id.utils.ts +4 -4
  167. package/lib/core/utils/global.utils.ts +81 -75
  168. package/lib/core/utils/http.utils.ts +23 -23
  169. package/lib/core/utils/management-client-utils.ts +189 -186
  170. package/lib/core/utils/processing-utils.ts +82 -82
  171. package/lib/core/utils/run.utils.ts +50 -50
  172. package/lib/core/utils/try.utils.ts +30 -0
  173. package/lib/export/context/export-context-fetcher.ts +472 -447
  174. package/lib/export/export-manager.ts +250 -232
  175. package/lib/export/export.models.ts +71 -56
  176. package/lib/export/utils/export.utils.ts +9 -7
  177. package/lib/file/file-manager.ts +28 -28
  178. package/lib/import/comparers/asset-comparer.ts +107 -106
  179. package/lib/import/context/import-context-fetcher.ts +462 -462
  180. package/lib/import/import-manager.ts +243 -240
  181. package/lib/import/import.models.ts +69 -67
  182. package/lib/import/importers/assets-importer.ts +240 -236
  183. package/lib/import/importers/content-items-importer.ts +126 -122
  184. package/lib/import/importers/language-variant-importer.ts +324 -328
  185. package/lib/import/importers/workflow-importer.ts +372 -367
  186. package/lib/import/utils/import.utils.ts +9 -7
  187. package/lib/index.ts +12 -8
  188. package/lib/metadata.ts +3 -4
  189. package/lib/node/cli/actions/export-action.ts +44 -38
  190. package/lib/node/cli/actions/import-action.ts +32 -29
  191. package/lib/node/cli/actions/migrate-action.ts +50 -46
  192. package/lib/node/cli/app.ts +21 -21
  193. package/lib/node/cli/args/args-fetcher.ts +55 -54
  194. package/lib/node/cli/args/args-setter.ts +34 -32
  195. package/lib/node/cli/cli.models.ts +17 -17
  196. package/lib/node/cli/commands.ts +165 -153
  197. package/lib/toolkit/elements-builder.ts +69 -69
  198. package/lib/toolkit/export.ts +21 -21
  199. package/lib/toolkit/file.ts +59 -53
  200. package/lib/toolkit/import.ts +32 -32
  201. package/lib/toolkit/migrate.ts +60 -49
  202. package/lib/translation/extraction/items-extraction.processor.ts +203 -173
  203. package/lib/translation/helpers/export-placeholder.utils.ts +10 -0
  204. package/lib/translation/helpers/rich-text.processor.ts +311 -311
  205. package/lib/translation/transforms/export-transforms.ts +313 -279
  206. package/lib/translation/transforms/import-transforms.ts +188 -191
  207. package/lib/zip/zip-manager.ts +28 -27
  208. package/lib/zip/zip-packager.ts +75 -73
  209. package/lib/zip/zip-transformer.ts +112 -107
  210. package/lib/zip/zip.models.ts +7 -7
  211. package/package.json +91 -84
  212. package/dist/core/index.d.ts +0 -16
  213. package/dist/core/index.js +0 -17
  214. package/dist/core/index.js.map +0 -1
  215. package/dist/export/index.d.ts +0 -2
  216. package/dist/export/index.js +0 -3
  217. package/dist/export/index.js.map +0 -1
  218. package/dist/file/index.d.ts +0 -1
  219. package/dist/file/index.js +0 -2
  220. package/dist/file/index.js.map +0 -1
  221. package/dist/import/index.d.ts +0 -2
  222. package/dist/import/index.js +0 -3
  223. package/dist/import/index.js.map +0 -1
  224. package/dist/toolkit/index.d.ts +0 -5
  225. package/dist/toolkit/index.js +0 -6
  226. package/dist/toolkit/index.js.map +0 -1
  227. package/dist/translation/index.d.ts +0 -4
  228. package/dist/translation/index.js +0 -5
  229. package/dist/translation/index.js.map +0 -1
  230. package/dist/zip/index.d.ts +0 -4
  231. package/dist/zip/index.js +0 -5
  232. package/dist/zip/index.js.map +0 -1
  233. package/lib/core/index.ts +0 -18
  234. package/lib/export/index.ts +0 -2
  235. package/lib/file/index.ts +0 -1
  236. package/lib/import/index.ts +0 -2
  237. package/lib/toolkit/index.ts +0 -5
  238. package/lib/translation/index.ts +0 -4
  239. package/lib/zip/index.ts +0 -4
@@ -1,392 +1,397 @@
1
- import type { LanguageVariantModels, ManagementClient, WorkflowModels } from '@kontent-ai/management-sdk';
2
- import { SharedModels } from '@kontent-ai/management-sdk';
3
- import { match } from 'ts-pattern';
4
- import type { Logger, LogSpinnerData, MigrationItem, MigrationItemVersion, ShortestPathResult, WorkflowStep } from '../../core/index.js';
5
- import { runMapiRequestAsync, workflowHelper as workflowHelperInit } from '../../core/index.js';
1
+ import type { LanguageVariantModels, ManagementClient, WorkflowModels } from "@kontent-ai/management-sdk";
2
+ import { SharedModels } from "@kontent-ai/management-sdk";
3
+ import { match } from "ts-pattern";
4
+ import { type ShortestPathResult, type WorkflowStep, workflowHelper as workflowHelperInit } from "../../core/helpers/workflow-helper.js";
5
+ import type { Logger, LogSpinnerData } from "../../core/models/log.models.js";
6
+ import type { MigrationItem, MigrationItemVersion } from "../../core/models/migration.models.js";
7
+ import { runMapiRequestAsync } from "../../core/utils/run.utils.js";
6
8
 
7
9
  export function workflowImporter(config: {
8
- readonly logger: Logger;
9
- readonly managementClient: Readonly<ManagementClient>;
10
- readonly workflows: readonly Readonly<WorkflowModels.Workflow>[];
10
+ readonly logger: Logger;
11
+ readonly managementClient: Readonly<ManagementClient>;
12
+ readonly workflows: readonly Readonly<WorkflowModels.Workflow>[];
11
13
  }) {
12
- const workflowHelper = workflowHelperInit(config.workflows);
14
+ const workflowHelper = workflowHelperInit(config.workflows);
13
15
 
14
- const publishLanguageVariantAsync = async (data: {
15
- readonly logSpinner: LogSpinnerData;
16
- readonly migrationItem: MigrationItem;
17
- readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
18
- readonly workflowCodename: string;
19
- readonly stepCodename: string;
20
- }): Promise<void> => {
21
- await runMapiRequestAsync({
22
- logger: config.logger,
23
- func: async () =>
24
- (
25
- await config.managementClient
26
- .publishLanguageVariant()
27
- .byItemCodename(data.migrationItem.system.codename)
28
- .byLanguageCodename(data.migrationItem.system.language.codename)
29
- .withoutData()
30
- .toPromise()
31
- ).data,
32
- action: 'publish',
33
- type: 'languageVariant',
34
- logSpinner: data.logSpinner,
35
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`
36
- });
37
- };
16
+ const publishLanguageVariantAsync = async (data: {
17
+ readonly logSpinner: LogSpinnerData;
18
+ readonly migrationItem: MigrationItem;
19
+ readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
20
+ readonly workflowCodename: string;
21
+ readonly stepCodename: string;
22
+ }): Promise<void> => {
23
+ await runMapiRequestAsync({
24
+ logger: config.logger,
25
+ func: async () =>
26
+ (
27
+ await config.managementClient
28
+ .publishLanguageVariant()
29
+ .byItemCodename(data.migrationItem.system.codename)
30
+ .byLanguageCodename(data.migrationItem.system.language.codename)
31
+ .withoutData()
32
+ .toPromise()
33
+ ).data,
34
+ action: "publish",
35
+ type: "languageVariant",
36
+ logSpinner: data.logSpinner,
37
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
38
+ });
39
+ };
38
40
 
39
- const getPreviousToPublishStep = (
40
- workflow: Readonly<WorkflowModels.Workflow>,
41
- variantStep: WorkflowStep,
42
- publishStep: WorkflowStep
43
- ): ShortestPathResult => {
44
- const steps = workflowHelper.findShortestPathBetweenSteps(workflow, variantStep, publishStep);
41
+ const getPreviousToPublishStep = (
42
+ workflow: Readonly<WorkflowModels.Workflow>,
43
+ variantStep: WorkflowStep,
44
+ publishStep: WorkflowStep,
45
+ ): ShortestPathResult | undefined => {
46
+ const steps = workflowHelper.findShortestPathBetweenSteps(workflow, variantStep, publishStep);
45
47
 
46
- return steps[steps.length - 2];
47
- };
48
+ if (steps.length < 2) {
49
+ return undefined;
50
+ }
51
+ return steps[steps.length - 2];
52
+ };
48
53
 
49
- const unpublishLanguageVariantAsync = async (data: {
50
- readonly logSpinner: LogSpinnerData;
51
- readonly migrationItem: MigrationItem;
52
- }): Promise<void> => {
53
- // unpublish the language variant first if published
54
- // there is no way to determine if language variant is published via MAPI
55
- // so we have to always try unpublishing first and catching possible errors
56
- try {
57
- await runMapiRequestAsync({
58
- logger: config.logger,
59
- func: async () =>
60
- (
61
- await config.managementClient
62
- .unpublishLanguageVariant()
63
- .byItemCodename(data.migrationItem.system.codename)
64
- .byLanguageCodename(data.migrationItem.system.language.codename)
65
- .withoutData()
66
- .toPromise()
67
- ).data,
68
- action: 'unpublish',
69
- type: 'languageVariant',
70
- logSpinner: data.logSpinner,
71
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`
72
- });
73
- } catch (error) {
74
- if (error instanceof SharedModels.ContentManagementBaseKontentError) {
75
- data.logSpinner({
76
- type: 'unpublish',
77
- message: `Unpublish failed, but this may be expected behavior as we cannot determine if there is a published version already. Error received: ${error.message}`
78
- });
79
- } else {
80
- throw error;
81
- }
82
- }
83
- };
54
+ const unpublishLanguageVariantAsync = async (data: {
55
+ readonly logSpinner: LogSpinnerData;
56
+ readonly migrationItem: MigrationItem;
57
+ }): Promise<void> => {
58
+ // unpublish the language variant first if published
59
+ // there is no way to determine if language variant is published via MAPI
60
+ // so we have to always try unpublishing first and catching possible errors
61
+ try {
62
+ await runMapiRequestAsync({
63
+ logger: config.logger,
64
+ func: async () =>
65
+ (
66
+ await config.managementClient
67
+ .unpublishLanguageVariant()
68
+ .byItemCodename(data.migrationItem.system.codename)
69
+ .byLanguageCodename(data.migrationItem.system.language.codename)
70
+ .withoutData()
71
+ .toPromise()
72
+ ).data,
73
+ action: "unpublish",
74
+ type: "languageVariant",
75
+ logSpinner: data.logSpinner,
76
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
77
+ });
78
+ } catch (error) {
79
+ if (error instanceof SharedModels.ContentManagementBaseKontentError) {
80
+ data.logSpinner({
81
+ type: "unpublish",
82
+ message: `Unpublish failed, but this may be expected behavior as we cannot determine if there is a published version already. Error received: ${error.message}`,
83
+ });
84
+ } else {
85
+ throw error;
86
+ }
87
+ }
88
+ };
84
89
 
85
- const schedulePublishLanguageVariantAsync = async (data: {
86
- readonly logSpinner: LogSpinnerData;
87
- readonly migrationItem: MigrationItem;
88
- readonly schedule: {
89
- readonly publish_time: string;
90
- readonly publish_display_timezone: string;
91
- };
92
- }): Promise<void> => {
93
- await runMapiRequestAsync({
94
- logger: config.logger,
95
- func: async () =>
96
- (
97
- await config.managementClient
98
- .publishLanguageVariant()
99
- .byItemCodename(data.migrationItem.system.codename)
100
- .byLanguageCodename(data.migrationItem.system.language.codename)
101
- .withData({
102
- scheduled_to: data.schedule.publish_time,
103
- display_timezone: data.schedule.publish_display_timezone
104
- })
105
- .toPromise()
106
- ).data,
107
- action: 'schedulePublish',
108
- type: 'languageVariant',
109
- logSpinner: data.logSpinner,
110
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`
111
- });
112
- };
90
+ const schedulePublishLanguageVariantAsync = async (data: {
91
+ readonly logSpinner: LogSpinnerData;
92
+ readonly migrationItem: MigrationItem;
93
+ readonly schedule: {
94
+ readonly publish_time: string;
95
+ readonly publish_display_timezone: string;
96
+ };
97
+ }): Promise<void> => {
98
+ await runMapiRequestAsync({
99
+ logger: config.logger,
100
+ func: async () =>
101
+ (
102
+ await config.managementClient
103
+ .publishLanguageVariant()
104
+ .byItemCodename(data.migrationItem.system.codename)
105
+ .byLanguageCodename(data.migrationItem.system.language.codename)
106
+ .withData({
107
+ scheduled_to: data.schedule.publish_time,
108
+ display_timezone: data.schedule.publish_display_timezone,
109
+ })
110
+ .toPromise()
111
+ ).data,
112
+ action: "schedulePublish",
113
+ type: "languageVariant",
114
+ logSpinner: data.logSpinner,
115
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
116
+ });
117
+ };
113
118
 
114
- const scheduleUnpublishLanguageVariantAsync = async (data: {
115
- readonly logSpinner: LogSpinnerData;
116
- readonly migrationItem: MigrationItem;
117
- readonly schedule: {
118
- readonly unpublish_time: string;
119
- readonly unpublish_display_timezone: string;
120
- };
121
- }): Promise<void> => {
122
- await runMapiRequestAsync({
123
- logger: config.logger,
124
- func: async () =>
125
- (
126
- await config.managementClient
127
- .unpublishLanguageVariant()
128
- .byItemCodename(data.migrationItem.system.codename)
129
- .byLanguageCodename(data.migrationItem.system.language.codename)
130
- .withData({
131
- scheduled_to: data.schedule.unpublish_time,
132
- display_timezone: data.schedule.unpublish_display_timezone
133
- })
134
- .toPromise()
135
- ).data,
136
- action: 'scheduleUnpublish',
137
- type: 'languageVariant',
138
- logSpinner: data.logSpinner,
139
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`
140
- });
141
- };
119
+ const scheduleUnpublishLanguageVariantAsync = async (data: {
120
+ readonly logSpinner: LogSpinnerData;
121
+ readonly migrationItem: MigrationItem;
122
+ readonly schedule: {
123
+ readonly unpublish_time: string;
124
+ readonly unpublish_display_timezone: string;
125
+ };
126
+ }): Promise<void> => {
127
+ await runMapiRequestAsync({
128
+ logger: config.logger,
129
+ func: async () =>
130
+ (
131
+ await config.managementClient
132
+ .unpublishLanguageVariant()
133
+ .byItemCodename(data.migrationItem.system.codename)
134
+ .byLanguageCodename(data.migrationItem.system.language.codename)
135
+ .withData({
136
+ scheduled_to: data.schedule.unpublish_time,
137
+ display_timezone: data.schedule.unpublish_display_timezone,
138
+ })
139
+ .toPromise()
140
+ ).data,
141
+ action: "scheduleUnpublish",
142
+ type: "languageVariant",
143
+ logSpinner: data.logSpinner,
144
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
145
+ });
146
+ };
142
147
 
143
- const archiveLanguageVariantAsync = async (data: {
144
- readonly logSpinner: LogSpinnerData;
145
- readonly workflowCodename: string;
146
- readonly migrationItem: MigrationItem;
147
- }): Promise<void> => {
148
- const workflow = workflowHelper.getWorkflowByCodename(data.workflowCodename);
149
- await runMapiRequestAsync({
150
- logger: config.logger,
151
- func: async () =>
152
- (
153
- await config.managementClient
154
- .changeWorkflowOfLanguageVariant()
155
- .byItemCodename(data.migrationItem.system.codename)
156
- .byLanguageCodename(data.migrationItem.system.language.codename)
157
- .withData({
158
- step_identifier: {
159
- codename: workflow.archivedStep.codename
160
- },
161
- workflow_identifier: {
162
- codename: workflow.codename
163
- }
164
- })
165
- .toPromise()
166
- ).data,
167
- action: 'archive',
168
- type: 'languageVariant',
169
- logSpinner: data.logSpinner,
170
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${workflow.archivedStep.codename}`
171
- });
172
- };
148
+ const archiveLanguageVariantAsync = async (data: {
149
+ readonly logSpinner: LogSpinnerData;
150
+ readonly workflowCodename: string;
151
+ readonly migrationItem: MigrationItem;
152
+ }): Promise<void> => {
153
+ const workflow = workflowHelper.getWorkflowByCodename(data.workflowCodename);
154
+ await runMapiRequestAsync({
155
+ logger: config.logger,
156
+ func: async () =>
157
+ (
158
+ await config.managementClient
159
+ .changeWorkflowOfLanguageVariant()
160
+ .byItemCodename(data.migrationItem.system.codename)
161
+ .byLanguageCodename(data.migrationItem.system.language.codename)
162
+ .withData({
163
+ step_identifier: {
164
+ codename: workflow.archivedStep.codename,
165
+ },
166
+ workflow_identifier: {
167
+ codename: workflow.codename,
168
+ },
169
+ })
170
+ .toPromise()
171
+ ).data,
172
+ action: "archive",
173
+ type: "languageVariant",
174
+ logSpinner: data.logSpinner,
175
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${workflow.archivedStep.codename}`,
176
+ });
177
+ };
173
178
 
174
- const changeWorkflowOfLanguageVariantAsync = async (data: {
175
- readonly logSpinner: LogSpinnerData;
176
- readonly workflowCodename: string;
177
- readonly stepCodename: string;
178
- readonly migrationItem: MigrationItem;
179
- }): Promise<void> => {
180
- const { workflow, step } = workflowHelper.getWorkflowAndStepByCodenames({
181
- workflowCodename: data.workflowCodename,
182
- stepCodename: data.stepCodename
183
- });
179
+ const changeWorkflowOfLanguageVariantAsync = async (data: {
180
+ readonly logSpinner: LogSpinnerData;
181
+ readonly workflowCodename: string;
182
+ readonly stepCodename: string;
183
+ readonly migrationItem: MigrationItem;
184
+ }): Promise<void> => {
185
+ const { workflow, step } = workflowHelper.getWorkflowAndStepByCodenames({
186
+ workflowCodename: data.workflowCodename,
187
+ stepCodename: data.stepCodename,
188
+ });
184
189
 
185
- await runMapiRequestAsync({
186
- logger: config.logger,
187
- func: async () =>
188
- (
189
- await config.managementClient
190
- .changeWorkflowOfLanguageVariant()
191
- .byItemCodename(data.migrationItem.system.codename)
192
- .byLanguageCodename(data.migrationItem.system.language.codename)
193
- .withData({
194
- step_identifier: {
195
- codename: step.codename
196
- },
197
- workflow_identifier: {
198
- codename: workflow.codename
199
- }
200
- })
201
- .toPromise()
202
- ).data,
203
- action: 'changeWorkflowStep',
204
- type: 'languageVariant',
205
- logSpinner: data.logSpinner,
206
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${step.codename}`
207
- });
208
- };
190
+ await runMapiRequestAsync({
191
+ logger: config.logger,
192
+ func: async () =>
193
+ (
194
+ await config.managementClient
195
+ .changeWorkflowOfLanguageVariant()
196
+ .byItemCodename(data.migrationItem.system.codename)
197
+ .byLanguageCodename(data.migrationItem.system.language.codename)
198
+ .withData({
199
+ step_identifier: {
200
+ codename: step.codename,
201
+ },
202
+ workflow_identifier: {
203
+ codename: workflow.codename,
204
+ },
205
+ })
206
+ .toPromise()
207
+ ).data,
208
+ action: "changeWorkflowStep",
209
+ type: "languageVariant",
210
+ logSpinner: data.logSpinner,
211
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${step.codename}`,
212
+ });
213
+ };
209
214
 
210
- const createNewVersionOfLanguageVariantAsync = async (data: {
211
- readonly logSpinner: LogSpinnerData;
212
- readonly migrationItem: MigrationItem;
213
- }): Promise<void> => {
214
- await runMapiRequestAsync({
215
- logger: config.logger,
216
- func: async () => {
217
- await config.managementClient
218
- .createNewVersionOfLanguageVariant()
219
- .byItemCodename(data.migrationItem.system.codename)
220
- .byLanguageCodename(data.migrationItem.system.language.codename)
221
- .toPromise();
222
- },
223
- action: 'createNewVersion',
224
- type: 'languageVariant',
225
- logSpinner: data.logSpinner,
226
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`
227
- });
228
- };
215
+ const createNewVersionOfLanguageVariantAsync = async (data: {
216
+ readonly logSpinner: LogSpinnerData;
217
+ readonly migrationItem: MigrationItem;
218
+ }): Promise<void> => {
219
+ await runMapiRequestAsync({
220
+ logger: config.logger,
221
+ func: async () => {
222
+ await config.managementClient
223
+ .createNewVersionOfLanguageVariant()
224
+ .byItemCodename(data.migrationItem.system.codename)
225
+ .byLanguageCodename(data.migrationItem.system.language.codename)
226
+ .toPromise();
227
+ },
228
+ action: "createNewVersion",
229
+ type: "languageVariant",
230
+ logSpinner: data.logSpinner,
231
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename})`,
232
+ });
233
+ };
229
234
 
230
- const cancelScheduledPublishAsync = async (data: {
231
- readonly logSpinner: LogSpinnerData;
232
- readonly migrationItem: MigrationItem;
233
- }): Promise<void> => {
234
- await runMapiRequestAsync({
235
- logger: config.logger,
236
- func: async () => {
237
- await config.managementClient
238
- .cancelSheduledPublishingOfLanguageVariant()
239
- .byItemCodename(data.migrationItem.system.codename)
240
- .byLanguageCodename(data.migrationItem.system.language.codename)
241
- .toPromise();
242
- },
243
- action: 'cancelScheduledPublish',
244
- type: 'languageVariant',
245
- logSpinner: data.logSpinner,
246
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> Cancel scheduled publish`
247
- });
248
- };
235
+ const cancelScheduledPublishAsync = async (data: {
236
+ readonly logSpinner: LogSpinnerData;
237
+ readonly migrationItem: MigrationItem;
238
+ }): Promise<void> => {
239
+ await runMapiRequestAsync({
240
+ logger: config.logger,
241
+ func: async () => {
242
+ await config.managementClient
243
+ .cancelSheduledPublishingOfLanguageVariant()
244
+ .byItemCodename(data.migrationItem.system.codename)
245
+ .byLanguageCodename(data.migrationItem.system.language.codename)
246
+ .toPromise();
247
+ },
248
+ action: "cancelScheduledPublish",
249
+ type: "languageVariant",
250
+ logSpinner: data.logSpinner,
251
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> Cancel scheduled publish`,
252
+ });
253
+ };
249
254
 
250
- const cancelScheduledUnpublishAsync = async (data: {
251
- readonly logSpinner: LogSpinnerData;
252
- readonly migrationItem: MigrationItem;
253
- }): Promise<void> => {
254
- await runMapiRequestAsync({
255
- logger: config.logger,
256
- func: async () => {
257
- await config.managementClient
258
- .cancelSheduledUnpublishingOfLanguageVariant()
259
- .byItemCodename(data.migrationItem.system.codename)
260
- .byLanguageCodename(data.migrationItem.system.language.codename)
261
- .toPromise();
262
- },
263
- action: 'cancelScheduledUnpublish',
264
- type: 'languageVariant',
265
- logSpinner: data.logSpinner,
266
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> Cancel scheduled unpublish`
267
- });
268
- };
255
+ const cancelScheduledUnpublishAsync = async (data: {
256
+ readonly logSpinner: LogSpinnerData;
257
+ readonly migrationItem: MigrationItem;
258
+ }): Promise<void> => {
259
+ await runMapiRequestAsync({
260
+ logger: config.logger,
261
+ func: async () => {
262
+ await config.managementClient
263
+ .cancelSheduledUnpublishingOfLanguageVariant()
264
+ .byItemCodename(data.migrationItem.system.codename)
265
+ .byLanguageCodename(data.migrationItem.system.language.codename)
266
+ .toPromise();
267
+ },
268
+ action: "cancelScheduledUnpublish",
269
+ type: "languageVariant",
270
+ logSpinner: data.logSpinner,
271
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> Cancel scheduled unpublish`,
272
+ });
273
+ };
269
274
 
270
- const moveToDraftStepAsync = async (data: {
271
- readonly logSpinner: LogSpinnerData;
272
- readonly migrationItem: MigrationItem;
273
- }): Promise<void> => {
274
- const workflow = workflowHelper.getWorkflowByCodename(data.migrationItem.system.workflow.codename);
275
- const firstWorkflowStep = workflow.steps?.[0];
275
+ const moveToDraftStepAsync = async (data: {
276
+ readonly logSpinner: LogSpinnerData;
277
+ readonly migrationItem: MigrationItem;
278
+ }): Promise<void> => {
279
+ const workflow = workflowHelper.getWorkflowByCodename(data.migrationItem.system.workflow.codename);
280
+ const firstWorkflowStep = workflow.steps.length ? workflow.steps[0] : undefined;
276
281
 
277
- if (firstWorkflowStep) {
278
- await runMapiRequestAsync({
279
- logger: config.logger,
280
- func: async () => {
281
- await config.managementClient
282
- .changeWorkflowOfLanguageVariant()
283
- .byItemCodename(data.migrationItem.system.codename)
284
- .byLanguageCodename(data.migrationItem.system.language.codename)
285
- .withData({
286
- workflow_identifier: {
287
- codename: workflow.codename
288
- },
289
- step_identifier: {
290
- codename: firstWorkflowStep.codename
291
- }
292
- })
293
- .toPromise();
294
- },
295
- action: 'changeWorkflowStep',
296
- type: 'languageVariant',
297
- logSpinner: data.logSpinner,
298
- itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${firstWorkflowStep.codename}`
299
- });
300
- }
301
- };
282
+ if (firstWorkflowStep) {
283
+ await runMapiRequestAsync({
284
+ logger: config.logger,
285
+ func: async () => {
286
+ await config.managementClient
287
+ .changeWorkflowOfLanguageVariant()
288
+ .byItemCodename(data.migrationItem.system.codename)
289
+ .byLanguageCodename(data.migrationItem.system.language.codename)
290
+ .withData({
291
+ workflow_identifier: {
292
+ codename: workflow.codename,
293
+ },
294
+ step_identifier: {
295
+ codename: firstWorkflowStep.codename,
296
+ },
297
+ })
298
+ .toPromise();
299
+ },
300
+ action: "changeWorkflowStep",
301
+ type: "languageVariant",
302
+ logSpinner: data.logSpinner,
303
+ itemName: `${data.migrationItem.system.codename} (${data.migrationItem.system.language.codename}) -> ${firstWorkflowStep.codename}`,
304
+ });
305
+ }
306
+ };
302
307
 
303
- const setScheduledStateOfLanguageVariantAsync = async (data: {
304
- readonly logSpinner: LogSpinnerData;
305
- readonly migrationItem: MigrationItem;
306
- readonly migrationItemVersion: MigrationItemVersion;
307
- }): Promise<void> => {
308
- if (!data.migrationItemVersion.schedule) {
309
- return;
310
- }
308
+ const setScheduledStateOfLanguageVariantAsync = async (data: {
309
+ readonly logSpinner: LogSpinnerData;
310
+ readonly migrationItem: MigrationItem;
311
+ readonly migrationItemVersion: MigrationItemVersion;
312
+ }): Promise<void> => {
313
+ if (!data.migrationItemVersion.schedule) {
314
+ return;
315
+ }
311
316
 
312
- // set scheduling
313
- if (data.migrationItemVersion.schedule.unpublish_time && data.migrationItemVersion.schedule.unpublish_display_timezone) {
314
- await scheduleUnpublishLanguageVariantAsync({
315
- logSpinner: data.logSpinner,
316
- migrationItem: data.migrationItem,
317
- schedule: {
318
- unpublish_time: data.migrationItemVersion.schedule.unpublish_time,
319
- unpublish_display_timezone: data.migrationItemVersion.schedule.unpublish_display_timezone
320
- }
321
- });
322
- }
317
+ // set scheduling
318
+ if (data.migrationItemVersion.schedule.unpublish_time && data.migrationItemVersion.schedule.unpublish_display_timezone) {
319
+ await scheduleUnpublishLanguageVariantAsync({
320
+ logSpinner: data.logSpinner,
321
+ migrationItem: data.migrationItem,
322
+ schedule: {
323
+ unpublish_time: data.migrationItemVersion.schedule.unpublish_time,
324
+ unpublish_display_timezone: data.migrationItemVersion.schedule.unpublish_display_timezone,
325
+ },
326
+ });
327
+ }
323
328
 
324
- if (data.migrationItemVersion.schedule.publish_time && data.migrationItemVersion.schedule.publish_display_timezone) {
325
- await schedulePublishLanguageVariantAsync({
326
- logSpinner: data.logSpinner,
327
- migrationItem: data.migrationItem,
328
- schedule: {
329
- publish_time: data.migrationItemVersion.schedule.publish_time,
330
- publish_display_timezone: data.migrationItemVersion.schedule.publish_display_timezone
331
- }
332
- });
333
- }
334
- };
329
+ if (data.migrationItemVersion.schedule.publish_time && data.migrationItemVersion.schedule.publish_display_timezone) {
330
+ await schedulePublishLanguageVariantAsync({
331
+ logSpinner: data.logSpinner,
332
+ migrationItem: data.migrationItem,
333
+ schedule: {
334
+ publish_time: data.migrationItemVersion.schedule.publish_time,
335
+ publish_display_timezone: data.migrationItemVersion.schedule.publish_display_timezone,
336
+ },
337
+ });
338
+ }
339
+ };
335
340
 
336
- const setWorkflowOfLanguageVariantAsync = async (data: {
337
- readonly logSpinner: LogSpinnerData;
338
- readonly workflowCodename: string;
339
- readonly stepCodename: string;
340
- readonly migrationItem: MigrationItem;
341
- readonly migrationItemVersion: MigrationItemVersion;
342
- readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
343
- }): Promise<void> => {
344
- return await match(data.stepCodename)
345
- .returnType<Promise<void>>()
346
- .when(
347
- (stepCodename) => workflowHelper.isPublishedStepByCodename(stepCodename),
348
- async () => {
349
- const { workflow, step: publishStep } = workflowHelper.getWorkflowAndStepByCodenames({
350
- workflowCodename: data.workflowCodename,
351
- stepCodename: data.stepCodename
352
- });
353
- const variantStep = workflowHelper.getWorkflowStepById(
354
- workflow,
355
- data.languageVariant.workflow.stepIdentifier.id as string
356
- );
357
- const previousToPublishStep = getPreviousToPublishStep(workflow, variantStep, publishStep);
341
+ const setWorkflowOfLanguageVariantAsync = async (data: {
342
+ readonly logSpinner: LogSpinnerData;
343
+ readonly workflowCodename: string;
344
+ readonly stepCodename: string;
345
+ readonly migrationItem: MigrationItem;
346
+ readonly migrationItemVersion: MigrationItemVersion;
347
+ readonly languageVariant: Readonly<LanguageVariantModels.ContentItemLanguageVariant>;
348
+ }): Promise<void> => {
349
+ return await match(data.stepCodename)
350
+ .returnType<Promise<void>>()
351
+ .when(
352
+ (stepCodename) => workflowHelper.isPublishedStepByCodename(stepCodename),
353
+ async () => {
354
+ const { workflow, step: publishStep } = workflowHelper.getWorkflowAndStepByCodenames({
355
+ workflowCodename: data.workflowCodename,
356
+ stepCodename: data.stepCodename,
357
+ });
358
+ const variantStep = workflowHelper.getWorkflowStepById(
359
+ workflow,
360
+ data.languageVariant.workflow.stepIdentifier.id as string,
361
+ );
362
+ const previousToPublishStep = getPreviousToPublishStep(workflow, variantStep, publishStep);
358
363
 
359
- if (previousToPublishStep) {
360
- await changeWorkflowOfLanguageVariantAsync({ ...data, stepCodename: previousToPublishStep.stepCodename });
361
- }
364
+ if (previousToPublishStep) {
365
+ await changeWorkflowOfLanguageVariantAsync({ ...data, stepCodename: previousToPublishStep.stepCodename });
366
+ }
362
367
 
363
- await publishLanguageVariantAsync(data);
364
- }
365
- )
366
- .when(
367
- (stepCodename) => workflowHelper.isArchivedStepByCodename(stepCodename),
368
- async () => await archiveLanguageVariantAsync(data)
369
- )
370
- .when(
371
- (stepCodename) => workflowHelper.isScheduledStepByCodename(stepCodename),
372
- async () => {
373
- // do nothing for scheduled step
374
- return await Promise.resolve();
375
- }
376
- )
377
- .otherwise(async () => await changeWorkflowOfLanguageVariantAsync(data));
378
- };
368
+ await publishLanguageVariantAsync(data);
369
+ },
370
+ )
371
+ .when(
372
+ (stepCodename) => workflowHelper.isArchivedStepByCodename(stepCodename),
373
+ async () => await archiveLanguageVariantAsync(data),
374
+ )
375
+ .when(
376
+ (stepCodename) => workflowHelper.isScheduledStepByCodename(stepCodename),
377
+ async () => {
378
+ // do nothing for scheduled step
379
+ return await Promise.resolve();
380
+ },
381
+ )
382
+ .otherwise(async () => await changeWorkflowOfLanguageVariantAsync(data));
383
+ };
379
384
 
380
- return {
381
- setScheduledStateOfLanguageVariantAsync,
382
- setWorkflowOfLanguageVariantAsync,
383
- publishLanguageVariantAsync,
384
- unpublishLanguageVariantAsync,
385
- archiveLanguageVariantAsync,
386
- changeWorkflowOfLanguageVariantAsync,
387
- moveToDraftStepAsync,
388
- createNewVersionOfLanguageVariantAsync,
389
- cancelScheduledPublishAsync,
390
- cancelScheduledUnpublishAsync
391
- };
385
+ return {
386
+ setScheduledStateOfLanguageVariantAsync,
387
+ setWorkflowOfLanguageVariantAsync,
388
+ publishLanguageVariantAsync,
389
+ unpublishLanguageVariantAsync,
390
+ archiveLanguageVariantAsync,
391
+ changeWorkflowOfLanguageVariantAsync,
392
+ moveToDraftStepAsync,
393
+ createNewVersionOfLanguageVariantAsync,
394
+ cancelScheduledPublishAsync,
395
+ cancelScheduledUnpublishAsync,
396
+ };
392
397
  }