@vielzeug/spell 26.10.14 → 26.10.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/_dev.cjs.map +1 -1
  2. package/dist/_dev.js.map +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/core.js.map +1 -1
  6. package/dist/errors.cjs.map +1 -1
  7. package/dist/errors.js +1 -1
  8. package/dist/errors.js.map +1 -1
  9. package/dist/formats.cjs.map +1 -1
  10. package/dist/formats.js +1 -1
  11. package/dist/formats.js.map +1 -1
  12. package/dist/json-schema.cjs.map +1 -1
  13. package/dist/json-schema.js.map +1 -1
  14. package/dist/json.js +1 -1
  15. package/dist/messages.cjs.map +1 -1
  16. package/dist/messages.js.map +1 -1
  17. package/dist/s.cjs.map +1 -1
  18. package/dist/s.js.map +1 -1
  19. package/dist/safe-object.cjs.map +1 -1
  20. package/dist/safe-object.js +1 -1
  21. package/dist/safe-object.js.map +1 -1
  22. package/dist/schemas/array.cjs.map +1 -1
  23. package/dist/schemas/array.js.map +1 -1
  24. package/dist/schemas/bigint.cjs.map +1 -1
  25. package/dist/schemas/bigint.js.map +1 -1
  26. package/dist/schemas/boolean.cjs.map +1 -1
  27. package/dist/schemas/boolean.js.map +1 -1
  28. package/dist/schemas/date.cjs.map +1 -1
  29. package/dist/schemas/date.js.map +1 -1
  30. package/dist/schemas/enum.cjs.map +1 -1
  31. package/dist/schemas/enum.js.map +1 -1
  32. package/dist/schemas/instanceof.cjs.map +1 -1
  33. package/dist/schemas/instanceof.js.map +1 -1
  34. package/dist/schemas/intersect.cjs.map +1 -1
  35. package/dist/schemas/intersect.js.map +1 -1
  36. package/dist/schemas/lazy.cjs.map +1 -1
  37. package/dist/schemas/lazy.js.map +1 -1
  38. package/dist/schemas/literal.cjs.map +1 -1
  39. package/dist/schemas/literal.js.map +1 -1
  40. package/dist/schemas/map.cjs.map +1 -1
  41. package/dist/schemas/map.js +1 -1
  42. package/dist/schemas/map.js.map +1 -1
  43. package/dist/schemas/never.cjs.map +1 -1
  44. package/dist/schemas/never.js.map +1 -1
  45. package/dist/schemas/number.cjs.map +1 -1
  46. package/dist/schemas/number.js.map +1 -1
  47. package/dist/schemas/object.cjs.map +1 -1
  48. package/dist/schemas/object.js.map +1 -1
  49. package/dist/schemas/raw-or.cjs.map +1 -1
  50. package/dist/schemas/raw-or.js.map +1 -1
  51. package/dist/schemas/record.cjs.map +1 -1
  52. package/dist/schemas/record.js.map +1 -1
  53. package/dist/schemas/set.cjs.map +1 -1
  54. package/dist/schemas/set.js +1 -1
  55. package/dist/schemas/set.js.map +1 -1
  56. package/dist/schemas/string.cjs.map +1 -1
  57. package/dist/schemas/string.js.map +1 -1
  58. package/dist/schemas/tuple.cjs.map +1 -1
  59. package/dist/schemas/tuple.js.map +1 -1
  60. package/dist/schemas/union.cjs.map +1 -1
  61. package/dist/schemas/union.js.map +1 -1
  62. package/dist/schemas/variant.cjs.map +1 -1
  63. package/dist/schemas/variant.js +1 -1
  64. package/dist/schemas/variant.js.map +1 -1
  65. package/dist/spell.cjs.map +1 -1
  66. package/dist/spell.iife.js.map +1 -1
  67. package/dist/spell.js +2235 -2
  68. package/dist/spell.js.map +1 -1
  69. package/dist/tolerate.cjs.map +1 -1
  70. package/dist/tolerate.js.map +1 -1
  71. package/dist/types.cjs.map +1 -1
  72. package/dist/types.js.map +1 -1
  73. package/dist/validators.cjs.map +1 -1
  74. package/dist/validators.js.map +1 -1
  75. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.cjs","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.cjs","names":["require_safe_object","definitionToJsonSchema","descriptorToJsonSchema","definition","base","_descriptorToBase","d","result","out","properties","required","key","fieldDescriptor"],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.js","names":["definitionToJsonSchema","descriptorToJsonSchema","definition","base","_descriptorToBase","d","result","out","properties","required","key","fieldDescriptor","defineOwnProperty"],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type: represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T>: no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
