@kontent-ai/migration-toolkit 1.5.1 → 2.1.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 (67) hide show
  1. package/dist/es2022/core/config.d.ts +4 -0
  2. package/dist/es2022/core/config.js +6 -0
  3. package/dist/es2022/core/config.js.map +1 -0
  4. package/dist/es2022/core/models/migration.models.d.ts +4 -5
  5. package/dist/es2022/core/models/migration.schema.d.ts +46 -233
  6. package/dist/es2022/core/models/migration.schema.js +7 -22
  7. package/dist/es2022/core/models/migration.schema.js.map +1 -1
  8. package/dist/es2022/core/utils/binary-data.utils.d.ts +1 -0
  9. package/dist/es2022/core/utils/binary-data.utils.js.map +1 -1
  10. package/dist/es2022/core/utils/management-client-utils.d.ts +2 -2
  11. package/dist/es2022/core/utils/management-client-utils.js +11 -4
  12. package/dist/es2022/core/utils/management-client-utils.js.map +1 -1
  13. package/dist/es2022/export/export-manager.d.ts +1 -1
  14. package/dist/es2022/export/export-manager.js +6 -5
  15. package/dist/es2022/export/export-manager.js.map +1 -1
  16. package/dist/es2022/export/export.models.d.ts +4 -3
  17. package/dist/es2022/import/comparers/asset-comparer.js +2 -2
  18. package/dist/es2022/import/comparers/asset-comparer.js.map +1 -1
  19. package/dist/es2022/import/import.models.d.ts +2 -2
  20. package/dist/es2022/import/importers/assets-importer.js +2 -2
  21. package/dist/es2022/import/importers/assets-importer.js.map +1 -1
  22. package/dist/es2022/import/importers/language-variant-importer.js +4 -4
  23. package/dist/es2022/import/importers/language-variant-importer.js.map +1 -1
  24. package/dist/es2022/metadata.js +2 -2
  25. package/dist/es2022/toolkit/file.js +3 -2
  26. package/dist/es2022/toolkit/file.js.map +1 -1
  27. package/dist/es2022/translation/extraction/items-extraction.processor.d.ts +2 -2
  28. package/dist/es2022/translation/extraction/items-extraction.processor.js +10 -4
  29. package/dist/es2022/translation/extraction/items-extraction.processor.js.map +1 -1
  30. package/dist/es2022/translation/helpers/rich-text.processor.d.ts +2 -0
  31. package/dist/es2022/translation/helpers/rich-text.processor.js +56 -1
  32. package/dist/es2022/translation/helpers/rich-text.processor.js.map +1 -1
  33. package/dist/es2022/translation/transforms/export-transforms.js +131 -83
  34. package/dist/es2022/translation/transforms/export-transforms.js.map +1 -1
  35. package/dist/es2022/translation/transforms/import-transforms.js +22 -19
  36. package/dist/es2022/translation/transforms/import-transforms.js.map +1 -1
  37. package/dist/es2022/zip/zip-manager.d.ts +1 -0
  38. package/dist/es2022/zip/zip-manager.js +1 -1
  39. package/dist/es2022/zip/zip-manager.js.map +1 -1
  40. package/dist/es2022/zip/zip-packager.js +2 -1
  41. package/dist/es2022/zip/zip-packager.js.map +1 -1
  42. package/dist/es2022/zip/zip-transformer.d.ts +1 -1
  43. package/dist/es2022/zip/zip-transformer.js +3 -3
  44. package/dist/es2022/zip/zip-transformer.js.map +1 -1
  45. package/dist/es2022/zip/zip.models.d.ts +1 -0
  46. package/lib/core/config.ts +6 -0
  47. package/lib/core/models/migration.models.ts +12 -15
  48. package/lib/core/models/migration.schema.ts +11 -36
  49. package/lib/core/utils/binary-data.utils.ts +1 -0
  50. package/lib/core/utils/management-client-utils.ts +13 -6
  51. package/lib/export/export-manager.ts +22 -21
  52. package/lib/export/export.models.ts +18 -17
  53. package/lib/import/comparers/asset-comparer.ts +2 -2
  54. package/lib/import/import.models.ts +17 -17
  55. package/lib/import/importers/assets-importer.ts +2 -2
  56. package/lib/import/importers/language-variant-importer.ts +13 -13
  57. package/lib/metadata.ts +2 -2
  58. package/lib/toolkit/file.ts +3 -2
  59. package/lib/translation/extraction/items-extraction.processor.ts +16 -9
  60. package/lib/translation/helpers/rich-text.processor.ts +81 -1
  61. package/lib/translation/transforms/export-transforms.ts +143 -103
  62. package/lib/translation/transforms/import-transforms.ts +27 -31
  63. package/lib/zip/zip-manager.ts +2 -1
  64. package/lib/zip/zip-packager.ts +4 -3
  65. package/lib/zip/zip-transformer.ts +4 -4
  66. package/lib/zip/zip.models.ts +1 -0
  67. package/package.json +14 -13
