@prismicio/types-internal 4.0.0-pr.6.e3136c3 → 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 (164) hide show
  1. package/README.md +5 -5
  2. package/dist/content/codec/link.js +8 -8
  3. package/dist/content/codec/link.js.map +1 -1
  4. package/dist/content/codec/richText.js +2 -2
  5. package/dist/content/codec/richText.js.map +1 -1
  6. package/dist/content/document.d.ts +2 -3019
  7. package/dist/content/document.d.ts.map +1 -1
  8. package/dist/content/field.d.ts +1 -30
  9. package/dist/content/field.d.ts.map +1 -1
  10. package/dist/content/field.js.map +1 -1
  11. package/dist/content/group.d.ts +2 -1
  12. package/dist/content/group.d.ts.map +1 -1
  13. package/dist/content/group.js.map +1 -1
  14. package/dist/content/legacy/boolean.d.ts +1 -0
  15. package/dist/content/legacy/embed.d.ts +1 -0
  16. package/dist/content/legacy/empty.d.ts +1 -0
  17. package/dist/content/legacy/field.d.ts +1 -0
  18. package/dist/content/legacy/geopoint.d.ts +1 -0
  19. package/dist/content/legacy/group.d.ts +9 -0
  20. package/dist/content/legacy/group.d.ts.map +1 -0
  21. package/dist/content/legacy/group.js.map +1 -1
  22. package/dist/content/legacy/integrationField.d.ts +1 -0
  23. package/dist/content/legacy/link.d.ts +41 -0
  24. package/dist/content/legacy/link.d.ts.map +1 -0
  25. package/dist/content/legacy/link.js.map +1 -1
  26. package/dist/content/legacy/nestable.d.ts +1 -0
  27. package/dist/content/legacy/nestable.js.map +1 -1
  28. package/dist/content/legacy/repeatable.d.ts +1 -0
  29. package/dist/content/legacy/repeatable.js +2 -8
  30. package/dist/content/legacy/repeatable.js.map +1 -1
  31. package/dist/content/legacy/richText.d.ts +109 -0
  32. package/dist/content/legacy/richText.d.ts.map +1 -0
  33. package/dist/content/legacy/richText.js +3 -3
  34. package/dist/content/legacy/richText.js.map +1 -1
  35. package/dist/content/legacy/separator.d.ts +1 -0
  36. package/dist/content/legacy/slice.js +2 -3
  37. package/dist/content/legacy/slice.js.map +1 -1
  38. package/dist/content/legacy/table.d.ts +1 -0
  39. package/dist/content/link.d.ts +74 -99
  40. package/dist/content/link.d.ts.map +1 -1
  41. package/dist/content/link.js +2 -2
  42. package/dist/content/link.js.map +1 -1
  43. package/dist/content/nestable.d.ts +13 -749
  44. package/dist/content/nestable.d.ts.map +1 -1
  45. package/dist/content/nestable.js +1 -0
  46. package/dist/content/nestable.js.map +1 -1
  47. package/dist/content/repeatable.d.ts +3 -98
  48. package/dist/content/repeatable.d.ts.map +1 -1
  49. package/dist/content/richText.d.ts +81 -131
  50. package/dist/content/richText.d.ts.map +1 -1
  51. package/dist/content/richText.js +5 -4
  52. package/dist/content/richText.js.map +1 -1
  53. package/dist/content/slice.d.ts +6 -4509
  54. package/dist/content/slice.d.ts.map +1 -1
  55. package/dist/content/slice.js.map +1 -1
  56. package/dist/content/slices.d.ts +8 -6765
  57. package/dist/content/slices.d.ts.map +1 -1
  58. package/dist/content/table.d.ts +2 -134
  59. package/dist/content/table.d.ts.map +1 -1
  60. package/dist/content/widget.d.ts +5 -3020
  61. package/dist/content/widget.d.ts.map +1 -1
  62. package/dist/content/widget.js.map +1 -1
  63. package/dist/helpers/contentPath.js +1 -1
  64. package/dist/helpers/customTypeModel.d.ts +3 -2
  65. package/dist/helpers/customTypeModel.d.ts.map +1 -1
  66. package/dist/helpers/customTypeModel.js +31 -1
  67. package/dist/helpers/customTypeModel.js.map +1 -1
  68. package/dist/helpers/documentContent.d.ts +5 -10
  69. package/dist/helpers/documentContent.d.ts.map +1 -1
  70. package/dist/helpers/documentContent.js +18 -5
  71. package/dist/helpers/documentContent.js.map +1 -1
  72. package/dist/helpers/sliceContent.d.ts +12 -0
  73. package/dist/helpers/sliceContent.d.ts.map +1 -0
  74. package/dist/helpers/sliceContent.js +60 -0
  75. package/dist/helpers/sliceContent.js.map +1 -0
  76. package/dist/helpers/traverseContent.d.ts +21 -22
  77. package/dist/helpers/traverseContent.d.ts.map +1 -1
  78. package/dist/helpers/traverseContent.js +54 -22
  79. package/dist/helpers/traverseContent.js.map +1 -1
  80. package/dist/helpers/traverseContentWithModel.d.ts +20 -21
  81. package/dist/helpers/traverseContentWithModel.d.ts.map +1 -1
  82. package/dist/helpers/traverseContentWithModel.js +64 -38
  83. package/dist/helpers/traverseContentWithModel.js.map +1 -1
  84. package/dist/index.d.ts +26 -25
  85. package/dist/index.js +3 -1
  86. package/dist/io-ts.d.ts +3304 -70918
  87. package/dist/io-ts.d.ts.map +1 -1
  88. package/dist/io-ts.js +125 -122
  89. package/dist/io-ts.js.map +1 -1
  90. package/dist/model/customType.d.ts +3 -3329
  91. package/dist/model/customType.d.ts.map +1 -1
  92. package/dist/model/group.d.ts +391 -392
  93. package/dist/model/group.d.ts.map +1 -1
  94. package/dist/model/group.js.map +1 -1
  95. package/dist/model/image.d.ts +4 -4
  96. package/dist/model/image.js.map +1 -1
  97. package/dist/model/link.d.ts +18 -18
  98. package/dist/model/link.d.ts.map +1 -1
  99. package/dist/model/link.js +7 -7
  100. package/dist/model/link.js.map +1 -1
  101. package/dist/model/nestable.d.ts +17 -178
  102. package/dist/model/nestable.d.ts.map +1 -1
  103. package/dist/model/nestable.js +3 -3
  104. package/dist/model/nestable.js.map +1 -1
  105. package/dist/model/richText.d.ts +3 -7
  106. package/dist/model/richText.d.ts.map +1 -1
  107. package/dist/model/richText.js +4 -3
  108. package/dist/model/richText.js.map +1 -1
  109. package/dist/model/section.d.ts +3 -3329
  110. package/dist/model/section.d.ts.map +1 -1
  111. package/dist/model/select.d.ts +1 -1
  112. package/dist/model/select.js +1 -1
  113. package/dist/model/select.js.map +1 -1
  114. package/dist/model/slice.d.ts +861 -3800
  115. package/dist/model/slice.d.ts.map +1 -1
  116. package/dist/model/slice.js +7 -2
  117. package/dist/model/slice.js.map +1 -1
  118. package/dist/model/slices.d.ts +3 -2195
  119. package/dist/model/slices.d.ts.map +1 -1
  120. package/dist/model/table.d.ts +2 -1
  121. package/dist/model/table.d.ts.map +1 -1
  122. package/dist/model/table.js +9 -7
  123. package/dist/model/table.js.map +1 -1
  124. package/dist/model/widget.d.ts +14 -3339
  125. package/dist/model/widget.d.ts.map +1 -1
  126. package/dist/model/widget.js.map +1 -1
  127. package/dist/zod4.d.ts +1345 -34797
  128. package/dist/zod4.d.ts.map +1 -1
  129. package/dist/zod4.js +125 -122
  130. package/dist/zod4.js.map +1 -1
  131. package/package.json +3 -2
  132. package/src/content/codec/link.ts +8 -8
  133. package/src/content/codec/richText.ts +10 -6
  134. package/src/content/field.ts +9 -2
  135. package/src/content/group.ts +5 -2
  136. package/src/content/legacy/group.ts +12 -4
  137. package/src/content/legacy/link.ts +32 -9
  138. package/src/content/legacy/nestable.ts +26 -2
  139. package/src/content/legacy/repeatable.ts +3 -16
  140. package/src/content/legacy/richText.ts +40 -7
  141. package/src/content/legacy/slice.ts +8 -7
  142. package/src/content/legacy/widget.ts +6 -2
  143. package/src/content/link.ts +32 -9
  144. package/src/content/nestable.ts +42 -2
  145. package/src/content/richText.ts +31 -9
  146. package/src/content/slice.ts +2 -2
  147. package/src/content/widget.ts +6 -2
  148. package/src/helpers/customTypeModel.ts +44 -0
  149. package/src/helpers/documentContent.ts +45 -17
  150. package/src/helpers/sliceContent.ts +86 -0
  151. package/src/helpers/traverseContent.ts +108 -41
  152. package/src/helpers/traverseContentWithModel.ts +91 -60
  153. package/src/index.ts +5 -2
  154. package/src/io-ts.ts +166 -140
  155. package/src/model/group.ts +4 -1
  156. package/src/model/image.ts +1 -1
  157. package/src/model/link.ts +39 -45
  158. package/src/model/nestable.ts +33 -1
  159. package/src/model/richText.ts +2 -2
  160. package/src/model/select.ts +2 -2
  161. package/src/model/slice.ts +36 -9
  162. package/src/model/table.ts +11 -2
  163. package/src/model/widget.ts +8 -4
  164. package/src/zod4.ts +166 -140
