Skip to content

Commit a6ddf68

Browse files
fix: correctly handle jsonschema edge-case where 'prefixItems' is set with 'items' as an array
1 parent 22c42aa commit a6ddf68

1 file changed

Lines changed: 19 additions & 4 deletions

File tree

ark/json-schema/array.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,34 @@ export const parseArrayJsonSchema: Type<
7171
}
7272

7373
let itemsIsPrefixItems = false
74+
let itemsHaveBeenPreProcessed = false
75+
7476
if ("prefixItems" in jsonSchema) {
7577
if ("items" in jsonSchema) {
7678
if ("additionalItems" in jsonSchema) {
7779
throwParseError(
7880
writeJsonSchemaArrayAdditionalItemsAndItemsAndPrefixItemsMessage()
7981
)
80-
} else jsonSchema.additionalItems = jsonSchema.items
82+
}
83+
if (Array.isArray(jsonSchema.items)) {
84+
arktypeArraySchema.sequence = {
85+
prefix: [...jsonSchema.prefixItems, ...jsonSchema.items].map(
86+
item => jsonSchemaToType(item as never).internal
87+
)
88+
}
89+
itemsHaveBeenPreProcessed = true
90+
} else {
91+
jsonSchema.additionalItems = jsonSchema.items
92+
jsonSchema.items = jsonSchema.prefixItems
93+
itemsIsPrefixItems = true
94+
}
95+
} else {
96+
jsonSchema.items = jsonSchema.prefixItems
97+
itemsIsPrefixItems = true
8198
}
82-
jsonSchema.items = jsonSchema.prefixItems
83-
itemsIsPrefixItems = true
8499
}
85100

86-
if ("items" in jsonSchema) {
101+
if (!itemsHaveBeenPreProcessed && "items" in jsonSchema) {
87102
if (Array.isArray(jsonSchema.items)) {
88103
arktypeArraySchema.sequence = {
89104
prefix: jsonSchema.items.map(item => jsonSchemaToType(item).internal)

0 commit comments

Comments
 (0)