canonize 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +629 -0
- package/dist/coercers/array.d.ts +7 -0
- package/dist/coercers/array.d.ts.map +1 -0
- package/dist/coercers/bigint.d.ts +5 -0
- package/dist/coercers/bigint.d.ts.map +1 -0
- package/dist/coercers/boolean.d.ts +5 -0
- package/dist/coercers/boolean.d.ts.map +1 -0
- package/dist/coercers/date.d.ts +5 -0
- package/dist/coercers/date.d.ts.map +1 -0
- package/dist/coercers/discriminated-union.d.ts +7 -0
- package/dist/coercers/discriminated-union.d.ts.map +1 -0
- package/dist/coercers/enum.d.ts +9 -0
- package/dist/coercers/enum.d.ts.map +1 -0
- package/dist/coercers/intersection.d.ts +8 -0
- package/dist/coercers/intersection.d.ts.map +1 -0
- package/dist/coercers/literal.d.ts +5 -0
- package/dist/coercers/literal.d.ts.map +1 -0
- package/dist/coercers/map-set.d.ts +11 -0
- package/dist/coercers/map-set.d.ts.map +1 -0
- package/dist/coercers/nan.d.ts +5 -0
- package/dist/coercers/nan.d.ts.map +1 -0
- package/dist/coercers/null.d.ts +5 -0
- package/dist/coercers/null.d.ts.map +1 -0
- package/dist/coercers/number.d.ts +13 -0
- package/dist/coercers/number.d.ts.map +1 -0
- package/dist/coercers/object.d.ts +7 -0
- package/dist/coercers/object.d.ts.map +1 -0
- package/dist/coercers/record.d.ts +7 -0
- package/dist/coercers/record.d.ts.map +1 -0
- package/dist/coercers/string.d.ts +6 -0
- package/dist/coercers/string.d.ts.map +1 -0
- package/dist/coercers/tuple.d.ts +7 -0
- package/dist/coercers/tuple.d.ts.map +1 -0
- package/dist/coercers/union.d.ts +7 -0
- package/dist/coercers/union.d.ts.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/create-schema.d.ts +5 -0
- package/dist/create-schema.d.ts.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1623 -0
- package/dist/index.js.map +33 -0
- package/dist/tool-parameters/index.d.ts +206 -0
- package/dist/tool-parameters/index.d.ts.map +1 -0
- package/dist/tool-parameters/index.js +301 -0
- package/dist/tool-parameters/index.js.map +12 -0
- package/dist/tool-parameters/link-metadata.d.ts +17 -0
- package/dist/tool-parameters/link-metadata.d.ts.map +1 -0
- package/dist/utilities/circular.d.ts +27 -0
- package/dist/utilities/circular.d.ts.map +1 -0
- package/dist/utilities/parsers.d.ts +29 -0
- package/dist/utilities/parsers.d.ts.map +1 -0
- package/dist/utilities/special-methods.d.ts +14 -0
- package/dist/utilities/special-methods.d.ts.map +1 -0
- package/dist/utilities/type-coercion.d.ts +11 -0
- package/dist/utilities/type-coercion.d.ts.map +1 -0
- package/dist/utilities/type-detection.d.ts +26 -0
- package/dist/utilities/type-detection.d.ts.map +1 -0
- package/dist/utilities/type-guards.d.ts +35 -0
- package/dist/utilities/type-guards.d.ts.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/utilities/circular.ts", "../src/utilities/parsers.ts", "../src/constants.ts", "../src/utilities/type-detection.ts", "../src/coercers/array.ts", "../src/utilities/special-methods.ts", "../src/coercers/bigint.ts", "../src/coercers/boolean.ts", "../src/coercers/number.ts", "../src/coercers/date.ts", "../src/coercers/discriminated-union.ts", "../src/coercers/enum.ts", "../src/coercers/intersection.ts", "../src/coercers/string.ts", "../src/coercers/literal.ts", "../src/coercers/map-set.ts", "../src/coercers/nan.ts", "../src/coercers/null.ts", "../src/coercers/object.ts", "../src/coercers/record.ts", "../src/coercers/tuple.ts", "../src/coercers/union.ts", "../src/create-schema.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import * as z from 'zod';\n\n// Collection coercers\nimport { coerceToArray } from './coercers/array.js';\nimport { coerceToBigInt } from './coercers/bigint.js';\nimport { coerceToBoolean } from './coercers/boolean.js';\nimport { coerceToDate } from './coercers/date.js';\nimport { coerceToDiscriminatedUnion } from './coercers/discriminated-union.js';\n// Special type coercers\nimport { coerceToEnum } from './coercers/enum.js';\nimport { coerceToIntersection } from './coercers/intersection.js';\nimport { coerceToLiteral } from './coercers/literal.js';\n// Map & Set coercers\nimport { coerceToMap, coerceToSet } from './coercers/map-set.js';\nimport { coerceToNaN } from './coercers/nan.js';\nimport { coerceToNull } from './coercers/null.js';\nimport { coerceToInt32, coerceToInteger, coerceToNumber } from './coercers/number.js';\nimport { coerceToObject } from './coercers/object.js';\nimport { coerceToRecord } from './coercers/record.js';\n// Primitive coercers\nimport { coerceToString } from './coercers/string.js';\nimport { coerceToTuple } from './coercers/tuple.js';\nimport { coerceToUnion } from './coercers/union.js';\nimport { ZodType } from './constants.js';\nimport { CircularTracker } from './utilities/circular.js';\nimport { getZodTypeName } from './utilities/type-detection.js';\n\n// Re-export utilities for advanced use cases\nexport { ZodType } from './constants.js';\nexport {\n type CanonizePrimitive,\n createCanonizePrimitive,\n createCanonizeSchema,\n} from './create-schema.js';\nexport { CircularTracker } from './utilities/circular.js';\nexport { getZodTypeName, unwrapSchema } from './utilities/type-detection.js';\n\n/**\n * Main coercion dispatcher\n */\nfunction coerceValue(\n schema: z.ZodTypeAny,\n value: unknown,\n tracker = new CircularTracker(),\n): unknown {\n const typeName = getZodTypeName(schema);\n\n // Handle wrappers first\n if (typeName === ZodType.OPTIONAL) {\n if (value === undefined) return undefined;\n return coerceValue((schema._def as any).innerType, value, tracker);\n }\n\n if (typeName === ZodType.NULLABLE) {\n if (value === null) return null;\n // Aggressive coercion: coerce empty string to null (prevents '' → {} for objects)\n if (value === '') {\n return null;\n }\n return coerceValue((schema._def as any).innerType, value, tracker);\n }\n\n if (typeName === ZodType.DEFAULT) {\n if (value === undefined) return (schema._def as any).defaultValue();\n return coerceValue((schema._def as any).innerType, value, tracker);\n }\n\n if (typeName === ZodType.CATCH) {\n // Just coerce the inner type and let Zod's native .catch() handle validation errors\n return coerceValue((schema._def as any).innerType, value, tracker);\n }\n\n if (typeName === ZodType.READONLY) {\n const result = coerceValue((schema._def as any).innerType, value, tracker);\n // Freeze the result\n if (typeof result === 'object' && result !== null) {\n return Object.freeze(result);\n }\n return result;\n }\n\n if (typeName === ZodType.LAZY) {\n const lazySchema = (schema._def as any).getter();\n return coerceValue(lazySchema, value, tracker);\n }\n\n // Primitive types\n if (typeName === ZodType.STRING) {\n return coerceToString(value, tracker);\n }\n\n if (typeName === ZodType.NUMBER) {\n const num = coerceToNumber(value);\n\n // Check for Zod v4 number format\n const defData = schema._def as any;\n if (defData.check === 'number_format' && defData.format === 'safeint') {\n // z.int() - safe integer\n return coerceToInteger(num);\n }\n if (defData.check === 'number_format' && defData.format === 'int32') {\n // z.int32() - 32-bit integer\n return coerceToInt32(num);\n }\n\n return num;\n }\n\n if (typeName === ZodType.BOOLEAN) {\n return coerceToBoolean(value);\n }\n\n if (typeName === ZodType.DATE) {\n return coerceToDate(value);\n }\n\n if (typeName === ZodType.BIGINT) {\n return coerceToBigInt(value);\n }\n\n if (typeName === ZodType.NULL) {\n return coerceToNull(value);\n }\n\n if (typeName === ZodType.NAN) {\n return coerceToNaN(value);\n }\n\n if (typeName === ZodType.ANY || typeName === ZodType.UNKNOWN) {\n // Pass through as-is\n return value;\n }\n\n if (typeName === ZodType.CUSTOM) {\n return coerceCustomSchema(schema, value, tracker);\n }\n\n if (typeName === ZodType.NEVER) {\n throw new Error('Cannot coerce to never type');\n }\n\n // Array\n if (typeName === ZodType.ARRAY) {\n const elementSchema = (schema._def as any).element;\n return coerceToArray(\n value,\n elementSchema,\n (v, t) => coerceValue(elementSchema, v, t),\n tracker,\n );\n }\n\n // Object\n if (typeName === ZodType.OBJECT) {\n const shape = (schema._def as any).shape;\n return coerceToObject(\n value,\n shape,\n (key, v, t) => {\n if (key in shape) {\n return coerceValue(shape[key], v, t);\n }\n return v;\n },\n tracker,\n );\n }\n\n // Tuple\n if (typeName === ZodType.TUPLE) {\n const items = (schema._def as any).items;\n return coerceToTuple(\n value,\n items,\n (index, v, t) => coerceValue(items[index], v, t),\n tracker,\n );\n }\n\n // Record\n if (typeName === ZodType.RECORD) {\n const valueType = (schema._def as any).valueType;\n return coerceToRecord(\n value,\n valueType,\n (v, t) => coerceValue(valueType, v, t),\n tracker,\n );\n }\n\n // Enum\n if (typeName === ZodType.ENUM) {\n const defData = schema._def as any;\n const entries = defData.entries;\n\n // Determine if this is a numeric enum by checking if any value is a number\n const allValues = Object.values(entries);\n const hasNumbers = allValues.some((v) => typeof v === 'number');\n\n // For numeric enums, Zod only validates against the numeric values\n // Filter to only numeric values if it's a numeric enum\n const validValues = hasNumbers\n ? allValues.filter((v) => typeof v === 'number')\n : Array.from(new Set(allValues));\n\n return coerceToEnum(value, validValues, entries);\n }\n\n // Literal\n if (typeName === ZodType.LITERAL) {\n const defData = schema._def as any;\n const literalValue = defData.values[0];\n return coerceToLiteral(value, literalValue);\n }\n\n // Discriminated Union (check before regular union, as discriminated unions have type === \"union\" in Zod v4)\n if (typeName === ZodType.UNION && (schema._def as any).discriminator) {\n const discriminator = (schema._def as any).discriminator;\n const options = (schema._def as any).options;\n return coerceToDiscriminatedUnion(\n value,\n discriminator,\n options,\n (index, v, t) => coerceValue(options[index], v, t),\n tracker,\n );\n }\n\n // Union\n if (typeName === ZodType.UNION) {\n const options = (schema._def as any).options;\n return coerceToUnion(\n value,\n options,\n (index, v, t) => coerceValue(options[index], v, t),\n tracker,\n );\n }\n\n // Intersection\n if (typeName === ZodType.INTERSECTION) {\n const left = (schema._def as any).left;\n const right = (schema._def as any).right;\n return coerceToIntersection(\n value,\n left,\n right,\n (v, t) => coerceValue(left, v, t),\n (v, t) => coerceValue(right, v, t),\n tracker,\n );\n }\n\n // Map\n if (typeName === ZodType.MAP) {\n const keyType = (schema._def as any).keyType;\n const valueType = (schema._def as any).valueType;\n return coerceToMap(\n value,\n keyType,\n valueType,\n (v, t) => coerceValue(keyType, v, t),\n (v, t) => coerceValue(valueType, v, t),\n tracker,\n );\n }\n\n // Set\n if (typeName === ZodType.SET) {\n return coerceSetSchema(value, schema, tracker);\n }\n\n // Fallback: return as-is\n return value;\n}\n\nfunction coerceSetSchema(value: unknown, schema: z.ZodTypeAny, tracker: CircularTracker) {\n const valueType = (schema._def as any).valueType;\n return coerceToSet(value, valueType, (v, t) => coerceValue(valueType, v, t), tracker);\n}\n\nfunction coerceCustomSchema(\n schema: z.ZodTypeAny,\n value: unknown,\n tracker: CircularTracker,\n) {\n const defData = schema._def as any;\n const predicate = typeof defData?.fn === 'function' ? defData.fn : null;\n\n if (!predicate) {\n return value;\n }\n\n const attempts: Array<() => unknown> = [\n () => value,\n () => coerceToDate(value),\n () => coerceToNumber(value),\n () => coerceToBigInt(value),\n () => coerceToBoolean(value),\n () => coerceToString(value, tracker),\n ];\n\n for (const attempt of attempts) {\n let coerced: unknown;\n\n try {\n coerced = attempt();\n } catch {\n continue;\n }\n\n try {\n if (predicate(coerced)) {\n return coerced;\n }\n } catch {\n continue;\n }\n }\n\n return value;\n}\n\nexport type CanonizeSchema<T extends z.ZodTypeAny> = T & {};\n\n/**\n * Wrap a Zod schema with aggressive type coercion.\n *\n * This is the main export of the canonize library. It takes any Zod schema\n * and returns a new schema that will automatically coerce inputs to the\n * expected types before validation.\n *\n * @example\n * ```typescript\n * import { canonize } from 'canonize';\n * import { z } from 'zod';\n *\n * const schema = canonize(z.object({\n * name: z.string(),\n * age: z.number(),\n * active: z.boolean()\n * }));\n *\n * // All of these will succeed:\n * schema.parse({ name: 'Alice', age: '30', active: 'yes' });\n * schema.parse({ name: 123, age: 30, active: 1 });\n * schema.parse({ name: ['Alice'], age: '30.5', active: 'true' });\n * ```\n *\n * Overloads preserve specific Zod types (e.g., ZodObject) so callers\n * retain exact schema types without needing casts.\n */\n// Object\nexport function canonize<T extends z.ZodObject<any>>(schema: T): T;\n// Array\nexport function canonize<T extends z.ZodArray<any>>(schema: T): T;\n// Record\nexport function canonize<T extends z.ZodRecord<any, any>>(schema: T): T;\n// Tuple\nexport function canonize<T extends z.ZodTuple<any, any>>(schema: T): T;\n// Map\nexport function canonize<T extends z.ZodMap<any, any>>(schema: T): T;\n// Set\nexport function canonize<T extends z.ZodSet<any>>(schema: T): T;\n// Union\nexport function canonize<T extends z.ZodUnion<any>>(schema: T): T;\n// Discriminated Union\nexport function canonize<T extends z.ZodDiscriminatedUnion<any, any>>(schema: T): T;\n// Intersection\nexport function canonize<T extends z.ZodIntersection<any, any>>(schema: T): T;\n// Primitives\nexport function canonize<T extends z.ZodString>(schema: T): T;\nexport function canonize<T extends z.ZodNumber>(schema: T): T;\nexport function canonize<T extends z.ZodBoolean>(schema: T): T;\nexport function canonize<T extends z.ZodBigInt>(schema: T): T;\nexport function canonize<T extends z.ZodDate>(schema: T): T;\nexport function canonize<T extends z.ZodNull>(schema: T): T;\nexport function canonize<T extends z.ZodNaN>(schema: T): T;\nexport function canonize<T extends z.ZodTypeAny>(schema: T): CanonizeSchema<T>;\nexport function canonize<T extends z.ZodTypeAny>(schema: T): CanonizeSchema<T> {\n // Use preprocess to coerce BEFORE validation\n const preprocessed = z.preprocess((value) => {\n try {\n return coerceValue(schema, value);\n } catch (error) {\n // Re-throw circular reference errors\n if (error instanceof Error && error.message.includes('Circular reference')) {\n throw error;\n }\n // For other coercion failures, return the original value\n // and let Zod validation handle it\n return value;\n }\n }, schema);\n\n return preprocessed as any as CanonizeSchema<T>;\n}\n",
|
|
6
|
+
"/**\n * Circular reference tracker using WeakSet\n */\nexport class CircularTracker {\n private seen = new WeakSet<object>();\n\n /**\n * Check if object has been seen before\n */\n has(obj: object): boolean {\n return this.seen.has(obj);\n }\n\n /**\n * Mark object as seen\n */\n add(obj: object): void {\n this.seen.add(obj);\n }\n\n /**\n * Create a child tracker (for nested coercion)\n */\n child(): CircularTracker {\n const child = new CircularTracker();\n // Copy parent's seen objects to child\n return child;\n }\n}\n\n/**\n * Check if a value can have circular references\n */\nexport function canBeCircular(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Throw error for circular reference\n */\nexport function throwCircular(): never {\n throw new Error('Circular reference detected');\n}\n",
|
|
7
|
+
"/**\n * Try to parse a JSON string\n */\nexport function tryParseJSON(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\n/**\n * Try to parse a delimited string to array (CSV, semicolon, pipe)\n */\nexport function tryParseCSV(value: string): string[] | null {\n // Try comma first\n if (value.includes(',')) {\n return value.split(',').map((s) => s.trim());\n }\n // Try semicolon\n if (value.includes(';')) {\n return value.split(';').map((s) => s.trim());\n }\n // Try pipe\n if (value.includes('|')) {\n return value.split('|').map((s) => s.trim());\n }\n return null;\n}\n\n/**\n * Try to parse a hex/octal/binary number string\n */\nexport function tryParseSpecialNumber(value: string): number | null {\n const trimmed = value.trim();\n\n // Hex: 0x or 0X\n if (/^0x[0-9a-f]+$/i.test(trimmed)) {\n return parseInt(trimmed, 16);\n }\n\n // Octal: 0o or 0O\n if (/^0o[0-7]+$/i.test(trimmed)) {\n return parseInt(trimmed.slice(2), 8);\n }\n\n // Binary: 0b or 0B\n if (/^0b[01]+$/i.test(trimmed)) {\n return parseInt(trimmed.slice(2), 2);\n }\n\n return null;\n}\n\n/**\n * Try to parse a string to number\n */\nexport function tryParseNumber(value: string): number | null {\n // Try special formats first\n const special = tryParseSpecialNumber(value);\n if (special !== null) return special;\n\n // Try regular number parsing\n const trimmed = value.trim();\n if (trimmed === '') return null;\n\n const num = Number(trimmed);\n if (isNaN(num)) return null;\n\n return num;\n}\n\n/**\n * Check if a string looks like a boolean\n */\nexport function isBooleanLikeString(value: string): boolean {\n const lower = value.trim().toLowerCase();\n return (\n lower === 'true' ||\n lower === 'false' ||\n lower === 'yes' ||\n lower === 'no' ||\n lower === 'on' ||\n lower === 'off' ||\n lower === 'y' ||\n lower === 'n' ||\n lower === 't' ||\n lower === 'f' ||\n lower === 'enabled' ||\n lower === 'disabled' ||\n lower === '1' ||\n lower === '0'\n );\n}\n\n/**\n * Normalize a string for case-insensitive comparison\n */\nexport function normalizeString(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n * Check if value is falsy for null coercion\n */\nexport function isFalsyForNull(value: unknown): boolean {\n if (value === null) return true;\n if (value === undefined) return true;\n if (value === false) return true;\n if (value === 0) return true;\n if (Object.is(value, -0)) return true;\n if (value === '') return true;\n if (typeof value === 'bigint' && value === 0n) return true;\n\n // String variations of null/undefined (case-insensitive)\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (normalized === 'null' || normalized === 'undefined') return true;\n }\n\n // Empty array\n if (Array.isArray(value) && value.length === 0) return true;\n\n // Empty object\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const keys = Object.keys(value);\n if (keys.length === 0) return true;\n }\n\n return false;\n}\n",
|
|
8
|
+
"// Boolean string values for stringbool logic\nexport const TRUTHY_STRINGS = ['true', 'yes', 'on', 'y', 't', 'enabled', '1'];\n\nexport const FALSY_STRINGS = ['false', 'no', 'off', 'n', 'f', 'disabled', '0'];\n\n// Zod type names for schema detection (Zod v4 uses lowercase types)\nexport const ZodType = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n DATE: 'date',\n BIGINT: 'bigint',\n NULL: 'null',\n UNDEFINED: 'undefined',\n NAN: 'nan',\n ARRAY: 'array',\n OBJECT: 'object',\n TUPLE: 'tuple',\n RECORD: 'record',\n ENUM: 'enum',\n NATIVE_ENUM: 'nativeEnum',\n LITERAL: 'literal',\n UNION: 'union',\n DISCRIMINATED_UNION: 'discriminatedUnion',\n INTERSECTION: 'intersection',\n MAP: 'map',\n SET: 'set',\n OPTIONAL: 'optional',\n NULLABLE: 'nullable',\n DEFAULT: 'default',\n CATCH: 'catch',\n LAZY: 'lazy',\n READONLY: 'readonly',\n BRANDED: 'branded',\n ANY: 'any',\n UNKNOWN: 'unknown',\n NEVER: 'never',\n CUSTOM: 'custom',\n} as const;\n",
|
|
9
|
+
"import * as z from 'zod';\n\nimport { ZodType } from '../constants.js';\n\n/**\n * Get the Zod type name from a schema (Zod v4 uses _def.type)\n */\nexport function getZodTypeName(schema: z.ZodTypeAny): string {\n const candidates = [\n (schema._def as any).type,\n (schema._def as any).typeName,\n (schema as any).type,\n ];\n const rawType = candidates.find((candidate) => typeof candidate === 'string') ?? '';\n\n const withoutPrefix = rawType.replace(/^Zod/i, '');\n const lower = withoutPrefix.toLowerCase();\n const mapped: Record<string, string> = {\n nativeenum: ZodType.NATIVE_ENUM,\n discriminatedunion: ZodType.DISCRIMINATED_UNION,\n };\n\n return mapped[lower] ?? lower;\n}\n\n/**\n * Check if a schema is a specific Zod type\n */\nexport function isZodType(schema: z.ZodTypeAny, typeName: string): boolean {\n return getZodTypeName(schema) === typeName;\n}\n\n/**\n * Unwrap a schema from optional/nullable/default/catch wrappers\n */\nexport function unwrapSchema(schema: z.ZodTypeAny): z.ZodTypeAny {\n const typeName = getZodTypeName(schema);\n\n if (typeName === ZodType.OPTIONAL || typeName === ZodType.NULLABLE) {\n return unwrapSchema((schema._def as any).innerType);\n }\n\n if (typeName === ZodType.DEFAULT) {\n return unwrapSchema((schema._def as any).innerType);\n }\n\n if (typeName === ZodType.CATCH) {\n return unwrapSchema((schema._def as any).innerType);\n }\n\n if (typeName === ZodType.READONLY) {\n return unwrapSchema((schema._def as any).innerType);\n }\n\n return schema;\n}\n\n/**\n * Check if value is a plain object (not Date, Array, Map, Set, etc.)\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) return false;\n if (Array.isArray(value)) return false;\n if (value instanceof Date) return false;\n if (value instanceof Map) return false;\n if (value instanceof Set) return false;\n if (value instanceof RegExp) return false;\n if (value instanceof Error) return false;\n if (ArrayBuffer.isView(value)) return false; // TypedArrays\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Check if value is an array-like object\n */\nexport function isArrayLike(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n const obj = value;\n return typeof obj['length'] === 'number' && obj['length'] >= 0;\n}\n\n/**\n * Check if value is iterable\n */\nexport function isIterable(value: unknown): value is Iterable<unknown> {\n if (value == null) return false;\n return typeof (value as any)[Symbol.iterator] === 'function';\n}\n",
|
|
10
|
+
"import * as z from 'zod';\n\nimport { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { tryParseCSV, tryParseJSON } from '../utilities/parsers.js';\nimport { isArrayLike, isPlainObject } from '../utilities/type-detection.js';\n\n/**\n * Coerce value to array with element type coercion\n */\nexport function coerceToArray(\n value: unknown,\n _elementSchema: z.ZodTypeAny,\n coerceElement: (v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): unknown[] {\n // null → empty array\n if (value === null) return [];\n\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Already an array\n if (Array.isArray(value)) {\n tracker.add(value);\n // Use for loop to preserve sparse arrays (holes)\n const result: unknown[] = [];\n for (let i = 0; i < value.length; i++) {\n if (i in value) {\n // Check for circular reference before coercing element\n if (canBeCircular(value[i]) && tracker.has(value[i])) {\n throwCircular();\n }\n result[i] = coerceElement(value[i], tracker);\n }\n // Leave holes as undefined (sparse)\n }\n return result;\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // String: try JSON, CSV, or single value\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → empty array\n if (trimmed === '') return [];\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (Array.isArray(json)) {\n return json.map((v) => coerceElement(v, tracker));\n }\n\n // Try CSV\n const csv = tryParseCSV(trimmed);\n if (csv) {\n return csv.map((v) => coerceElement(v, tracker));\n }\n\n // Single value\n return [coerceElement(trimmed, tracker)];\n }\n\n // Set → array\n if (value instanceof Set) {\n return Array.from(value).map((v) => coerceElement(v, tracker));\n }\n\n // Map → array of values\n if (value instanceof Map) {\n return Array.from(value.values()).map((v) => coerceElement(v, tracker));\n }\n\n // TypedArray → array\n if (ArrayBuffer.isView(value)) {\n return Array.from(value as any).map((v) => coerceElement(v, tracker));\n }\n\n // Array-like object → array\n if (isArrayLike(value)) {\n const obj = value as any;\n const length = obj.length;\n const result: unknown[] = [];\n for (let i = 0; i < length; i++) {\n if (i in obj) {\n result[i] = coerceElement(obj[i], tracker);\n }\n // Leave holes as undefined (sparse)\n }\n return result;\n }\n\n // Plain object → array of values\n if (isPlainObject(value)) {\n const values = Object.values(value);\n return values.map((v) => coerceElement(v, tracker));\n }\n\n // Single value → array with one element\n return [coerceElement(value, tracker)];\n}\n",
|
|
11
|
+
"/**\n * Try to extract a primitive value from an object using special methods\n * Priority: Symbol.toPrimitive > toJSON > toString > valueOf\n */\nexport function extractPrimitiveValue(\n value: unknown,\n hint: 'string' | 'number' | 'default' = 'default',\n): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n const obj = value as any;\n\n // Special case: Date objects should use toJSON (ISO string) for consistency\n if (value instanceof Date && typeof obj.toJSON === 'function') {\n try {\n return obj.toJSON();\n } catch {\n // Continue to next method\n }\n }\n\n // 1. Symbol.toPrimitive (highest priority for non-Date objects)\n if (Symbol.toPrimitive in obj) {\n try {\n return obj[Symbol.toPrimitive](hint);\n } catch {\n // Continue to next method\n }\n }\n\n // 2. toJSON\n if (typeof obj.toJSON === 'function') {\n try {\n return obj.toJSON();\n } catch {\n // Continue to next method\n }\n }\n\n // 3. toString (prefer for string hint)\n if (hint === 'string' && typeof obj.toString === 'function') {\n try {\n const result = obj.toString();\n if (result !== '[object Object]') {\n return result;\n }\n } catch {\n // Continue to next method\n }\n }\n\n // 4. valueOf\n if (typeof obj.valueOf === 'function') {\n try {\n const result = obj.valueOf();\n if (result !== obj) {\n // valueOf returned a primitive\n return result;\n }\n } catch {\n // Continue to next method\n }\n }\n\n // 5. toString as fallback\n if (hint !== 'string' && typeof obj.toString === 'function') {\n try {\n const result = obj.toString();\n if (result !== '[object Object]') {\n return result;\n }\n } catch {\n // Continue\n }\n }\n\n return value;\n}\n\n/**\n * Check if object has a specific special method\n */\nexport function hasSpecialMethod(value: unknown, method: string): boolean {\n if (typeof value !== 'object' || value === null) return false;\n return typeof (value as any)[method] === 'function';\n}\n\n/**\n * Try to get a Date value from an object using getTime() or toISOString()\n */\nexport function extractDateValue(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value !== 'object' || value === null) return null;\n\n const obj = value as any;\n\n // Try getTime() method\n if (typeof obj.getTime === 'function') {\n try {\n const time = obj.getTime();\n if (typeof time === 'number' && !isNaN(time)) {\n return new Date(time);\n }\n } catch {\n // Continue\n }\n }\n\n // Try toISOString() method\n if (typeof obj.toISOString === 'function') {\n try {\n const iso = obj.toISOString();\n const date = new Date(iso);\n if (!isNaN(date.getTime())) {\n return date;\n }\n } catch {\n // Continue\n }\n }\n\n return null;\n}\n",
|
|
12
|
+
"import { tryParseJSON } from '../utilities/parsers.js';\nimport { extractPrimitiveValue } from '../utilities/special-methods.js';\n\n/**\n * Coerce any value to BigInt\n */\nexport function coerceToBigInt(value: unknown): bigint {\n // Already a BigInt\n if (typeof value === 'bigint') return value;\n\n // Function/Symbol cannot be coerced to BigInt\n if (typeof value === 'function') {\n throw new Error('Cannot convert function to BigInt');\n }\n if (typeof value === 'symbol') {\n throw new Error('Cannot convert symbol to BigInt');\n }\n\n // Number\n if (typeof value === 'number') {\n // NaN, Infinity not allowed\n if (!isFinite(value)) {\n throw new Error('Cannot convert NaN or Infinity to BigInt');\n }\n\n // Truncate to integer\n return BigInt(Math.trunc(value));\n }\n\n // Boolean\n if (typeof value === 'boolean') return value ? 1n : 0n;\n\n // String\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → 0n\n if (trimmed === '') return 0n;\n\n // Try parsing as BigInt\n try {\n return BigInt(trimmed);\n } catch {\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (json !== null) {\n return coerceToBigInt(json);\n }\n\n throw new Error(`Cannot convert \"${trimmed}\" to BigInt`);\n }\n }\n\n // Array\n if (Array.isArray(value)) {\n // Empty array → 0n\n if (value.length === 0) return 0n;\n\n // Single or multiple elements → coerce first element\n return coerceToBigInt(value[0]);\n }\n\n // null/undefined\n if (value === null) return 0n;\n if (value === undefined) {\n throw new Error('Cannot convert undefined to BigInt');\n }\n\n // Try special methods\n const extracted = extractPrimitiveValue(value, 'number');\n if (typeof extracted === 'bigint') return extracted;\n if (typeof extracted !== 'object' || extracted === null) {\n return coerceToBigInt(extracted);\n }\n\n throw new Error('Cannot convert object to BigInt');\n}\n",
|
|
13
|
+
"import { FALSY_STRINGS, TRUTHY_STRINGS } from '../constants.js';\nimport { normalizeString } from '../utilities/parsers.js';\nimport { extractPrimitiveValue } from '../utilities/special-methods.js';\n\n/**\n * Coerce any value to boolean\n */\nexport function coerceToBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'function' || typeof value === 'symbol') {\n return true;\n }\n\n if (value === null || value === undefined) {\n return false;\n }\n\n if (typeof value === 'number') {\n if (value === 0 || Object.is(value, -0) || isNaN(value)) {\n return false;\n }\n return true;\n }\n\n if (typeof value === 'bigint') {\n return value !== 0n;\n }\n\n if (typeof value === 'string') {\n const normalized = normalizeString(value);\n if (normalized === '') {\n return false;\n }\n if (TRUTHY_STRINGS.includes(normalized)) {\n return true;\n }\n if (FALSY_STRINGS.includes(normalized)) {\n return false;\n }\n throw new Error(`Cannot coerce string \"${value}\" to boolean`);\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return false;\n }\n if (value.length === 1) {\n return coerceToBoolean(value[0]);\n }\n return true;\n }\n\n const extracted = extractPrimitiveValue(value, 'default');\n if (typeof extracted === 'boolean') {\n return extracted;\n }\n if (typeof extracted !== 'object' || extracted === null) {\n return coerceToBoolean(extracted);\n }\n return Object.keys(value as Record<string, unknown>).length > 0;\n}\n",
|
|
14
|
+
"import { tryParseJSON, tryParseNumber } from '../utilities/parsers.js';\nimport { extractPrimitiveValue } from '../utilities/special-methods.js';\n\n/**\n * Coerce any value to number\n */\nexport function coerceToNumber(value: unknown): number {\n // Already a number\n if (typeof value === 'number') return value;\n\n // Functions and Symbols → NaN (avoid recursion and throws)\n if (typeof value === 'function') return NaN;\n if (typeof value === 'symbol') return NaN;\n\n // null → 0\n if (value === null) return 0;\n\n // undefined → NaN\n if (value === undefined) return NaN;\n\n // Boolean\n if (typeof value === 'boolean') return value ? 1 : 0;\n\n // BigInt\n if (typeof value === 'bigint') {\n // Convert to number, may lose precision for large values\n return Number(value);\n }\n\n // String\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → 0 (matches JavaScript Number('') behavior)\n if (trimmed === '') return 0;\n\n // \"NaN\" → NaN\n if (trimmed.toLowerCase() === 'nan') return NaN;\n\n // \"Infinity\" → Infinity\n if (trimmed === 'Infinity') return Infinity;\n if (trimmed === '-Infinity') return -Infinity;\n\n // Try parsing special formats (hex, octal, binary)\n const parsed = tryParseNumber(trimmed);\n if (parsed !== null) return parsed;\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (typeof json === 'number') return json;\n\n // Non-numeric string → NaN (matches JavaScript Number('abc') behavior)\n return NaN;\n }\n\n // Array\n if (Array.isArray(value)) {\n // Empty array → 0 (matches JavaScript Number([]) behavior)\n if (value.length === 0) return 0;\n\n // Single element → coerce that element\n if (value.length === 1) return coerceToNumber(value[0]);\n\n // Multiple elements → first element (JavaScript coerces to string first, then NaN)\n return coerceToNumber(value[0]);\n }\n\n // Date\n if (value instanceof Date) {\n return value.getTime();\n }\n\n // Try special methods\n const extracted = extractPrimitiveValue(value, 'number');\n if (typeof extracted === 'number') return extracted;\n if (typeof extracted !== 'object' || extracted === null) {\n return coerceToNumber(extracted);\n }\n\n // Object → NaN\n return NaN;\n}\n\n/**\n * Coerce value to integer (truncate decimal)\n */\nexport function coerceToInteger(value: unknown): number {\n const num = coerceToNumber(value);\n\n // NaN, Infinity stay as is\n if (!isFinite(num)) return num;\n\n // Truncate to integer\n const truncated = Math.trunc(num);\n\n // Clamp to MAX_SAFE_INTEGER range (Zod v4's z.int() requires safe integers)\n if (truncated > Number.MAX_SAFE_INTEGER) return Number.MAX_SAFE_INTEGER;\n if (truncated < Number.MIN_SAFE_INTEGER) return Number.MIN_SAFE_INTEGER;\n\n // Handle -0 (convert to +0)\n if (Object.is(truncated, -0)) return 0;\n\n return truncated;\n}\n\n/**\n * Coerce value to int32 (with wrapping)\n */\nexport function coerceToInt32(value: unknown): number {\n const num = coerceToNumber(value);\n\n // Use bitwise OR to convert to int32 with wrapping\n return num | 0;\n}\n",
|
|
15
|
+
"import { tryParseJSON } from '../utilities/parsers.js';\nimport { extractDateValue } from '../utilities/special-methods.js';\nimport { coerceToNumber } from './number.js';\n\n/**\n * Coerce any value to Date\n */\nexport function coerceToDate(value: unknown): Date {\n // Already a Date\n if (value instanceof Date) return value;\n\n // Try special date methods (getTime, toISOString)\n const extracted = extractDateValue(value);\n if (extracted) return extracted;\n\n // Number: treat as timestamp (milliseconds)\n if (typeof value === 'number') {\n return new Date(value);\n }\n\n // BigInt: treat as timestamp\n if (typeof value === 'bigint') {\n return new Date(Number(value));\n }\n\n // String: try parsing\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → Invalid Date\n if (trimmed === '') return new Date(NaN);\n\n // Try ISO 8601, RFC 2822, etc.\n const parsed = new Date(trimmed);\n if (!isNaN(parsed.getTime())) return parsed;\n\n // Try parsing as number (unix timestamp)\n const num = Number(trimmed);\n if (!isNaN(num)) {\n // If < 10000000000, might be seconds instead of milliseconds\n if (num < 10000000000 && num > 0) {\n return new Date(num * 1000);\n }\n return new Date(num);\n }\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (json !== null) {\n return coerceToDate(json);\n }\n\n return new Date(NaN);\n }\n\n // Array: try [year, month, day, hour, minute, second, ms]\n if (Array.isArray(value)) {\n if (value.length === 0) return new Date(NaN);\n\n // Single element: timestamp (but not if it's a nested array)\n if (value.length === 1) {\n if (Array.isArray(value[0])) {\n // Nested array - can't coerce\n return new Date(NaN);\n }\n return coerceToDate(value[0]);\n }\n\n // Multiple elements: date components\n const parts = value.map(coerceToNumber);\n const [year, month = 0, day = 1, hour = 0, minute = 0, second = 0, ms = 0] = parts;\n\n return new Date(year as number, month, day, hour, minute, second, ms);\n }\n\n // Object: look for timestamp, year/month/day properties\n if (typeof value === 'object' && value !== null) {\n const obj = value as any;\n\n // Check for timestamp property\n if ('timestamp' in obj) {\n return coerceToDate(obj.timestamp);\n }\n\n // Check for year/month/day properties\n if ('year' in obj) {\n // Month is required when year is present (month is 1-indexed in object form)\n if (!('month' in obj)) {\n return new Date(NaN);\n }\n\n const year = coerceToNumber(obj.year);\n // Month is 1-indexed in object, but Date constructor expects 0-indexed\n const month = coerceToNumber(obj.month) - 1;\n const day = 'day' in obj ? coerceToNumber(obj.day) : 1;\n const hour = 'hour' in obj ? coerceToNumber(obj.hour) : 0;\n const minute = 'minute' in obj ? coerceToNumber(obj.minute) : 0;\n const second = 'second' in obj ? coerceToNumber(obj.second) : 0;\n const ms = 'millisecond' in obj ? coerceToNumber(obj.millisecond) : 0;\n\n return new Date(year, month, day, hour, minute, second, ms);\n }\n\n // Check for 'date' string property\n if ('date' in obj && typeof obj.date === 'string') {\n return coerceToDate(obj.date);\n }\n }\n\n // Try coercing to number as fallback\n const num = coerceToNumber(value);\n if (!isNaN(num)) {\n return new Date(num);\n }\n\n // If number coercion failed, try string coercion (for objects with toString)\n if (typeof value === 'object' && value !== null) {\n const obj = value as any;\n if (typeof obj.toString === 'function') {\n try {\n const str = obj.toString();\n if (str && str !== '[object Object]') {\n return coerceToDate(str);\n }\n } catch {\n // Continue to fallback\n }\n }\n }\n\n return new Date(NaN);\n}\n",
|
|
16
|
+
"import * as z from 'zod';\n\nimport { CircularTracker } from '../utilities/circular.js';\nimport { normalizeString } from '../utilities/parsers.js';\nimport { isPlainObject } from '../utilities/type-detection.js';\nimport { coerceToNumber } from './number.js';\n\n/**\n * Coerce value to discriminated union (intelligently matches based on discriminator)\n */\nexport function coerceToDiscriminatedUnion(\n value: unknown,\n discriminatorKey: string,\n options: z.ZodTypeAny[],\n coerceOption: (index: number, v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): unknown {\n // Must be an object to have a discriminator\n if (!isPlainObject(value)) {\n throw new Error('Discriminated union requires an object');\n }\n\n const obj = value;\n\n // Get discriminator value\n if (!(discriminatorKey in obj)) {\n throw new Error(`Missing discriminator key: ${discriminatorKey}`);\n }\n\n const discriminatorValue = obj[discriminatorKey];\n\n // Extract expected discriminator values from options\n const optionDiscriminators: any[] = [];\n for (const option of options) {\n // Each option should be an object schema with the discriminator as a literal\n // In Zod v4, use _def.type instead of _def.typeName\n const optionType = (option._def as any).type || (option._def as any).typeName;\n if (optionType === 'object') {\n // In Zod v4, shape is a getter function\n const shape =\n typeof (option._def as any).shape === 'function'\n ? (option._def as any).shape()\n : (option._def as any).shape;\n if (discriminatorKey in shape) {\n const discriminatorSchema = shape[discriminatorKey];\n const discriminatorType =\n discriminatorSchema._def.type || discriminatorSchema._def.typeName;\n if (discriminatorType === 'literal') {\n // In Zod v4, literal values are in _def.values array\n const value = discriminatorSchema._def.values\n ? discriminatorSchema._def.values[0]\n : discriminatorSchema._def.value;\n optionDiscriminators.push(value);\n }\n }\n }\n }\n\n // Try to match discriminator value (with coercion)\n for (let i = 0; i < optionDiscriminators.length; i++) {\n const expected = optionDiscriminators[i];\n\n // Exact match\n if (discriminatorValue === expected) {\n try {\n return coerceOption(i, value, tracker);\n } catch {\n // Continue to next option\n }\n }\n\n // String matching (case-insensitive)\n if (typeof expected === 'string' && typeof discriminatorValue === 'string') {\n if (normalizeString(expected) === normalizeString(discriminatorValue)) {\n try {\n // Update discriminator value to match expected case\n const updated = { ...obj, [discriminatorKey]: expected };\n return coerceOption(i, updated, tracker);\n } catch {\n // Continue to next option\n }\n }\n }\n\n // Number matching (with coercion)\n if (typeof expected === 'number') {\n const coerced = coerceToNumber(discriminatorValue);\n if (coerced === expected) {\n try {\n const updated = { ...obj, [discriminatorKey]: expected };\n return coerceOption(i, updated, tracker);\n } catch {\n // Continue to next option\n }\n }\n }\n }\n\n throw new Error(\n `No matching discriminated union option for discriminator: ${discriminatorValue}`,\n );\n}\n",
|
|
17
|
+
"import { normalizeString } from '../utilities/parsers.js';\nimport { coerceToNumber } from './number.js';\n\n/**\n * Coerce value to enum (case-insensitive string matching, numeric index support)\n */\nexport function coerceToEnum(\n value: unknown,\n enumValues: readonly any[],\n enumEntries?: any,\n): any {\n // Handle null/undefined - check if \"null\"/\"undefined\" is in enum values\n if (value === null) {\n // Check if \"null\" is an enum value\n for (const enumValue of enumValues) {\n if (enumValue === 'null' || enumValue === null) {\n return enumValue;\n }\n }\n throw new Error(`Cannot coerce null to enum`);\n }\n\n if (value === undefined) {\n // Check if \"undefined\" is an enum value\n for (const enumValue of enumValues) {\n if (enumValue === 'undefined' || enumValue === undefined) {\n return enumValue;\n }\n }\n throw new Error(`Cannot coerce undefined to enum`);\n }\n\n // Handle arrays - extract first element, or numeric index\n const isValidEnumIndex = (input: number): boolean =>\n Number.isInteger(input) && input >= 0 && input < enumValues.length;\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`Cannot coerce empty array to enum`);\n }\n\n const first = value[0];\n if (typeof first === 'number' && isValidEnumIndex(first)) {\n return enumValues[first];\n }\n\n if (value.length >= 1) return coerceToEnum(first, enumValues, enumEntries);\n }\n\n // If enumEntries is provided (for numeric enums), check if value is a key FIRST\n // This handles cases like \"Red\" → 0 for numeric enums\n if (enumEntries && typeof value === 'string') {\n // Check for exact key match first\n if (value in enumEntries) {\n const result = enumEntries[value];\n // Return if it's a valid enum value (not a reverse mapping)\n if (enumValues.includes(result)) {\n return result;\n }\n }\n\n // Check for case-insensitive key match\n const normalized = normalizeString(value);\n for (const key of Object.keys(enumEntries)) {\n if (normalizeString(key) === normalized) {\n const result = enumEntries[key];\n // Return if it's a valid enum value (not a reverse mapping)\n if (enumValues.includes(result)) {\n return result;\n }\n }\n }\n }\n\n // Check if value matches any enum value (case-insensitive for strings)\n for (const enumValue of enumValues) {\n if (typeof enumValue === 'string' && typeof value === 'string') {\n if (normalizeString(enumValue) === normalizeString(value)) {\n return enumValue;\n }\n } else if (enumValue === value) {\n return enumValue;\n }\n }\n\n // Try numeric index coercion (but only for string/mixed enums, not pure numeric enums)\n // For numeric enums (where all values are numbers), don't use array indexing\n const allNumeric = enumValues.every((v) => typeof v === 'number');\n\n if (!allNumeric && (typeof value === 'number' || typeof value === 'boolean')) {\n const index = typeof value === 'boolean' ? (value ? 1 : 0) : value;\n if (Number.isInteger(index) && index >= 0 && index < enumValues.length) {\n return enumValues[index];\n }\n }\n\n // Try converting string to number for index or direct value match (but skip empty strings)\n if (typeof value === 'string' && value.trim() !== '') {\n const num = coerceToNumber(value);\n if (!isNaN(num)) {\n // First check if the numeric value is directly in the enum\n if (enumValues.includes(num)) {\n return num;\n }\n\n // Otherwise try as array index (but not for pure numeric enums)\n if (!allNumeric && isValidEnumIndex(num)) return enumValues[num]!;\n }\n }\n\n // Try BigInt to index (but not for pure numeric enums)\n if (!allNumeric && typeof value === 'bigint') {\n const num = Number(value);\n if (Number.isInteger(num) && num >= 0 && num < enumValues.length) {\n return enumValues[num];\n }\n }\n\n throw new Error(`Cannot coerce value to enum`);\n}\n\n/**\n * Coerce value to native enum\n */\nexport function coerceToNativeEnum(value: unknown, enumObj: any): any {\n // Get all enum values\n const enumValues = Object.values(enumObj);\n\n // Try direct match first\n if (enumValues.includes(value)) {\n return value;\n }\n\n // Case-insensitive string matching\n if (typeof value === 'string') {\n const normalized = normalizeString(value);\n for (const [key, val] of Object.entries(enumObj)) {\n if (!isNumericKey(key) && normalizeString(key) === normalized) {\n return val;\n }\n }\n }\n\n // Numeric matching\n if (typeof value === 'number' || typeof value === 'string') {\n const num = typeof value === 'number' ? value : coerceToNumber(value);\n if (!isNaN(num) && enumValues.includes(num)) {\n return num;\n }\n }\n\n throw new Error('Cannot coerce value to native enum');\n}\n\nfunction isNumericKey(key: string): boolean {\n if (key === '') return false;\n return !Number.isNaN(Number(key));\n}\n",
|
|
18
|
+
"import * as z from 'zod';\n\nimport { CircularTracker } from '../utilities/circular.js';\n\n/**\n * Coerce value to intersection (must satisfy both types)\n * Strategy: Try to coerce to a value that satisfies both schemas\n */\nexport function coerceToIntersection(\n value: unknown,\n left: z.ZodTypeAny,\n right: z.ZodTypeAny,\n coerceLeft: (v: unknown, tracker: CircularTracker) => unknown,\n coerceRight: (v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): unknown {\n // Check if both types are objects - if so, coerce as merged object\n const leftTypeName = (left._def as any).type || (left._def as any).typeName;\n const rightTypeName = (right._def as any).type || (right._def as any).typeName;\n\n // Handle nested intersections or objects\n const leftIsObjectLike = leftTypeName === 'object' || leftTypeName === 'intersection';\n const rightIsObjectLike =\n rightTypeName === 'object' || rightTypeName === 'intersection';\n\n if (leftIsObjectLike && rightIsObjectLike) {\n // Both are objects or intersections, coerce with left first, then right\n const leftResult = coerceLeft(value, tracker);\n return coerceRight(leftResult, tracker);\n }\n\n // For record & object intersections\n if (\n (leftTypeName === 'record' && rightTypeName === 'object') ||\n (leftTypeName === 'object' && rightTypeName === 'record')\n ) {\n // Coerce with both - record first for all props, then object for specific props\n const leftResult = coerceLeft(value, tracker);\n return coerceRight(leftResult, tracker);\n }\n\n // For union intersections (e.g., intersection of two unions), try to find common type\n // Example: intersection(union[string, number], union[number, boolean]) = number\n if (leftTypeName === 'union' && rightTypeName === 'union') {\n // Try coercing with left first, then validate with right\n const leftResult = coerceLeft(value, tracker);\n\n // Check if the coerced result would validate with right schema\n const rightValidation = right.safeParse(leftResult);\n if (rightValidation.success) {\n return leftResult;\n }\n\n // Try the other direction\n const rightResult = coerceRight(value, tracker);\n const leftValidation = left.safeParse(rightResult);\n if (leftValidation.success) {\n return rightResult;\n }\n\n // Neither worked, return the value and let Zod validation fail\n return value;\n }\n\n // For literal & string intersections - coerce to the literal value\n if (\n (leftTypeName === 'literal' && rightTypeName === 'string') ||\n (leftTypeName === 'string' && rightTypeName === 'literal')\n ) {\n // Get the literal value (Zod v4 uses _def.values array)\n const literalSchema = leftTypeName === 'literal' ? left : right;\n const literalValues = (literalSchema._def as any).values;\n const literalValue = Array.isArray(literalValues) ? literalValues[0] : literalValues;\n\n // If value is a string, try to coerce to the literal value\n if (typeof value === 'string' && typeof literalValue === 'string') {\n // Case-insensitive match\n if (value.toLowerCase() === literalValue.toLowerCase()) {\n return literalValue;\n }\n }\n\n return value;\n }\n\n // For string & object intersections (e.g., string with length property)\n // JavaScript strings already have a length property, so just return the value\n // But Zod v4 won't accept this, so we can't do much here\n if (\n (leftTypeName === 'string' && rightTypeName === 'object') ||\n (leftTypeName === 'object' && rightTypeName === 'string')\n ) {\n // Just return the value - Zod v4 will reject this anyway\n return value;\n }\n\n // For array & object intersections\n if (\n (leftTypeName === 'array' && rightTypeName === 'object') ||\n (leftTypeName === 'object' && rightTypeName === 'array')\n ) {\n // Just return the value\n return value;\n }\n\n // For other cases, just return the value unchanged\n return value;\n}\n",
|
|
19
|
+
"import { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { extractPrimitiveValue } from '../utilities/special-methods.js';\nimport { isPlainObject } from '../utilities/type-detection.js';\n\n/**\n * Coerce any value to string\n */\nexport function coerceToString(value: unknown, tracker = new CircularTracker()): string {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Already a string\n if (typeof value === 'string') return value;\n\n // null/undefined → empty string\n if (value === null) return '';\n if (value === undefined) return '';\n\n // Skip extractPrimitiveValue for collections we handle specially\n const skipExtract =\n Array.isArray(value) ||\n value instanceof Set ||\n value instanceof Map ||\n ArrayBuffer.isView(value);\n\n // Try special methods first (but not for collections)\n if (!skipExtract) {\n const extracted = extractPrimitiveValue(value, 'string');\n if (typeof extracted === 'string') return extracted;\n if (typeof extracted !== 'object' || extracted === null) {\n return String(extracted);\n }\n // If extracted is an object (e.g., toJSON returned an object), recursively coerce it\n if (extracted !== value) {\n return coerceToString(extracted, tracker);\n }\n }\n\n // Mark as seen for circular tracking\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // BigInt\n if (typeof value === 'bigint') return (value as any).toString();\n\n // Symbol\n if (typeof value === 'symbol') return (value as any).toString();\n\n // Function\n if (typeof value === 'function') return value.toString();\n\n // RegExp\n if (value instanceof RegExp) return value.toString();\n\n // Error\n if (value instanceof Error) return value.message || value.toString();\n\n // Array - JOIN WITH COMMA AND SPACE\n if (Array.isArray(value)) {\n // Check if array has custom toString method\n if (value.toString !== Array.prototype.toString) {\n return value.toString();\n }\n\n return value\n .map((v) => {\n // For nested arrays, use JSON representation to preserve structure\n if (Array.isArray(v)) {\n return JSON.stringify(v).replace(/,/g, ', ');\n }\n // For nested objects (not Date/RegExp/Error), use String() to get \"[object Object]\"\n if (\n typeof v === 'object' &&\n v !== null &&\n !(v instanceof Date) &&\n !(v instanceof RegExp) &&\n !(v instanceof Error)\n ) {\n return String(v);\n }\n return coerceToString(v, tracker);\n })\n .join(', ');\n }\n\n // Map - JOIN WITH COMMA AND SPACE\n if (value instanceof Map) {\n const entries = Array.from(value.entries());\n return entries\n .map(([k, v]) => `${coerceToString(k, tracker)}: ${coerceToString(v, tracker)}`)\n .join(', ');\n }\n\n // Set - JOIN WITH COMMA AND SPACE\n if (value instanceof Set) {\n return Array.from(value)\n .map((v) => coerceToString(v, tracker))\n .join(', ');\n }\n\n // TypedArrays - JOIN WITH COMMA AND SPACE\n if (ArrayBuffer.isView(value)) {\n return Array.from(value as any).join(', ');\n }\n\n // Plain object - JOIN WITH COMMA AND SPACE\n return isPlainObject(value) ? formatPlainObject(value, tracker) : String(value);\n}\n\nfunction formatPlainObject(\n value: Record<string, unknown>,\n tracker: CircularTracker,\n): string {\n return Object.entries(value)\n .filter(([_, v]) => v !== null && v !== undefined && v !== '')\n .map(([k, v]) => {\n if (typeof v === 'object' && v !== null && tracker.has(v)) {\n throwCircular();\n }\n if (\n typeof v === 'object' &&\n v !== null &&\n !(v instanceof Date) &&\n !(v instanceof RegExp) &&\n !(v instanceof Error)\n ) {\n return `${k}: ${String(v)}`;\n }\n return `${k}: ${coerceToString(v, tracker)}`;\n })\n .join(', ');\n}\n",
|
|
20
|
+
"import { isFalsyForNull, normalizeString } from '../utilities/parsers.js';\nimport { coerceToBigInt } from './bigint.js';\nimport { coerceToBoolean } from './boolean.js';\nimport { coerceToNumber } from './number.js';\nimport { coerceToString } from './string.js';\n\n/**\n * Coerce value to literal (with type-specific coercion)\n */\nexport function coerceToLiteral(value: unknown, literalValue: any): any {\n // Exact match\n if (value === literalValue) return literalValue;\n\n // String literals: case-insensitive, whitespace-trimmed\n if (typeof literalValue === 'string') {\n // Special case: null coerces to empty string literal\n if (literalValue === '' && value === null) {\n return literalValue;\n }\n const coerced = coerceToString(value);\n if (normalizeString(coerced) === normalizeString(literalValue)) {\n return literalValue;\n }\n }\n\n // Number literals: try coercing to number\n if (typeof literalValue === 'number') {\n const coerced = coerceToNumber(value);\n const matchesNumber =\n coerced === literalValue || (isNaN(coerced) && isNaN(literalValue));\n const matchesSignedZero = Object.is(coerced, literalValue);\n if (matchesNumber || matchesSignedZero) {\n return literalValue;\n }\n }\n\n // Boolean literals: try coercing to boolean\n if (typeof literalValue === 'boolean') {\n const coerced = coerceToBoolean(value);\n if (coerced === literalValue) {\n return literalValue;\n }\n }\n\n // BigInt literals: try coercing to bigint\n if (typeof literalValue === 'bigint') {\n try {\n const coerced = coerceToBigInt(value);\n if (coerced === literalValue) {\n return literalValue;\n }\n } catch {\n // Can't coerce to bigint\n }\n }\n\n // Null literal: use falsy check\n if (literalValue === null) {\n if (isFalsyForNull(value)) {\n return null;\n }\n }\n\n throw new Error(`Cannot coerce value to literal ${literalValue}`);\n}\n",
|
|
21
|
+
"import * as z from 'zod';\n\nimport { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { tryParseCSV, tryParseJSON } from '../utilities/parsers.js';\nimport { isPlainObject } from '../utilities/type-detection.js';\n\n/**\n * Coerce value to Map with key and value type coercion\n */\nexport function coerceToMap(\n value: unknown,\n keySchema: z.ZodTypeAny,\n valueSchema: z.ZodTypeAny,\n coerceKey: (v: unknown, tracker: CircularTracker) => unknown,\n coerceValue: (v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): Map<unknown, unknown> {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // Already a Map\n if (value instanceof Map) {\n const result = new Map();\n for (const [k, v] of value.entries()) {\n result.set(coerceKey(k, tracker), coerceValue(v, tracker));\n }\n return result;\n }\n\n // Object → Map\n if (isPlainObject(value)) {\n const result = new Map();\n for (const [k, v] of Object.entries(value)) {\n result.set(coerceKey(k, tracker), coerceValue(v, tracker));\n }\n return result;\n }\n\n // Array of [key, value] pairs → Map\n if (Array.isArray(value)) {\n if (value.every((item) => Array.isArray(item) && item.length === 2)) {\n const result = new Map();\n for (const [k, v] of value) {\n result.set(coerceKey(k, tracker), coerceValue(v, tracker));\n }\n return result;\n }\n\n throw new Error('Cannot convert non-pair array to Map');\n }\n\n if (typeof value === 'string')\n return coerceMapFromString(\n value,\n keySchema,\n valueSchema,\n coerceKey,\n coerceValue,\n tracker,\n );\n\n throw new Error('Cannot convert value to Map');\n}\n\n/**\n * Coerce value to Set with element type coercion\n */\nexport function coerceToSet(\n value: unknown,\n elementSchema: z.ZodTypeAny,\n coerceElement: (v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): Set<unknown> {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // Already a Set\n if (value instanceof Set) {\n const result = new Set();\n for (const item of value) {\n result.add(coerceElement(item, tracker));\n }\n return result;\n }\n\n // Array → Set (with deduplication)\n if (Array.isArray(value)) {\n const result = new Set();\n for (const item of value) {\n result.add(coerceElement(item, tracker));\n }\n return result;\n }\n\n if (typeof value === 'string')\n return coerceSetFromString(value, elementSchema, coerceElement, tracker);\n\n // Object values → Set\n if (isPlainObject(value)) {\n const result = new Set();\n for (const val of Object.values(value)) {\n result.add(coerceElement(val, tracker));\n }\n return result;\n }\n\n throw new Error('Cannot convert value to Set');\n}\n\nfunction coerceMapFromString(\n raw: string,\n keySchema: z.ZodTypeAny,\n valueSchema: z.ZodTypeAny,\n coerceKey: (v: unknown, tracker: CircularTracker) => unknown,\n coerceValue: (v: unknown, tracker: CircularTracker) => unknown,\n tracker: CircularTracker,\n): Map<unknown, unknown> {\n const json = tryParseJSON(raw);\n if (json === null) {\n throw new Error('Cannot convert string to Map');\n }\n return coerceToMap(json, keySchema, valueSchema, coerceKey, coerceValue, tracker);\n}\n\nfunction coerceSetFromString(\n raw: string,\n elementSchema: z.ZodTypeAny,\n coerceElement: (v: unknown, tracker: CircularTracker) => unknown,\n tracker: CircularTracker,\n): Set<unknown> {\n const trimmed = raw.trim();\n\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n const json = tryParseJSON(trimmed);\n if (!Array.isArray(json)) {\n throw new Error('Cannot convert string to Set');\n }\n return coerceToSet(json, elementSchema, coerceElement, tracker);\n }\n\n const csv = tryParseCSV(trimmed);\n if (csv) {\n const result = new Set();\n for (const item of csv) {\n result.add(coerceElement(item, tracker));\n }\n return result;\n }\n\n throw new Error('Cannot convert string to Set');\n}\n",
|
|
22
|
+
"/**\n * Coerce value to NaN (only accepts values that should be NaN)\n */\nexport function coerceToNaN(value: unknown): number {\n // Already NaN\n if (typeof value === 'number' && isNaN(value)) return NaN;\n\n // undefined → NaN\n if (value === undefined) return NaN;\n\n // Functions and Symbols → NaN (align with Number(fn) => NaN; Number(symbol) throws, treat as NaN)\n if (typeof value === 'function') return NaN;\n if (typeof value === 'symbol') return NaN;\n\n // String \"NaN\" or \"nan\"\n if (typeof value === 'string') {\n const trimmed = value.trim().toLowerCase();\n if (trimmed === 'nan') return NaN;\n\n // Try parsing as number, if it results in NaN, return NaN\n const num = Number(trimmed);\n if (isNaN(num)) return NaN;\n\n // Valid number → throw\n throw new Error('Cannot coerce valid number to NaN');\n }\n\n // Array/object → try converting to number, if NaN return NaN\n if (Array.isArray(value) || typeof value === 'object') {\n const num = Number(value as any);\n if (isNaN(num)) return NaN;\n\n throw new Error('Cannot coerce valid value to NaN');\n }\n\n // Actual number (not NaN) → throw\n throw new Error('Cannot coerce valid value to NaN');\n}\n",
|
|
23
|
+
"import { isFalsyForNull } from '../utilities/parsers.js';\n\n/**\n * Coerce falsy values to null\n */\nexport function coerceToNull(value: unknown): null {\n // Already null\n if (value === null) return null;\n\n // Check if value is falsy for null coercion\n if (isFalsyForNull(value)) return null;\n\n // Non-falsy value → throw\n throw new Error('Cannot coerce non-falsy value to null');\n}\n",
|
|
24
|
+
"import * as z from 'zod';\n\nimport { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { tryParseJSON } from '../utilities/parsers.js';\nimport { extractPrimitiveValue } from '../utilities/special-methods.js';\nimport { isPlainObject } from '../utilities/type-detection.js';\n\n/**\n * Coerce value to object with property type coercion\n */\nexport function coerceToObject(\n value: unknown,\n shape: z.ZodRawShape,\n coerceProperty: (key: string, v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): Record<string, unknown> {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // Already a plain object\n if (isPlainObject(value)) {\n // Try special methods (toJSON, etc.) for plain objects\n const extracted = extractPrimitiveValue(value, 'default');\n if (extracted !== value) {\n // Special method returned something different, try coercing that\n return coerceToObject(extracted, shape, coerceProperty, tracker);\n }\n\n // Process as normal object\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = coerceProperty(key, val, tracker);\n }\n return result;\n }\n\n // String: try JSON parsing\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → empty object\n if (trimmed === '') return {};\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (isPlainObject(json)) {\n return coerceToObject(json, shape, coerceProperty, tracker);\n }\n\n // Can't convert string to object\n throw new Error('Cannot convert string to object');\n }\n\n // Array → object (check before other object types to avoid toString coercion)\n if (Array.isArray(value)) {\n // Empty array → empty object\n if (value.length === 0) return {};\n\n // Array of [key, value] pairs → object\n if (value.every((item) => Array.isArray(item) && item.length === 2)) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of value) {\n const keyStr = String(key);\n result[keyStr] = coerceProperty(keyStr, val, tracker);\n }\n return result;\n }\n\n // Convert to object with numeric keys\n const result: Record<string, unknown> = {};\n value.forEach((val, i) => {\n const key = String(i);\n result[key] = coerceProperty(key, val, tracker);\n });\n return result;\n }\n\n // Map → object\n if (value instanceof Map) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of value.entries()) {\n const keyStr = String(key);\n result[keyStr] = coerceProperty(keyStr, val, tracker);\n }\n return result;\n }\n\n // Set → object with numeric indices\n if (value instanceof Set) {\n const result: Record<string, unknown> = {};\n let index = 0;\n for (const val of value) {\n const key = String(index);\n result[key] = coerceProperty(key, val, tracker);\n index++;\n }\n return result;\n }\n\n // null/undefined → empty object\n if (value === null || value === undefined) return {};\n\n // Other object types (Date, RegExp, etc.) → can't convert\n if (typeof value === 'object') {\n // Try to convert to plain object by enumerating properties\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = coerceProperty(key, (value as any)[key], tracker);\n }\n return result;\n }\n\n throw new Error('Cannot convert primitive to object');\n}\n",
|
|
25
|
+
"import * as z from 'zod';\n\nimport { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { tryParseJSON } from '../utilities/parsers.js';\nimport { isPlainObject } from '../utilities/type-detection.js';\n\n/**\n * Coerce value to record (Record<K, V>) with value type coercion\n */\nexport function coerceToRecord(\n value: unknown,\n valueSchema: z.ZodTypeAny,\n coerceValue: (v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): Record<string, unknown> {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // Already a plain object\n if (isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[key] = coerceValue(val, tracker);\n }\n return result;\n }\n\n // String: try JSON parsing\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string → empty object\n if (trimmed === '') return {};\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (isPlainObject(json)) {\n return coerceToRecord(json, valueSchema, coerceValue, tracker);\n }\n\n throw new Error('Cannot convert string to record');\n }\n\n // Array → record\n if (Array.isArray(value)) {\n // Empty array → empty record\n if (value.length === 0) return {};\n\n // Check if all elements are [key, value] pairs\n if (value.every((item) => Array.isArray(item) && item.length === 2)) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of value) {\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[String(key)] = coerceValue(val, tracker);\n }\n return result;\n }\n\n // Convert array to record with numeric keys\n const result: Record<string, unknown> = {};\n value.forEach((val, index) => {\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[String(index)] = coerceValue(val, tracker);\n });\n return result;\n }\n\n // Map → record\n if (value instanceof Map) {\n const result: Record<string, unknown> = {};\n for (const [key, val] of value.entries()) {\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[String(key)] = coerceValue(val, tracker);\n }\n return result;\n }\n\n // Set → record with numeric indices\n if (value instanceof Set) {\n const result: Record<string, unknown> = {};\n let index = 0;\n for (const val of value) {\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[String(index)] = coerceValue(val, tracker);\n index++;\n }\n return result;\n }\n\n // null/undefined → empty record\n if (value === null || value === undefined) return {};\n\n // Other object types → try to enumerate\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n const val = (value as any)[key];\n // Check for circular reference before coercing value\n if (canBeCircular(val) && tracker.has(val)) {\n throwCircular();\n }\n result[key] = coerceValue(val, tracker);\n }\n return result;\n }\n\n throw new Error('Cannot convert primitive to record');\n}\n",
|
|
26
|
+
"import * as z from 'zod';\n\nimport { canBeCircular, CircularTracker, throwCircular } from '../utilities/circular.js';\nimport { tryParseCSV, tryParseJSON } from '../utilities/parsers.js';\nimport { isArrayLike } from '../utilities/type-detection.js';\n\n/**\n * Coerce value to tuple with element-specific type coercion\n */\nexport function coerceToTuple(\n value: unknown,\n items: z.ZodTypeAny[],\n coerceElement: (index: number, v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): unknown[] {\n // Check circular reference\n if (canBeCircular(value) && tracker.has(value)) {\n throwCircular();\n }\n\n // Already an array\n if (Array.isArray(value)) {\n tracker.add(value);\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n if (i < value.length) {\n result.push(coerceElement(i, value[i], tracker));\n } else {\n // Missing element, will be caught by Zod validation\n result.push(undefined);\n }\n }\n return result;\n }\n\n // Mark as seen\n if (canBeCircular(value)) {\n tracker.add(value);\n }\n\n // String: try JSON or CSV\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Empty string or 'null' -> empty tuple\n if (trimmed === '' || trimmed === 'null') {\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n result.push(undefined);\n }\n return result;\n }\n\n // Try JSON parsing\n const json = tryParseJSON(trimmed);\n if (Array.isArray(json)) {\n return coerceToTuple(json, items, coerceElement, tracker);\n }\n\n // Try CSV\n const csv = tryParseCSV(trimmed);\n if (csv) {\n return coerceToTuple(csv, items, coerceElement, tracker);\n }\n\n throw new Error('Cannot convert non-array string to tuple');\n }\n\n // null -> empty tuple\n if (value === null) {\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n result.push(undefined);\n }\n return result;\n }\n\n // Plain object (with or without length property)\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const obj = value as any;\n\n // Check if it's array-like (has length property)\n if (isArrayLike(value)) {\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n if (i in obj) {\n result.push(coerceElement(i, obj[i], tracker));\n } else {\n result.push(undefined);\n }\n }\n return result;\n }\n\n // Check if it has numeric keys matching tuple indices\n let hasNumericKeys = false;\n for (let i = 0; i < items.length; i++) {\n if (i in obj) {\n hasNumericKeys = true;\n break;\n }\n }\n\n if (hasNumericKeys)\n return items.map((_, i) =>\n i in obj ? coerceElement(i, obj[i], tracker) : undefined,\n );\n }\n\n throw new Error('Cannot convert non-array to tuple');\n}\n",
|
|
27
|
+
"import * as z from 'zod';\n\nimport { CircularTracker } from '../utilities/circular.js';\n\n/**\n * Coerce value to union (tries coercion in order, with validation after each attempt)\n */\nexport function coerceToUnion(\n value: unknown,\n options: z.ZodTypeAny[],\n coerceOption: (index: number, v: unknown, tracker: CircularTracker) => unknown,\n tracker = new CircularTracker(),\n): unknown {\n // Strategy: prefer exact matches for primitives, then structural matches, then coerce by order\n // This balances exact match preservation, structural matching, and type order preference\n // 1. Check if primitive value matches any type exactly (preserve existing primitives)\n // 2. Check if value structurally matches any type (e.g., object matches object schema better than array)\n // 3. Try coercing to first type - if successful, use it\n // 4. Try coercing to remaining types in order\n\n const errors: Error[] = [];\n\n // Step 0a: For primitive values (except strings) and Date objects, check if they match any type exactly first\n // This prevents over-coercion (e.g., number 42 in string|number union should stay as number,\n // Date object in string|date union should stay as Date)\n // Strings are excluded because they're highly coercible and union order should take precedence\n const isPrimitive = typeof value !== 'object' || value === null;\n const isString = typeof value === 'string';\n const isDate = value instanceof Date;\n if ((isPrimitive && !isString) || isDate) {\n for (let i = 0; i < options.length; i++) {\n const directResult = options[i]!.safeParse(value);\n if (directResult.success) {\n return value;\n }\n }\n }\n\n // Step 0b: If value is a plain object (not Date, not other special objects) and one of the options is an object/record schema,\n // try the object/record schema first (before trying string coercion which would convert object to string)\n const objectCandidate = tryObjectFirstCoercion(value, options, tracker, coerceOption);\n if (objectCandidate !== undefined) {\n return objectCandidate;\n }\n\n // Step 0c: If value is an array and union contains array, try array first\n // This prevents arrays from being converted to strings prematurely\n if (Array.isArray(value)) {\n for (let i = 0; i < options.length; i++) {\n const option = options[i]!;\n const type = (option._def as any)?.type || (option._def as any).typeName;\n if (type === 'array' || type === 'ZodArray') {\n try {\n const coerced = coerceOption(i, value, tracker);\n const coercedResult = options[i]!.safeParse(coerced);\n if (coercedResult.success) {\n return coerced;\n }\n } catch {\n // Continue to regular flow\n }\n }\n }\n }\n\n // Step 0d: If value is a string that looks like CSV/array and union contains array, try array first\n // This prevents '1,2,3' from being kept as string when it could be array\n if (typeof value === 'string' && value.trim() !== '') {\n const trimmed = value.trim();\n // Check if it looks like a CSV (has commas) or JSON array\n if (trimmed.includes(',') || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n for (let i = 0; i < options.length; i++) {\n const option = options[i]!;\n const type = (option._def as any)?.type || (option._def as any).typeName;\n if (type === 'array' || type === 'ZodArray') {\n try {\n const coerced = coerceOption(i, value, tracker);\n const coercedResult = options[i]!.safeParse(coerced);\n if (coercedResult.success) {\n return coerced;\n }\n } catch {\n // Continue to regular flow\n }\n }\n }\n }\n }\n\n // Step 0e: If value is a boolean-like string and union contains boolean, try boolean first\n // This prevents 'yes'/'true' from being kept as string when it could be boolean\n // But only for non-numeric boolean strings (avoid '1'/'0' which could be numbers or strings)\n if (typeof value === 'string' && value.trim() !== '') {\n const trimmed = value.trim().toLowerCase();\n // Non-numeric boolean strings only\n const nonNumericBooleanStrings = [\n 'true',\n 'false',\n 'yes',\n 'no',\n 'on',\n 'off',\n 'y',\n 'n',\n 't',\n 'f',\n 'enabled',\n 'disabled',\n ];\n if (nonNumericBooleanStrings.includes(trimmed)) {\n for (let i = 0; i < options.length; i++) {\n const option = options[i]!;\n const type = (option._def as any)?.type || (option._def as any).typeName;\n if (type === 'boolean') {\n try {\n const coerced = coerceOption(i, value, tracker);\n const coercedResult = options[i]!.safeParse(coerced);\n if (coercedResult.success) {\n return coerced;\n }\n } catch {\n // Continue to regular flow\n }\n }\n }\n }\n }\n\n // Step 1: Try coercing to first type (aggressive coercion to preferred type)\n if (options.length > 0) {\n const attempt = executeUnionAttempt(0, value, options, tracker, coerceOption);\n if (attempt.status === 'success') {\n return attempt.value;\n }\n if (attempt.status === 'validation') {\n errors.push(new Error(`Coercion to first type failed validation`));\n } else if (attempt.error) {\n errors.push(attempt.error);\n }\n }\n\n // Step 2: Try coercing to remaining types in order\n for (let i = 1; i < options.length; i++) {\n const attempt = executeUnionAttempt(i, value, options, tracker, coerceOption);\n if (attempt.status === 'success') {\n return attempt.value;\n }\n if (attempt.status === 'validation') {\n errors.push(new Error(`Coerced value does not match schema`));\n } else if (attempt.error) {\n errors.push(attempt.error);\n }\n }\n\n // All options failed\n throw new Error(\n `Cannot coerce value to any union type: ${errors.map((e) => e.message).join(', ')}`,\n );\n}\n\nfunction tryObjectFirstCoercion(\n value: unknown,\n options: z.ZodTypeAny[],\n _tracker: CircularTracker,\n coerceOption: (index: number, v: unknown, tracker: CircularTracker) => unknown,\n): unknown | undefined {\n if (\n typeof value !== 'object' ||\n value === null ||\n Array.isArray(value) ||\n value instanceof Date\n ) {\n return undefined;\n }\n\n for (let i = 0; i < options.length; i++) {\n const option = options[i]!;\n const type = (option._def as any)?.type || (option._def as any).typeName;\n if (type === 'object' || type === 'ZodObject' || type === 'record') {\n try {\n const attemptTracker = new CircularTracker();\n const coerced = coerceOption(i, value, attemptTracker);\n const coercedResult = options[i]!.safeParse(coerced);\n if (coercedResult.success) {\n return coerced;\n }\n } catch {\n // Continue to regular flow\n }\n }\n }\n\n return undefined;\n}\n\ntype UnionAttemptResult =\n | { status: 'success'; value: unknown }\n | { status: 'validation'; error?: undefined }\n | { status: 'error'; error: Error };\n\nfunction executeUnionAttempt(\n index: number,\n value: unknown,\n options: z.ZodTypeAny[],\n tracker: CircularTracker,\n coerceOption: (idx: number, v: unknown, tracker: CircularTracker) => unknown,\n): UnionAttemptResult {\n try {\n const coerced = coerceOption(index, value, tracker);\n const coercedResult = options[index]!.safeParse(coerced);\n if (coercedResult.success) {\n return { status: 'success', value: coerced };\n }\n return { status: 'validation' };\n } catch (error) {\n if (error instanceof Error && error.message.includes('Circular reference')) {\n throw error;\n }\n return { status: 'error', error: error as Error };\n }\n}\n",
|
|
28
|
+
"import * as z from 'zod';\n\nimport { coerceToBoolean } from './coercers/boolean.js';\nimport { coerceToNull } from './coercers/null.js';\n\nexport type CanonizePrimitive = 'string' | 'number' | 'boolean' | 'null';\n\nconst primitiveFactories: Record<CanonizePrimitive, () => z.ZodTypeAny> = {\n string: () => z.coerce.string(),\n number: () => z.coerce.number(),\n boolean: () => getStringBool(),\n null: () => getNullCoercion(),\n};\n\nexport function createCanonizePrimitive(primitive: CanonizePrimitive) {\n return primitiveFactories[primitive]();\n}\n\nexport function createCanonizeSchema<T extends Record<string, CanonizePrimitive>>(\n schema: T,\n) {\n const shape = Object.fromEntries(\n Object.entries(schema).map(([key, primitive]) => [\n key,\n createCanonizePrimitive(primitive),\n ]),\n ) as { [K in keyof T]: ReturnType<typeof createCanonizePrimitive> };\n\n return z.object(shape);\n}\n\ntype ExtendedCoerce = typeof z.coerce & {\n stringbool?: () => z.ZodType<boolean>;\n null?: () => z.ZodType<null>;\n};\n\nconst coerceHelpers = z.coerce as ExtendedCoerce;\n\nconst stringBoolFactory: () => z.ZodType<boolean> =\n typeof coerceHelpers.stringbool === 'function'\n ? () => coerceHelpers.stringbool!()\n : () => z.preprocess((value) => coerceToBoolean(value), z.boolean());\n\nconst nullFactory: () => z.ZodType<null> =\n typeof coerceHelpers.null === 'function'\n ? () => coerceHelpers.null!()\n : () => z.preprocess((value) => coerceToNull(value), z.null());\n\nfunction getStringBool() {\n return stringBoolFactory();\n}\n\nfunction getNullCoercion() {\n return nullFactory();\n}\n"
|
|
29
|
+
],
|
|
30
|
+
"mappings": "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",
|
|
31
|
+
"debugId": "4135B5B30AC609E164756E2164756E21",
|
|
32
|
+
"names": []
|
|
33
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Generic Tool Parameter Schema Helpers
|
|
4
|
+
*
|
|
5
|
+
* Reusable, permissive schema builders for tool parameter definitions.
|
|
6
|
+
* These wrap LLM coercion utilities to handle malformed inputs gracefully.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Creates a schema for boolean parameters with ultra-robust coercion.
|
|
10
|
+
* Handles: true, false, "true", "false", "yes", "no", "on", "off", 1, 0, etc.
|
|
11
|
+
*
|
|
12
|
+
* @param defaultValue - Default boolean value
|
|
13
|
+
* @example
|
|
14
|
+
* const enabledSchema = boolean(true); // defaults to true
|
|
15
|
+
* enabledSchema.parse("yes"); // true
|
|
16
|
+
* enabledSchema.parse("FALSE"); // false
|
|
17
|
+
* enabledSchema.parse(1); // true
|
|
18
|
+
*/
|
|
19
|
+
export declare const boolean: (defaultValue: boolean) => z.ZodDefault<z.ZodPipe<z.ZodTransform<boolean, unknown>, z.ZodBoolean>>;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a schema for number parameters with ultra-robust coercion.
|
|
22
|
+
* Handles: 42, "42", "42px", "1,234", "1e5", objects, arrays, etc.
|
|
23
|
+
*
|
|
24
|
+
* @param defaultValue - Default number value
|
|
25
|
+
* @param options - Optional constraints (min, max, int)
|
|
26
|
+
* @example
|
|
27
|
+
* const countSchema = number(10, { min: 1, max: 100, int: true });
|
|
28
|
+
* countSchema.parse("42px"); // 42
|
|
29
|
+
* countSchema.parse("1,234"); // 1234
|
|
30
|
+
* countSchema.parse({value: 15}); // 15
|
|
31
|
+
*/
|
|
32
|
+
export declare const number: (defaultValue: number, options?: {
|
|
33
|
+
min?: number;
|
|
34
|
+
max?: number;
|
|
35
|
+
int?: boolean;
|
|
36
|
+
}) => z.ZodDefault<z.ZodPipe<z.ZodTransform<number, unknown>, z.ZodNumber>>;
|
|
37
|
+
/**
|
|
38
|
+
* Creates a schema for string parameters with ultra-robust coercion and trimming.
|
|
39
|
+
* Handles: "hello", 123, true, objects, arrays, etc.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const nameSchema = string();
|
|
43
|
+
* nameSchema.parse(" hello "); // "hello"
|
|
44
|
+
* nameSchema.parse(123); // "123"
|
|
45
|
+
* nameSchema.parse({value: "foo"}); // "foo"
|
|
46
|
+
*/
|
|
47
|
+
export declare const string: () => z.ZodPipe<z.ZodTransform<string, unknown>, z.ZodString>;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a schema for CSS selector strings with validation.
|
|
50
|
+
* Trims whitespace and validates non-empty.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* const selectorSchema = selector();
|
|
54
|
+
* selectorSchema.parse(" .class "); // ".class"
|
|
55
|
+
*/
|
|
56
|
+
export declare const selector: () => z.ZodPipe<z.ZodTransform<string, unknown>, z.ZodString>;
|
|
57
|
+
/**
|
|
58
|
+
* Creates a schema for container/region CSS selectors with intelligent coercion.
|
|
59
|
+
* Designed to handle common LLM mistakes when specifying page regions to search within.
|
|
60
|
+
*
|
|
61
|
+
* Coercion strategies:
|
|
62
|
+
* - Natural language ("all", "everything", "entire page") → null (entire document)
|
|
63
|
+
* - Programming literals ("null", "undefined", "none") → null
|
|
64
|
+
* - Wildcards ("*") → null (too broad to be useful)
|
|
65
|
+
* - Link selectors ("a", "a[href]", "links") → null (wrong element type)
|
|
66
|
+
* - Descendant combinators ("body a", "main a") → extracts container ("body", "main")
|
|
67
|
+
* - Valid CSS → passes through unchanged
|
|
68
|
+
* - Invalid CSS → passes through (will be caught at runtime)
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* containerSelector().parse("main"); // "main" (valid)
|
|
72
|
+
* containerSelector().parse("*"); // null (wildcard)
|
|
73
|
+
* containerSelector().parse("null"); // null (literal)
|
|
74
|
+
* containerSelector().parse("a"); // null (link selector)
|
|
75
|
+
* containerSelector().parse("body a"); // "body" (extracted)
|
|
76
|
+
* containerSelector().parse("all"); // null (natural language)
|
|
77
|
+
*/
|
|
78
|
+
export declare const containerSelector: () => z.ZodOptional<z.ZodPipe<z.ZodTransform<string | null, unknown>, z.ZodNullable<z.ZodString>>>;
|
|
79
|
+
/**
|
|
80
|
+
* Creates a schema for collection of strings with ultra-flexible input handling.
|
|
81
|
+
*
|
|
82
|
+
* Handles:
|
|
83
|
+
* - Arrays: ["foo", "bar"]
|
|
84
|
+
* - Comma-separated: "foo,bar,baz"
|
|
85
|
+
* - Semicolon-separated: "foo;bar;baz"
|
|
86
|
+
* - Pipe-separated: "foo|bar|baz"
|
|
87
|
+
* - Newline-separated: "foo\nbar\nbaz"
|
|
88
|
+
* - Single values: wraps in array
|
|
89
|
+
* - Empty values: filters out
|
|
90
|
+
*
|
|
91
|
+
* @param defaultValues - Default array values (defaults to empty array)
|
|
92
|
+
* @example
|
|
93
|
+
* const tagsSchema = collection('default', 'tags');
|
|
94
|
+
* tagsSchema.parse("foo,bar"); // ['foo', 'bar']
|
|
95
|
+
* tagsSchema.parse("foo;bar"); // ['foo', 'bar']
|
|
96
|
+
* tagsSchema.parse("foo"); // ['foo']
|
|
97
|
+
* tagsSchema.parse(null); // ['default', 'tags']
|
|
98
|
+
*/
|
|
99
|
+
export declare const collection: (...defaultValues: string[]) => z.ZodDefault<z.ZodPipe<z.ZodTransform<string[], unknown>, z.ZodArray<z.ZodString>>>;
|
|
100
|
+
/**
|
|
101
|
+
* Creates a schema for collection of numbers with ultra-flexible input handling.
|
|
102
|
+
*
|
|
103
|
+
* Handles:
|
|
104
|
+
* - Arrays: [1, 2, 3]
|
|
105
|
+
* - Comma-separated: "1,2,3"
|
|
106
|
+
* - Semicolon-separated: "1;2;3"
|
|
107
|
+
* - Pipe-separated: "1|2|3"
|
|
108
|
+
* - Single values: wraps in array
|
|
109
|
+
* - Strings with units: "42px,100%,5" → [42, 100, 5]
|
|
110
|
+
*
|
|
111
|
+
* @param options - Optional constraints (min, max, int)
|
|
112
|
+
* @example
|
|
113
|
+
* const idsSchema = numbers({ int: true, min: 0 });
|
|
114
|
+
* idsSchema.parse("1,2,3"); // [1, 2, 3]
|
|
115
|
+
* idsSchema.parse([1, "2", 3]); // [1, 2, 3]
|
|
116
|
+
* idsSchema.parse("42"); // [42]
|
|
117
|
+
*/
|
|
118
|
+
export declare const numbers: (options?: {
|
|
119
|
+
min?: number;
|
|
120
|
+
max?: number;
|
|
121
|
+
int?: boolean;
|
|
122
|
+
}) => z.ZodDefault<z.ZodPipe<z.ZodTransform<number[], unknown>, z.ZodArray<z.ZodNumber>>>;
|
|
123
|
+
/**
|
|
124
|
+
* Creates a schema for enum/literal string values with fuzzy matching.
|
|
125
|
+
* Handles case-insensitive, partial, and fuzzy matches.
|
|
126
|
+
*
|
|
127
|
+
* @param values - Allowed string literals
|
|
128
|
+
* @param defaultValue - Default value (optional)
|
|
129
|
+
* @example
|
|
130
|
+
* const sortSchema = choices(['date', 'name', 'size'], 'date');
|
|
131
|
+
* sortSchema.parse('Date'); // 'date' (case-insensitive)
|
|
132
|
+
* sortSchema.parse('nam'); // 'name' (prefix match)
|
|
133
|
+
* sortSchema.parse('date_desc'); // 'date' (contains match)
|
|
134
|
+
*/
|
|
135
|
+
export declare const choices: <T extends string>(values: readonly [T, ...T[]], defaultValue?: T) => z.ZodPipe<z.ZodTransform<T, unknown>, z.ZodEnum<{ [k_1 in T]: k_1; } extends infer T_1 ? { [k in keyof T_1]: { [k_1 in T]: k_1; }[k]; } : never>> | z.ZodDefault<z.ZodPipe<z.ZodTransform<T, unknown>, z.ZodEnum<{ [k_1 in T]: k_1; } extends infer T_2 ? { [k in keyof T_2]: { [k_1 in T]: k_1; }[k]; } : never>>>;
|
|
136
|
+
/**
|
|
137
|
+
* Creates a schema for count/statistic values in tool results.
|
|
138
|
+
* Ultra-robust number coercion with no default value.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* results: z.object({
|
|
142
|
+
* totalFound: count(),
|
|
143
|
+
* filtered: count(),
|
|
144
|
+
* })
|
|
145
|
+
*/
|
|
146
|
+
export declare const count: () => z.ZodPipe<z.ZodTransform<number, unknown>, z.ZodNumber>;
|
|
147
|
+
/**
|
|
148
|
+
* Creates a schema for URL parameters with ultra-robust string coercion.
|
|
149
|
+
* Validates URL format while remaining permissive.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* const schema = url();
|
|
153
|
+
* schema.parse("https://example.com"); // "https://example.com"
|
|
154
|
+
* schema.parse(" /path "); // "/path"
|
|
155
|
+
*/
|
|
156
|
+
export declare const url: () => z.ZodPipe<z.ZodTransform<string, unknown>, z.ZodString>;
|
|
157
|
+
/**
|
|
158
|
+
* Standard export format parameter (markdown, csv, json).
|
|
159
|
+
* Provides fuzzy matching and defaults to 'markdown'.
|
|
160
|
+
*
|
|
161
|
+
* @param options - Configuration options
|
|
162
|
+
* @param options.defaultValue - Default format (defaults to 'markdown')
|
|
163
|
+
* @param options.includeJson - Whether to include json option (default true)
|
|
164
|
+
* @example
|
|
165
|
+
* exportFormat() // markdown|csv|json, defaults to markdown
|
|
166
|
+
* exportFormat({ includeJson: false }) // markdown|csv only
|
|
167
|
+
* exportFormat({ defaultValue: 'csv' }) // defaults to csv
|
|
168
|
+
*/
|
|
169
|
+
export declare const exportFormat: (options?: {
|
|
170
|
+
defaultValue?: "markdown" | "csv" | "json";
|
|
171
|
+
includeJson?: boolean;
|
|
172
|
+
}) => z.ZodPipe<z.ZodTransform<"markdown" | "csv" | "json", unknown>, z.ZodEnum<{
|
|
173
|
+
markdown: "markdown";
|
|
174
|
+
csv: "csv";
|
|
175
|
+
json: "json";
|
|
176
|
+
}>> | z.ZodDefault<z.ZodPipe<z.ZodTransform<"markdown" | "csv" | "json", unknown>, z.ZodEnum<{
|
|
177
|
+
markdown: "markdown";
|
|
178
|
+
csv: "csv";
|
|
179
|
+
json: "json";
|
|
180
|
+
}>>>;
|
|
181
|
+
/**
|
|
182
|
+
* Image format parameter for screenshots and image captures.
|
|
183
|
+
* Provides fuzzy matching and defaults to 'png'.
|
|
184
|
+
*
|
|
185
|
+
* @param defaultValue - Default format ('jpeg' or 'png')
|
|
186
|
+
* @example
|
|
187
|
+
* imageFormat() // defaults to 'png'
|
|
188
|
+
* imageFormat('jpeg') // defaults to 'jpeg'
|
|
189
|
+
*/
|
|
190
|
+
export declare const imageFormat: (defaultValue?: "jpeg" | "png") => z.ZodPipe<z.ZodTransform<"jpeg" | "png", unknown>, z.ZodEnum<{
|
|
191
|
+
jpeg: "jpeg";
|
|
192
|
+
png: "png";
|
|
193
|
+
}>> | z.ZodDefault<z.ZodPipe<z.ZodTransform<"jpeg" | "png", unknown>, z.ZodEnum<{
|
|
194
|
+
jpeg: "jpeg";
|
|
195
|
+
png: "png";
|
|
196
|
+
}>>>;
|
|
197
|
+
/**
|
|
198
|
+
* Creates a schema for link metadata arrays used in tools that work with URLs.
|
|
199
|
+
* Accepts arrays of link objects with title and url properties.
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* const schema = links();
|
|
203
|
+
* schema.parse([{ title: 'Example', url: 'https://example.com' }]);
|
|
204
|
+
*/
|
|
205
|
+
export declare const links: () => z.ZodDefault<z.ZodArray<z.ZodType<import("./link-metadata").LinkMetadata, unknown, z.core.$ZodTypeInternals<import("./link-metadata").LinkMetadata, unknown>>>>;
|
|
206
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tool-parameters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,GAAI,cAAc,OAAO,4EAC2C,CAAC;AAEzF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,GACjB,cAAc,MAAM,EACpB,UAAU;IACR,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,0EAIuB,CAAC;AAE3B;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,+DAA2C,CAAC;AAE/D;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,+DAAkD,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iBAAiB,oGA4Df,CAAC;AAEhB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,UAAU,GAAI,GAAG,eAAe,MAAM,EAAE,wFAM1B,CAAC;AAE5B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,wFAe/D,CAAC;AAEjB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,EACtC,QAAQ,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAC5B,eAAe,CAAC,wTAIjB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,+DAA4D,CAAC;AAE/E;;;;;;;;GAQG;AACH,eAAO,MAAM,GAAG,+DAKO,CAAC;AAExB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU;IACrC,YAAY,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;;;;;;;;IAOA,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,eAAc,MAAM,GAAG,KAAa;;;;;;IACxB,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,uKAAgD,CAAC"}
|