package/dist/json.js CHANGED
@@ -1 +1 @@
1
- import{definitionToJsonSchema as e}from"./json-schema.js";export{e as fromDefinition};
1
+ export{definitionToJsonSchema as fromDefinition}from"./json-schema.js";
@@ -1 +1 @@
1
- {"version":3,"file":"messages.cjs","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages.cjs","names":["cloneRecord","isUnsafeObjectKey","require_safe_object","_builtinMessages","exact","max","min","step","values","v","className","expected","keys","suffix","substr","prefix","discriminator","k","isRecord","value","mergeMessages","out","base","key","patch","baseValue","createParseContext","messages"],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"A,2DA+HA,IAAMG,EAA6B,CACjC,MAAO,CACL,QAAS,CAAE,WAAY,qBAAqBC,EAAM,QAClD,KAAM,CAAE,SAAU,qBAAqBC,EAAI,QAC3C,KAAM,CAAE,SAAU,sBAAsBC,EAAI,QAC5C,aAAgB,kBAChB,SAAY,iBACZ,WAAc,0BAChB,EACA,OAAQ,CACN,KAAM,CAAE,SAAU,mBAAmBD,IACrC,KAAM,CAAE,SAAU,oBAAoBC,IACtC,YAAa,CAAE,UAAW,yBAAyBC,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,iBACd,EACA,QAAS,CACP,SAAY,kBACd,EACA,MAAO,CACL,YAAe,eACjB,EACA,KAAM,CACJ,KAAM,CAAE,SAAU,kBAAkBF,EAAI,YAAY,IACpD,KAAM,CAAE,SAAU,iBAAiBC,EAAI,YAAY,IACnD,SAAY,qBACd,EACA,KAAM,CACJ,SAAU,CAAE,YAAa,oBAAoBE,EAAO,IAAK,GAAM,KAAK,UAAUC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7F,EACA,WAAY,CACV,MAAO,CAAE,eAAgB,wBAAwBC,GACnD,EACA,QAAS,CACP,UAAW,CAAE,cAAe,YAAY,KAAK,UAAUC,CAAQ,GACjE,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwBN,EAAI,UAC9C,KAAM,CAAE,SAAU,yBAAyBC,EAAI,UAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwBF,EAAM,UACnD,SAAY,cACd,EACA,MAAO,CACL,YAAe,sBACjB,EACA,OAAQ,CACN,WAAc,iBACd,QAAW,qBACX,KAAM,CAAE,SAAU,mBAAmBC,IACrC,KAAM,CAAE,SAAU,oBAAoBC,IACtC,YAAa,CAAE,UAAW,yBAAyBC,IACnD,aAAgB,mBAChB,gBAAmB,uBACnB,gBAAmB,uBACnB,aAAgB,mBAChB,SAAY,yBACZ,SAAY,iBACd,EACA,OAAQ,CACN,aAAc,CAAE,UAAW,sBAAsBK,EAAK,KAAK,IAAI,IAC/D,SAAY,iBACd,EACA,IAAK,CACH,KAAM,CAAE,SAAU,wBAAwBP,EAAI,QAC9C,KAAM,CAAE,SAAU,yBAAyBC,EAAI,QAC/C,aAAgB,kBAChB,MAAO,CAAE,WAAY,wBAAwBF,EAAM,QACnD,SAAY,cACd,EACA,OAAQ,CACN,WAAc,iBACd,cAAiB,oBACjB,SAAY,eACZ,UAAa,gBACb,SAAY,eACZ,aAAgB,mBAChB,aAAgB,4BAChB,UAAa,wBACb,UAAa,yBACb,UAAW,CAAE,YAAa,kBAAkBS,EAAO,GACnD,QAAW,cACX,aAAgB,oBAChB,UAAW,CAAE,YAAa,iBAAiBC,EAAO,GAClD,OAAU,qBACV,QAAW,cACX,QAAS,CAAE,WAAY,mBAAmBV,EAAM,aAChD,KAAM,CAAE,SAAU,mBAAmBC,EAAI,aACzC,KAAM,CAAE,SAAU,oBAAoBC,EAAI,aAC1C,WAAc,iBACd,aAAgB,kBAChB,YAAe,yBACf,UAAa,iBACb,WAAc,iBACd,SAAY,eACZ,YAAa,CAAE,YAAa,oBAAoBS,EAAO,GACvD,SAAY,eACZ,SAAY,kBACZ,SAAY,eACZ,QAAW,cACX,SAAY,cACd,EACA,MAAO,CACL,QAAS,CAAE,WAAY,4BAA4BX,IACnD,KAAM,CAAE,SAAU,gCAAgCE,EAAI,QACtD,SAAY,gBACd,EACA,MAAO,CACL,YAAe,0CACjB,EACA,QAAS,CACP,sBAAuB,CAAE,gBAAe,cACtC,mCAAmCU,EAAc,cAAcL,EAAS,IAAK,GAAM,KAAK,UAAUM,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAClH,SAAY,iBACd,CACF,EAEA,SAASC,EAAS,EAAkD,CAClE,OAAyB,OAAOC,GAAU,YAAnCA,GAA+C,CAAC,MAAM,QAAQA,CAAK,CAC5E,CAEA,SAASC,EAAiD,EAAS,EAA0B,CAC3F,IAAMC,EAAMrB,EAAAA,YAAYsB,CAAI,EAE5B,IAAK,GAAM,CAACC,EAAKJ,KAAU,OAAO,QAAQK,CAAK,EAAG,CAChD,GAAIL,IAAU,IAAA,GAAW,SAEzB,GAAIlB,EAAAA,kBAAkBsB,CAAG,EAAG,CACrB,GAAiDA,EAAjD,EACL,QACF,CAEA,IAAME,EAAYJ,EAAIE,GAElBL,EAASO,CAAS,GAAKP,EAASC,CAAK,EACvCjB,EAAA,kBAAkBmB,EAAKE,EAAKH,EAAcK,EAAWN,CAAsC,CAAC,EAE5FjB,EAAA,kBAAkBmB,EAAKE,EAAKJ,CAAK,CAErC,CAEA,OAAOE,CACT,CAMA,SAAgBK,EAAmB,EAAkC,CAAC,EAAiB,CACrF,MAAO,CAAE,SAAUN,EAAcjB,EAAkBwB,CAAQ,CAAE,CAC/D,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","names":[],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","names":["_builtinMessages","exact","max","min","step","values","v","className","expected","keys","suffix","substr","prefix","discriminator","k","isRecord","value","mergeMessages","out","cloneRecord","base","key","patch","isUnsafeObjectKey","baseValue","defineOwnProperty","createParseContext","messages"],"sources":["../src/messages.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { cloneRecord, defineOwnProperty, isUnsafeObjectKey } from './safe-object';\nimport type { ParseContext } from './types';\n\nexport type Messages = {\n array: {\n length: (ctx: { exact: number; value: unknown[] }) => string;\n max: (ctx: { max: number; value: unknown[] }) => string;\n min: (ctx: { min: number; value: unknown[] }) => string;\n nonEmpty: () => string;\n type: () => string;\n unique: () => string;\n };\n bigint: {\n max: (ctx: { max: bigint; value: bigint }) => string;\n min: (ctx: { min: bigint; value: bigint }) => string;\n multipleOf: (ctx: { step: bigint; value: bigint }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n type: () => string;\n };\n boolean: {\n type: () => string;\n };\n check: {\n default: () => string;\n };\n date: {\n max: (ctx: { max: Date; value: Date }) => string;\n min: (ctx: { min: Date; value: Date }) => string;\n type: () => string;\n };\n enum: {\n invalid: (ctx: { values: readonly unknown[] }) => string;\n };\n instanceof: {\n type: (ctx: { className: string }) => string;\n };\n literal: {\n expected: (ctx: { expected: unknown }) => string;\n };\n map: {\n max: (ctx: { max: number; value: Map<unknown, unknown> }) => string;\n min: (ctx: { min: number; value: Map<unknown, unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Map<unknown, unknown> }) => string;\n type: () => string;\n };\n never: {\n invalid: () => string;\n };\n number: {\n finite: () => string;\n int: () => string;\n max: (ctx: { max: number; value: number }) => string;\n min: (ctx: { min: number; value: number }) => string;\n multipleOf: (ctx: { step: number; value: number }) => string;\n negative: () => string;\n nonNegative: () => string;\n nonPositive: () => string;\n positive: () => string;\n safe: () => string;\n type: () => string;\n };\n object: {\n invalidKeys: (ctx: { keys: string[] }) => string;\n type: () => string;\n };\n set: {\n max: (ctx: { max: number; value: Set<unknown> }) => string;\n min: (ctx: { min: number; value: Set<unknown> }) => string;\n nonEmpty: () => string;\n size: (ctx: { exact: number; value: Set<unknown> }) => string;\n type: () => string;\n };\n string: {\n base64: () => string;\n base64url: () => string;\n cuid: () => string;\n cuid2: () => string;\n date: () => string;\n dateTime: () => string;\n duration: () => string;\n email: () => string;\n emoji: () => string;\n endsWith: (ctx: { suffix: string; value: string }) => string;\n hex: () => string;\n hexColor: () => string;\n includes: (ctx: { substr: string; value: string }) => string;\n ip: () => string;\n jwt: () => string;\n length: (ctx: { exact: number; value: string }) => string;\n max: (ctx: { max: number; value: string }) => string;\n min: (ctx: { min: number; value: string }) => string;\n nanoid: () => string;\n nonEmpty: () => string;\n numeric: () => string;\n regex: (ctx: { value: string }) => string;\n semver: () => string;\n slug: () => string;\n startsWith: (ctx: { prefix: string; value: string }) => string;\n time: () => string;\n type: () => string;\n ulid: () => string;\n url: () => string;\n uuid: () => string;\n };\n tuple: {\n length: (ctx: { exact: number }) => string;\n min: (ctx: { min: number }) => string;\n type: () => string;\n };\n union: {\n invalid: () => string;\n };\n variant: {\n invalidDiscriminator: (ctx: { discriminator: string; expected: string[] }) => string;\n type: () => string;\n };\n};\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown> ? DeepPartial<T[K]> : T[K];\n};\n\nconst _builtinMessages: Messages = {\n array: {\n length: ({ exact }) => `Must have exactly ${exact} items`,\n max: ({ max }) => `Must have at most ${max} items`,\n min: ({ min }) => `Must have at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n type: () => 'Expected array',\n unique: () => 'All items must be unique',\n },\n bigint: {\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n type: () => 'Expected bigint',\n },\n boolean: {\n type: () => 'Expected boolean',\n },\n check: {\n default: () => 'Invalid value',\n },\n date: {\n max: ({ max }) => `Must be before ${max.toISOString()}`,\n min: ({ min }) => `Must be after ${min.toISOString()}`,\n type: () => 'Expected valid date',\n },\n enum: {\n invalid: ({ values }) => `Expected one of: ${values.map((v) => JSON.stringify(v)).join(', ')}`,\n },\n instanceof: {\n type: ({ className }) => `Expected instance of ${className}`,\n },\n literal: {\n expected: ({ expected }) => `Expected ${JSON.stringify(expected)}`,\n },\n map: {\n max: ({ max }) => `Must contain at most ${max} entries`,\n min: ({ min }) => `Must contain at least ${min} entries`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} entries`,\n type: () => 'Expected map',\n },\n never: {\n invalid: () => 'Value is not allowed',\n },\n number: {\n finite: () => 'Must be finite',\n int: () => 'Must be an integer',\n max: ({ max }) => `Must be at most ${max}`,\n min: ({ min }) => `Must be at least ${min}`,\n multipleOf: ({ step }) => `Must be a multiple of ${step}`,\n negative: () => 'Must be negative',\n nonNegative: () => 'Must be non-negative',\n nonPositive: () => 'Must be non-positive',\n positive: () => 'Must be positive',\n safe: () => 'Must be a safe integer',\n type: () => 'Expected number',\n },\n object: {\n invalidKeys: ({ keys }) => `Unrecognized keys: ${keys.join(', ')}`,\n type: () => 'Expected object',\n },\n set: {\n max: ({ max }) => `Must contain at most ${max} items`,\n min: ({ min }) => `Must contain at least ${min} items`,\n nonEmpty: () => 'Cannot be empty',\n size: ({ exact }) => `Must contain exactly ${exact} items`,\n type: () => 'Expected set',\n },\n string: {\n base64: () => 'Invalid base64',\n base64url: () => 'Invalid base64url',\n cuid: () => 'Invalid CUID',\n cuid2: () => 'Invalid CUID2',\n date: () => 'Invalid date',\n dateTime: () => 'Invalid datetime',\n duration: () => 'Invalid ISO 8601 duration',\n email: () => 'Invalid email address',\n emoji: () => 'Invalid emoji sequence',\n endsWith: ({ suffix }) => `Must end with \"${suffix}\"`,\n hex: () => 'Invalid hex',\n hexColor: () => 'Invalid hex color',\n includes: ({ substr }) => `Must include \"${substr}\"`,\n ip: () => 'Invalid IP address',\n jwt: () => 'Invalid JWT',\n length: ({ exact }) => `Must be exactly ${exact} characters`,\n max: ({ max }) => `Must be at most ${max} characters`,\n min: ({ min }) => `Must be at least ${min} characters`,\n nanoid: () => 'Invalid NanoID',\n nonEmpty: () => 'Cannot be empty',\n numeric: () => 'Invalid numeric string',\n regex: () => 'Invalid format',\n semver: () => 'Invalid semver',\n slug: () => 'Invalid slug',\n startsWith: ({ prefix }) => `Must start with \"${prefix}\"`,\n time: () => 'Invalid time',\n type: () => 'Expected string',\n ulid: () => 'Invalid ULID',\n url: () => 'Invalid URL',\n uuid: () => 'Invalid UUID',\n },\n tuple: {\n length: ({ exact }) => `Expected tuple of length ${exact}`,\n min: ({ min }) => `Expected tuple with at least ${min} items`,\n type: () => 'Expected array',\n },\n union: {\n invalid: () => 'Does not match any of the expected types',\n },\n variant: {\n invalidDiscriminator: ({ discriminator, expected }) =>\n `Invalid discriminator value at \"${discriminator}\": expected ${expected.map((k) => JSON.stringify(k)).join(' | ')}`,\n type: () => 'Expected object',\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mergeMessages<T extends Record<string, unknown>>(base: T, patch: DeepPartial<T>): T {\n const out = cloneRecord(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n\n if (isUnsafeObjectKey(key)) {\n warn(`[spell] Ignoring unsafe message override key \"${key}\" to prevent prototype mutation.`);\n continue;\n }\n\n const baseValue = out[key];\n\n if (isRecord(baseValue) && isRecord(value)) {\n defineOwnProperty(out, key, mergeMessages(baseValue, value as DeepPartial<typeof baseValue>));\n } else {\n defineOwnProperty(out, key, value);\n }\n }\n\n return out as T;\n}\n\n/**\n * Creates an immutable parse context. Pass this context to parse methods when\n * validation messages vary by request, locale, or form. Spell never stores it globally.\n */\nexport function createParseContext(messages: DeepPartial<Messages> = {}): ParseContext {\n return { messages: mergeMessages(_builtinMessages, messages) };\n}\n\n/** @internal */\n"],"mappings":"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"}
package/dist/s.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAA,YAAY,CAAM,EACnF,MAA8B,IAAI,EAAA,aAClC,MAAgC,IAAI,EAAA,cACpC,MAA0B,IAAI,EAAA,WAC9B,EAAqC,GAA6B,IAAI,EAAA,WAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAA,WAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAA,cAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAAA,YAChC,MAAmC,IAAI,EAAA,cAAc,IAAI,EACzD,MAA8B,IAAI,EAAA,aAClC,EAAkC,GAA8B,IAAI,EAAA,aAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAA,UAAU,CAAM,EAC7E,MAA8B,IAAI,EAAA,aAClC,EAAwC,GAA6B,IAAI,EAAA,YAAY,CAAK,EAC1F,MAA6C,IAAI,EAAA,cAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,EAAA,MAgD5C"}
1
+ {"version":3,"file":"s.cjs","names":["ArraySchema","BigIntSchema","BooleanSchema","DateSchema","EnumSchema","InstanceOfSchema","IntersectSchema","normalizeToSchemas","LazySchema","LiteralSchema","MapSchema","NeverSchema","NumberSchema","ObjectSchema","RecordSchema","SetSchema","StringSchema","TupleSchema","UnionSchema","Schema","VariantSchema","require_core","require_array","require_bigint","require_boolean","require_date","require_enum","require_instanceof","require_intersect","require_lazy","require_literal","require_map","require_never","require_number","require_union","require_object","require_raw_or","require_record","require_set","require_string","require_tuple","require_variant","sArray","schema","sBigint","sBoolean","sDate","sEnum","values","sInstanceof","cls","sIntersect","items","sLazy","getter","sLiteral","value","sMap","keySchema","valueSchema","sNever","sNull","sNumber","sObject","shape","sRecord","sSet","sString","sTuple","sUndefined","sUnion","s","discriminator","map"],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"A,gsBAwBA,IAAM0C,EAA+B,GAA8B,IAAI1C,EAAAA,YAAY2C,CAAM,EACnFC,MAA8B,IAAI3C,EAAAA,aAClC4C,MAAgC,IAAI3C,EAAAA,cACpC4C,MAA0B,IAAI3C,EAAAA,WAC9B4C,EAAqC,GAA6B,IAAI3C,EAAAA,WAAW4C,CAAM,EACvFC,EAAkB,GAA0D,IAAI5C,EAAAA,iBAAiB6C,CAAG,EACpGC,GACJ,GAAGC,IAEH,IAAI9C,EAAAA,gBAAgBC,EAAAA,mBAAmB6C,CAAK,CAA6C,EACrFC,EAA8B,GAClC,IAAI7C,EAAAA,WAAW8C,CAAgE,EAC3EC,EAAoE,GACxE,IAAI9C,EAAAA,cAAc+C,CAAK,EACnBC,GAAkD,EAAc,IACpE,IAAI/C,EAAAA,UAAUgD,EAAWC,CAAW,EAChCC,MAA4B,IAAIjD,EAAAA,YAChCkD,MAAmC,IAAIpD,EAAAA,cAAc,IAAI,EACzDqD,MAA8B,IAAIlD,EAAAA,aAClCmD,EAAkC,GAA8B,IAAIlD,EAAAA,aAAamD,CAAK,EACtFC,GAAqD,EAAc,IACvE,IAAInD,EAAAA,aAAa4C,EAAWC,CAAW,EACnCO,EAA6B,GAA4B,IAAInD,EAAAA,UAAU4B,CAAM,EAC7EwB,MAA8B,IAAInD,EAAAA,aAClCoD,EAAwC,GAA6B,IAAInD,EAAAA,YAAYmC,CAAK,EAC1FiB,MAA6C,IAAI5D,EAAAA,cAAc,IAAA,EAAS,EAO9E,SAAS6D,EAAsB,GAAGlB,EAAkE,CAClG,OAAO,IAAIlC,EAAAA,YAAYX,EAAAA,mBAAmB6C,CAAK,CAAgB,CACjE,CAyBA,IAAamB,EAAI,CACf,MAAO7B,EACP,OAAQE,EACR,QAASC,EACT,OAAQ,CAtBR,WAAqC5C,EAAAA,aAAa,OAAO,EACzD,YAAuCC,EAAAA,cAAc,OAAO,EAC5D,SAAiCC,EAAAA,WAAW,OAAO,EACnD,WAAqCS,EAAAA,aAAa,OAAO,EACzD,WAAqCI,EAAAA,aAAa,OAAO,CAkBjD,EACR,KAAM8B,EACN,oBA5BA,EACA,IACwB,IAAI1B,EAAAA,cAAcoD,EAAeC,CAAG,EA2B5D,KAAM1B,EACN,WAAYE,EACZ,UAAWE,EACX,KAAME,EACN,QAASE,EACT,IAAKE,EACL,MAAOG,EACP,KAAMC,EACN,OAAQC,EACR,OAAQC,EACR,OAAQE,EACR,IAAKC,EACL,OAAQC,EACR,MAAOC,EACP,UAAWC,EACX,MAAOC,EACP,YA/CsC,IAAInD,EAAAA,MAgD5C,E"}
package/dist/s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCAwBA,IAAM,EAA+B,GAA8B,IAAI,EAAY,CAAM,EACnF,MAA8B,IAAI,EAClC,MAAgC,IAAI,EACpC,MAA0B,IAAI,EAC9B,EAAqC,GAA6B,IAAI,EAAW,CAAM,EACvF,EAAkB,GAA0D,IAAI,EAAiB,CAAG,EACpG,GACJ,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EACrF,EAA8B,GAClC,IAAI,EAAW,CAAgE,EAC3E,EAAoE,GACxE,IAAI,EAAc,CAAK,EACnB,GAAkD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAChC,MAA4B,IAAI,EAChC,MAAmC,IAAI,EAAc,IAAI,EACzD,MAA8B,IAAI,EAClC,EAAkC,GAA8B,IAAI,EAAa,CAAK,EACtF,GAAqD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EACnC,EAA6B,GAA4B,IAAI,EAAU,CAAM,EAC7E,MAA8B,IAAI,EAClC,EAAwC,GAA6B,IAAI,EAAY,CAAK,EAC1F,MAA6C,IAAI,EAAc,IAAA,EAAS,EAO9E,SAAS,EAAsB,GAAG,EAAkE,CAClG,OAAO,IAAI,EAAY,EAAmB,CAAK,CAAgB,CACjE,CAyBA,IAAa,EAAI,CACf,MAAO,EACP,OAAQ,EACR,QAAS,EACT,OAAQ,CAtBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAkBjD,EACR,KAAM,EACN,oBA5BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA2B5D,KAAM,EACN,WAAY,EACZ,UAAW,EACX,KAAM,EACN,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,IAAK,EACL,OAAQ,EACR,MAAO,EACP,UAAW,EACX,MAAO,EACP,YA/CsC,IAAI,CAgD5C"}
1
+ {"version":3,"file":"s.js","names":["sArray","ArraySchema","schema","sBigint","BigIntSchema","sBoolean","BooleanSchema","sDate","DateSchema","sEnum","EnumSchema","values","sInstanceof","InstanceOfSchema","cls","sIntersect","items","IntersectSchema","normalizeToSchemas","sLazy","LazySchema","getter","sLiteral","LiteralSchema","value","sMap","MapSchema","keySchema","valueSchema","sNever","NeverSchema","sNull","sNumber","NumberSchema","sObject","ObjectSchema","shape","sRecord","RecordSchema","sSet","SetSchema","sString","StringSchema","sTuple","TupleSchema","sUndefined","sUnion","UnionSchema","s","VariantSchema","discriminator","map","Schema"],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\n// Schema-only tuples keep their concrete branch types; the second overload normalizes raw\n// literals, where intersecting with AnySchema[] costs nothing.\nfunction sUnion<T extends readonly [AnySchema, AnySchema, ...AnySchema[]]>(...items: T): UnionSchema<T>;\nfunction sUnion<T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]>;\nfunction sUnion(this: unknown, ...items: readonly RawOrSchema[]): UnionSchema<readonly AnySchema[]> {\n return new UnionSchema(normalizeToSchemas(items) as AnySchema[]);\n}\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace: the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"A,yhCAwBA,IAAMA,EAA+B,GAA8B,IAAIC,EAAYC,CAAM,EACnFC,MAA8B,IAAIC,EAClCC,MAAgC,IAAIC,EACpCC,MAA0B,IAAIC,EAC9BC,EAAqC,GAA6B,IAAIC,EAAWC,CAAM,EACvFC,EAAkB,GAA0D,IAAIC,EAAiBC,CAAG,EACpGC,GACJ,GAAGC,IAEH,IAAIC,EAAgBC,EAAmBF,CAAK,CAA6C,EACrFG,EAA8B,GAClC,IAAIC,EAAWC,CAAgE,EAC3EC,EAAoE,GACxE,IAAIC,EAAcC,CAAK,EACnBC,GAAkD,EAAc,IACpE,IAAIC,EAAUC,EAAWC,CAAW,EAChCC,MAA4B,IAAIC,EAChCC,MAAmC,IAAIR,EAAc,IAAI,EACzDS,MAA8B,IAAIC,EAClCC,EAAkC,GAA8B,IAAIC,EAAaC,CAAK,EACtFC,GAAqD,EAAc,IACvE,IAAIC,EAAaX,EAAWC,CAAW,EACnCW,EAA6B,GAA4B,IAAIC,EAAUtC,CAAM,EAC7EuC,MAA8B,IAAIC,EAClCC,EAAwC,GAA6B,IAAIC,EAAY5B,CAAK,EAC1F6B,MAA6C,IAAItB,EAAc,IAAA,EAAS,EAO9E,SAASuB,EAAsB,GAAG9B,EAAkE,CAClG,OAAO,IAAI+B,EAAY7B,EAAmBF,CAAK,CAAgB,CACjE,CAyBA,IAAagC,EAAI,CACf,MAAOhD,EACP,OAAQG,EACR,QAASE,EACT,OAAQ,CAtBR,WAAqCD,EAAa,OAAO,EACzD,YAAuCE,EAAc,OAAO,EAC5D,SAAiCE,EAAW,OAAO,EACnD,WAAqCyB,EAAa,OAAO,EACzD,WAAqCS,EAAa,OAAO,CAkBjD,EACR,KAAMnC,EACN,oBA5BA,EACA,IACwB,IAAI0C,EAAcC,EAAeC,CAAG,EA2B5D,KAAM1C,EACN,WAAYG,EACZ,UAAWG,EACX,KAAMI,EACN,QAASG,EACT,IAAKG,EACL,MAAOI,EACP,KAAME,EACN,OAAQC,EACR,OAAQE,EACR,OAAQG,EACR,IAAKE,EACL,OAAQE,EACR,MAAOE,EACP,UAAWE,EACX,MAAOC,EACP,YA/CsC,IAAIM,CAgD5C,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"safe-object.cjs","names":[],"sources":["../src/safe-object.ts"],"sourcesContent":["export const UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\nexport function cloneRecord<T>(source: Record<string, T>): Record<string, T> {\n return objectFromEntries(Object.entries(source));\n}\n"],"mappings":"AAAA,IAAa,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAEnF,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EAAmB,IAAI,CAAG,CACnC,CAEA,SAAgB,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAe,EAAQ,EAAK,CACjC,aAAc,GACd,WAAY,GACZ,QACA,SAAU,EACZ,CAAC,CACH,CAEA,SAAgB,EAAqB,EAA4D,CAC/F,IAAM,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAAC,EAAK,KAAU,EAAS,EAAkB,EAAK,EAAK,CAAK,EAErE,OAAO,CACT,CAEA,SAAgB,EAAe,EAA8C,CAC3E,OAAO,EAAkB,OAAO,QAAQ,CAAM,CAAC,CACjD"}
1
+ {"version":3,"file":"safe-object.cjs","names":["UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","cloneRecord","source"],"sources":["../src/safe-object.ts"],"sourcesContent":["export const UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\nexport function cloneRecord<T>(source: Record<string, T>): Record<string, T> {\n return objectFromEntries(Object.entries(source));\n}\n"],"mappings":"AAAA,IAAaA,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAEnF,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAEA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CACjC,aAAc,GACd,WAAY,GACZ,QACA,SAAU,EACZ,CAAC,CACH,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAEA,SAAgBG,EAAe,EAA8C,CAC3E,OAAOJ,EAAkB,OAAO,QAAQK,CAAM,CAAC,CACjD,C"}
@@ -1,2 +1,2 @@
1
- var e=new Set([`__proto__`,`constructor`,`prototype`]);function t(t){return e.has(t)}function n(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function r(e){let t={};for(let[r,i]of e)n(t,r,i);return t}function i(e){return r(Object.entries(e))}export{e as UNSAFE_OBJECT_KEYS,i as cloneRecord,n as defineOwnProperty,t as isUnsafeObjectKey,r as objectFromEntries};
1
+ var e=/* @__PURE__ */ new Set([`__proto__`,`constructor`,`prototype`]);function t(t){return e.has(t)}function n(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})}function r(e){let t={};for(let[r,i]of e)n(t,r,i);return t}function i(e){return r(Object.entries(e))}export{e as UNSAFE_OBJECT_KEYS,i as cloneRecord,n as defineOwnProperty,t as isUnsafeObjectKey,r as objectFromEntries};
2
2
  //# sourceMappingURL=safe-object.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"safe-object.js","names":[],"sources":["../src/safe-object.ts"],"sourcesContent":["export const UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\nexport function cloneRecord<T>(source: Record<string, T>): Record<string, T> {\n return objectFromEntries(Object.entries(source));\n}\n"],"mappings":"AAAA,IAAa,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAEnF,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EAAmB,IAAI,CAAG,CACnC,CAEA,SAAgB,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAe,EAAQ,EAAK,CACjC,aAAc,GACd,WAAY,GACZ,QACA,SAAU,EACZ,CAAC,CACH,CAEA,SAAgB,EAAqB,EAA4D,CAC/F,IAAM,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAAC,EAAK,KAAU,EAAS,EAAkB,EAAK,EAAK,CAAK,EAErE,OAAO,CACT,CAEA,SAAgB,EAAe,EAA8C,CAC3E,OAAO,EAAkB,OAAO,QAAQ,CAAM,CAAC,CACjD"}
1
+ {"version":3,"file":"safe-object.js","names":["UNSAFE_OBJECT_KEYS","isUnsafeObjectKey","key","defineOwnProperty","target","objectFromEntries","out","value","entries","cloneRecord","source"],"sources":["../src/safe-object.ts"],"sourcesContent":["export const UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n\nexport function defineOwnProperty<T>(target: Record<string, T>, key: string, value: T): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nexport function objectFromEntries<T>(entries: Iterable<readonly [string, T]>): Record<string, T> {\n const out: Record<string, T> = {};\n\n for (const [key, value] of entries) defineOwnProperty(out, key, value);\n\n return out;\n}\n\nexport function cloneRecord<T>(source: Record<string, T>): Record<string, T> {\n return objectFromEntries(Object.entries(source));\n}\n"],"mappings":"AAAA,IAAaA,kBAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAEnF,SAAgBC,EAAkB,EAAsB,CACtD,OAAOD,EAAmB,IAAIE,CAAG,CACnC,CAEA,SAAgBC,EAAqB,EAA2B,EAAa,EAAgB,CAC3F,OAAO,eAAeC,EAAQF,EAAK,CACjC,aAAc,GACd,WAAY,GACZ,QACA,SAAU,EACZ,CAAC,CACH,CAEA,SAAgBG,EAAqB,EAA4D,CAC/F,IAAMC,EAAyB,CAAC,EAEhC,IAAK,GAAM,CAACJ,EAAKK,KAAUC,EAASL,EAAkBG,EAAKJ,EAAKK,CAAK,EAErE,OAAOD,CACT,CAEA,SAAgBG,EAAe,EAA8C,CAC3E,OAAOJ,EAAkB,OAAO,QAAQK,CAAM,CAAC,CACjD,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"oFAoBA,IAAa,EAAb,cAAsD,EAAA,MAA0C,CAC9F,WAEA,IAAuB,OAAgB,CACrC,MAAO,OACT,CAEA,YAAY,EAAe,CACzB,MAAM,EACN,KAAK,WAAa,CACpB,CAEA,gBAAwB,EAAkB,EAAgE,CACxG,IAAM,EAAkB,CAAC,EACnB,EAA2B,CAAC,EAElC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAM,EAAS,KAAK,WAAW,eAAe,EAAM,GAAI,CAAG,EAEvD,EAAO,OAAO,SAAW,EAC3B,EAAO,KAAK,EAAO,IAAsB,GAEzC,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAO,OAAQ,CAAC,CAAC,EACjD,EAAO,KAAK,EAAM,EAAoB,EAE1C,CAEA,MAAO,CAAE,KAAM,EAAQ,QAAO,CAChC,CAEA,OAA0B,EAAgB,EAA+B,CACvE,GAAI,CAAC,MAAM,QAAQ,CAAK,EACtB,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAA,KAAK,EAAA,UAAU,aAAc,EAAI,SAAS,MAAM,KAAK,CAAC,EAAG,OAAQ,EAAM,EAGvG,GAAM,CAAE,KAAM,EAAO,UAAW,KAAK,gBAAgB,EAAO,CAAG,EAE/D,MAAO,CAAE,KAAM,EAAO,SAAQ,OAAQ,EAAK,CAC7C,CAEA,MAAyB,YAAY,EAAgB,EAAwC,CAC3F,GAAI,CAAC,MAAM,QAAQ,CAAK,EACtB,MAAO,CAAE,KAAM,EAAO,OAAQ,EAAA,KAAK,EAAA,UAAU,aAAc,EAAI,SAAS,MAAM,KAAK,CAAC,EAAG,OAAQ,EAAM,EAGvG,IAAM,EAAU,MAAM,QAAQ,IAAI,EAAM,IAAK,GAAS,KAAK,WAAW,gBAAgB,EAAM,CAAG,CAAC,CAAC,EAE3F,EAAkB,CAAC,EACnB,EAA2B,CAAC,EAElC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,IAAM,EAAS,EAAQ,GAEnB,EAAO,OAAO,SAAW,EAC3B,EAAO,KAAK,EAAO,IAAsB,GAEzC,EAAO,KAAK,GAAG,EAAA,iBAAiB,EAAO,OAAQ,CAAC,CAAC,EACjD,EAAO,KAAK,EAAM,EAAoB,EAE1C,CAEA,MAAO,CAAE,KAAM,EAAQ,SAAQ,OAAQ,EAAK,CAC9C,CAEA,IAAI,EAAgB,EAA8D,CAChF,OAAO,KAAK,gBACT,EAAO,IACD,EAAoB,QAAU,EAAe,KAE3C,EAAA,KACL,EAAA,UAAU,UACV,EAAA,eAAe,GAAW,EAAK,SAAS,MAAM,IAAK,CAAE,IAAK,EAAe,OAAmB,CAAC,EAC7F,CACE,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,SAAU,EAAI,WAAa,IAAA,GAAY,EAAS,KAAK,IAAI,EAAI,SAAU,CAAM,CAC/E,CACF,CACF,CACF,CAEA,IAAI,EAAgB,EAA8D,CAChF,OAAO,KAAK,gBACT,EAAO,IACD,EAAoB,QAAU,EAAe,KAE3C,EAAA,KACL,EAAA,UAAU,QACV,EAAA,eAAe,GAAW,EAAK,SAAS,MAAM,IAAK,CAAE,IAAK,EAAe,OAAmB,CAAC,EAC7F,CACE,IAAK,CACP,CACF,EAED,GAAY,CACX,IAAM,EAAM,EAEZ,MAAO,CACL,GAAG,EACH,SAAU,EAAI,WAAa,IAAA,GAAY,EAAS,KAAK,IAAI,EAAI,SAAU,CAAM,CAC/E,CACF,CACF,CACF,CAEA,OAAO,EAAe,EAAgE,CACpF,OAAO,KAAK,gBACT,EAAO,IACD,EAAoB,SAAW,EAAc,KAE3C,EAAA,KACL,EAAA,UAAU,eACV,EAAA,eAAe,GAAW,EAAK,SAAS,MAAM,OAAQ,CAAE,QAAc,OAAmB,CAAC,EAC1F,CAAE,OAAM,CACV,EAED,IAAS,CAAE,GAAG,EAAK,SAAU,EAAO,SAAU,CAAM,EACvD,CACF,CAEA,SAAS,EAA8D,CACrE,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAEd,OAAO,EAAM,OAAS,EAClB,KACA,EAAA,KAAK,EAAA,UAAU,UAAW,EAAA,eAAe,GAAW,EAAK,SAAS,MAAM,SAAU,CAAE,IAAK,EAAG,MAAO,CAAM,CAAC,EAAG,CAC3G,IAAK,CACP,CAAC,CACP,CAAC,CACH,CAgBA,OACE,EACA,EACM,CACN,IAAM,EAAmB,OAAO,GAAsB,YAAc,EAAkB,SAAW,EAC3F,EAAW,EAAoB,EAA0E,KACzG,EAAkB,EACpB,EACA,OAAO,GAAsB,WAC1B,EACD,IAAA,GAEN,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EACV,EAUJ,MARA,CAGE,EAHE,EACS,EAAM,OAAO,EAAG,IAAM,EAAM,MAAM,EAAG,CAAC,CAAC,CAAC,MAAO,GAAM,CAAC,EAAS,EAAG,CAAC,CAAC,CAAC,EAErE,IAAI,IAAI,CAAK,CAAC,CAAC,OAAS,EAAM,OAGvC,EAAiB,KAEd,EAAA,KACL,EAAA,UAAU,eACV,EAAA,eAAe,GAAmB,EAAK,SAAS,MAAM,OAAQ,CAAE,MAAO,CAAmB,CAAC,EAC3F,CACE,OAAQ,EACV,CACF,CACF,CAAC,CACH,CAEA,mBAAyD,CACvD,IAAM,EAAM,KAAK,aAEjB,MAAO,CACL,GAAG,KAAK,cAAc,EACtB,GAAI,EAAI,WAAa,IAAA,GAAyC,CAAC,EAA9B,CAAE,SAAU,EAAI,QAAS,EAC1D,GAAI,EAAI,WAAa,IAAA,GAAyC,CAAC,EAA9B,CAAE,SAAU,EAAI,QAAS,EAC1D,MAAO,KAAK,WAAW,WAAW,EAClC,KAAM,OACR,CACF,CACF"}
1
+ {"version":3,"file":"array.cjs","names":["Schema","prependIssuePath","fail","ErrorCode","resolveMessage","require_errors","require_types","require_core","ArraySchema","itemSchema","issues","parsed","i","items","result","ctx","value","settled","item","length","message","ann","current","exact","typed","isCustomEqualsFn","equalsFnOrMessage","equalsFn","resolvedMessage","isUnique","a","b"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.js","names":["ArraySchema","Schema","itemSchema","issues","parsed","i","items","result","ctx","prependIssuePath","value","fail","ErrorCode","settled","item","length","resolveMessage","message","ann","current","exact","typed","isCustomEqualsFn","equalsFnOrMessage","equalsFn","resolvedMessage","isUnique","a","b"],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n InferInput,\n InferOutput,\n Issue,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n} from '../core';\n\nimport { ErrorCode, fail, prependIssuePath, resolveMessage, Schema } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<T extends AnySchema> extends Schema<InferOutput<T>[], InferInput<T>[]> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const settled = await Promise.all(value.map((item) => this.itemSchema._parseFullAsync(item, ctx)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(value[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues, typeOk: true };\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bigint.cjs","names":[],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n protected override get _kind(): string {\n return 'bigint';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'bigint' ? null : fail(ErrorCode.invalid_type, ctx!.messages.bigint.type()),\n );\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.bigint.min, { min: minimum, value: typed }),\n { min: minimum },\n );\n });\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.bigint.max, { max: maximum, value: typed }),\n { max: maximum },\n );\n });\n }\n\n positive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed > 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.positive, { value: typed }), {\n exclusive: true,\n min: 0n,\n });\n });\n }\n\n negative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed < 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.negative, { value: typed }), {\n exclusive: true,\n max: 0n,\n });\n });\n }\n\n nonNegative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.nonNegative, { value: typed }), {\n min: 0n,\n });\n });\n }\n\n nonPositive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.nonPositive, { value: typed }), {\n max: 0n,\n });\n });\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed % step === 0n) return null;\n\n return fail(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.bigint.multipleOf, { step, value: typed }),\n { step },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n if (this.state.validators.length > 0) {\n warn(\n 'definition(): this bigint schema has constraints (e.g. min(), max(), positive()). ' +\n 'BigInt constraints are not serializable and will not appear in the definition.',\n );\n }\n\n return { ...this._describeBase(), kind: 'bigint' };\n }\n\n static coerce(): BigIntSchema<unknown> {\n return new BigIntSchema().preprocess((value: unknown) => {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return value;\n\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Guard against DoS: BigInt() conversion is O(n²) in digit count.\n if (trimmed.length === 0 || trimmed.length > 1000) return value;\n\n try {\n return BigInt(trimmed);\n } catch {\n return value;\n }\n }\n\n return value;\n });\n }\n}\n"],"mappings":"iHAIA,IAAa,EAAb,MAAa,UAAqC,EAAA,MAAsB,CACtE,IAAuB,OAAgB,CACrC,MAAO,QACT,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAO,GAAU,SAAW,KAAO,EAAA,KAAK,EAAA,UAAU,aAAc,EAAK,SAAS,OAAO,KAAK,CAAC,CAC7F,CACF,CAEA,IAAI,EAAiB,EAA2D,CAC9E,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,GAAS,EAAgB,KAEtB,EAAA,KACL,EAAA,UAAU,UACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,IAAK,CAAE,IAAK,EAAS,MAAO,CAAM,CAAC,EAClF,CAAE,IAAK,CAAQ,CACjB,CACF,CAAC,CACH,CAEA,IAAI,EAAiB,EAA2D,CAC9E,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,GAAS,EAAgB,KAEtB,EAAA,KACL,EAAA,UAAU,QACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,IAAK,CAAE,IAAK,EAAS,MAAO,CAAM,CAAC,EAClF,CAAE,IAAK,CAAQ,CACjB,CACF,CAAC,CACH,CAEA,SAAS,EAA8C,CACrD,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAQ,GAAW,KAEhB,EAAA,KAAK,EAAA,UAAU,UAAW,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,SAAU,CAAE,MAAO,CAAM,CAAC,EAAG,CAC3G,UAAW,GACX,IAAK,EACP,CAAC,CACH,CAAC,CACH,CAEA,SAAS,EAA8C,CACrD,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAQ,GAAW,KAEhB,EAAA,KAAK,EAAA,UAAU,QAAS,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,SAAU,CAAE,MAAO,CAAM,CAAC,EAAG,CACzG,UAAW,GACX,IAAK,EACP,CAAC,CACH,CAAC,CACH,CAEA,YAAY,EAA8C,CACxD,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,GAAS,GAAW,KAEjB,EAAA,KAAK,EAAA,UAAU,UAAW,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,YAAa,CAAE,MAAO,CAAM,CAAC,EAAG,CAC9G,IAAK,EACP,CAAC,CACH,CAAC,CACH,CAEA,YAAY,EAA8C,CACxD,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,GAAS,GAAW,KAEjB,EAAA,KAAK,EAAA,UAAU,QAAS,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,YAAa,CAAE,MAAO,CAAM,CAAC,EAAG,CAC5G,IAAK,EACP,CAAC,CACH,CAAC,CACH,CAEA,WAAW,EAAc,EAA4D,CACnF,OAAO,KAAK,gBAAgB,EAAO,IAAQ,CACzC,IAAM,EAAQ,EAId,OAFI,EAAQ,IAAS,GAAW,KAEzB,EAAA,KACL,EAAA,UAAU,oBACV,EAAA,eAAe,GAAW,EAAK,SAAS,OAAO,WAAY,CAAE,OAAM,MAAO,CAAM,CAAC,EACjF,CAAE,MAAK,CACT,CACF,CAAC,CACH,CAEA,mBAAyD,CAQvD,OAPI,KAAK,MAAM,WAAW,OAOnB,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,QAAS,CACnD,CAEA,OAAO,QAAgC,CACrC,OAAO,IAAI,EAAa,CAAC,CAAC,WAAY,GAAmB,CACvD,GAAI,OAAO,GAAU,SAAU,OAAO,EAEtC,GAAI,OAAO,GAAU,SAAU,CAC7B,GAAI,CAAC,OAAO,SAAS,CAAK,GAAK,CAAC,OAAO,UAAU,CAAK,EAAG,OAAO,EAEhE,GAAI,CACF,OAAO,OAAO,CAAK,CACrB,MAAQ,CACN,OAAO,CACT,CACF,CAEA,GAAI,OAAO,GAAU,SAAU,CAC7B,IAAM,EAAU,EAAM,KAAK,EAG3B,GAAI,EAAQ,SAAW,GAAK,EAAQ,OAAS,IAAM,OAAO,EAE1D,GAAI,CACF,OAAO,OAAO,CAAO,CACvB,MAAQ,CACN,OAAO,CACT,CACF,CAEA,OAAO,CACT,CAAC,CACH,CACF"}
1
+ {"version":3,"file":"bigint.cjs","names":["Schema","fail","ErrorCode","resolveMessage","require_errors","require_types","require_core","BigIntSchema","value","ctx","typed","minimum","message","maximum","step","trimmed"],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n protected override get _kind(): string {\n return 'bigint';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'bigint' ? null : fail(ErrorCode.invalid_type, ctx!.messages.bigint.type()),\n );\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.bigint.min, { min: minimum, value: typed }),\n { min: minimum },\n );\n });\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.bigint.max, { max: maximum, value: typed }),\n { max: maximum },\n );\n });\n }\n\n positive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed > 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.positive, { value: typed }), {\n exclusive: true,\n min: 0n,\n });\n });\n }\n\n negative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed < 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.negative, { value: typed }), {\n exclusive: true,\n max: 0n,\n });\n });\n }\n\n nonNegative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.nonNegative, { value: typed }), {\n min: 0n,\n });\n });\n }\n\n nonPositive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.nonPositive, { value: typed }), {\n max: 0n,\n });\n });\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed % step === 0n) return null;\n\n return fail(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.bigint.multipleOf, { step, value: typed }),\n { step },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n if (this.state.validators.length > 0) {\n warn(\n 'definition(): this bigint schema has constraints (e.g. min(), max(), positive()). ' +\n 'BigInt constraints are not serializable and will not appear in the definition.',\n );\n }\n\n return { ...this._describeBase(), kind: 'bigint' };\n }\n\n static coerce(): BigIntSchema<unknown> {\n return new BigIntSchema().preprocess((value: unknown) => {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return value;\n\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Guard against DoS: BigInt() conversion is O(n²) in digit count.\n if (trimmed.length === 0 || trimmed.length > 1000) return value;\n\n try {\n return BigInt(trimmed);\n } catch {\n return value;\n }\n }\n\n return value;\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bigint.js","names":[],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n protected override get _kind(): string {\n return 'bigint';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'bigint' ? null : fail(ErrorCode.invalid_type, ctx!.messages.bigint.type()),\n );\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.bigint.min, { min: minimum, value: typed }),\n { min: minimum },\n );\n });\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.bigint.max, { max: maximum, value: typed }),\n { max: maximum },\n );\n });\n }\n\n positive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed > 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.positive, { value: typed }), {\n exclusive: true,\n min: 0n,\n });\n });\n }\n\n negative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed < 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.negative, { value: typed }), {\n exclusive: true,\n max: 0n,\n });\n });\n }\n\n nonNegative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.nonNegative, { value: typed }), {\n min: 0n,\n });\n });\n }\n\n nonPositive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.nonPositive, { value: typed }), {\n max: 0n,\n });\n });\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed % step === 0n) return null;\n\n return fail(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.bigint.multipleOf, { step, value: typed }),\n { step },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n if (this.state.validators.length > 0) {\n warn(\n 'definition(): this bigint schema has constraints (e.g. min(), max(), positive()). ' +\n 'BigInt constraints are not serializable and will not appear in the definition.',\n );\n }\n\n return { ...this._describeBase(), kind: 'bigint' };\n }\n\n static coerce(): BigIntSchema<unknown> {\n return new BigIntSchema().preprocess((value: unknown) => {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return value;\n\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Guard against DoS: BigInt() conversion is O(n²) in digit count.\n if (trimmed.length === 0 || trimmed.length > 1000) return value;\n\n try {\n return BigInt(trimmed);\n } catch {\n return value;\n }\n }\n\n return value;\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bigint.js","names":["BigIntSchema","Schema","value","fail","ErrorCode","ctx","typed","minimum","resolveMessage","message","maximum","step","trimmed"],"sources":["../../src/schemas/bigint.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\n\nexport class BigIntSchema<Input = bigint> extends Schema<bigint, Input> {\n protected override get _kind(): string {\n return 'bigint';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'bigint' ? null : fail(ErrorCode.invalid_type, ctx!.messages.bigint.type()),\n );\n }\n\n min(minimum: bigint, message?: MessageFn<{ min: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= minimum) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.bigint.min, { min: minimum, value: typed }),\n { min: minimum },\n );\n });\n }\n\n max(maximum: bigint, message?: MessageFn<{ max: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= maximum) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.bigint.max, { max: maximum, value: typed }),\n { max: maximum },\n );\n });\n }\n\n positive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed > 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.positive, { value: typed }), {\n exclusive: true,\n min: 0n,\n });\n });\n }\n\n negative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed < 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.negative, { value: typed }), {\n exclusive: true,\n max: 0n,\n });\n });\n }\n\n nonNegative(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed >= 0n) return null;\n\n return fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.bigint.nonNegative, { value: typed }), {\n min: 0n,\n });\n });\n }\n\n nonPositive(message?: MessageFn<{ value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed <= 0n) return null;\n\n return fail(ErrorCode.too_big, resolveMessage(message ?? ctx!.messages.bigint.nonPositive, { value: typed }), {\n max: 0n,\n });\n });\n }\n\n multipleOf(step: bigint, message?: MessageFn<{ step: bigint; value: bigint }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as bigint;\n\n if (typed % step === 0n) return null;\n\n return fail(\n ErrorCode.invalid_multiple_of,\n resolveMessage(message ?? ctx!.messages.bigint.multipleOf, { step, value: typed }),\n { step },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n if (this.state.validators.length > 0) {\n warn(\n 'definition(): this bigint schema has constraints (e.g. min(), max(), positive()). ' +\n 'BigInt constraints are not serializable and will not appear in the definition.',\n );\n }\n\n return { ...this._describeBase(), kind: 'bigint' };\n }\n\n static coerce(): BigIntSchema<unknown> {\n return new BigIntSchema().preprocess((value: unknown) => {\n if (typeof value === 'bigint') return value;\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || !Number.isInteger(value)) return value;\n\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n\n // Guard against DoS: BigInt() conversion is O(n²) in digit count.\n if (trimmed.length === 0 || trimmed.length > 1000) return value;\n\n try {\n return BigInt(trimmed);\n } catch {\n return value;\n }\n }\n\n return value;\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"boolean.cjs","names":[],"sources":["../../src/schemas/boolean.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class BooleanSchema<Input = boolean> extends Schema<boolean, Input> {\n protected override get _kind(): string {\n return 'boolean';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'boolean'\n ? null\n : [{ code: ErrorCode.invalid_type, message: ctx!.messages.boolean.type(), path: [] }],\n );\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'boolean' };\n }\n\n static coerce(): BooleanSchema<unknown> {\n return new BooleanSchema().preprocess((v: unknown) => {\n if (typeof v === 'boolean') return v;\n\n if (v === 'true' || v === '1' || v === 1) return true;\n\n if (v === 'false' || v === '0' || v === 0) return false;\n\n return v;\n });\n }\n}\n"],"mappings":"yDAIA,IAAa,EAAb,MAAa,UAAuC,EAAA,MAAuB,CACzE,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAO,GAAU,UACb,KACA,CAAC,CAAE,KAAM,EAAA,UAAU,aAAc,QAAS,EAAK,SAAS,QAAQ,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,CACxF,CACF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,SAAU,CACpD,CAEA,OAAO,QAAiC,CACtC,OAAO,IAAI,EAAc,CAAC,CAAC,WAAY,GACjC,OAAO,GAAM,UAAkB,EAE/B,IAAM,QAAU,IAAM,KAAO,IAAM,EAAU,GAE7C,IAAM,SAAW,IAAM,KAAO,IAAM,EAAU,GAE3C,CACR,CACH,CACF"}
1
+ {"version":3,"file":"boolean.cjs","names":["Schema","ErrorCode","require_types","require_core","BooleanSchema","value","ctx","v"],"sources":["../../src/schemas/boolean.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class BooleanSchema<Input = boolean> extends Schema<boolean, Input> {\n protected override get _kind(): string {\n return 'boolean';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'boolean'\n ? null\n : [{ code: ErrorCode.invalid_type, message: ctx!.messages.boolean.type(), path: [] }],\n );\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'boolean' };\n }\n\n static coerce(): BooleanSchema<unknown> {\n return new BooleanSchema().preprocess((v: unknown) => {\n if (typeof v === 'boolean') return v;\n\n if (v === 'true' || v === '1' || v === 1) return true;\n\n if (v === 'false' || v === '0' || v === 0) return false;\n\n return v;\n });\n }\n}\n"],"mappings":"A,yDAIA,IAAaI,EAAb,MAAaA,UAAuCJ,EAAAA,MAAuB,CACzE,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAOK,GAAU,UACb,KACA,CAAC,CAAE,KAAMJ,EAAAA,UAAU,aAAc,QAASK,EAAK,SAAS,QAAQ,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,CACxF,CACF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,SAAU,CACpD,CAEA,OAAO,QAAiC,CACtC,OAAO,IAAIF,EAAc,CAAC,CAAC,WAAY,GACjC,OAAOG,GAAM,UAAkBA,EAE/BA,IAAM,QAAUA,IAAM,KAAOA,IAAM,EAAU,GAE7CA,IAAM,SAAWA,IAAM,KAAOA,IAAM,EAAU,GAE3CA,CACR,CACH,CACF,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"boolean.js","names":[],"sources":["../../src/schemas/boolean.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class BooleanSchema<Input = boolean> extends Schema<boolean, Input> {\n protected override get _kind(): string {\n return 'boolean';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'boolean'\n ? null\n : [{ code: ErrorCode.invalid_type, message: ctx!.messages.boolean.type(), path: [] }],\n );\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'boolean' };\n }\n\n static coerce(): BooleanSchema<unknown> {\n return new BooleanSchema().preprocess((v: unknown) => {\n if (typeof v === 'boolean') return v;\n\n if (v === 'true' || v === '1' || v === 1) return true;\n\n if (v === 'false' || v === '0' || v === 0) return false;\n\n return v;\n });\n }\n}\n"],"mappings":"4EAIA,IAAa,EAAb,MAAa,UAAuC,CAAuB,CACzE,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAO,GAAU,UACb,KACA,CAAC,CAAE,KAAM,EAAU,aAAc,QAAS,EAAK,SAAS,QAAQ,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,CACxF,CACF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,SAAU,CACpD,CAEA,OAAO,QAAiC,CACtC,OAAO,IAAI,EAAc,CAAC,CAAC,WAAY,GACjC,OAAO,GAAM,UAAkB,EAE/B,IAAM,QAAU,IAAM,KAAO,IAAM,EAAU,GAE7C,IAAM,SAAW,IAAM,KAAO,IAAM,EAAU,GAE3C,CACR,CACH,CACF"}
1
+ {"version":3,"file":"boolean.js","names":["BooleanSchema","Schema","value","ErrorCode","ctx","v"],"sources":["../../src/schemas/boolean.ts"],"sourcesContent":["import type { SchemaDescriptor } from '../core';\n\nimport { ErrorCode, Schema } from '../core';\n\nexport class BooleanSchema<Input = boolean> extends Schema<boolean, Input> {\n protected override get _kind(): string {\n return 'boolean';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'boolean'\n ? null\n : [{ code: ErrorCode.invalid_type, message: ctx!.messages.boolean.type(), path: [] }],\n );\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'boolean' };\n }\n\n static coerce(): BooleanSchema<unknown> {\n return new BooleanSchema().preprocess((v: unknown) => {\n if (typeof v === 'boolean') return v;\n\n if (v === 'true' || v === '1' || v === 1) return true;\n\n if (v === 'false' || v === '0' || v === 0) return false;\n\n return v;\n });\n }\n}\n"],"mappings":"A,4EAIA,IAAaA,EAAb,MAAaA,UAAuCC,CAAuB,CACzE,IAAuB,OAAgB,CACrC,MAAO,SACT,CAEA,aAAc,CACZ,OAAO,EAAO,IACZ,OAAOC,GAAU,UACb,KACA,CAAC,CAAE,KAAMC,EAAU,aAAc,QAASC,EAAK,SAAS,QAAQ,KAAK,EAAG,KAAM,CAAC,CAAE,CAAC,CACxF,CACF,CAEA,mBAAyD,CACvD,MAAO,CAAE,GAAG,KAAK,cAAc,EAAG,KAAM,SAAU,CACpD,CAEA,OAAO,QAAiC,CACtC,OAAO,IAAIJ,EAAc,CAAC,CAAC,WAAY,GACjC,OAAOK,GAAM,UAAkBA,EAE/BA,IAAM,QAAUA,IAAM,KAAOA,IAAM,EAAU,GAE7CA,IAAM,SAAWA,IAAM,KAAOA,IAAM,EAAU,GAE3CA,CACR,CACH,CACF,E"}