@ai-sdk-tool/parser 3.3.0 → 3.3.1

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.
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  parse as parse2,
3
3
  stringify
4
- } from "./chunk-TR2ARLIF.js";
4
+ } from "./chunk-EW3A6Y7O.js";
5
5
  import {
6
6
  parse
7
7
  } from "./chunk-IX4FJELL.js";
8
8
  import {
9
9
  coerceBySchema
10
- } from "./chunk-DZB6Y354.js";
10
+ } from "./chunk-OUGMLYAW.js";
11
11
 
12
12
  // src/core/utils/debug.ts
13
13
  var LINE_SPLIT_REGEX = /\r?\n/;
@@ -2877,4 +2877,4 @@ export {
2877
2877
  xmlToolMiddleware,
2878
2878
  yamlToolMiddleware
2879
2879
  };
2880
- //# sourceMappingURL=chunk-3QJVNEHE.js.map
2880
+ //# sourceMappingURL=chunk-7E6UFDFQ.js.map
@@ -2,7 +2,7 @@ import {
2
2
  coerceBySchema,
3
3
  getSchemaType,
4
4
  unwrapJsonSchema
5
- } from "./chunk-DZB6Y354.js";
5
+ } from "./chunk-OUGMLYAW.js";
6
6
 
7
7
  // src/rxml/errors/types.ts
8
8
  var RXMLParseError = class extends Error {
@@ -2213,4 +2213,4 @@ export {
2213
2213
  stringify,
2214
2214
  parse2 as parse
2215
2215
  };
2216
- //# sourceMappingURL=chunk-TR2ARLIF.js.map
2216
+ //# sourceMappingURL=chunk-EW3A6Y7O.js.map
@@ -47,6 +47,153 @@ function getSchemaType(schema) {
47
47
  }
48
48
  return;
49
49
  }
50
+ function schemaAllowsPropertyViaCombinators(s, key, depth) {
51
+ const anyOfValues = s.anyOf;
52
+ const oneOfValues = s.oneOf;
53
+ const allOfValues = s.allOf;
54
+ let hasCombinator = false;
55
+ let anyOfAllows = true;
56
+ let oneOfAllows = true;
57
+ let allOfAllows = true;
58
+ if (Array.isArray(anyOfValues)) {
59
+ hasCombinator = true;
60
+ anyOfAllows = anyOfValues.some(
61
+ (sub) => schemaHasProperty(sub, key, depth + 1)
62
+ );
63
+ }
64
+ if (Array.isArray(oneOfValues)) {
65
+ hasCombinator = true;
66
+ oneOfAllows = oneOfValues.some(
67
+ (sub) => schemaHasProperty(sub, key, depth + 1)
68
+ );
69
+ }
70
+ if (Array.isArray(allOfValues)) {
71
+ hasCombinator = true;
72
+ allOfAllows = allOfValues.every(
73
+ (sub) => schemaHasProperty(sub, key, depth + 1)
74
+ );
75
+ }
76
+ if (!hasCombinator) {
77
+ return false;
78
+ }
79
+ return anyOfAllows && oneOfAllows && allOfAllows;
80
+ }
81
+ function schemaHasPropertyDirectly(s, key) {
82
+ const props = s.properties;
83
+ if (props && typeof props === "object" && !Array.isArray(props) && Object.hasOwn(props, key) && props[key] !== false) {
84
+ return true;
85
+ }
86
+ const required = s.required;
87
+ if (Array.isArray(required) && required.includes(key)) {
88
+ return true;
89
+ }
90
+ const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);
91
+ return patternSchemas.some((schema) => schema !== false);
92
+ }
93
+ function schemaHasPropertyViaAdditional(s) {
94
+ const additional = s.additionalProperties;
95
+ if (additional === true || additional && typeof additional === "object" && !Array.isArray(additional)) {
96
+ return true;
97
+ }
98
+ if (Object.hasOwn(s, "additionalProperties")) {
99
+ return false;
100
+ }
101
+ const type = s.type;
102
+ const isObjectType = type === "object" || Array.isArray(type) && type.includes("object");
103
+ const hasObjectKeywords = s.properties && typeof s.properties === "object" && !Array.isArray(s.properties) || s.patternProperties && typeof s.patternProperties === "object" && !Array.isArray(s.patternProperties) || Array.isArray(s.required) && s.required.length > 0;
104
+ return !!(isObjectType || hasObjectKeywords);
105
+ }
106
+ function schemaDisallowsPropertyDirectly(s, key) {
107
+ const props = s.properties;
108
+ if (props && typeof props === "object" && !Array.isArray(props) && Object.hasOwn(props, key) && props[key] === false) {
109
+ return true;
110
+ }
111
+ const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);
112
+ return patternSchemas.some((schema) => schema === false);
113
+ }
114
+ function schemaHasProperty(schema, key, depth = 0) {
115
+ if (depth > 5) {
116
+ return true;
117
+ }
118
+ const unwrapped = unwrapJsonSchema(schema);
119
+ if (schemaIsUnconstrained(unwrapped)) {
120
+ return true;
121
+ }
122
+ if (!unwrapped || typeof unwrapped !== "object") {
123
+ return false;
124
+ }
125
+ const s = unwrapped;
126
+ if (schemaDisallowsPropertyDirectly(s, key)) {
127
+ return false;
128
+ }
129
+ if (schemaHasPropertyDirectly(s, key)) {
130
+ return true;
131
+ }
132
+ if (schemaHasPropertyViaAdditional(s)) {
133
+ return true;
134
+ }
135
+ return schemaAllowsPropertyViaCombinators(s, key, depth);
136
+ }
137
+ function schemaIsUnconstrained(schema) {
138
+ const unwrapped = unwrapJsonSchema(schema);
139
+ if (unwrapped == null || unwrapped === true) {
140
+ return true;
141
+ }
142
+ if (typeof unwrapped !== "object" || Array.isArray(unwrapped)) {
143
+ return false;
144
+ }
145
+ return Object.keys(unwrapped).length === 0;
146
+ }
147
+ function getPatternSchemasForKey(patternProperties, key) {
148
+ if (!patternProperties || typeof patternProperties !== "object" || Array.isArray(patternProperties)) {
149
+ return [];
150
+ }
151
+ const schemas = [];
152
+ for (const [pattern, schema] of Object.entries(
153
+ patternProperties
154
+ )) {
155
+ try {
156
+ const regex = new RegExp(pattern);
157
+ if (regex.test(key)) {
158
+ schemas.push(schema);
159
+ }
160
+ } catch (e) {
161
+ }
162
+ }
163
+ return schemas;
164
+ }
165
+ function coerceValueForKey(value, key, unwrapped) {
166
+ const schemas = [];
167
+ const props = unwrapped.properties;
168
+ if (props && Object.hasOwn(props, key)) {
169
+ schemas.push(props[key]);
170
+ }
171
+ const patternSchemas = getPatternSchemasForKey(
172
+ unwrapped.patternProperties,
173
+ key
174
+ );
175
+ if (patternSchemas.length > 0) {
176
+ schemas.push(...patternSchemas);
177
+ }
178
+ if (schemas.length > 0) {
179
+ let out = value;
180
+ for (const schema of schemas) {
181
+ if (typeof schema === "boolean") {
182
+ continue;
183
+ }
184
+ out = coerceBySchema(out, schema);
185
+ }
186
+ return out;
187
+ }
188
+ const additional = unwrapped.additionalProperties;
189
+ if (additional && typeof additional === "object" && !Array.isArray(additional)) {
190
+ return coerceBySchema(value, additional);
191
+ }
192
+ if (additional === true || additional === false) {
193
+ return value;
194
+ }
195
+ return coerceBySchema(value, void 0);
196
+ }
50
197
  function coerceStringWithoutSchema(value) {
51
198
  const s = value.trim();
52
199
  const lower = s.toLowerCase();
@@ -77,13 +224,7 @@ function coerceStringToObject(s, unwrapped) {
77
224
  normalized = normalized.replace(EMPTY_OBJECT_REGEX, "{}");
78
225
  const obj = JSON.parse(normalized);
79
226
  if (obj && typeof obj === "object" && !Array.isArray(obj)) {
80
- const props = unwrapped.properties;
81
- const out = {};
82
- for (const [k, v] of Object.entries(obj)) {
83
- const propSchema = props ? props[k] : void 0;
84
- out[k] = typeof propSchema === "boolean" ? v : coerceBySchema(v, propSchema);
85
- }
86
- return out;
227
+ return coerceObjectToObject(obj, unwrapped);
87
228
  }
88
229
  } catch (e) {
89
230
  }
@@ -113,10 +254,8 @@ function coerceStringToArray(s, unwrapped) {
113
254
  }
114
255
  function coerceObjectToObject(value, unwrapped) {
115
256
  const out = {};
116
- const props = unwrapped.properties;
117
257
  for (const [k, v] of Object.entries(value)) {
118
- const propSchema = props ? props[k] : void 0;
119
- out[k] = typeof propSchema === "boolean" ? v : coerceBySchema(v, propSchema);
258
+ out[k] = coerceValueForKey(v, k, unwrapped);
120
259
  }
121
260
  return out;
122
261
  }
@@ -133,16 +272,22 @@ function coerceObjectToArray(maybe, prefixItems, itemsSchema) {
133
272
  return coerceArrayToArray(arr, prefixItems, itemsSchema);
134
273
  }
135
274
  const keys = Object.keys(maybe);
136
- if (keys.length === 1) {
137
- const singleValue = maybe[keys[0]];
138
- if (Array.isArray(singleValue)) {
139
- return singleValue.map((v) => coerceBySchema(v, itemsSchema));
140
- }
141
- }
142
275
  if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {
143
276
  const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);
144
277
  return coerceArrayToArray(arr, prefixItems, itemsSchema);
145
278
  }