@@ -1,20 +1,18 @@
1
1
  import { z } from 'zod';
2
2
  import {
3
+ MigrationAssetDescriptionSchema,
4
+ MigrationAssetSchema,
3
5
  MigrationComponentSchema,
4
- MigrationElementTypeSchema,
5
- MigrationElementValueSchema,
6
- MigrationReferenceSchema,
7
- MigrationUrlSlugElementValueSchema,
8
- MigrationUrlSlugModeSchema,
9
- MigrationRichTextElementValueSchema,
6
+ MigrationDataSchema,
10
7
  MigrationElementSchema,
11
8
  MigrationElementsSchema,
12
- MigrationAssetDescriptionSchema,
13
- MigrationDataSchema,
14
- MigrationAssetSchema,
15
- MigrationItemVersionSchema,
9
+ MigrationElementTypeSchema,
10
+ MigrationElementValueSchema,
16
11
  MigrationItemSchema,
17
- MigrationItemSystemSchema
12
+ MigrationItemSystemSchema,
13
+ MigrationItemVersionSchema,
14
+ MigrationReferenceSchema,
15
+ MigrationUrlSlugModeSchema
18
16
  } from './migration.schema.js';
19
17
 
20
18
  export namespace MigrationElementModels {
@@ -28,13 +26,13 @@ export namespace MigrationElementModels {
28
26
 
29
27
  export type TextElement = MigrationElementDef<'text', string>;
30
28
  export type NumberElement = MigrationElementDef<'number', number>;
31
- export type RichTextElement = MigrationElementDef<'rich_text', MigrationRichTextElementValue>;
29
+ export type RichTextElement = MigrationElementDef<'rich_text', string>;
32
30
  export type MultipleChoiceElement = MigrationElementDef<'multiple_choice', MigrationReference[]>;
33
31
  export type DateTimeElement = MigrationElementDef<'date_time', string>;
34
32
  export type AssetElement = MigrationElementDef<'asset', MigrationReference[]>;
35
33
  export type LinkedItemsElement = MigrationElementDef<'modular_content', MigrationReference[]>;
36
34
  export type TaxonomyElement = MigrationElementDef<'taxonomy', MigrationReference[]>;
37
- export type UrlSlugElement = MigrationElementDef<'url_slug', MigrationUrlSlugElementValue>;
35
+ export type UrlSlugElement = MigrationElementDef<'url_slug', string>;
38
36
  export type CustomElement = MigrationElementDef<'custom', string>;
39
37
  export type SubpagesElement = MigrationElementDef<'subpages', MigrationReference[]>;
40
38
  }
@@ -58,11 +56,10 @@ export type MigrationItemSystem<
58
56
  };
59
57
  export type MigrationUrlSlugMode = z.infer<typeof MigrationUrlSlugModeSchema>;
60
58
  export type MigrationElementType = z.infer<typeof MigrationElementTypeSchema>;
61
- export type MigrationUrlSlugElementValue = z.infer<typeof MigrationUrlSlugElementValueSchema>;
62
- export type MigrationRichTextElementValue = z.infer<typeof MigrationRichTextElementValueSchema>;
63
59
  export type MigrationComponent = z.infer<typeof MigrationComponentSchema>;
64
60
  export type MigrationElementValue = z.infer<typeof MigrationElementValueSchema>;
65
61
  export type MigrationElement = z.infer<typeof MigrationElementSchema>;
62
+ export type MigrationElementTransformData = Omit<MigrationElement, 'type'>;
66
63
  export type MigrationElements = z.infer<typeof MigrationElementsSchema>;
67
64
  export type MigrationAssetDescription = z.infer<typeof MigrationAssetDescriptionSchema>;
68
65
  export type MigrationAsset = z.infer<typeof MigrationAssetSchema>;
