@kontent-ai/delivery-sdk 16.4.2 → 16.4.4

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 (83) hide show
  1. package/.npmignore +15 -15
  2. package/LICENSE.md +9 -9
  3. package/dist/bundles/kontent-delivery.umd.js +5770 -4807
  4. package/dist/bundles/kontent-delivery.umd.js.map +1 -1
  5. package/dist/bundles/kontent-delivery.umd.min.js +1 -1
  6. package/dist/bundles/kontent-delivery.umd.min.js.map +1 -1
  7. package/dist/bundles/report.json +1 -1
  8. package/dist/bundles/report.min.json +1 -1
  9. package/dist/bundles/stats.json +10038 -7042
  10. package/dist/bundles/stats.min.json +14400 -10652
  11. package/dist/cjs/sdk-info.generated.js +1 -1
  12. package/dist/es6/sdk-info.generated.js +1 -1
  13. package/dist/esnext/sdk-info.generated.js +1 -1
  14. package/lib/client/delivery-client.factory.ts +9 -9
  15. package/lib/client/delivery-client.ts +163 -163
  16. package/lib/client/idelivery-client.interface.ts +110 -110
  17. package/lib/client/index.ts +3 -3
  18. package/lib/config/delivery-configs.ts +98 -98
  19. package/lib/config/index.ts +1 -1
  20. package/lib/contracts/contracts.ts +265 -265
  21. package/lib/contracts/index.ts +1 -1
  22. package/lib/elements/element-models.ts +89 -89
  23. package/lib/elements/element-resolver.ts +3 -3
  24. package/lib/elements/element-type.ts +16 -16
  25. package/lib/elements/elements.ts +70 -70
  26. package/lib/elements/index.ts +4 -4
  27. package/lib/images/image-url-transformation-builder.factory.ts +5 -5
  28. package/lib/images/image-url-transformation-builder.ts +181 -181
  29. package/lib/images/image.models.ts +4 -4
  30. package/lib/images/index.ts +3 -3
  31. package/lib/index.ts +12 -12
  32. package/lib/mappers/element.mapper.ts +504 -504
  33. package/lib/mappers/generic-element.mapper.ts +20 -20
  34. package/lib/mappers/index.ts +8 -8
  35. package/lib/mappers/item.mapper.ts +181 -181
  36. package/lib/mappers/language.mapper.ts +24 -24
  37. package/lib/mappers/sync.mapper.ts +32 -32
  38. package/lib/mappers/taxonomy.mapper.ts +77 -77
  39. package/lib/mappers/type.mapper.ts +76 -76
  40. package/lib/mappers/used-in.mapper.ts +20 -20
  41. package/lib/models/common/base-responses.ts +13 -13
  42. package/lib/models/common/common-models.ts +118 -118
  43. package/lib/models/common/filters.ts +280 -280
  44. package/lib/models/common/headers.ts +5 -5
  45. package/lib/models/common/index.ts +7 -7
  46. package/lib/models/common/pagination.class.ts +7 -7
  47. package/lib/models/common/parameters.ts +189 -189
  48. package/lib/models/common/sort-order.ts +1 -1
  49. package/lib/models/content-type-models.ts +42 -42
  50. package/lib/models/element-models.ts +51 -51
  51. package/lib/models/index.ts +9 -9
  52. package/lib/models/item-models.ts +192 -192
  53. package/lib/models/language-models.ts +17 -17
  54. package/lib/models/responses.ts +137 -137
  55. package/lib/models/sync-models.ts +18 -18
  56. package/lib/models/taxonomy-models.ts +25 -25
  57. package/lib/query/common/base-item-listing-query.class.ts +274 -274
  58. package/lib/query/common/base-listing-query.class.ts +95 -95
  59. package/lib/query/common/base-query.class.ts +148 -148
  60. package/lib/query/element/element-query.class.ts +45 -45
  61. package/lib/query/index.ts +13 -13
  62. package/lib/query/item/multiple-items-query.class.ts +183 -183
  63. package/lib/query/item/single-item-query.class.ts +106 -106
  64. package/lib/query/items-feed/items-feed-query.class.ts +191 -191
  65. package/lib/query/language/languages-query.class.ts +91 -91
  66. package/lib/query/sync/initialize-sync-query.class.ts +83 -83
  67. package/lib/query/sync/sync-changes-query.class.ts +56 -56
  68. package/lib/query/taxonomy/taxonomies-query.class.ts +82 -82
  69. package/lib/query/taxonomy/taxonomy-query.class.ts +50 -50
  70. package/lib/query/type/multiple-type-query.class.ts +95 -95
  71. package/lib/query/type/single-type-query.class.ts +45 -45
  72. package/lib/query/used-in/used-in-query.class.ts +126 -126
  73. package/lib/sdk-info.generated.ts +1 -1
  74. package/lib/services/base-delivery-query.service.ts +375 -375
  75. package/lib/services/delivery-query.service.ts +336 -336
  76. package/lib/services/index.ts +2 -2
  77. package/lib/services/mapping.service.ts +223 -223
  78. package/lib/utilities/codename.helper.ts +10 -10
  79. package/lib/utilities/delivery-url.helper.ts +11 -11
  80. package/lib/utilities/enum.helper.ts +38 -38
  81. package/lib/utilities/index.ts +3 -3
  82. package/package.json +96 -96
  83. package/readme.md +531 -531
