@prismicio/types-internal 4.0.0-pr.6.eb53f11 → 4.0.0-pr.7.9dec8db

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 (154) hide show
  1. package/README.md +5 -5
  2. package/dist/content/document.d.ts +2 -3019
  3. package/dist/content/document.d.ts.map +1 -1
  4. package/dist/content/field.d.ts +1 -30
  5. package/dist/content/field.d.ts.map +1 -1
  6. package/dist/content/field.js.map +1 -1
  7. package/dist/content/group.d.ts +2 -1
  8. package/dist/content/group.d.ts.map +1 -1
  9. package/dist/content/group.js.map +1 -1
  10. package/dist/content/legacy/boolean.d.ts +1 -0
  11. package/dist/content/legacy/embed.d.ts +1 -0
  12. package/dist/content/legacy/empty.d.ts +1 -0
  13. package/dist/content/legacy/field.d.ts +1 -0
  14. package/dist/content/legacy/geopoint.d.ts +1 -0
  15. package/dist/content/legacy/group.d.ts +9 -0
  16. package/dist/content/legacy/group.d.ts.map +1 -0
  17. package/dist/content/legacy/group.js.map +1 -1
  18. package/dist/content/legacy/integrationField.d.ts +1 -0
  19. package/dist/content/legacy/link.d.ts +41 -0
  20. package/dist/content/legacy/link.d.ts.map +1 -0
  21. package/dist/content/legacy/link.js.map +1 -1
  22. package/dist/content/legacy/nestable.d.ts +1 -0
  23. package/dist/content/legacy/nestable.js.map +1 -1
  24. package/dist/content/legacy/repeatable.d.ts +1 -0
  25. package/dist/content/legacy/repeatable.js +2 -8
  26. package/dist/content/legacy/repeatable.js.map +1 -1
  27. package/dist/content/legacy/richText.d.ts +109 -0
  28. package/dist/content/legacy/richText.d.ts.map +1 -0
  29. package/dist/content/legacy/richText.js.map +1 -1
  30. package/dist/content/legacy/separator.d.ts +1 -0
  31. package/dist/content/legacy/slice.js +2 -3
  32. package/dist/content/legacy/slice.js.map +1 -1
  33. package/dist/content/legacy/table.d.ts +1 -0
  34. package/dist/content/link.d.ts +74 -99
  35. package/dist/content/link.d.ts.map +1 -1
  36. package/dist/content/link.js +2 -2
  37. package/dist/content/link.js.map +1 -1
  38. package/dist/content/nestable.d.ts +13 -749
  39. package/dist/content/nestable.d.ts.map +1 -1
  40. package/dist/content/nestable.js +1 -0
  41. package/dist/content/nestable.js.map +1 -1
  42. package/dist/content/repeatable.d.ts +3 -98
  43. package/dist/content/repeatable.d.ts.map +1 -1
  44. package/dist/content/richText.d.ts +20 -248
  45. package/dist/content/richText.d.ts.map +1 -1
  46. package/dist/content/richText.js.map +1 -1
  47. package/dist/content/slice.d.ts +6 -4509
  48. package/dist/content/slice.d.ts.map +1 -1
  49. package/dist/content/slice.js.map +1 -1
  50. package/dist/content/slices.d.ts +8 -6765
  51. package/dist/content/slices.d.ts.map +1 -1
  52. package/dist/content/table.d.ts +2 -134
  53. package/dist/content/table.d.ts.map +1 -1
  54. package/dist/content/widget.d.ts +5 -3020
  55. package/dist/content/widget.d.ts.map +1 -1
  56. package/dist/content/widget.js.map +1 -1
  57. package/dist/helpers/contentPath.js +1 -1
  58. package/dist/helpers/customTypeModel.d.ts +3 -2
  59. package/dist/helpers/customTypeModel.d.ts.map +1 -1
  60. package/dist/helpers/customTypeModel.js +31 -1
  61. package/dist/helpers/customTypeModel.js.map +1 -1
  62. package/dist/helpers/documentContent.d.ts +3 -2
  63. package/dist/helpers/documentContent.d.ts.map +1 -1
  64. package/dist/helpers/documentContent.js +14 -1
  65. package/dist/helpers/documentContent.js.map +1 -1
  66. package/dist/helpers/sliceContent.d.ts +12 -0
  67. package/dist/helpers/sliceContent.d.ts.map +1 -0
  68. package/dist/helpers/sliceContent.js +60 -0
  69. package/dist/helpers/sliceContent.js.map +1 -0
  70. package/dist/helpers/traverseContent.d.ts +15 -16
  71. package/dist/helpers/traverseContent.d.ts.map +1 -1
  72. package/dist/helpers/traverseContent.js +51 -19
  73. package/dist/helpers/traverseContent.js.map +1 -1
  74. package/dist/helpers/traverseContentWithModel.d.ts +14 -15
  75. package/dist/helpers/traverseContentWithModel.d.ts.map +1 -1
  76. package/dist/helpers/traverseContentWithModel.js +61 -35
  77. package/dist/helpers/traverseContentWithModel.js.map +1 -1
  78. package/dist/index.d.ts +25 -24
  79. package/dist/index.js +3 -1
  80. package/dist/io-ts.d.ts +3048 -71012
  81. package/dist/io-ts.d.ts.map +1 -1
  82. package/dist/io-ts.js +125 -124
  83. package/dist/io-ts.js.map +1 -1
  84. package/dist/model/customType.d.ts +3 -3329
  85. package/dist/model/customType.d.ts.map +1 -1
  86. package/dist/model/group.d.ts +375 -376
  87. package/dist/model/group.d.ts.map +1 -1
  88. package/dist/model/group.js.map +1 -1
  89. package/dist/model/image.d.ts +4 -4
  90. package/dist/model/image.js.map +1 -1
  91. package/dist/model/link.d.ts +2 -2
  92. package/dist/model/link.js.map +1 -1
  93. package/dist/model/nestable.d.ts +17 -178
  94. package/dist/model/nestable.d.ts.map +1 -1
  95. package/dist/model/nestable.js +3 -3
  96. package/dist/model/nestable.js.map +1 -1
  97. package/dist/model/richText.d.ts +3 -7
  98. package/dist/model/richText.d.ts.map +1 -1
  99. package/dist/model/richText.js +4 -3
  100. package/dist/model/richText.js.map +1 -1
  101. package/dist/model/section.d.ts +3 -3329
  102. package/dist/model/section.d.ts.map +1 -1
  103. package/dist/model/select.d.ts +1 -1
  104. package/dist/model/select.js +1 -1
  105. package/dist/model/select.js.map +1 -1
  106. package/dist/model/slice.d.ts +781 -3720
  107. package/dist/model/slice.d.ts.map +1 -1
  108. package/dist/model/slice.js +7 -2
  109. package/dist/model/slice.js.map +1 -1
  110. package/dist/model/slices.d.ts +3 -2195
  111. package/dist/model/slices.d.ts.map +1 -1
  112. package/dist/model/table.d.ts +2 -1
  113. package/dist/model/table.d.ts.map +1 -1
  114. package/dist/model/table.js +9 -7
  115. package/dist/model/table.js.map +1 -1
  116. package/dist/model/widget.d.ts +6 -3331
  117. package/dist/model/widget.d.ts.map +1 -1
  118. package/dist/model/widget.js.map +1 -1
  119. package/dist/zod4.d.ts +1332 -34960
  120. package/dist/zod4.d.ts.map +1 -1
  121. package/dist/zod4.js +125 -124
  122. package/dist/zod4.js.map +1 -1
  123. package/package.json +3 -2
  124. package/src/content/field.ts +9 -2
  125. package/src/content/group.ts +5 -2
  126. package/src/content/legacy/group.ts +12 -4
  127. package/src/content/legacy/link.ts +32 -9
  128. package/src/content/legacy/nestable.ts +26 -2
  129. package/src/content/legacy/repeatable.ts +3 -16
  130. package/src/content/legacy/richText.ts +37 -5
  131. package/src/content/legacy/slice.ts +8 -7
  132. package/src/content/legacy/widget.ts +6 -2
  133. package/src/content/link.ts +32 -9
  134. package/src/content/nestable.ts +42 -2
  135. package/src/content/richText.ts +19 -7
  136. package/src/content/slice.ts +2 -2
  137. package/src/content/widget.ts +6 -2
  138. package/src/helpers/customTypeModel.ts +44 -0
  139. package/src/helpers/documentContent.ts +32 -1
  140. package/src/helpers/sliceContent.ts +86 -0
  141. package/src/helpers/traverseContent.ts +93 -32
  142. package/src/helpers/traverseContentWithModel.ts +73 -48
  143. package/src/index.ts +4 -1
  144. package/src/io-ts.ts +164 -144
  145. package/src/model/group.ts +4 -1
  146. package/src/model/image.ts +1 -1
  147. package/src/model/link.ts +1 -1
  148. package/src/model/nestable.ts +33 -1
  149. package/src/model/richText.ts +2 -2
  150. package/src/model/select.ts +2 -2
  151. package/src/model/slice.ts +36 -9
  152. package/src/model/table.ts +11 -2
  153. package/src/model/widget.ts +8 -4
  154. package/src/zod4.ts +164 -144