279
+ if (keys.length === 1) {
280
+ const singleKey = keys[0];
281
+ if (!(schemaIsUnconstrained(itemsSchema) || schemaHasProperty(itemsSchema, singleKey))) {
282
+ const singleValue = maybe[singleKey];
283
+ if (Array.isArray(singleValue)) {
284
+ return singleValue.map((v) => coerceBySchema(v, itemsSchema));
285
+ }
286
+ if (singleValue && typeof singleValue === "object") {
287
+ return [coerceBySchema(singleValue, itemsSchema)];
288
+ }
289
+ }
290
+ }
146
291
  return null;
147
292
  }
148
293
  function coercePrimitiveToArray(value, prefixItems, itemsSchema) {
@@ -202,11 +347,15 @@ function coerceArrayValue(value, prefixItems, itemsSchema) {
202
347
  if (result !== null) {
203
348
  return result;
204
349
  }
350
+ if (getSchemaType(itemsSchema) === "array") {
351
+ return [value];
352
+ }
353
+ return [coerceBySchema(value, itemsSchema)];
205
354
  }
206
355
  if (value == null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
207
356
  return coercePrimitiveToArray(value, prefixItems, itemsSchema);
208
357
  }
209
- return value;
358
+ return [value];
210
359
  }
211
360
  function coerceBySchema(value, schema) {
212
361
  const unwrapped = unwrapJsonSchema(schema);
@@ -237,4 +386,4 @@ export {
237
386
  getSchemaType,
238
387
  coerceBySchema
239
388
  };
240
- //# sourceMappingURL=chunk-DZB6Y354.js.map
389
+ //# sourceMappingURL=chunk-OUGMLYAW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema-coerce/index.ts"],"sourcesContent":["// Regex constants for performance\nconst NUMERIC_REGEX = /^-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\nconst EMPTY_OBJECT_REGEX = /^\\{\\s*\\}$/s;\nconst NEWLINE_SPLIT_REGEX = /\\n+/;\nconst COMMA_SPLIT_REGEX = /,\\s*/;\nconst DIGIT_KEY_REGEX = /^\\d+$/;\n\nexport function unwrapJsonSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") {\n return schema;\n }\n const s = schema as Record<string, unknown>;\n if (s.jsonSchema && typeof s.jsonSchema === \"object\") {\n return unwrapJsonSchema(s.jsonSchema);\n }\n return schema;\n}\n\nexport function getSchemaType(schema: unknown): string | undefined {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return;\n }\n const t: unknown = (unwrapped as Record<string, unknown>).type;\n if (typeof t === \"string\") {\n return t;\n }\n if (Array.isArray(t)) {\n const preferred = [\n \"object\",\n \"array\",\n \"boolean\",\n \"number\",\n \"integer\",\n \"string\",\n ];\n for (const p of preferred) {\n if (t.includes(p)) {\n return p;\n }\n }\n }\n const s = unwrapped as Record<string, unknown>;\n if (s && typeof s === \"object\" && (s.properties || s.additionalProperties)) {\n return \"object\";\n }\n if (\n s &&\n typeof s === \"object\" &&\n (s.items || (s as Record<string, unknown>).prefixItems)\n ) {\n return \"array\";\n }\n return;\n}\n\n/**\n * Checks if a property is allowed through schema combinators (anyOf, oneOf, allOf).\n *\n * @param s - The schema object to check\n * @param key - The property key to look for\n * @param depth - Current recursion depth\n * @returns `true` if at least one combinator exists AND allows the property;\n * `false` if no combinators exist OR none allow the property.\n * When no combinators are present, returns `false` so the caller can\n * fall back to other property-checking methods.\n *\n * **oneOf semantics**: JSON Schema's `oneOf` requires exactly one schema to match,\n * but for coercion heuristics we treat it like `anyOf` (at least one allows).\n * This is intentional because:\n * 1. We're determining if a property CAN exist, not validating exact matches\n * 2. Coercion should be permissive - if any branch allows the property, we allow it\n * 3. Strict oneOf validation would require runtime value inspection, not just schema analysis\n */\nfunction schemaAllowsPropertyViaCombinators(\n s: Record<string, unknown>,\n key: string,\n depth: number\n): boolean {\n const anyOfValues = s.anyOf;\n const oneOfValues = s.oneOf;\n const allOfValues = s.allOf;\n\n let hasCombinator = false;\n let anyOfAllows = true;\n let oneOfAllows = true;\n let allOfAllows = true;\n\n if (Array.isArray(anyOfValues)) {\n hasCombinator = true;\n anyOfAllows = anyOfValues.some((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (Array.isArray(oneOfValues)) {\n hasCombinator = true;\n oneOfAllows = oneOfValues.some((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (Array.isArray(allOfValues)) {\n hasCombinator = true;\n allOfAllows = allOfValues.every((sub) =>\n schemaHasProperty(sub, key, depth + 1)\n );\n }\n\n if (!hasCombinator) {\n return false;\n }\n\n return anyOfAllows && oneOfAllows && allOfAllows;\n}\n\nfunction schemaHasPropertyDirectly(\n s: Record<string, unknown>,\n key: string\n): boolean {\n const props = s.properties;\n if (\n props &&\n typeof props === \"object\" &&\n !Array.isArray(props) &&\n Object.hasOwn(props, key) &&\n (props as Record<string, unknown>)[key] !== false\n ) {\n return true;\n }\n const required = s.required;\n if (Array.isArray(required) && required.includes(key)) {\n return true;\n }\n const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);\n return patternSchemas.some((schema) => schema !== false);\n}\n\n/**\n * Checks if a schema allows additional properties beyond those explicitly defined.\n *\n * JSON Schema behavior for additionalProperties:\n * - `additionalProperties: true` or `additionalProperties: { schema }`: Explicitly allows additional properties\n * - `additionalProperties: false`: Explicitly disallows additional properties\n * - `additionalProperties` not specified: Defaults to allowing additional properties (JSON Schema spec)\n *\n * When `additionalProperties` is not explicitly set, this function returns `true` if the schema\n * appears to be an object schema (has `type: \"object\"`, `properties`, `patternProperties`, or `required`).\n * This follows the JSON Schema specification where omitting `additionalProperties` is equivalent to `true`.\n *\n * **Important**: This means schemas like `{ type: \"object\", properties: { foo: ... } }` without\n * `additionalProperties: false` will be treated as allowing any additional property, which affects\n * single-key object unwrapping behavior in array coercion.\n *\n * @param s - The schema object to check\n * @returns `true` if the schema allows additional properties, `false` otherwise\n */\nfunction schemaHasPropertyViaAdditional(s: Record<string, unknown>): boolean {\n const additional = s.additionalProperties;\n if (\n additional === true ||\n (additional && typeof additional === \"object\" && !Array.isArray(additional))\n ) {\n return true;\n }\n if (Object.hasOwn(s, \"additionalProperties\")) {\n return false;\n }\n const type = s.type;\n const isObjectType =\n type === \"object\" || (Array.isArray(type) && type.includes(\"object\"));\n const hasObjectKeywords =\n (s.properties &&\n typeof s.properties === \"object\" &&\n !Array.isArray(s.properties)) ||\n (s.patternProperties &&\n typeof s.patternProperties === \"object\" &&\n !Array.isArray(s.patternProperties)) ||\n (Array.isArray(s.required) && s.required.length > 0);\n return !!(isObjectType || hasObjectKeywords);\n}\n\nfunction schemaDisallowsPropertyDirectly(\n s: Record<string, unknown>,\n key: string\n): boolean {\n const props = s.properties;\n if (\n props &&\n typeof props === \"object\" &&\n !Array.isArray(props) &&\n Object.hasOwn(props, key) &&\n (props as Record<string, unknown>)[key] === false\n ) {\n return true;\n }\n const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);\n return patternSchemas.some((schema) => schema === false);\n}\n\n/**\n * Checks if a schema allows a specific property key.\n *\n * Recursively checks through schema combinators (allOf, anyOf, oneOf) to determine\n * if the given key is allowed by the schema.\n *\n * @param schema - The JSON Schema to check\n * @param key - The property key to check for\n * @param depth - Current recursion depth (default: 0)\n * @returns `true` if the schema allows the property, `false` otherwise\n *\n * @remarks\n * The depth limit of 5 prevents infinite recursion in deeply nested or circular\n * schema references. This limit is sufficient for most real-world schemas while\n * protecting against pathological cases. When the limit is exceeded, the function\n * conservatively returns `true` to prevent unwrapping - it's safer to keep a\n * wrapper key than to incorrectly remove it and lose data.\n */\nfunction schemaHasProperty(schema: unknown, key: string, depth = 0): boolean {\n if (depth > 5) {\n return true;\n }\n const unwrapped = unwrapJsonSchema(schema);\n // Unconstrained schemas (true, null, {}) allow any property\n if (schemaIsUnconstrained(unwrapped)) {\n return true;\n }\n if (!unwrapped || typeof unwrapped !== \"object\") {\n return false;\n }\n const s = unwrapped as Record<string, unknown>;\n\n if (schemaDisallowsPropertyDirectly(s, key)) {\n return false;\n }\n if (schemaHasPropertyDirectly(s, key)) {\n return true;\n }\n if (schemaHasPropertyViaAdditional(s)) {\n return true;\n }\n return schemaAllowsPropertyViaCombinators(s, key, depth);\n}\n\nfunction schemaIsUnconstrained(schema: unknown): boolean {\n const unwrapped = unwrapJsonSchema(schema);\n if (unwrapped == null || unwrapped === true) {\n return true;\n }\n if (typeof unwrapped !== \"object\" || Array.isArray(unwrapped)) {\n return false;\n }\n return Object.keys(unwrapped).length === 0;\n}\n\n/**\n * Gets all schemas from patternProperties that match the given key.\n *\n * @param patternProperties - The patternProperties object from a JSON Schema\n * @param key - The property key to match against patterns\n * @returns Array of schemas whose patterns match the key\n *\n * @remarks\n * **Security consideration**: This function executes regex patterns from the schema.\n * In typical usage (AI SDK tool parsing), schemas come from trusted application code.\n * However, if schemas can originate from untrusted sources, be aware of potential\n * ReDoS (Regular Expression Denial of Service) with malicious patterns like `(a+)+$`.\n * Consider adding regex timeout or safe-regex validation if processing untrusted schemas.\n */\nfunction getPatternSchemasForKey(\n patternProperties: unknown,\n key: string\n): unknown[] {\n if (\n !patternProperties ||\n typeof patternProperties !== \"object\" ||\n Array.isArray(patternProperties)\n ) {\n return [];\n }\n const schemas: unknown[] = [];\n for (const [pattern, schema] of Object.entries(\n patternProperties as Record<string, unknown>\n )) {\n try {\n const regex = new RegExp(pattern);\n if (regex.test(key)) {\n schemas.push(schema);\n }\n } catch {\n // Ignore invalid regex patterns.\n }\n }\n return schemas;\n}\n\nfunction coerceValueForKey(\n value: unknown,\n key: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const schemas: unknown[] = [];\n const props = unwrapped.properties as Record<string, unknown> | undefined;\n if (props && Object.hasOwn(props, key)) {\n schemas.push(props[key]);\n }\n const patternSchemas = getPatternSchemasForKey(\n unwrapped.patternProperties,\n key\n );\n if (patternSchemas.length > 0) {\n schemas.push(...patternSchemas);\n }\n\n if (schemas.length > 0) {\n let out = value;\n for (const schema of schemas) {\n if (typeof schema === \"boolean\") {\n continue;\n }\n out = coerceBySchema(out, schema);\n }\n return out;\n }\n\n const additional = unwrapped.additionalProperties;\n if (\n additional &&\n typeof additional === \"object\" &&\n !Array.isArray(additional)\n ) {\n return coerceBySchema(value, additional);\n }\n if (additional === true || additional === false) {\n return value;\n }\n\n return coerceBySchema(value, undefined);\n}\n\n/**\n * Coerce string value without schema information\n */\nfunction coerceStringWithoutSchema(value: string): unknown {\n const s = value.trim();\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n if (NUMERIC_REGEX.test(s)) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n\n // Fallback: try parsing JSON-like strings when no schema info\n if (\n (s.startsWith(\"{\") && s.endsWith(\"}\")) ||\n (s.startsWith(\"[\") && s.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(s);\n return coerceBySchema(parsed, undefined);\n } catch {\n // If parsing fails, return original value\n }\n }\n return value;\n}\n\n/**\n * Coerce string to object using schema\n */\nfunction coerceStringToObject(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n try {\n let normalized = s.replace(/'/g, '\"');\n normalized = normalized.replace(EMPTY_OBJECT_REGEX, \"{}\");\n\n const obj = JSON.parse(normalized);\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n return coerceObjectToObject(obj as Record<string, unknown>, unwrapped);\n }\n } catch {\n // fallthrough\n }\n return null;\n}\n\n/**\n * Coerce string to array using schema\n */\nfunction coerceStringToArray(\n s: string,\n unwrapped: Record<string, unknown>\n): unknown {\n const prefixItems = Array.isArray(unwrapped.prefixItems)\n ? (unwrapped.prefixItems as unknown[])\n : undefined;\n const itemsSchema = unwrapped.items as unknown;\n\n try {\n const normalized = s.replace(/'/g, '\"');\n const arr = JSON.parse(normalized);\n if (Array.isArray(arr)) {\n if (prefixItems && arr.length === prefixItems.length) {\n return arr.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return arr.map((v) => coerceBySchema(v, itemsSchema));\n }\n } catch {\n const csv = s.includes(\"\\n\")\n ? s.split(NEWLINE_SPLIT_REGEX)\n : s.split(COMMA_SPLIT_REGEX);\n const trimmed = csv.map((x) => x.trim()).filter((x) => x.length > 0);\n if (prefixItems && trimmed.length === prefixItems.length) {\n return trimmed.map((x, i) => coerceBySchema(x, prefixItems[i]));\n }\n return trimmed.map((x) => coerceBySchema(x, itemsSchema));\n }\n return null;\n}\n\n/**\n * Coerce object to object using schema\n */\nfunction coerceObjectToObject(\n value: Record<string, unknown>,\n unwrapped: Record<string, unknown>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n out[k] = coerceValueForKey(v, k, unwrapped);\n }\n return out;\n}\n\n/**\n * Coerce array to array using schema\n */\nfunction coerceArrayToArray(\n value: unknown[],\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && value.length === prefixItems.length) {\n return value.map((v, i) => coerceBySchema(v, prefixItems[i]));\n }\n return value.map((v) => coerceBySchema(v, itemsSchema));\n}\n\n/**\n * Coerce object to array using schema\n */\nfunction coerceObjectToArray(\n maybe: Record<string, unknown>,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Object.hasOwn(maybe, \"item\")) {\n const items = maybe.item as unknown;\n const arr = Array.isArray(items) ? items : [items];\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n const keys = Object.keys(maybe);\n\n // Check for numeric keys (traditional tuple handling)\n if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {\n const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);\n return coerceArrayToArray(arr, prefixItems, itemsSchema);\n }\n\n // Check for single field that contains an array or object (common XML pattern)\n // This handles both: { user: [{ name: \"A\" }, { name: \"B\" }] } and { user: { name: \"A\" } }\n if (keys.length === 1) {\n const singleKey = keys[0];\n if (\n !(\n schemaIsUnconstrained(itemsSchema) ||\n schemaHasProperty(itemsSchema, singleKey)\n )\n ) {\n const singleValue = maybe[singleKey];\n if (Array.isArray(singleValue)) {\n return singleValue.map((v) => coerceBySchema(v, itemsSchema));\n }\n // Also extract when single key's value is an object and wrap in array (single/multiple element consistency)\n if (singleValue && typeof singleValue === \"object\") {\n return [coerceBySchema(singleValue, itemsSchema)];\n }\n }\n }\n\n return null;\n}\n\n/**\n * Coerce primitive to array using schema\n */\nfunction coercePrimitiveToArray(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown[] {\n if (prefixItems && prefixItems.length > 0) {\n return [coerceBySchema(value, prefixItems[0])];\n }\n return [coerceBySchema(value, itemsSchema)];\n}\n\n/**\n * Coerce string to primitive type using schema\n */\nfunction coerceStringToPrimitive(\n s: string,\n schemaType: string | undefined\n): unknown {\n if (schemaType === \"boolean\") {\n const lower = s.toLowerCase();\n if (lower === \"true\") {\n return true;\n }\n if (lower === \"false\") {\n return false;\n }\n }\n if (\n (schemaType === \"number\" || schemaType === \"integer\") &&\n NUMERIC_REGEX.test(s)\n ) {\n const num = Number(s);\n if (Number.isFinite(num)) {\n return num;\n }\n }\n return null;\n}\n\nfunction coerceStringValue(\n value: string,\n schemaType: string | undefined,\n u: Record<string, unknown>\n): unknown {\n const s = value.trim();\n\n if (schemaType === \"object\") {\n const result = coerceStringToObject(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n if (schemaType === \"array\") {\n const result = coerceStringToArray(s, u);\n if (result !== null) {\n return result;\n }\n }\n\n const primitiveResult = coerceStringToPrimitive(s, schemaType);\n if (primitiveResult !== null) {\n return primitiveResult;\n }\n\n return value;\n}\n\nfunction coerceArrayValue(\n value: unknown,\n prefixItems: unknown[] | undefined,\n itemsSchema: unknown\n): unknown {\n if (Array.isArray(value)) {\n return coerceArrayToArray(value, prefixItems, itemsSchema);\n }\n\n if (value && typeof value === \"object\") {\n const result = coerceObjectToArray(\n value as Record<string, unknown>,\n prefixItems,\n itemsSchema\n );\n if (result !== null) {\n return result;\n }\n // To prevent infinite recursion, check if the itemsSchema is also for an array.\n // If so, just wrap the object. Otherwise, coerce it against the itemsSchema.\n if (getSchemaType(itemsSchema) === \"array\") {\n return [value];\n }\n return [coerceBySchema(value, itemsSchema)];\n }\n\n if (\n value == null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return coercePrimitiveToArray(value, prefixItems, itemsSchema);\n }\n\n return [value];\n}\n\nexport function coerceBySchema(value: unknown, schema?: unknown): unknown {\n const unwrapped = unwrapJsonSchema(schema);\n if (!unwrapped || typeof unwrapped !== \"object\") {\n if (typeof value === \"string\") {\n return coerceStringWithoutSchema(value);\n }\n return value;\n }\n\n const schemaType = getSchemaType(unwrapped);\n const u = unwrapped as Record<string, unknown>;\n\n // Handle string values\n if (typeof value === \"string\") {\n return coerceStringValue(value, schemaType, u);\n }\n\n // Handle object to object coercion\n if (\n schemaType === \"object\" &&\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n return coerceObjectToObject(value as Record<string, unknown>, u);\n }\n\n // Handle array coercion\n if (schemaType === \"array\") {\n const prefixItems = Array.isArray(u.prefixItems)\n ? (u.prefixItems as unknown[])\n : undefined;\n const itemsSchema = u.items as unknown;\n\n return coerceArrayValue(value, prefixItems, itemsSchema);\n }\n\n return value;\n}\n"],"mappings":";AACA,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAEjB,SAAS,iBAAiB,QAA0B;AACzD,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,EAAE,cAAc,OAAO,EAAE,eAAe,UAAU;AACpD,WAAO,iBAAiB,EAAE,UAAU;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,cAAc,QAAqC;AACjE,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C;AAAA,EACF;AACA,QAAM,IAAc,UAAsC;AAC1D,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,KAAK,WAAW;AACzB,UAAI,EAAE,SAAS,CAAC,GAAG;AACjB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI;AACV,MAAI,KAAK,OAAO,MAAM,aAAa,EAAE,cAAc,EAAE,uBAAuB;AAC1E,WAAO;AAAA,EACT;AACA,MACE,KACA,OAAO,MAAM,aACZ,EAAE,SAAU,EAA8B,cAC3C;AACA,WAAO;AAAA,EACT;AACA;AACF;AAoBA,SAAS,mCACP,GACA,KACA,OACS;AACT,QAAM,cAAc,EAAE;AACtB,QAAM,cAAc,EAAE;AACtB,QAAM,cAAc,EAAE;AAEtB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,oBAAgB;AAChB,kBAAc,YAAY;AAAA,MAAK,CAAC,QAC9B,kBAAkB,KAAK,KAAK,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,oBAAgB;AAChB,kBAAc,YAAY;AAAA,MAAK,CAAC,QAC9B,kBAAkB,KAAK,KAAK,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,oBAAgB;AAChB,kBAAc,YAAY;AAAA,MAAM,CAAC,QAC/B,kBAAkB,KAAK,KAAK,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,eAAe;AACvC;AAEA,SAAS,0BACP,GACA,KACS;AACT,QAAM,QAAQ,EAAE;AAChB,MACE,SACA,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,OAAO,OAAO,GAAG,KACvB,MAAkC,GAAG,MAAM,OAC5C;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,EAAE;AACnB,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG,GAAG;AACrD,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,wBAAwB,EAAE,mBAAmB,GAAG;AACvE,SAAO,eAAe,KAAK,CAAC,WAAW,WAAW,KAAK;AACzD;AAqBA,SAAS,+BAA+B,GAAqC;AAC3E,QAAM,aAAa,EAAE;AACrB,MACE,eAAe,QACd,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,GAC1E;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,GAAG,sBAAsB,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,QAAM,OAAO,EAAE;AACf,QAAM,eACJ,SAAS,YAAa,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,QAAQ;AACrE,QAAM,oBACH,EAAE,cACD,OAAO,EAAE,eAAe,YACxB,CAAC,MAAM,QAAQ,EAAE,UAAU,KAC5B,EAAE,qBACD,OAAO,EAAE,sBAAsB,YAC/B,CAAC,MAAM,QAAQ,EAAE,iBAAiB,KACnC,MAAM,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,SAAS;AACpD,SAAO,CAAC,EAAE,gBAAgB;AAC5B;AAEA,SAAS,gCACP,GACA,KACS;AACT,QAAM,QAAQ,EAAE;AAChB,MACE,SACA,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,OAAO,OAAO,GAAG,KACvB,MAAkC,GAAG,MAAM,OAC5C;AACA,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,wBAAwB,EAAE,mBAAmB,GAAG;AACvE,SAAO,eAAe,KAAK,CAAC,WAAW,WAAW,KAAK;AACzD;AAoBA,SAAS,kBAAkB,QAAiB,KAAa,QAAQ,GAAY;AAC3E,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,QAAM,YAAY,iBAAiB,MAAM;AAEzC,MAAI,sBAAsB,SAAS,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAEV,MAAI,gCAAgC,GAAG,GAAG,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,0BAA0B,GAAG,GAAG,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI,+BAA+B,CAAC,GAAG;AACrC,WAAO;AAAA,EACT;AACA,SAAO,mCAAmC,GAAG,KAAK,KAAK;AACzD;AAEA,SAAS,sBAAsB,QAA0B;AACvD,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,aAAa,QAAQ,cAAc,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,cAAc,YAAY,MAAM,QAAQ,SAAS,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,SAAS,EAAE,WAAW;AAC3C;AAgBA,SAAS,wBACP,mBACA,KACW;AACX,MACE,CAAC,qBACD,OAAO,sBAAsB,YAC7B,MAAM,QAAQ,iBAAiB,GAC/B;AACA,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAAqB,CAAC;AAC5B,aAAW,CAAC,SAAS,MAAM,KAAK,OAAO;AAAA,IACrC;AAAA,EACF,GAAG;AACD,QAAI;AACF,YAAM,QAAQ,IAAI,OAAO,OAAO;AAChC,UAAI,MAAM,KAAK,GAAG,GAAG;AACnB,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF,SAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,OACA,KACA,WACS;AACT,QAAM,UAAqB,CAAC;AAC5B,QAAM,QAAQ,UAAU;AACxB,MAAI,SAAS,OAAO,OAAO,OAAO,GAAG,GAAG;AACtC,YAAQ,KAAK,MAAM,GAAG,CAAC;AAAA,EACzB;AACA,QAAM,iBAAiB;AAAA,IACrB,UAAU;AAAA,IACV;AAAA,EACF;AACA,MAAI,eAAe,SAAS,GAAG;AAC7B,YAAQ,KAAK,GAAG,cAAc;AAAA,EAChC;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,QAAI,MAAM;AACV,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,WAAW;AAC/B;AAAA,MACF;AACA,YAAM,eAAe,KAAK,MAAM;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,UAAU;AAC7B,MACE,cACA,OAAO,eAAe,YACtB,CAAC,MAAM,QAAQ,UAAU,GACzB;AACA,WAAO,eAAe,OAAO,UAAU;AAAA,EACzC;AACA,MAAI,eAAe,QAAQ,eAAe,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO,MAAS;AACxC;AAKA,SAAS,0BAA0B,OAAwB;AACzD,QAAM,IAAI,MAAM,KAAK;AACrB,QAAM,QAAQ,EAAE,YAAY;AAC5B,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS;AACrB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,KAAK,CAAC,GAAG;AACzB,UAAM,MAAM,OAAO,CAAC;AACpB,QAAI,OAAO,SAAS,GAAG,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MACG,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,KACnC,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GACpC;AACA,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,CAAC;AAC3B,aAAO,eAAe,QAAQ,MAAS;AAAA,IACzC,SAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,qBACP,GACA,WACS;AACT,MAAI;AACF,QAAI,aAAa,EAAE,QAAQ,MAAM,GAAG;AACpC,iBAAa,WAAW,QAAQ,oBAAoB,IAAI;AAExD,UAAM,MAAM,KAAK,MAAM,UAAU;AACjC,QAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,aAAO,qBAAqB,KAAgC,SAAS;AAAA,IACvE;AAAA,EACF,SAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKA,SAAS,oBACP,GACA,WACS;AACT,QAAM,cAAc,MAAM,QAAQ,UAAU,WAAW,IAClD,UAAU,cACX;AACJ,QAAM,cAAc,UAAU;AAE9B,MAAI;AACF,UAAM,aAAa,EAAE,QAAQ,MAAM,GAAG;AACtC,UAAM,MAAM,KAAK,MAAM,UAAU;AACjC,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,eAAe,IAAI,WAAW,YAAY,QAAQ;AACpD,eAAO,IAAI,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,MAC5D;AACA,aAAO,IAAI,IAAI,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAAA,IACtD;AAAA,EACF,SAAQ;AACN,UAAM,MAAM,EAAE,SAAS,IAAI,IACvB,EAAE,MAAM,mBAAmB,IAC3B,EAAE,MAAM,iBAAiB;AAC7B,UAAM,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AACnE,QAAI,eAAe,QAAQ,WAAW,YAAY,QAAQ;AACxD,aAAO,QAAQ,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,IAChE;AACA,WAAO,QAAQ,IAAI,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAKA,SAAS,qBACP,OACA,WACyB;AACzB,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,CAAC,IAAI,kBAAkB,GAAG,GAAG,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAKA,SAAS,mBACP,OACA,aACA,aACW;AACX,MAAI,eAAe,MAAM,WAAW,YAAY,QAAQ;AACtD,WAAO,MAAM,IAAI,CAAC,GAAG,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC;AAAA,EAC9D;AACA,SAAO,MAAM,IAAI,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AACxD;AAKA,SAAS,oBACP,OACA,aACA,aACS;AACT,MAAI,OAAO,OAAO,OAAO,MAAM,GAAG;AAChC,UAAM,QAAQ,MAAM;AACpB,UAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACjD,WAAO,mBAAmB,KAAK,aAAa,WAAW;AAAA,EACzD;AAEA,QAAM,OAAO,OAAO,KAAK,KAAK;AAG9B,MAAI,KAAK,SAAS,KAAK,KAAK,MAAM,CAAC,MAAM,gBAAgB,KAAK,CAAC,CAAC,GAAG;AACjE,UAAM,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AAC1E,WAAO,mBAAmB,KAAK,aAAa,WAAW;AAAA,EACzD;AAIA,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,YAAY,KAAK,CAAC;AACxB,QACE,EACE,sBAAsB,WAAW,KACjC,kBAAkB,aAAa,SAAS,IAE1C;AACA,YAAM,cAAc,MAAM,SAAS;AACnC,UAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,eAAO,YAAY,IAAI,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAAA,MAC9D;AAEA,UAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,eAAO,CAAC,eAAe,aAAa,WAAW,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,uBACP,OACA,aACA,aACW;AACX,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,WAAO,CAAC,eAAe,OAAO,YAAY,CAAC,CAAC,CAAC;AAAA,EAC/C;AACA,SAAO,CAAC,eAAe,OAAO,WAAW,CAAC;AAC5C;AAKA,SAAS,wBACP,GACA,YACS;AACT,MAAI,eAAe,WAAW;AAC5B,UAAM,QAAQ,EAAE,YAAY;AAC5B,QAAI,UAAU,QAAQ;AACpB,aAAO;AAAA,IACT;AACA,QAAI,UAAU,SAAS;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AACA,OACG,eAAe,YAAY,eAAe,cAC3C,cAAc,KAAK,CAAC,GACpB;AACA,UAAM,MAAM,OAAO,CAAC;AACpB,QAAI,OAAO,SAAS,GAAG,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,OACA,YACA,GACS;AACT,QAAM,IAAI,MAAM,KAAK;AAErB,MAAI,eAAe,UAAU;AAC3B,UAAM,SAAS,qBAAqB,GAAG,CAAC;AACxC,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,eAAe,SAAS;AAC1B,UAAM,SAAS,oBAAoB,GAAG,CAAC;AACvC,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,kBAAkB,wBAAwB,GAAG,UAAU;AAC7D,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,OACA,aACA,aACS;AACT,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,mBAAmB,OAAO,aAAa,WAAW;AAAA,EAC3D;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAGA,QAAI,cAAc,WAAW,MAAM,SAAS;AAC1C,aAAO,CAAC,KAAK;AAAA,IACf;AACA,WAAO,CAAC,eAAe,OAAO,WAAW,CAAC;AAAA,EAC5C;AAEA,MACE,SAAS,QACT,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO,uBAAuB,OAAO,aAAa,WAAW;AAAA,EAC/D;AAEA,SAAO,CAAC,KAAK;AACf;AAEO,SAAS,eAAe,OAAgB,QAA2B;AACxE,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,0BAA0B,KAAK;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,cAAc,SAAS;AAC1C,QAAM,IAAI;AAGV,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,kBAAkB,OAAO,YAAY,CAAC;AAAA,EAC/C;AAGA,MACE,eAAe,YACf,SACA,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,GACpB;AACA,WAAO,qBAAqB,OAAkC,CAAC;AAAA,EACjE;AAGA,MAAI,eAAe,SAAS;AAC1B,UAAM,cAAc,MAAM,QAAQ,EAAE,WAAW,IAC1C,EAAE,cACH;AACJ,UAAM,cAAc,EAAE;AAEtB,WAAO,iBAAiB,OAAO,aAAa,WAAW;AAAA,EACzD;AAEA,SAAO;AACT;","names":[]}
@@ -1557,6 +1557,153 @@ function getSchemaType(schema) {
1557
1557
  }
1558
1558
  return;
1559
1559
  }