@@ -5,42 +5,47 @@ import { defaultCtx } from "../content/codec/legacyContentCtx"
5
5
  import type { DocumentContent } from "../content/document"
6
6
  import type { DocumentLegacy } from "../content/legacy/document"
7
7
  import { DocumentLegacySchema } from "../content/legacy/document"
8
+ import { isNestableContent } from "../content/nestable"
9
+ import type { CompositeSliceItemContent, LegacySliceItemContent } from "../content/slices"
8
10
  import type { WidgetContent } from "../content/widget"
11
+ import type { StaticCustomTypeModel } from "../model/customType"
9
12
  import type { FieldOrSliceType } from "../model/widget"
10
13
  import { FieldOrSliceTypeSchema } from "../model/widget"
11
14
  import * as contentPath from "./contentPath"
15
+ import * as customTypeModel from "./customTypeModel"
16
+ import * as sliceContent from "./sliceContent"
12
17
  import { traverseDocumentContent } from "./traverseContent"
13
18
 
14
19
  export function collectWidgets<TWidgetContent extends WidgetContent>(
15
20
  document: DocumentContent,
16
- test: (args: {
17
- path: contentPath.Path
18
- key: string
19
- apiID: string
20
- content: WidgetContent
21
- }) => args is {
22
- path: contentPath.Path
23
- key: string
24
- apiID: string
25
- content: TWidgetContent
26
- },
21
+ test: (
22
+ content: WidgetContent,
23
+ args: {
24
+ path: contentPath.Path
25
+ key: string
26
+ apiID: string
27
+ },
28
+ ) => content is TWidgetContent,
27
29
  ): Record<string, TWidgetContent> {
28
30
  const collected: Record<string, TWidgetContent> = {}
29
31
 
30
32
  traverseDocumentContent(document, {
31
- transformWidget: (args) => {
32
- if (test(args)) {
33
- collected[contentPath.serialize(args.path)] = args.content
33
+ transformWidget: ({ content, ...args }) => {
34
+ if (test(content, args)) {
35
+ collected[contentPath.serialize(args.path)] = content
34
36
  }
35
37
 
36
- return args.content
38
+ return content
37
39
  },
38
40
  })
39
41
 
40
42
  return collected
41
43
  }
42
44
 
43
- export function fromLegacy(legacy: DocumentLegacy): DocumentContent | undefined {
45
+ export function fromLegacy(
46
+ legacy: DocumentLegacy,
47
+ model: StaticCustomTypeModel,
48
+ ): DocumentContent | undefined {
44
49
  const parsed = DocumentLegacySchema.safeParse(legacy)
45
50
  if (!parsed.success) {
46
51
  return
@@ -65,11 +70,34 @@ export function fromLegacy(legacy: DocumentLegacy): DocumentContent | undefined
65
70
  }
66
71
  }
67
72
 
68
- const result = DocumentLegacyCodec(defaultCtx("", types, keys)).toContent(parsed.data)
73
+ const result = DocumentLegacyCodec(defaultCtx("", types, keys)).toContent(widgets)
69
74
  if (!result.success) {
70
75
  return
71
76
  }
72
77
 
78
+ const needsMigration = Object.values(customTypeModel.collectSharedSlices(model)).some((slice) =>
79
+ Boolean(slice.legacyPaths),
80
+ )
81
+
82
+ if (needsMigration) {
83
+ return traverseDocumentContent(result.data, {
84
+ model,
85
+ transformSlice: ({ content, model }) => {
86
+ if (model?.type === "SharedSlice") {
87
+ if (content.widget.__TYPE__ === "CompositeSliceContent") {
88
+ return sliceContent.compositeToShared(content as CompositeSliceItemContent, model)
89
+ } else if (
90
+ content.widget.__TYPE__ === "GroupContentType" ||
91
+ isNestableContent(content.widget)
92
+ ) {
93
+ return sliceContent.legacyToShared(content as LegacySliceItemContent, model)
94
+ }
95
+ }
96
+ return content
97
+ },
98
+ })
99
+ }
100
+
73
101
  return result.data
74
102
  }
75
103
 
@@ -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
+ }
111
145
 
146
+ // Non-migrated path, content and model are composite or legacy
147
+ if (!sliceContentModel && sliceModel && sliceModel.type !== "SharedSlice") {
148
+ sliceContentModel = sliceModel
149
+ }
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,9 +196,9 @@ export function traverseSlicesContent(
152
196
  }
153
197
 
154
198
  type TraverseSharedSliceContentConfig = {
155
- model?: SharedSliceVariationModel
156
- transformWidget: TraverseWidgetContentFunction
157
- transformSlice: TraverseSliceContentFunction
199
+ model?: SharedSliceVariationContentModel
200
+ transformWidget?: TraverseWidgetContentFunction
201
+ transformSlice?: TraverseSliceContentFunction
158
202
  }
159
203
 
160
204
  export function traverseSharedSliceContent(
@@ -164,7 +208,8 @@ export function traverseSharedSliceContent(
164
208
  content: SharedSliceItemContent,
165
209
  config: TraverseSharedSliceContentConfig,
166
210
  ): SharedSliceItemContent | undefined {
167
- const { transformWidget, transformSlice } = config
211
+ const { transformWidget = (args) => args.content, transformSlice = (args) => args.content } =
212
+ config
168
213
 
169
214
  const traversedPrimary: SharedSliceContent["primary"] = {}
170
215
  for (const [key, fieldContent] of Object.entries(content.widget.primary)) {
@@ -205,9 +250,9 @@ export function traverseSharedSliceContent(
205
250
  }
206
251
 
207
252
  type TraverseCompositeSliceContentConfig = {
208
- model?: CompositeSliceModel
209
- transformWidget: TraverseWidgetContentFunction
210
- transformSlice: TraverseSliceContentFunction
253
+ model?: CompositeSliceModel | SharedSliceVariationContentModel
254
+ transformWidget?: TraverseWidgetContentFunction
255
+ transformSlice?: TraverseSliceContentFunction
211
256
  }
212
257
 
213
258
  export function traverseCompositeSliceContent(
@@ -216,19 +261,22 @@ export function traverseCompositeSliceContent(
216
261
  apiID: string,
217
262
  content: CompositeSliceItemContent,
218
263
  config: TraverseCompositeSliceContentConfig,
219
- ): CompositeSliceItemContent | undefined {
220
- const { transformWidget, transformSlice } = config
264
+ ): CompositeSliceItemContent | SharedSliceItemContent | undefined {
265
+ const { transformWidget = (args) => args.content, transformSlice = (args) => args.content } =
266
+ config
221
267
 
268
+ const primaryModel =
269
+ config.model?.type === "SharedSlice"
270
+ ? config.model?.fields.primary
271
+ : config.model?.["non-repeat"]
222
272
  const traversedPrimary: CompositeSliceContent["nonRepeat"] = {}
223
273
  for (const [key, fieldContent] of Object.entries(content.widget.nonRepeat)) {
224
- const model = config.model?.["non-repeat"]?.[key]
225
-
226
274
  const traversedContent = traverseWidgetContent(
227
275
  path.concat({ key: "non-repeat", type: "primary" }, { key, type: "Widget" }),
228
276
  key,
229
277
  apiID,
230
278
  fieldContent,
231
- { model, transformWidget },
279
+ { model: primaryModel?.[key], transformWidget },
232
280
  )
233
281
 
234
282
  if (traversedContent && isNestableContent(traversedContent)) {
@@ -236,10 +284,12 @@ export function traverseCompositeSliceContent(
236
284
  }
237
285
  }
238
286
 
287
+ const itemsModel =
288
+ config.model?.type === "SharedSlice" ? config.model?.fields.items : config.model?.repeat
239
289
  const traversedItems = traverseGroupItemsContent(
240
290
  path.concat({ key: "repeat", type: "items" }),
241
291
  content.widget.repeat,
242
- { model: config.model?.repeat, transformWidget },
292
+ { model: itemsModel, transformWidget },
243
293
  )
244
294
 
245
295
  return transformSlice({
@@ -255,9 +305,9 @@ export function traverseCompositeSliceContent(
255
305
  }
256
306
 
257
307
  type TraverseLegacySliceContentConfig = {
258
- model?: LegacySliceModel
259
- transformWidget: TraverseWidgetContentFunction
260
- transformSlice: TraverseSliceContentFunction
308
+ model?: LegacySliceModel | SharedSliceVariationContentModel
309
+ transformWidget?: TraverseWidgetContentFunction
310
+ transformSlice?: TraverseSliceContentFunction
261
311
  }
262
312
 
263
313
  export function traverseLegacySliceContent(
@@ -266,11 +316,30 @@ export function traverseLegacySliceContent(
266
316
  apiID: string,
267
317
  content: LegacySliceItemContent,
268
318
  config: TraverseLegacySliceContentConfig,
269
- ): LegacySliceItemContent | undefined {
270
- const { model, transformWidget, transformSlice } = config
319
+ ): LegacySliceItemContent | SharedSliceItemContent | undefined {
320
+ const {
321
+ model,
322
+ transformWidget = (args) => args.content,
323
+ transformSlice = (args) => args.content,
324
+ } = config
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
+ }
271
340
 
272
341
  const traversedContent = traverseWidgetContent(path, key, apiID, content.widget, {
273
- model,
342
+ model: legacySliceModel,
274
343
  transformWidget,
275
344
  transformSlice,
276
345
  })
@@ -459,8 +528,8 @@ export type TraverseSliceContentFunction = <TContent extends SliceItemContent>(a
459
528
  key: string
460
529
  apiID: string
461
530
  content: TContent
462
- model?: SliceModel
463
- }) => TContent | undefined
531
+ model?: SliceContentModel
532
+ }) => TContent | SharedSliceItemContent | undefined
464
533
 
465
534
  export type TraverseWidgetContentFunction<
466
535
  TContentTransformMode extends "preserve" | "widen" = "preserve",
@@ -473,8 +542,6 @@ export type TraverseWidgetContentFunction<
473
542
  }) => (TContentTransformMode extends "preserve" ? TContent : WidgetContent) | undefined
474
543
 
475
544
  // Internals
476
- type SliceModel = SharedSliceVariationModel | CompositeSliceModel | LegacySliceModel
477
-
478
545
  type TraverseWidgetContentConfig = {
479
546
  model?: StaticWidgetModel
480
547
  transformWidget?: TraverseWidgetContentFunction