@@ -1,3 +1,4 @@
1
+ import { Buffer } from 'buffer';
1
2
  import { z } from 'zod';
2
3
 
3
4
  interface Elements {
@@ -5,12 +6,6 @@ interface Elements {
5
6
  }
6
7
 
7
8
  type UrlSlugMode = 'autogenerated' | 'custom';
8
-
9
- type UrlSlugElementValue = {
10
- readonly value?: string;
11
- readonly mode: UrlSlugMode;
12
- };
13
-
14
9
  type Reference = { readonly codename: string };
15
10
 
16
11
  type Component = {
@@ -21,16 +16,14 @@ type Component = {
21
16
  readonly elements: Elements;
22
17
  };
23
18
 
24
- type RichTextElementValue = {
25
- readonly value: string;
26
- readonly components: Readonly<Component[]>;
27
- };
28
-
29
- type ElementValue = string | undefined | number | Reference[] | RichTextElementValue | UrlSlugElementValue;
19
+ type ElementValue = string | undefined | number | Reference[];
30
20
 
31
21
  type Element = {
32
22
  readonly type: ElementType;
33
23
  readonly value?: ElementValue;
24
+ readonly display_timezone?: string;
25
+ readonly components?: readonly Component[];
26
+ readonly mode?: UrlSlugMode;
34
27
  };
35
28
 
36
29
  type ElementType =
@@ -99,33 +92,15 @@ export const MigrationComponentSchema = z
99
92
  })
100
93
  .readonly();
101
94
 
102
- export const MigrationUrlSlugElementValueSchema = z
103
- .strictObject({
104
- value: z.optional(z.string()),
105
- mode: MigrationUrlSlugModeSchema
106
- })
107
- .readonly();
108
-
109
- export const MigrationRichTextElementValueSchema = z
110
- .strictObject({
111
- value: z.string(),
112
- components: z.array(MigrationComponentSchema).readonly()
113
- })
114
- .readonly();
115
-
116
- export const MigrationElementValueSchema = z.union([
117
- z.string(),
118
- z.undefined(),
119
- z.number(),
120
- z.array(MigrationReferenceSchema),
121
- MigrationRichTextElementValueSchema,
122
- MigrationUrlSlugElementValueSchema
123
- ]);
95
+ export const MigrationElementValueSchema = z.union([z.string(), z.undefined(), z.number(), z.array(MigrationReferenceSchema)]);
124
96
 
125
97
  export const MigrationElementSchema = z
126
98
  .strictObject({
127
99
  type: MigrationElementTypeSchema,
128
- value: MigrationElementValueSchema
100
+ value: MigrationElementValueSchema,
101
+ display_timezone: z.string().optional(),
102
+ components: z.array(MigrationComponentSchema).readonly().optional(),
103
+ mode: MigrationUrlSlugModeSchema.optional()
129
104
  })
130
105
  .readonly();
131
106
 
@@ -170,7 +145,7 @@ const BaseMigrationAssetSchema = z.strictObject({
170
145
  });
171
146
 
172
147
  export const MigrationAssetSchema = BaseMigrationAssetSchema.extend({
173
- binaryData: z.union([z.instanceof(Buffer), z.instanceof(Blob)])
148
+ binary_data: z.union([z.instanceof(Buffer), z.instanceof(Blob)])
174
149
  }).readonly();
175
150
 