@@ -0,0 +1,86 @@
1
+ import type { GroupItemContent } from "../content/group"
2
+ import type { SharedSliceContent } from "../content/slice"
3
+ import type {
4
+ CompositeSliceItemContent,
5
+ LegacySliceItemContent,
6
+ SharedSliceItemContent,
7
+ } from "../content/slices"
8
+ import type { SharedSliceVariationContentModel } from "../model/slice"
9
+
10
+ export const legacyToShared = (
11
+ content: LegacySliceItemContent,
12
+ model: SharedSliceVariationContentModel,
13
+ ): SharedSliceItemContent => {
14
+ const sliceUUID = content.key.split("$")[1]
15
+
16
+ const primary: SharedSliceContent["primary"] = {}
17
+ const items: SharedSliceContent["items"] = []
18
+ if (content.widget.__TYPE__ === "GroupContentType") {
19
+ // Group content
20
+ for (const item of content.widget.value) {
21
+ const value: GroupItemContent["value"] = []
22
+
23
+ for (const [key, nestable] of item.value) {
24
+ if (model.fields.items?.[key]) {
25
+ value.push([key, nestable])
26
+ }
27
+ }
28
+
29
+ items.push({ ...item, value })
30
+ }
31
+ } else if (model.fields.primary?.[content.name]) {
32
+ // Nestable content
33
+ primary[content.name] = content.widget
34
+ }
35
+
36
+ return {
37
+ key: `${model.sliceName}$${sliceUUID}`,
38
+ name: model.sliceName,
39
+ maybeLabel: content.maybeLabel,
40
+ widget: {
41
+ __TYPE__: "SharedSliceContent",
42
+ variation: model.variationID,
43
+ primary,
44
+ items,
45
+ },
46
+ }
47
+ }
48
+
49
+ export const compositeToShared = (
50
+ content: CompositeSliceItemContent,
51
+ model: SharedSliceVariationContentModel,
52
+ ): SharedSliceItemContent => {
53
+ const sliceUUID = content.key.split("$")[1]
54
+
55
+ const primary: SharedSliceContent["primary"] = {}
56
+ for (const [key, value] of Object.entries(content.widget.nonRepeat)) {
57
+ if (model.fields.primary?.[key]) {
58
+ primary[key] = value
59
+ }
60
+ }
61
+
62
+ const items: SharedSliceContent["items"] = []
63
+ for (const item of content.widget.repeat) {
64
+ const value: GroupItemContent["value"] = []
65
+
66
+ for (const [key, nestable] of item.value) {
67
+ if (model.fields.items?.[key]) {
68
+ value.push([key, nestable])
69
+ }
70
+ }
71
+
72
+ items.push({ ...item, value })
73
+ }
74
+
75
+ return {
76
+ key: `${model.sliceName}$${sliceUUID}`,
77
+ name: model.sliceName,
78
+ maybeLabel: content.maybeLabel,
79
+ widget: {
80
+ __TYPE__: "SharedSliceContent",
81
+ variation: model.variationID,
82
+ primary,
83
+ items,
84
+ },
85
+ }
86
+ }
@@ -24,7 +24,9 @@ import type { NestableModel } from "../model/nestable"
24
24
  import type {
25
25
  CompositeSliceModel,
26
26
  LegacySliceModel,
27
- SharedSliceVariationModel,
27
+ SharedSliceModel,
28
+ SharedSliceVariationContentModel,
29
+ SliceContentModel,
28
30
  } from "../model/slice"