@@ -1,20 +1,20 @@
1
- import { Contracts } from '../contracts';
2
- import { IGenericElement } from '../models';
3
-
4
- export class GenericElementMapper {
5
- mapElement(response: Contracts.IViewContentTypeElementContract): IGenericElement {
6
- if (!response) {
7
- throw Error(`Invalid response for mapping element`);
8
- }
9
-
10
- const element = response;
11
-
12
- return {
13
- codename: element.codename,
14
- name: element.name,
15
- type: element.type,
16
- options: element.options ? element.options : [],
17
- taxonomyGroup: element.taxonomy_group
18
- };
19
- }
20
- }
1
+ import { Contracts } from '../contracts';
2
+ import { IGenericElement } from '../models';
3
+
4
+ export class GenericElementMapper {
5
+ mapElement(response: Contracts.IViewContentTypeElementContract): IGenericElement {
6
+ if (!response) {
7
+ throw Error(`Invalid response for mapping element`);
8
+ }
9
+
10
+ const element = response;
11
+
12
+ return {
13
+ codename: element.codename,
14
+ name: element.name,
15
+ type: element.type,
16
+ options: element.options ? element.options : [],
17
+ taxonomyGroup: element.taxonomy_group
18
+ };
19
+ }
20
+ }
@@ -1,8 +1,8 @@
1
- export * from './element.mapper';
2
- export * from './item.mapper';
3
- export * from './taxonomy.mapper';
4
- export * from './type.mapper';
5
- export * from './generic-element.mapper';
6
- export * from './language.mapper';
7
- export * from './used-in.mapper';
8
- export * from './sync.mapper';
1
+ export * from './element.mapper';
2
+ export * from './item.mapper';
3
+ export * from './taxonomy.mapper';
4
+ export * from './type.mapper';
5
+ export * from './generic-element.mapper';
6
+ export * from './language.mapper';
7
+ export * from './used-in.mapper';
8
+ export * from './sync.mapper';
@@ -1,181 +1,181 @@
1
- import { codenameHelper } from '../utilities';
2
- import { IDeliveryClientConfig } from '../config';
3
- import { Contracts } from '../contracts';
4
- import {
5
- IContentItem,
6
- IContentItemsContainer,
7
- IContentItemWithRawDataContainer,
8
- IContentItemWithRawElements
9
- } from '../models';
10
- import { ElementMapper } from './element.mapper';
11
-
12
- export interface IMapItemResult<
13
- TContentItem extends IContentItem = IContentItem,
14
- TLinkedItemType extends IContentItem = IContentItem
15
- > {
16
- item: TContentItem;
17
- processedItems: IContentItemsContainer<TLinkedItemType>;
18
- preparedItems: IContentItemWithRawDataContainer;
19
- processingStartedForCodenames: string[];
20
- }
21
-
22
- export interface IMultipleItemsMapResult<
23
- TContentItem extends IContentItem = IContentItem,
24
- TLinkedItemType extends IContentItem = IContentItem
25
- > {
26
- items: TContentItem[];
27
- linkedItems: IContentItemsContainer<TLinkedItemType>;
28
- }
29
-
30
- export interface ISingleItemMapResult<
31
- TContentItem extends IContentItem = IContentItem,
32
- TLinkedItemType extends IContentItem = IContentItem
33
- > {
34
- item: TContentItem;
35
- linkedItems: IContentItemsContainer<TLinkedItemType>;
36
- }
37
-
38
- export class ItemMapper<TContentItemType extends IContentItem> {
39
- private readonly elementMapper: ElementMapper<TContentItemType>;
40
-
41
- constructor(readonly config: IDeliveryClientConfig) {
42
- this.elementMapper = new ElementMapper(config);
43
- }
44
-
45
- /**
46
- * Maps single item to its proper strongly typed model from the given response
47
- * @param response Response used to map the item
48
- * @param queryConfig Query configuration
49
- */
50
- mapSingleItemFromResponse<TContentItem extends TContentItemType = TContentItemType>(
51
- response: Contracts.IViewContentItemContract
52
- ): ISingleItemMapResult<TContentItem, TContentItemType> {
53
- const mapResult = this.mapItems<TContentItem>({
54
- mainItems: [response.item],
55
- linkedItems: Object.values(response.modular_content)
56
- });
57
-
58
- return {
59
- item: mapResult.items[0],
60
- linkedItems: mapResult.linkedItems
61
- };
62
- }
63
-
64
- /**
65
- * Maps multiple items to their strongly typed model from the given response
66
- * @param response Response used to map the item
67
- * @param queryConfig Query configuration
68
- */
69
- mapMultipleItemsFromResponse<TContentItem extends TContentItemType = TContentItemType>(
70
- response: Contracts.IItemsWithModularContentContract
71
- ): IMultipleItemsMapResult<TContentItem, TContentItemType> {
72
- const mapResult = this.mapItems<TContentItem>({
73
- mainItems: response.items,
74
- linkedItems: Object.values(response.modular_content)
75
- });
76
-
77
- return mapResult;
78
- }
79
-
80
- /**
81
- * Maps item contracts to full models
82
- */
83
- mapItems<TContentItem extends TContentItemType = TContentItemType>(data: {
84
- mainItems: Contracts.IContentItemContract[];
85
- linkedItems: Contracts.IContentItemContract[];
86
- }): IMultipleItemsMapResult<TContentItem, TContentItemType> {
87
- const processedItems: IContentItemsContainer<TContentItem> = {};
88
- const preparedItems: IContentItemWithRawDataContainer = {};
89
- const processingStartedForCodenames: string[] = [];
90
- const mappedMainItems: TContentItem[] = [];
91
- const mappedLinkedItems: IContentItemsContainer<TContentItem> = {};
92
- const itemsToResolve: Contracts.IContentItemContract[] = [...data.mainItems, ...data.linkedItems];
93
-
94
- // first prepare reference for all items
95
- for (const item of itemsToResolve) {
96
- preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)] = {
97
- item: this.createContentItem(item),
98
- rawItem: item
99
- };
100
- }
101
-
102
- // then resolve main items
103
- for (const item of data.mainItems) {
104
- const itemResult = this.mapItem<TContentItem>({
105
- item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)],
106
- processedItems: processedItems,
107
- preparedItems: preparedItems,
108
- processingStartedForCodenames: processingStartedForCodenames
109
- });
110
- mappedMainItems.push(itemResult.item);
111
- }
112
-
113
- // and linked items
114
- for (const item of data.linkedItems) {
115
- const itemResult = this.mapItem<TContentItem>({
116
- item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)],
117
- processedItems: processedItems,
118
- preparedItems: preparedItems,
119
- processingStartedForCodenames: processingStartedForCodenames
120
- });
121
-
122
- mappedLinkedItems[item.system.codename] = itemResult.item;
123
- }
124
-
125
- return {
126
- items: mappedMainItems,
127
- linkedItems: mappedLinkedItems
128
- };
129
- }
130
-
131
- /**
132
- * Maps item contract to full model
133
- */
134
- private mapItem<TContentItem extends TContentItemType = TContentItemType>(data: {
135
- item: IContentItemWithRawElements;
136
- processedItems: IContentItemsContainer<TContentItem>;
137
- processingStartedForCodenames: string[];
138
- preparedItems: IContentItemWithRawDataContainer;
139
- }): IMapItemResult<TContentItem, TContentItemType> {
140
- if (!data.item) {
141
- throw Error(`Could not map item because its undefined`);
142
- }
143
-
144
- const result = this.elementMapper.mapElements<TContentItem>({
145
- dataToMap: data.item,
146
- preparedItems: data.preparedItems,
147
- processingStartedForCodenames: [],
148
- processedItems: data.processedItems
149
- });
150
-
151
- if (!result) {
152
- throw Error(`Mapping of content item '${data.item.item.system.codename}' failed`);
153
- }
154
- return {
155
- item: result.item,
156
- processedItems: result.processedItems,
157
- preparedItems: result.preparedItems,
158
- processingStartedForCodenames: result.processingStartedForCodenames
159
- };
160
- }
161
-
162
- private createContentItem(item: Contracts.IContentItemContract): IContentItem {
163
- const contentItem: IContentItem = {
164
- elements: {},
165
- system: {
166
- codename: item.system.codename,
167
- collection: item.system.collection,
168
- id: item.system.id,
169
- language: item.system.language,
170
- lastModified: item.system.last_modified,
171
- name: item.system.name,
172
- sitemapLocations: item.system.sitemap_locations,
173
- type: item.system.type,
174
- workflowStep: item.system.workflow_step ?? null,
175
- workflow: item.system.workflow ?? null
176
- }
177
- };
178
-
179
- return contentItem;
180
- }
181
- }
1
+ import { codenameHelper } from '../utilities';
2
+ import { IDeliveryClientConfig } from '../config';
3
+ import { Contracts } from '../contracts';
4
+ import {
5
+ IContentItem,
6
+ IContentItemsContainer,
7
+ IContentItemWithRawDataContainer,
8
+ IContentItemWithRawElements
9
+ } from '../models';
10
+ import { ElementMapper } from './element.mapper';
11
+
12
+ export interface IMapItemResult<
13
+ TContentItem extends IContentItem = IContentItem,
14
+ TLinkedItemType extends IContentItem = IContentItem
15
+ > {
16
+ item: TContentItem;
17
+ processedItems: IContentItemsContainer<TLinkedItemType>;
18
+ preparedItems: IContentItemWithRawDataContainer;
19
+ processingStartedForCodenames: string[];
20
+ }
21
+
22
+ export interface IMultipleItemsMapResult<
23
+ TContentItem extends IContentItem = IContentItem,
24
+ TLinkedItemType extends IContentItem = IContentItem
25
+ > {
26
+ items: TContentItem[];
27
+ linkedItems: IContentItemsContainer<TLinkedItemType>;
28
+ }
29
+
30
+ export interface ISingleItemMapResult<
31
+ TContentItem extends IContentItem = IContentItem,
32
+ TLinkedItemType extends IContentItem = IContentItem
33
+ > {
34
+ item: TContentItem;
35
+ linkedItems: IContentItemsContainer<TLinkedItemType>;
36
+ }
37
+
38
+ export class ItemMapper<TContentItemType extends IContentItem> {
39
+ private readonly elementMapper: ElementMapper<TContentItemType>;
40
+
41
+ constructor(readonly config: IDeliveryClientConfig) {
42
+ this.elementMapper = new ElementMapper(config);
43
+ }
44
+
45
+ /**
46
+ * Maps single item to its proper strongly typed model from the given response
47
+ * @param response Response used to map the item
48
+ * @param queryConfig Query configuration
49
+ */
50
+ mapSingleItemFromResponse<TContentItem extends TContentItemType = TContentItemType>(
51
+ response: Contracts.IViewContentItemContract
52
+ ): ISingleItemMapResult<TContentItem, TContentItemType> {
53
+ const mapResult = this.mapItems<TContentItem>({
54
+ mainItems: [response.item],
55
+ linkedItems: Object.values(response.modular_content)
56
+ });
57
+
58
+ return {
59
+ item: mapResult.items[0],
60
+ linkedItems: mapResult.linkedItems
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Maps multiple items to their strongly typed model from the given response
66
+ * @param response Response used to map the item
67
+ * @param queryConfig Query configuration
68
+ */
69
+ mapMultipleItemsFromResponse<TContentItem extends TContentItemType = TContentItemType>(
70
+ response: Contracts.IItemsWithModularContentContract
71
+ ): IMultipleItemsMapResult<TContentItem, TContentItemType> {
72
+ const mapResult = this.mapItems<TContentItem>({
73
+ mainItems: response.items,
74
+ linkedItems: Object.values(response.modular_content)
75
+ });
76
+
77
+ return mapResult;
78
+ }
79
+
80
+ /**
81
+ * Maps item contracts to full models
82
+ */
83
+ mapItems<TContentItem extends TContentItemType = TContentItemType>(data: {
84
+ mainItems: Contracts.IContentItemContract[];
85
+ linkedItems: Contracts.IContentItemContract[];
86
+ }): IMultipleItemsMapResult<TContentItem, TContentItemType> {
87
+ const processedItems: IContentItemsContainer<TContentItem> = {};
88
+ const preparedItems: IContentItemWithRawDataContainer = {};
89
+ const processingStartedForCodenames: string[] = [];
90
+ const mappedMainItems: TContentItem[] = [];
91
+ const mappedLinkedItems: IContentItemsContainer<TContentItem> = {};
92
+ const itemsToResolve: Contracts.IContentItemContract[] = [...data.mainItems, ...data.linkedItems];
93
+
94
+ // first prepare reference for all items
95
+ for (const item of itemsToResolve) {
96
+ preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)] = {
97
+ item: this.createContentItem(item),
98
+ rawItem: item
99
+ };
100
+ }
101
+
102
+ // then resolve main items
103
+ for (const item of data.mainItems) {
104
+ const itemResult = this.mapItem<TContentItem>({
105
+ item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)],
106
+ processedItems: processedItems,
107
+ preparedItems: preparedItems,
108
+ processingStartedForCodenames: processingStartedForCodenames
109
+ });
110
+ mappedMainItems.push(itemResult.item);
111
+ }
112
+
113
+ // and linked items
114
+ for (const item of data.linkedItems) {
115
+ const itemResult = this.mapItem<TContentItem>({
116
+ item: preparedItems[codenameHelper.escapeCodenameInCodenameIndexer(item.system.codename)],
117
+ processedItems: processedItems,
118
+ preparedItems: preparedItems,
119
+ processingStartedForCodenames: processingStartedForCodenames
120
+ });
121
+
122
+ mappedLinkedItems[item.system.codename] = itemResult.item;
123
+ }
124
+
125
+ return {
126
+ items: mappedMainItems,
127
+ linkedItems: mappedLinkedItems
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Maps item contract to full model
133
+ */
134
+ private mapItem<TContentItem extends TContentItemType = TContentItemType>(data: {
135
+ item: IContentItemWithRawElements;
136
+ processedItems: IContentItemsContainer<TContentItem>;
137
+ processingStartedForCodenames: string[];
138
+ preparedItems: IContentItemWithRawDataContainer;
139
+ }): IMapItemResult<TContentItem, TContentItemType> {
140
+ if (!data.item) {
141
+ throw Error(`Could not map item because its undefined`);
142
+ }
143
+
144
+ const result = this.elementMapper.mapElements<TContentItem>({
145
+ dataToMap: data.item,
146
+ preparedItems: data.preparedItems,
147
+ processingStartedForCodenames: [],
148
+ processedItems: data.processedItems
149
+ });
150
+
151
+ if (!result) {
152
+ throw Error(`Mapping of content item '${data.item.item.system.codename}' failed`);
153
+ }
154
+ return {
155
+ item: result.item,
156
+ processedItems: result.processedItems,
157
+ preparedItems: result.preparedItems,
158
+ processingStartedForCodenames: result.processingStartedForCodenames
159
+ };
160
+ }
161
+
162
+ private createContentItem(item: Contracts.IContentItemContract): IContentItem {
163
+ const contentItem: IContentItem = {
164
+ elements: {},
165
+ system: {
166
+ codename: item.system.codename,
167
+ collection: item.system.collection,
168
+ id: item.system.id,
169
+ language: item.system.language,
170
+ lastModified: item.system.last_modified,
171
+ name: item.system.name,
172
+ sitemapLocations: item.system.sitemap_locations,
173
+ type: item.system.type,
174
+ workflowStep: item.system.workflow_step ?? null,
175
+ workflow: item.system.workflow ?? null
176
+ }
177
+ };
178
+
179
+ return contentItem;
180
+ }
181
+ }
@@ -1,24 +1,24 @@
1
- import { Contracts } from '../contracts';
2
- import { ILanguage } from '../models';
3
-
4
- export class LanguageMapper<TLanguageCodenames extends string> {
5
- mapMultipleLanguages(response: Contracts.IListLanguagesContract): ILanguage<TLanguageCodenames>[] {
6
- return response.languages.map((language) => {
7
- return this.mapLanguage(language);
8
- });
9
- }
10
-
11
- private mapLanguage(language: Contracts.ILanguageContract): ILanguage<TLanguageCodenames> {
12
- if (!language) {
13
- throw Error(`Cannot map language`);
14
- }
15
-
16
- return {
17
- system: {
18
- codename: language.system.codename as TLanguageCodenames,
19
- id: language.system.id,
20
- name: language.system.name
21
- }
22
- };
23
- }
24
- }
1
+ import { Contracts } from '../contracts';
2
+ import { ILanguage } from '../models';
3
+
4
+ export class LanguageMapper<TLanguageCodenames extends string> {
5
+ mapMultipleLanguages(response: Contracts.IListLanguagesContract): ILanguage<TLanguageCodenames>[] {
6
+ return response.languages.map((language) => {
7
+ return this.mapLanguage(language);
8
+ });
9
+ }
10
+
11
+ private mapLanguage(language: Contracts.ILanguageContract): ILanguage<TLanguageCodenames> {
12
+ if (!language) {
13
+ throw Error(`Cannot map language`);
14
+ }
15
+
16
+ return {
17
+ system: {
18
+ codename: language.system.codename as TLanguageCodenames,
19
+ id: language.system.id,
20
+ name: language.system.name
21
+ }
22
+ };
23
+ }
24
+ }
@@ -1,32 +1,32 @@
1
- import { Contracts } from '../contracts';
2
- import { IContentItemDelta } from '../models';
3
-
4
- export class SyncMapper {
5
- mapContentItemDelta(itemDeltaContract: Contracts.IContentItemDeltaContract): IContentItemDelta {
6
- const systemContract = itemDeltaContract.data.system;
7
-
8
- const elements: Contracts.IContentItemElementsContracts = itemDeltaContract.data.elements
9
- ? itemDeltaContract.data.elements
10
- : {};
11
-
12
- return {
13
- changeType: itemDeltaContract.change_type,
14
- timestamp: itemDeltaContract.timestamp,
15
- data: {
16
- elements: elements,
17
- system: {
18
- codename: systemContract.codename,
19
- collection: systemContract.collection,
20
- id: systemContract.id,
21
- language: systemContract.language,
22
- lastModified: systemContract.last_modified,
23
- name: systemContract.name,
24
- sitemapLocations: systemContract.sitemap_locations,
25
- type: systemContract.type,
26
- workflowStep: systemContract.workflow_step ?? null,
27
- workflow: systemContract.workflow ?? null
28
- }
29
- }
30
- };
31
- }
32
- }
1
+ import { Contracts } from '../contracts';
2
+ import { IContentItemDelta } from '../models';
3
+
4
+ export class SyncMapper {
5
+ mapContentItemDelta(itemDeltaContract: Contracts.IContentItemDeltaContract): IContentItemDelta {
6
+ const systemContract = itemDeltaContract.data.system;
7
+
8
+ const elements: Contracts.IContentItemElementsContracts = itemDeltaContract.data.elements
9
+ ? itemDeltaContract.data.elements
10
+ : {};
11
+
12
+ return {
13
+ changeType: itemDeltaContract.change_type,
14
+ timestamp: itemDeltaContract.timestamp,
15
+ data: {
16
+ elements: elements,
17
+ system: {
18
+ codename: systemContract.codename,
19
+ collection: systemContract.collection,
20
+ id: systemContract.id,
21
+ language: systemContract.language,
22
+ lastModified: systemContract.last_modified,
23
+ name: systemContract.name,
24
+ sitemapLocations: systemContract.sitemap_locations,
25
+ type: systemContract.type,
26
+ workflowStep: systemContract.workflow_step ?? null,
27
+ workflow: systemContract.workflow ?? null
28
+ }
29
+ }
30
+ };
31
+ }
32
+ }