1560
+ function schemaAllowsPropertyViaCombinators(s, key, depth) {
1561
+ const anyOfValues = s.anyOf;
1562
+ const oneOfValues = s.oneOf;
1563
+ const allOfValues = s.allOf;
1564
+ let hasCombinator = false;
1565
+ let anyOfAllows = true;
1566
+ let oneOfAllows = true;
1567
+ let allOfAllows = true;
1568
+ if (Array.isArray(anyOfValues)) {
1569
+ hasCombinator = true;
1570
+ anyOfAllows = anyOfValues.some(
1571
+ (sub) => schemaHasProperty(sub, key, depth + 1)
1572
+ );
1573
+ }
1574
+ if (Array.isArray(oneOfValues)) {
1575
+ hasCombinator = true;
1576
+ oneOfAllows = oneOfValues.some(
1577
+ (sub) => schemaHasProperty(sub, key, depth + 1)
1578
+ );
1579
+ }
1580
+ if (Array.isArray(allOfValues)) {
1581
+ hasCombinator = true;
1582
+ allOfAllows = allOfValues.every(
1583
+ (sub) => schemaHasProperty(sub, key, depth + 1)
1584
+ );
1585
+ }
1586
+ if (!hasCombinator) {
1587
+ return false;
1588
+ }
1589
+ return anyOfAllows && oneOfAllows && allOfAllows;
1590
+ }
1591
+ function schemaHasPropertyDirectly(s, key) {
1592
+ const props = s.properties;
1593
+ if (props && typeof props === "object" && !Array.isArray(props) && Object.hasOwn(props, key) && props[key] !== false) {
1594
+ return true;
1595
+ }
1596
+ const required = s.required;
1597
+ if (Array.isArray(required) && required.includes(key)) {
1598
+ return true;
1599
+ }
1600
+ const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);
1601
+ return patternSchemas.some((schema) => schema !== false);
1602
+ }
1603
+ function schemaHasPropertyViaAdditional(s) {
1604
+ const additional = s.additionalProperties;
1605
+ if (additional === true || additional && typeof additional === "object" && !Array.isArray(additional)) {
1606
+ return true;
1607
+ }
1608
+ if (Object.hasOwn(s, "additionalProperties")) {
1609
+ return false;
1610
+ }
1611
+ const type = s.type;
1612
+ const isObjectType = type === "object" || Array.isArray(type) && type.includes("object");
1613
+ const hasObjectKeywords = s.properties && typeof s.properties === "object" && !Array.isArray(s.properties) || s.patternProperties && typeof s.patternProperties === "object" && !Array.isArray(s.patternProperties) || Array.isArray(s.required) && s.required.length > 0;
1614
+ return !!(isObjectType || hasObjectKeywords);
1615
+ }
1616
+ function schemaDisallowsPropertyDirectly(s, key) {
1617
+ const props = s.properties;
1618
+ if (props && typeof props === "object" && !Array.isArray(props) && Object.hasOwn(props, key) && props[key] === false) {
1619
+ return true;
1620
+ }
1621
+ const patternSchemas = getPatternSchemasForKey(s.patternProperties, key);
1622
+ return patternSchemas.some((schema) => schema === false);
1623
+ }
1624
+ function schemaHasProperty(schema, key, depth = 0) {
1625
+ if (depth > 5) {
1626
+ return true;
1627
+ }
1628
+ const unwrapped = unwrapJsonSchema(schema);
1629
+ if (schemaIsUnconstrained(unwrapped)) {
1630
+ return true;
1631
+ }
1632
+ if (!unwrapped || typeof unwrapped !== "object") {
1633
+ return false;
1634
+ }
1635
+ const s = unwrapped;
1636
+ if (schemaDisallowsPropertyDirectly(s, key)) {
1637
+ return false;
1638
+ }
1639
+ if (schemaHasPropertyDirectly(s, key)) {
1640
+ return true;
1641
+ }
1642
+ if (schemaHasPropertyViaAdditional(s)) {
1643
+ return true;
1644
+ }
1645
+ return schemaAllowsPropertyViaCombinators(s, key, depth);
1646
+ }
1647
+ function schemaIsUnconstrained(schema) {
1648
+ const unwrapped = unwrapJsonSchema(schema);
1649
+ if (unwrapped == null || unwrapped === true) {
1650
+ return true;
1651
+ }
1652
+ if (typeof unwrapped !== "object" || Array.isArray(unwrapped)) {
1653
+ return false;
1654
+ }
1655
+ return Object.keys(unwrapped).length === 0;
1656
+ }
1657
+ function getPatternSchemasForKey(patternProperties, key) {
1658
+ if (!patternProperties || typeof patternProperties !== "object" || Array.isArray(patternProperties)) {
1659
+ return [];
1660
+ }
1661
+ const schemas = [];
1662
+ for (const [pattern, schema] of Object.entries(
1663
+ patternProperties
1664
+ )) {
1665
+ try {
1666
+ const regex = new RegExp(pattern);
1667
+ if (regex.test(key)) {
1668
+ schemas.push(schema);
1669
+ }
1670
+ } catch (e) {
1671
+ }
1672
+ }
1673
+ return schemas;
1674
+ }
1675
+ function coerceValueForKey(value, key, unwrapped) {
1676
+ const schemas = [];
1677
+ const props = unwrapped.properties;
1678
+ if (props && Object.hasOwn(props, key)) {
1679
+ schemas.push(props[key]);
1680
+ }
1681
+ const patternSchemas = getPatternSchemasForKey(
1682
+ unwrapped.patternProperties,
1683
+ key
1684
+ );
1685
+ if (patternSchemas.length > 0) {
1686
+ schemas.push(...patternSchemas);
1687
+ }
1688
+ if (schemas.length > 0) {
1689
+ let out = value;
1690
+ for (const schema of schemas) {
1691
+ if (typeof schema === "boolean") {
1692
+ continue;
1693
+ }
1694
+ out = coerceBySchema(out, schema);
1695
+ }
1696
+ return out;
1697
+ }
1698
+ const additional = unwrapped.additionalProperties;
1699
+ if (additional && typeof additional === "object" && !Array.isArray(additional)) {
1700
+ return coerceBySchema(value, additional);
1701
+ }
1702
+ if (additional === true || additional === false) {
1703
+ return value;
1704
+ }
1705
+ return coerceBySchema(value, void 0);
1706
+ }
1560
1707
  function coerceStringWithoutSchema(value) {
1561
1708
  const s = value.trim();
1562
1709
  const lower = s.toLowerCase();
@@ -1587,13 +1734,7 @@ function coerceStringToObject(s, unwrapped) {
1587
1734
  normalized = normalized.replace(EMPTY_OBJECT_REGEX, "{}");
1588
1735
  const obj = JSON.parse(normalized);
1589
1736
  if (obj && typeof obj === "object" && !Array.isArray(obj)) {
1590
- const props = unwrapped.properties;
1591
- const out = {};
1592
- for (const [k, v] of Object.entries(obj)) {
1593
- const propSchema = props ? props[k] : void 0;
1594
- out[k] = typeof propSchema === "boolean" ? v : coerceBySchema(v, propSchema);
1595
- }
1596
- return out;
1737
+ return coerceObjectToObject(obj, unwrapped);
1597
1738
  }
1598
1739
  } catch (e) {
1599
1740
  }
@@ -1623,10 +1764,8 @@ function coerceStringToArray(s, unwrapped) {
1623
1764
  }
1624
1765
  function coerceObjectToObject(value, unwrapped) {
1625
1766
  const out = {};
1626
- const props = unwrapped.properties;
1627
1767
  for (const [k, v] of Object.entries(value)) {
1628
- const propSchema = props ? props[k] : void 0;
1629
- out[k] = typeof propSchema === "boolean" ? v : coerceBySchema(v, propSchema);
1768
+ out[k] = coerceValueForKey(v, k, unwrapped);
1630
1769
  }
1631
1770
  return out;
1632
1771
  }
@@ -1643,16 +1782,22 @@ function coerceObjectToArray(maybe, prefixItems, itemsSchema) {
1643
1782
  return coerceArrayToArray(arr, prefixItems, itemsSchema);
1644
1783
  }
1645
1784
  const keys = Object.keys(maybe);
1646
- if (keys.length === 1) {
1647
- const singleValue = maybe[keys[0]];
1648
- if (Array.isArray(singleValue)) {
1649
- return singleValue.map((v) => coerceBySchema(v, itemsSchema));
1650
- }
1651
- }
1652
1785
  if (keys.length > 0 && keys.every((k) => DIGIT_KEY_REGEX.test(k))) {
1653
1786
  const arr = keys.sort((a, b) => Number(a) - Number(b)).map((k) => maybe[k]);
1654
1787
  return coerceArrayToArray(arr, prefixItems, itemsSchema);
1655
1788
  }
1789
+ if (keys.length === 1) {
1790
+ const singleKey = keys[0];
1791
+ if (!(schemaIsUnconstrained(itemsSchema) || schemaHasProperty(itemsSchema, singleKey))) {
1792
+ const singleValue = maybe[singleKey];
1793
+ if (Array.isArray(singleValue)) {
1794
+ return singleValue.map((v) => coerceBySchema(v, itemsSchema));
1795
+ }
1796
+ if (singleValue && typeof singleValue === "object") {
1797
+ return [coerceBySchema(singleValue, itemsSchema)];
1798
+ }
1799
+ }
1800
+ }
1656
1801
  return null;
1657
1802
  }
1658
1803
  function coercePrimitiveToArray(value, prefixItems, itemsSchema) {
@@ -1712,11 +1857,15 @@ function coerceArrayValue(value, prefixItems, itemsSchema) {
1712
1857
  if (result !== null) {
1713
1858
  return result;
1714
1859
  }
1860
+ if (getSchemaType(itemsSchema) === "array") {
1861
+ return [value];
1862
+ }
1863
+ return [coerceBySchema(value, itemsSchema)];
1715
1864
  }
1716
1865
  if (value == null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
1717
1866
  return coercePrimitiveToArray(value, prefixItems, itemsSchema);
1718
1867
  }
1719
- return value;
1868
+ return [value];
1720
1869
  }
1721
1870
  function coerceBySchema(value, schema) {
1722
1871
  const unwrapped = unwrapJsonSchema(schema);