29
31
  import type { StaticSlicesModel } from "../model/slices"
30
32
  import { TableCellModel } from "../model/table"
@@ -88,27 +90,67 @@ export function traverseSlicesContent(
88
90
  for (const sliceItemContent of content.value) {
89
91
  const sliceModel = config.model?.config?.choices?.[sliceItemContent.name]
90
92
 
91
- let traversedSliceItemContent: SliceItemContent | undefined
92
- if (sliceItemContent.widget.__TYPE__ === SharedSliceContentType) {
93
- let model: SharedSliceVariationModel | undefined
94
- if (sliceModel?.type === "SharedSlice") {
95
- const variationID = sliceItemContent.widget.variation
96
- const variationModel = sliceModel.variations.find(
97
- (variation) => variation.id === variationID,
98
- )
99
- if (variationModel) {
100
- model = {
93
+ let sliceContentModel: SliceContentModel | undefined
94
+
95
+ // Happy path, content and model are both shared slices
96
+ if (
97
+ sliceItemContent.widget.__TYPE__ === SharedSliceContentType &&
98
+ sliceModel?.type === "SharedSlice"
99
+ ) {
100
+ const variationID = sliceItemContent.widget.variation
101
+ const variationModel = sliceModel.variations.find((variation) => variation.id === variationID)
102
+ if (variationModel) {
103
+ sliceContentModel = {
104
+ type: "SharedSlice",
105
+ sliceName: sliceModel.id,
106
+ variationID: variationModel.id,
107
+ fields: {
108
+ primary: variationModel.primary || {},
109
+ items: variationModel.items || {},
110
+ },
111
+ }
112
+ }
113
+ }
114
+
115
+ // Migrated path, content is composite or legacy, model is shared slice
116
+ if (!sliceContentModel) {
117
+ const legacyPath = contentPath.append(contentPath.serialize(path), sliceItemContent.name)
118
+
119
+ // Find the migrated slice model who's legacy path matches the content path
120
+ const migratedSliceModel = Object.values(config.model?.config?.choices || {}).find(
121
+ (model): model is SharedSliceModel => {
122
+ return model.type === "SharedSlice" && Boolean(model.legacyPaths?.[legacyPath])
123
+ },
124
+ )
125
+
126
+ if (migratedSliceModel) {
127
+ // Find the variation that matches the legacy path
128
+ const variation = migratedSliceModel.variations.find((variation) => {
129
+ return variation.id === migratedSliceModel.legacyPaths?.[legacyPath]
130
+ })
131
+
132
+ if (variation) {
133
+ sliceContentModel = {
101
134
  type: "SharedSlice",
102
- sliceName: sliceModel.id,
103
- variationID,
135
+ sliceName: migratedSliceModel.id,
136
+ variationID: variation.id,
104
137
  fields: {
105
- primary: variationModel.primary || {},
106
- items: variationModel.items || {},
138
+ primary: variation.primary || {},
139
+ items: variation.items || {},
107
140
  },
108
141
  }
109
142
  }
110
143
  }
144
+ }
145
+
146
+ // Non-migrated path, content and model are composite or legacy
147
+ if (!sliceContentModel && sliceModel && sliceModel.type !== "SharedSlice") {
148
+ sliceContentModel = sliceModel
149
+ }
111
150
 
151
+ let traversedSliceItemContent: SliceItemContent | undefined
152
+ if (sliceItemContent.widget.__TYPE__ === SharedSliceContentType) {
153
+ const model = sliceContentModel?.type === "SharedSlice" ? sliceContentModel : undefined
112
154
  traversedSliceItemContent = traverseSharedSliceContent(
113
155
  path.concat({ key: sliceItemContent.key, type: "SharedSlice" }),
114
156
  sliceItemContent.key,
@@ -117,7 +159,10 @@ export function traverseSlicesContent(
117
159
  { model, transformWidget, transformSlice },
118
160
  )
119
161
  } else if (sliceItemContent.widget.__TYPE__ === CompositeSliceContentType) {
120
- const model = sliceModel?.type === "Slice" ? sliceModel : undefined
162
+ const model =
163
+ sliceContentModel?.type === "Slice" || sliceContentModel?.type === "SharedSlice"
164
+ ? sliceContentModel
165
+ : undefined
121
166
  traversedSliceItemContent = traverseCompositeSliceContent(
122
167
  path.concat({ key: sliceItemContent.key, type: "Slice" }),
123
168
  sliceItemContent.key,
@@ -126,8 +171,7 @@ export function traverseSlicesContent(
126
171
  { model, transformWidget, transformSlice },
127
172
  )
128
173
  } else {
129
- const model =
130
- sliceModel?.type !== "SharedSlice" && sliceModel?.type !== "Slice" ? sliceModel : undefined
174
+ const model = sliceContentModel?.type !== "Slice" ? sliceContentModel : undefined
131
175
  traversedSliceItemContent = traverseLegacySliceContent(
132
176
  path.concat({ key: sliceItemContent.key, type: "LegacySlice" }),
133
177
  sliceItemContent.key,
@@ -152,7 +196,7 @@ export function traverseSlicesContent(
152
196
  }
153
197
 
154
198
  type TraverseSharedSliceContentConfig = {
155
- model?: SharedSliceVariationModel
199
+ model?: SharedSliceVariationContentModel
156
200
  transformWidget?: TraverseWidgetContentFunction
157
201
  transformSlice?: TraverseSliceContentFunction
158
202
  }
@@ -206,7 +250,7 @@ export function traverseSharedSliceContent(
206
250
  }
207
251
 
208
252
  type TraverseCompositeSliceContentConfig = {
209
- model?: CompositeSliceModel
253
+ model?: CompositeSliceModel | SharedSliceVariationContentModel
210
254
  transformWidget?: TraverseWidgetContentFunction
211
255
  transformSlice?: TraverseSliceContentFunction
212
256
  }
@@ -217,20 +261,22 @@ export function traverseCompositeSliceContent(
217
261
  apiID: string,
218
262
  content: CompositeSliceItemContent,
219
263
  config: TraverseCompositeSliceContentConfig,
220
- ): CompositeSliceItemContent | undefined {
264
+ ): CompositeSliceItemContent | SharedSliceItemContent | undefined {
221
265
  const { transformWidget = (args) => args.content, transformSlice = (args) => args.content } =
222
266
  config
223
267
 
268
+ const primaryModel =
269
+ config.model?.type === "SharedSlice"
270
+ ? config.model?.fields.primary
271
+ : config.model?.["non-repeat"]
224
272
  const traversedPrimary: CompositeSliceContent["nonRepeat"] = {}
225
273
  for (const [key, fieldContent] of Object.entries(content.widget.nonRepeat)) {
226
- const model = config.model?.["non-repeat"]?.[key]
227
-
228
274
  const traversedContent = traverseWidgetContent(
229
275
  path.concat({ key: "non-repeat", type: "primary" }, { key, type: "Widget" }),
230
276
  key,
231
277
  apiID,
232
278
  fieldContent,
233
- { model, transformWidget },
279
+ { model: primaryModel?.[key], transformWidget },
234
280
  )
235
281
 
236
282
  if (traversedContent && isNestableContent(traversedContent)) {
@@ -238,10 +284,12 @@ export function traverseCompositeSliceContent(
238
284
  }
239
285
  }
240
286
 
287
+ const itemsModel =
288
+ config.model?.type === "SharedSlice" ? config.model?.fields.items : config.model?.repeat
241
289
  const traversedItems = traverseGroupItemsContent(
242
290
  path.concat({ key: "repeat", type: "items" }),
243
291
  content.widget.repeat,
244
- { model: config.model?.repeat, transformWidget },
292
+ { model: itemsModel, transformWidget },
245
293
  )
246
294
 
247
295
  return transformSlice({
@@ -257,7 +305,7 @@ export function traverseCompositeSliceContent(
257
305
  }
258
306
 
259
307
  type TraverseLegacySliceContentConfig = {
260
- model?: LegacySliceModel
308
+ model?: LegacySliceModel | SharedSliceVariationContentModel
261
309
  transformWidget?: TraverseWidgetContentFunction
262
310
  transformSlice?: TraverseSliceContentFunction
263
311
  }
@@ -268,15 +316,30 @@ export function traverseLegacySliceContent(
268
316
  apiID: string,
269
317
  content: LegacySliceItemContent,
270
318
  config: TraverseLegacySliceContentConfig,
271
- ): LegacySliceItemContent | undefined {
319
+ ): LegacySliceItemContent | SharedSliceItemContent | undefined {
272
320
  const {
273
321
  model,
274
322
  transformWidget = (args) => args.content,
275
323
  transformSlice = (args) => args.content,
276
324
  } = config
277
325
 
326
+ let legacySliceModel: LegacySliceModel | undefined
327
+ if (content.widget.__TYPE__ === "GroupContentType") {
328
+ if (model?.type === "Group") {
329
+ legacySliceModel = model
330
+ } else if (model?.type === "SharedSlice") {
331
+ legacySliceModel = { type: "Group", config: { fields: model.fields.items } }
332
+ }
333
+ } else {
334
+ if (model?.type === "SharedSlice") {
335
+ legacySliceModel = model.fields.primary?.[content.name]
336
+ } else if (model?.type !== "Group") {
337
+ legacySliceModel = model
338
+ }
339
+ }
340
+
278
341
  const traversedContent = traverseWidgetContent(path, key, apiID, content.widget, {
279
- model,
342
+ model: legacySliceModel,
280
343
  transformWidget,
281
344
  transformSlice,
282
345
  })
@@ -465,8 +528,8 @@ export type TraverseSliceContentFunction = <TContent extends SliceItemContent>(a
465
528
  key: string
466
529
  apiID: string
467
530
  content: TContent
468
- model?: SliceModel
469
- }) => TContent | undefined
531
+ model?: SliceContentModel
532
+ }) => TContent | SharedSliceItemContent | undefined
470
533
 
471
534
  export type TraverseWidgetContentFunction<
472
535
  TContentTransformMode extends "preserve" | "widen" = "preserve",
@@ -479,8 +542,6 @@ export type TraverseWidgetContentFunction<
479
542
  }) => (TContentTransformMode extends "preserve" ? TContent : WidgetContent) | undefined
480
543
 
481
544
  // Internals
482
- type SliceModel = SharedSliceVariationModel | CompositeSliceModel | LegacySliceModel
483
-
484
545
  type TraverseWidgetContentConfig = {
485
546
  model?: StaticWidgetModel
486
547
  transformWidget?: TraverseWidgetContentFunction
@@ -24,7 +24,8 @@ import type { NestableModel } from "../model/nestable"
24
24
  import type {
25
25
  CompositeSliceModel,
26
26
  LegacySliceModel,
27
- SharedSliceVariationModel,
27
+ SharedSliceVariationContentModel,
28
+ SliceContentModel,
28
29
  } from "../model/slice"
29
30
  import type { StaticSlicesModel } from "../model/slices"
30
31
  import { TableCellModel } from "../model/table"
@@ -95,49 +96,70 @@ export function traverseSlicesContentWithModel(
95
96
 
96
97
  const traversed: SlicesContent["value"] = []
97
98
  for (const sliceItemContent of content.value) {
98
- const model = config.model.config?.choices?.[sliceItemContent.name]
99
+ const sliceModel = config.model.config?.choices?.[sliceItemContent.name]
99
100
 
100
101
  let traversedSliceItemContent: SliceItemContent | undefined
101
- if (
102
- model?.type === "SharedSlice" &&
103
- sliceItemContent.widget.__TYPE__ === SharedSliceContentType
104
- ) {
105
- const variationID = sliceItemContent.widget.variation
106
- const variationModel = model.variations.find((variation) => variation.id === variationID)
107
- if (variationModel) {
108
- const sharedSliceVariationModel: SharedSliceVariationModel = {
109
- type: "SharedSlice",
110
- sliceName: model.id,
111
- variationID,
112
- fields: {
113
- primary: variationModel.primary || {},
114
- items: variationModel.items || {},
115
- },
102
+ if (sliceModel?.type === "SharedSlice") {
103
+ if (sliceItemContent.widget.__TYPE__ === SharedSliceContentType) {
104
+ // Happy path, content and model are both shared slices
105
+ const variationID = sliceItemContent.widget.variation
106
+ const variationModel = sliceModel.variations.find(
107
+ (variation) => variation.id === variationID,
108
+ )
109
+ if (variationModel) {
110
+ const model: SharedSliceVariationContentModel = {
111
+ type: "SharedSlice",
112
+ sliceName: sliceModel.id,
113
+ variationID: variationModel.id,
114
+ fields: {
115
+ primary: variationModel.primary || {},
116
+ items: variationModel.items || {},
117
+ },
118
+ }
119
+
120
+ traversedSliceItemContent = traverseSharedSliceContentWithModel(
121
+ path.concat({ key: sliceItemContent.key, type: "SharedSlice" }),
122
+ sliceItemContent.key,
123
+ sliceItemContent.name,
124
+ sliceItemContent as SharedSliceItemContent,
125
+ { model, transformWidget, transformSlice },
126
+ )
116
127
  }
117
-
118
- traversedSliceItemContent = traverseSharedSliceContentWithModel(
119
- path.concat({ key: sliceItemContent.key, type: "SharedSlice" }),
128
+ } else if (sliceItemContent.widget.__TYPE__ === CompositeSliceContentType) {
129
+ // Migrated path, content is composite, model is shared slice
130
+ const variationModel = sliceModel.variations[0]
131
+ if (variationModel) {
132
+ const model: SharedSliceVariationContentModel = {
133
+ type: "SharedSlice",
134
+ sliceName: sliceModel.id,
135
+ variationID: variationModel.id,
136
+ fields: {
137
+ primary: variationModel.primary || {},
138
+ items: variationModel.items || {},
139
+ },
140
+ }
141
+
142
+ traversedSliceItemContent = traverseCompositeSliceContentWithModel(
143
+ path.concat({ key: sliceItemContent.key, type: "Slice" }),
144
+ sliceItemContent.key,
145
+ sliceItemContent.name,
146
+ sliceItemContent as CompositeSliceItemContent,
147
+ { model, transformWidget, transformSlice },
148
+ )
149
+ }
150
+ }
151
+ } else if (sliceModel?.type === "Slice") {
152
+ if (sliceItemContent.widget.__TYPE__ === CompositeSliceContentType) {
153
+ traversedSliceItemContent = traverseCompositeSliceContentWithModel(
154
+ path.concat({ key: sliceItemContent.key, type: "Slice" }),
120
155
  sliceItemContent.key,
121
156
  sliceItemContent.name,
122
- sliceItemContent as SharedSliceItemContent,
123
- { model: sharedSliceVariationModel, transformWidget, transformSlice },
157
+ sliceItemContent as CompositeSliceItemContent,
158
+ { model: sliceModel, transformWidget, transformSlice },
124
159
  )
125
160
  }
126
161
  } else if (
127
- model?.type === "Slice" &&
128
- sliceItemContent.widget.__TYPE__ === CompositeSliceContentType
129
- ) {
130
- traversedSliceItemContent = traverseCompositeSliceContentWithModel(
131
- path.concat({ key: sliceItemContent.key, type: "Slice" }),
132
- sliceItemContent.key,
133
- sliceItemContent.name,
134
- sliceItemContent as CompositeSliceItemContent,
135
- { model, transformWidget, transformSlice },
136
- )
137
- } else if (
138
- model &&
139
- model?.type !== "SharedSlice" &&
140
- model?.type !== "Slice" &&
162
+ sliceModel &&
141
163
  sliceItemContent.widget.__TYPE__ !== SharedSliceContentType &&
142
164
  sliceItemContent.widget.__TYPE__ !== CompositeSliceContentType
143
165
  ) {
@@ -146,7 +168,7 @@ export function traverseSlicesContentWithModel(
146
168
  sliceItemContent.key,
147
169
  sliceItemContent.name,
148
170
  sliceItemContent as LegacySliceItemContent,
149
- { model, transformWidget, transformSlice },
171
+ { model: sliceModel, transformWidget, transformSlice },
150
172
  )
151
173
  }
152
174
 
@@ -165,7 +187,7 @@ export function traverseSlicesContentWithModel(
165
187
  }
166
188
 
167
189
  type TraverseSharedSliceContentWithModelConfig = {
168
- model: SharedSliceVariationModel
190
+ model: SharedSliceVariationContentModel
169
191
  transformWidget?: TraverseWidgetContentWithModelFunction
170
192
  transformSlice?: TraverseSliceContentWithModelFunction
171
193
  }
@@ -221,7 +243,7 @@ export function traverseSharedSliceContentWithModel(
221
243
  }
222
244
 
223
245
  type TraverseCompositeSliceContentWithModelConfig = {
224
- model: CompositeSliceModel
246
+ model: CompositeSliceModel | SharedSliceVariationContentModel
225
247
  transformWidget?: TraverseWidgetContentWithModelFunction
226
248
  transformSlice?: TraverseSliceContentWithModelFunction
227
249
  }
@@ -232,7 +254,7 @@ export function traverseCompositeSliceContentWithModel(
232
254
  apiID: string,
233
255
  content: CompositeSliceItemContent | undefined,
234
256
  config: TraverseCompositeSliceContentWithModelConfig,
235
- ): CompositeSliceItemContent | undefined {
257
+ ): CompositeSliceItemContent | SharedSliceItemContent | undefined {
236
258
  if (!content) {
237
259
  return
238
260
  }
@@ -240,8 +262,12 @@ export function traverseCompositeSliceContentWithModel(
240
262
  const { transformWidget = (args) => args.content, transformSlice = (args) => args.content } =
241
263
  config
242
264
 
265
+ const primaryModel =
266
+ config.model?.type === "SharedSlice"
267
+ ? config.model?.fields.primary
268
+ : config.model?.["non-repeat"]
243
269
  const traversedPrimary: CompositeSliceContent["nonRepeat"] = {}
244
- for (const [key, model] of Object.entries(config.model?.["non-repeat"] ?? {})) {
270
+ for (const [key, model] of Object.entries(primaryModel ?? {})) {
245
271
  const traversedContent = traverseWidgetContentWithModel(
246
272
  path.concat({ key: "non-repeat", type: "primary" }, { key, type: "Widget" }),
247
273
  key,
@@ -255,10 +281,12 @@ export function traverseCompositeSliceContentWithModel(
255
281
  }
256
282
  }
257
283
 
284
+ const itemsModel =
285
+ config.model?.type === "SharedSlice" ? config.model?.fields.items : config.model?.repeat
258
286
  const traversedItems = traverseGroupItemsContentWithModel(
259
287
  path.concat({ key: "repeat", type: "items" }),
260
288
  content.widget.repeat,
261
- { model: config.model.repeat ?? {}, transformWidget },
289
+ { model: itemsModel ?? {}, transformWidget },
262
290
  )
263
291
 
264
292
  return transformSlice({
@@ -285,7 +313,7 @@ export function traverseLegacySliceContentWithModel(
285
313
  apiID: string,
286
314
  content: LegacySliceItemContent | undefined,
287
315
  config: TraverseLegacySliceContentWithModelConfig,
288
- ): LegacySliceItemContent | undefined {
316
+ ): LegacySliceItemContent | SharedSliceItemContent | undefined {
289
317
  if (!content) {
290
318
  return
291
319
  }
@@ -513,16 +541,13 @@ export function traverseTableContentWithModel(
513
541
  }
514
542
 
515
543
  // Internals
516
-
517
- type SliceModel = SharedSliceVariationModel | CompositeSliceModel | LegacySliceModel
518
-
519
544
  export type TraverseSliceContentWithModelFunction = <TContent extends SliceItemContent>(args: {
520
545
  path: contentPath.Path
521
546
  key: string
522
547
  apiID: string
523
548
  content?: TContent
524
- model: SliceModel
525
- }) => TContent | undefined
549
+ model: SliceContentModel
550
+ }) => TContent | SharedSliceItemContent | undefined
526
551
 
527
552
  export type TraverseWidgetContentWithModelFunction<
528
553
  TContentTransformMode extends "preserve" | "widen" = "preserve",
package/src/index.ts CHANGED
@@ -69,13 +69,15 @@ export type {
69
69
  CompositeSliceModel,
70
70
  SharedSliceModel,
71
71
  SharedSliceRefModel,
72
- SharedSliceVariationModel,
72
+ SharedSliceVariationContentModel as SharedSliceVariationModel,
73
73
  StaticSliceModel,
74
74
  DynamicSliceModel,
75
+ SliceContentModel,
75
76
  SliceModelType,
76
77
  } from "./model/slice"
77
78
  export type { DynamicSlicesModel, StaticSlicesModel } from "./model/slices"
78
79
  export type { TableModel } from "./model/table"
80
+ export { TableCellModelNodeTypes } from "./model/table"
79
81
  export type { TextModel } from "./model/text"
80
82
  export type { TimestampModel } from "./model/timestamp"
81
83
  export type { UIDModel } from "./model/uid"
@@ -88,6 +90,7 @@ export { LegacyContentCtx, getFieldCtx, defaultCtx } from "./content/codec/legac
88
90
  export * as contentPath from "./helpers/contentPath"
89
91
  export * as customTypeModel from "./helpers/customTypeModel"
90
92
  export * as documentContent from "./helpers/documentContent"
93
+ export * as sliceContent from "./helpers/sliceContent"
91
94
  export {
92
95
  traverseDocumentContent,
93
96
  traverseSlicesContent,