176
151
  export const ZipMigrationAssetSchema = BaseMigrationAssetSchema.extend({
@@ -1,3 +1,4 @@
1
+ import { Buffer } from 'buffer';
1
2
  import { defaultHttpService, defaultRetryStrategy } from './http.utils.js';
2
3
 
3
4
  export async function getBinaryDataFromUrlAsync(url: string): Promise<{ data: Buffer | Blob; contentLength: number }> {
@@ -1,3 +1,4 @@
1
+ import { IRetryStrategyOptions } from '@kontent-ai/core-sdk';
1
2
  import {
2
3
  AssetFolderModels,
3
4
  CollectionModels,
@@ -10,14 +11,14 @@ import {
10
11
  WorkflowModels,
11
12
  createManagementClient
12
13
  } from '@kontent-ai/management-sdk';
13
- import { IRetryStrategyOptions } from '@kontent-ai/core-sdk';
14
- import { runMapiRequestAsync } from './run.utils.js';
15
- import { LogSpinnerData, Logger } from '../models/log.models.js';
14
+ import chalk from 'chalk';
15
+ import { coreConfig } from '../config.js';
16
16
  import { FlattenedContentType, FlattenedContentTypeElement } from '../models/core.models.js';
17
+ import { LogSpinnerData, Logger } from '../models/log.models.js';
18
+ import { findRequired } from './array.utils.js';
17
19
  import { isNotUndefined } from './global.utils.js';
18
- import chalk from 'chalk';
19
20
  import { defaultHttpService, defaultRetryStrategy } from './http.utils.js';
20
- import { findRequired } from './array.utils.js';
21
+ import { runMapiRequestAsync } from './run.utils.js';
21
22
 
22
23
  export interface ManagementClientConfig {
23
24
  readonly environmentId: string;
@@ -31,7 +32,13 @@ export function getMigrationManagementClient(config: ManagementClientConfig): Ma
31
32
  environmentId: config.environmentId,
32
33
  retryStrategy: config.retryStrategy ?? defaultRetryStrategy,
33
34
  httpService: defaultHttpService,
34
- apiKey: config.apiKey
35
+ apiKey: config.apiKey,
36
+ headers: [
37
+ {
38
+ header: coreConfig.kontentTrackingHeaderName,
39
+ value: coreConfig.kontentTrackingHeaderValue
40
+ }
41
+ ]
35
42
  });
36
43
  }
37
44
 
@@ -1,29 +1,29 @@
1
- import { ExportContext, ExportConfig, ExportItem } from './export.models.js';
2
- import chalk from 'chalk';
3
1
  import { AssetFolderModels, AssetModels, CollectionModels, ElementModels } from '@kontent-ai/management-sdk';
2
+ import chalk from 'chalk';
4
3
  import {
5
- MigrationAsset,
6
- MigrationItem,
7
- FlattenedContentTypeElement,
8
4
  extractErrorData,
9
- processItemsAsync,
10
- getBinaryDataFromUrlAsync,
11
- MigrationElements,
5
+ findRequired,
12
6
  FlattenedContentType,
13
- MigrationComponent,
7
+ FlattenedContentTypeElement,
8
+ getBinaryDataFromUrlAsync,
14
9
  getDefaultLogger,
15
- MigrationData,
16
- isNotUndefined,
17
- MigrationElementValue,
18
10
  getMigrationManagementClient,
19
- findRequired,
20
- Writeable,
21
- MigrationItemsSchema,
11
+ isNotUndefined,
12
+ MigrationAsset,
22
13
  MigrationAssetsSchema,
23
- MigrationItemVersion
14
+ MigrationComponent,
15
+ MigrationData,
16
+ MigrationElements,
17
+ MigrationElementTransformData,
18
+ MigrationItem,
19
+ MigrationItemsSchema,
20
+ MigrationItemVersion,
21
+ processItemsAsync,
22
+ Writeable
24
23
  } from '../core/index.js';
25
24
  import { exportTransforms } from '../translation/index.js';
26
25
  import { exportContextFetcherAsync } from './context/export-context-fetcher.js';
26
+ import { ExportConfig, ExportContext, ExportItem } from './export.models.js';
27
27
 
28
28
  export function exportManager(config: ExportConfig) {
29
29
  const logger = config.logger ?? getDefaultLogger();
@@ -111,7 +111,7 @@ export function exportManager(config: ExportConfig) {
111
111
 
112
112
  model[typeElement.codename] = {
113
113
  type: typeElement.type,
114
- value: getValueToStoreFromElement({
114
+ ...getMigrationElementToStore({
115
115
  context: context,
116
116
  contentType: contentType,
117
117
  exportElement: itemElement,
@@ -123,12 +123,12 @@ export function exportManager(config: ExportConfig) {
123
123
  }, {});
124
124
  };
125
125
 
126
- const getValueToStoreFromElement = (data: {
126
+ const getMigrationElementToStore = (data: {
127
127
  context: ExportContext;
128
128
  contentType: FlattenedContentType;
129
129
  typeElement: FlattenedContentTypeElement;
130
130
  exportElement: ElementModels.ContentItemElement;
131
- }): MigrationElementValue => {
131
+ }): MigrationElementTransformData => {
132
132
  try {
133
133
  return exportTransforms[data.typeElement.type]({
134
134
  context: data.context,
@@ -136,7 +136,8 @@ export function exportManager(config: ExportConfig) {
136
136
  exportElement: {
137
137
  components: data.exportElement.components.map((component) => mapToMigrationComponent(data.context, component)),
138
138
  value: data.exportElement.value,
139
- urlSlugMode: data.exportElement.mode
139
+ urlSlugMode: data.exportElement.mode,
140
+ displayTimezone: data.exportElement.display_timezone
140
141
  }
141
142
  });
142
143
  } catch (error) {
@@ -204,7 +205,7 @@ export function exportManager(config: ExportConfig) {
204
205
  filename: asset.fileName,
205
206
  title: asset.title ?? '',
206
207
  codename: asset.codename,
207
- binaryData: binaryData.data,
208
+ binary_data: binaryData.data,
208
209
  collection: assetCollection ? { codename: assetCollection.codename } : undefined,
209
210
  folder: assetFolder ? { codename: assetFolder.codename } : undefined,
210
211
  descriptions: asset.descriptions.map((description) => {
@@ -1,26 +1,26 @@
1
1
  import {
2
- Logger,
3
- FlattenedContentType,
2
+ AssetFolderModels,
3
+ CollectionModels,
4
+ ContentItemModels,
5
+ LanguageModels,
6
+ LanguageVariantModels,
7
+ ManagementClient,
8
+ SharedModels,
9
+ TaxonomyModels,
10
+ WorkflowModels
11
+ } from '@kontent-ai/management-sdk';
12
+ import {
4
13
  AssetStateInSourceEnvironmentById,
14
+ FlattenedContentType,
5
15
  FlattenedContentTypeElement,
6
16
  ItemStateInSourceEnvironmentById,
7
- ReferencedDataInLanguageVariants,
8
- MigrationElementValue,
17
+ Logger,
18
+ ManagementClientConfig,
9
19
  MigrationComponent,
20
+ MigrationElementTransformData,
10
21
  MigrationUrlSlugMode,
11
- ManagementClientConfig
22
+ ReferencedDataInLanguageVariants
12
23
  } from '../core/index.js';
13
- import {
14
- LanguageVariantModels,
15
- ContentItemModels,
16
- WorkflowModels,
17
- CollectionModels,
18
- LanguageModels,
19
- TaxonomyModels,
20
- ManagementClient,
21
- SharedModels,
22
- AssetFolderModels
23
- } from '@kontent-ai/management-sdk';
24
24
 
25
25
  export interface ExportContextEnvironmentData {
26
26
  readonly languages: readonly Readonly<LanguageModels.LanguageModel>[];
@@ -37,13 +37,14 @@ export interface ExportElement {
37
37
  readonly value: ExportElementValue;
38
38
  readonly components: readonly MigrationComponent[];
39
39
  readonly urlSlugMode: MigrationUrlSlugMode | undefined;
40
+ readonly displayTimezone: string | undefined;
40
41
  }
41
42
 
42
43
  export type ExportTransformFunc = (data: {
43
44
  readonly typeElement: FlattenedContentTypeElement;
44
45
  readonly exportElement: ExportElement;
45
46
  readonly context: ExportContext;
46
- }) => MigrationElementValue;
47
+ }) => MigrationElementTransformData;
47
48
 
48
49
  export interface ExportContext {
49
50
  readonly environmentData: ExportContextEnvironmentData;
@@ -1,6 +1,6 @@
1
1
  import { AssetFolderModels, AssetModels, CollectionModels, LanguageModels } from '@kontent-ai/management-sdk';
2
- import { MigrationAsset, MigrationAssetDescription, findRequired, geSizeInBytes } from '../../core/index.js';
3
2
  import deepEqual from 'deep-equal';
3
+ import { MigrationAsset, MigrationAssetDescription, findRequired, geSizeInBytes } from '../../core/index.js';
4
4
 
5
5
  export function shouldUpdateAsset(data: {
6
6
  readonly migrationAsset: MigrationAsset;
@@ -29,7 +29,7 @@ function isBinaryFileIdentical(data: {
29
29
  readonly migrationAsset: MigrationAsset;
30
30
  readonly targetAsset: Readonly<AssetModels.Asset>;
31
31
  }): boolean {
32
- const sourceFileSize = geSizeInBytes(data.migrationAsset.binaryData);
32
+ const sourceFileSize = geSizeInBytes(data.migrationAsset.binary_data);
33
33
  const targetFileSize = data.targetAsset.size;
34
34
 
35
35
  const sourceFilename = data.migrationAsset.filename;
@@ -1,19 +1,3 @@
1
- import {
2
- MigrationItem,
3
- MigrationAsset,
4
- Logger,
5
- AssetStateInTargetEnvironmentByCodename,
6
- ItemStateInTargetEnvironmentByCodename,
7
- ReferencedDataInMigrationItems,
8
- LanguageVariantStateInTargetEnvironmentByCodename,
9
- ExternalIdGenerator,
10
- FlattenedContentTypeElement,
11
- MigrationElementValue,
12
- MigrationElementType,
13
- MigrationData,
14
- ManagementClientConfig,
15
- FlattenedContentType
16
- } from '../core/index.js';
17
1
  import {
18
2
  AssetFolderModels,
19
3
  AssetModels,
@@ -25,6 +9,22 @@ import {
25
9
  ManagementClient,
26
10
  WorkflowModels
27
11
  } from '@kontent-ai/management-sdk';
12
+ import {
13
+ AssetStateInTargetEnvironmentByCodename,
14
+ ExternalIdGenerator,
15
+ FlattenedContentType,
16
+ FlattenedContentTypeElement,
17
+ ItemStateInTargetEnvironmentByCodename,
18
+ LanguageVariantStateInTargetEnvironmentByCodename,
19
+ Logger,
20
+ ManagementClientConfig,
21
+ MigrationAsset,
22
+ MigrationData,
23
+ MigrationElementTransformData,
24
+ MigrationElementType,
25
+ MigrationItem,
26
+ ReferencedDataInMigrationItems
27
+ } from '../core/index.js';
28
28
 
29
29
  export interface ImportContextConfig {
30
30
  readonly logger: Logger;
@@ -66,7 +66,7 @@ export interface ImportContext {
66
66
  }
67
67
 
68
68
  export type ImportTransformFunc = (data: {
69
- readonly value: MigrationElementValue;
69
+ readonly elementData: MigrationElementTransformData;
70
70
  readonly elementCodename: string;
71
71
  readonly importContext: ImportContext;
72
72
  readonly migrationItems: readonly MigrationItem[];
@@ -174,8 +174,8 @@ export function assetsImporter(data: {
174
174
  await data.client
175
175
  .uploadBinaryFile()
176
176
  .withData({
177
- binaryData: migrationAsset.binaryData,
178
- contentLength: geSizeInBytes(migrationAsset.binaryData),
177
+ binaryData: migrationAsset.binary_data,
178
+ contentLength: geSizeInBytes(migrationAsset.binary_data),
179
179
  contentType: mime.getType(migrationAsset.filename) ?? '',
180
180
  filename: migrationAsset.filename
181
181
  })
@@ -1,24 +1,24 @@
1
- import { match } from 'ts-pattern';
2
1
  import { ContentItemModels, ElementContracts, LanguageVariantModels, ManagementClient, WorkflowModels } from '@kontent-ai/management-sdk';
2
+ import chalk from 'chalk';
3
+ import { match } from 'ts-pattern';
3
4
  import {
5
+ findRequired,
6
+ isNotUndefined,
7
+ LanguageVariantSchedulesStateValues,
8
+ LanguageVariantStateInTargetEnvironmentByCodename,
4
9
  Logger,
5
- processItemsAsync,
6
- runMapiRequestAsync,
7
- MigrationItem,
8
10
  LogSpinnerData,
9
11
  MigrationElement,
12
+ MigrationItem,
10
13
  MigrationItemVersion,
11
- workflowHelper,
12
- findRequired,
13
- isNotUndefined,
14
- LanguageVariantSchedulesStateValues,
15
- LanguageVariantStateInTargetEnvironmentByCodename
14
+ processItemsAsync,
15
+ runMapiRequestAsync,
16
+ workflowHelper
16
17
  } from '../../core/index.js';
17
- import chalk from 'chalk';
18
- import { ImportContext } from '../import.models.js';
19
18
  import { importTransforms } from '../../translation/index.js';
20
- import { workflowImporter as workflowImporterInit } from './workflow-importer.js';
19
+ import { ImportContext } from '../import.models.js';
21
20
  import { throwErrorForMigrationItem } from '../utils/import.utils.js';
21
+ import { workflowImporter as workflowImporterInit } from './workflow-importer.js';
22
22
 
23
23
  export function languageVariantImporter(config: {
24
24
  readonly logger: Logger;
@@ -290,7 +290,7 @@ export function languageVariantImporter(config: {
290
290
  elementCodename: elementCodename,
291
291
  importContext: config.importContext,
292
292
  migrationItems: config.importContext.categorizedImportData.contentItems,
293
- value: element.value
293
+ elementData: element
294
294
  });
295
295
 
296
296
  return importTransformResult;
package/lib/metadata.ts CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  export const libMetadata = {
3
3
  name: '@kontent-ai/migration-toolkit',
4
- timestamp: 'Mon, 09 Sep 2024 13:24:59 GMT',
5
- version: '1.5.1'
4
+ timestamp: 'Tue, 08 Oct 2024 10:16:11 GMT',
5
+ version: '2.1.0'
6
6
  };
@@ -1,7 +1,8 @@
1
+ import { Buffer } from 'buffer';
2
+ import { defaultZipFilename, executeWithTrackingAsync, getDefaultLogger, Logger, MigrationData } from '../core/index.js';
1
3
  import { fileManager } from '../file/index.js';
2
- import { Logger, executeWithTrackingAsync, defaultZipFilename, getDefaultLogger, MigrationData } from '../core/index.js';
3
- import { zipManager } from '../zip/index.js';
4
4
  import { libMetadata } from '../metadata.js';
5
+ import { zipManager } from '../zip/index.js';
5
6
 
6
7
  export interface StoreConfig {
7
8
  readonly data: MigrationData;
@@ -1,15 +1,15 @@
1
- import { richTextProcessor } from '../index.js';
1
+ import { ElementModels } from '@kontent-ai/management-sdk';
2
+ import { GetFlattenedElementByIds } from 'lib/export/export.models.js';
3
+ import { match, P } from 'ts-pattern';
2
4
  import {
3
5
  MigrationElementModels,
4
6
  MigrationElements,
7
+ parseAsMigrationReferencesArray,
5
8
  ReferencedDataInLanguageVariants,
6
- ReferencedDataInMigrationItems,
7
- parseAsMigrationReferencesArray
9
+ ReferencedDataInMigrationItems
8
10
  } from '../../core/index.js';
9
11
  import { GetFlattenedElementByCodenames } from '../../import/index.js';
10
- import { ElementModels } from '@kontent-ai/management-sdk';
11
- import { GetFlattenedElementByIds } from 'lib/export/export.models.js';
12
- import { match, P } from 'ts-pattern';
12
+ import { richTextProcessor } from '../index.js';
13
13
 
14
14
  export interface ExtractItemById {
15
15
  readonly elements: Readonly<ElementModels.ContentItemElement>[];
@@ -59,6 +59,10 @@ export function itemsExtractionProcessor() {
59
59
  .processAssetIds(rteValue ?? '')
60
60
  .ids.forEach((id) => extractedIds.assetIds.add(id));
61
61
 
62
+ richTextProcessor()
63
+ .processLinkAssetIds(rteValue ?? '')
64
+ .ids.forEach((id) => extractedIds.assetIds.add(id));
65
+
62
66
  // recursively extract data from components as well because they may reference additional assets & content items
63
67
  const extractedComponents = extractReferencedDataFromExtractItems(
64
68
  itemElement.components.map((component) => {
@@ -106,11 +110,10 @@ export function itemsExtractionProcessor() {
106
110
  return Object.entries(item.elements).reduce<ReferencedDataInMigrationItemsLocal>(
107
111
  (childExtractedCodenames, [elementCodename, element]) => {
108
112
  const flattenedElement = getElement(item.contentTypeCodename, elementCodename, element.type);
109
-
110
113
  match(flattenedElement.type)
111
114
  .with('rich_text', () => {
112
115
  const richTextElementValue = element as MigrationElementModels.RichTextElement;
113
- const richTextHtml = richTextElementValue.value?.value ?? '';
116
+ const richTextHtml = richTextElementValue?.value ?? '';
114
117
 
115
118
  // items
116
119
  richTextProcessor()
@@ -126,9 +129,13 @@ export function itemsExtractionProcessor() {
126
129
  .processAssetCodenames(richTextHtml)
127
130
  .codenames.forEach((codename) => childExtractedCodenames.assetCodenames.add(codename));
128
131
 
132
+ richTextProcessor()
133
+ .processLinkAssetCodenames(richTextHtml)
134
+ .codenames.forEach((codename) => childExtractedCodenames.assetCodenames.add(codename));
135
+
129
136
  // recursively extract data from components as well because they may reference additional assets & content items
130
137
  const extractedComponents = extractReferencedItemsFromMigrationItems(
131
- (richTextElementValue.value?.components ?? []).map((component) => {
138
+ (element.components ?? []).map((component) => {
132
139
  const extractionItem: ExtractItemByCodename = {
133
140
  contentTypeCodename: component.system.type.codename,
134
141
  elements: component.elements
@@ -126,6 +126,42 @@ export function richTextProcessor() {
126
126
  };
127
127
  };
128
128
 
129
+ const processLinkAssetIds = (richTextHtml: string, replaceFunc?: IdReplaceFunc): ProcessIdsResult => {
130
+ const assetIds = new Set<string>();
131
+
132
+ if (!richTextHtml) {
133
+ return {
134
+ html: richTextHtml,
135
+ ids: assetIds
136
+ };
137
+ }
138
+
139
+ richTextHtml = richTextHtml.replaceAll(rteRegexes.elements.linkTagRegex, (linkTag) => {
140
+ const assetIdMatch = linkTag.match(rteRegexes.ids.dataAssetIdAttrRegex);
141
+ if (assetIdMatch && (assetIdMatch?.length ?? 0) >= 2) {
142
+ const assetId = assetIdMatch[1];
143
+
144
+ assetIds.add(assetId);
145
+
146
+ if (replaceFunc) {
147
+ const { codename } = replaceFunc(assetId);
148
+
149
+ return linkTag.replaceAll(
150
+ `${attributes.ids.assetIdAttributeName}="${assetId}"`,
151
+ `${attributes.codenames.assetCodenameAttribute}="${codename}"`
152
+ );
153
+ }
154
+ }
155
+
156
+ return linkTag;
157
+ });
158
+
159
+ return {
160
+ html: richTextHtml,
161
+ ids: assetIds
162
+ };
163
+ };
164
+
129
165
  const processLinkItemIds = (richTextHtml: string, replaceFunc?: IdReplaceFunc): ProcessIdsResult => {
130
166
  const linkItemIds = new Set<string>();
131
167
 
@@ -288,13 +324,57 @@ export function richTextProcessor() {
288
324
  html: richTextHtml
289
325
  };
290
326
  };
327
+
328
+ const processLinkAssetCodenames = (
329
+ richTextHtml: string,
330
+ replaceFunc?: CodenameReplaceFunc<AssetStateInTargetEnvironmentByCodename>
331
+ ): ProcessCodenamesResult => {
332
+ const assetCodenames = new Set<string>();
333
+
334
+ if (!richTextHtml) {
335
+ return {
336
+ codenames: assetCodenames,
337
+ html: richTextHtml
338
+ };
339
+ }
340
+
341
+ richTextHtml = richTextHtml.replaceAll(rteRegexes.elements.linkTagRegex, (linkTag) => {
342
+ const codenameMatch = linkTag.match(rteRegexes.codenames.rteAssetCodenameRegex);
343
+ if (codenameMatch && (codenameMatch?.length ?? 0) >= 2) {
344
+ const codename = codenameMatch[1];
345
+
346
+ assetCodenames.add(codename);
347
+
348
+ if (replaceFunc) {
349
+ const assetState = replaceFunc(codename);
350
+
351
+ if (assetState.asset && assetState.state === 'exists') {
352
+ return linkTag;
353
+ }
354
+ return linkTag.replaceAll(
355
+ `${attributes.codenames.assetCodenameAttribute}="${codename}"`,
356
+ `${attributes.ids.externalAssetIdAttributeName}="${assetState.externalIdToUse}"`
357
+ );
358
+ }
359
+ }
360
+
361
+ return linkTag;
362
+ });
363
+
364
+ return {
365
+ codenames: assetCodenames,
366
+ html: richTextHtml
367
+ };
368
+ };
291
369
 
292
370
  return {
293
371
  processAssetIds,
294
372
  processDataIds,
295
373
  processLinkItemIds,
374
+ processLinkAssetIds,
296
375
  processAssetCodenames,
297
376
  processItemCodenames,
298
- processLinkItemCodenames
377
+ processLinkItemCodenames,
378
+ processLinkAssetCodenames
299
379
  };
300
380
  }