@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
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.cjs","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.js","names":["warn"],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __SPELL_PROD__?: boolean }).__SPELL_PROD__;\n\n/** @internal */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/spell] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() / error() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AAGA,SAAgBA,EAAK,EAAmB,CAExC,C"}
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","names":["isPlainObject","createParseContext","ErrorCode","SpellValidationError","SpellDefinitionError","require_errors","require_safe_object","require_messages","require_types","_vielzeug_arsenal","deepFreeze","value","child","materializeValue","item","out","key","mapValue","entry","defaultState","cloneState","state","_makeCtx","messages","normalizeValidateResult","issues","ctxIssues","result","ctx","Schema","typeValidator","c","prepared","core","validationIssues","allIssues","error","fn","next","issue","r","async","cloned","defaultValue","fallback","PipeSchema","description","label","validator","mergeAnnotations","target","processed","withDefault","current","preprocess","postprocess","typeResult","validate","_value","from","to","first","second"],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,fail as r,joinIssuePath as i,prependIssuePath as a,resolveMessage as o}from"./errors.js";import{defineOwnProperty as s}from"./safe-object.js";import{createParseContext as c}from"./messages.js";import{ErrorCode as l}from"./types.js";import{isPlainObject as u}from"@vielzeug/arsenal";function d(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))d(t);return Object.freeze(e)}function f(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>f(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=new Map;for(let[n,r]of e.entries())t.set(f(n),f(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>f(e)));if(u(e)){let t={};for(let[n,r]of Object.entries(e))s(t,n,f(r));return t}return e}function p(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function m(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function h(e){return e?{messages:e}:c()}function g(e,t,n){let r=[...t];return typeof e==`string`?r.push({code:l.custom,message:e,path:[]}):e===!1&&r.length===0&&r.push({code:l.custom,message:n.messages.check.default(),path:[]}),r.length?r:null}var _=class{state;_annotations={};_typeValidator=null;get"~standard"(){return{validate:async e=>{let t=await this.safeParseAsync(e);return t.success?{value:t.data}:{issues:t.error.issues.map(({message:e,path:t})=>({message:e,path:t}))}},vendor:`vielzeug`,version:1}}constructor(e){this.state=p(),this._typeValidator=e??null}parse(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h();return this._withCatch(()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._parse(t.value,r),a=i.typeOk?this._runValidatorsSync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}safeParse(e,t){try{return{data:this.parse(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}async parseAsync(e,t){let r=t??h();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=await this._parseAsync(t.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,t){try{return{data:await this.parseAsync(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}_parseFullSync(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h(),i=this._prepareInput(e);if(i.skip)return{data:i.value,issues:[]};let a=this._parse(i.value,r),o=a.typeOk?this._runValidatorsSync(a.data,r):[],s=[...a.issues,...o];return s.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:a.data,issues:s}:{data:this._runPostprocessors(a.data),issues:[]}}async _parseFullAsync(e,t){let n=t??h(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parseAsync(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>g(e,r,n)):g(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>f(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>f(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new v(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new e(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return d(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(e,t){let r=this._parseFullSync(e);if(r.issues.length===0)return;let i=t?r.issues.map(e=>({...e,message:e.path.length===0?`${t}: ${e.message}`:e.message})):r.issues;throw new n(i)}get kind(){return this._kind}get _kind(){return`unknown`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(m(this.state))}_copyStateTo(e){return e.state=m(this.state),e}_toDescriptorImpl(){return{...this._describeBase(),kind:`unknown`}}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(e,t){if(this._typeValidator){let r=this._typeValidator(e,t);if(r instanceof Promise)throw new n([{code:l.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(r&&r.length>0)return r}let r=[];for(let i of this.state.validators){let a=i(e,t);if(a instanceof Promise)throw new n([{code:l.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);a&&r.push(...a)}return r}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}_parseAsync(e,t){return Promise.resolve(this._parse(e,t))}},v=class extends _{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async _parseAsync(e,t){let n=await this.from._parseFullAsync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=await this.to._parseFullAsync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};export{l as ErrorCode,v as PipeSchema,_ as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,h as _makeCtx,r as fail,i as joinIssuePath,a as prependIssuePath,o as resolveMessage};
1
+ import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n,fail as r,joinIssuePath as i,prependIssuePath as a,resolveMessage as o}from"./errors.js";import{defineOwnProperty as s}from"./safe-object.js";import{createParseContext as c}from"./messages.js";import{ErrorCode as l}from"./types.js";import{isPlainObject as u}from"@vielzeug/arsenal";function d(e){if(typeof e!=`object`||!e||Object.isFrozen(e))return e;for(let t of Object.values(e))d(t);return Object.freeze(e)}function f(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(e=>f(e));if(e instanceof Date)return new Date(e.getTime());if(e instanceof Map){let t=/* @__PURE__ */ new Map;for(let[n,r]of e.entries())t.set(f(n),f(r));return t}if(e instanceof Set)return new Set([...e.values()].map(e=>f(e)));if(u(e)){let t={};for(let[n,r]of Object.entries(e))s(t,n,f(r));return t}return e}function p(){return{hasAsyncChecks:!1,hasRuntimeChecks:!1,isNullable:!1,isOptional:!1,postprocessors:[],preprocessors:[],validators:[]}}function m(e){return{catch:e.catch,defaultValue:e.defaultValue,description:e.description,hasAsyncChecks:e.hasAsyncChecks,hasRuntimeChecks:e.hasRuntimeChecks,isNullable:e.isNullable,isOptional:e.isOptional,postprocessors:[...e.postprocessors],preprocessors:[...e.preprocessors],validators:[...e.validators]}}function h(e){return e?{messages:e}:c()}function g(e,t,n){let r=[...t];return typeof e==`string`?r.push({code:l.custom,message:e,path:[]}):e===!1&&r.length===0&&r.push({code:l.custom,message:n.messages.check.default(),path:[]}),r.length?r:null}var _=class{state;_annotations={};_typeValidator=null;get"~standard"(){return{validate:async e=>{let t=await this.safeParseAsync(e);return t.success?{value:t.data}:{issues:t.error.issues.map(({message:e,path:t})=>({message:e,path:t}))}},vendor:`vielzeug`,version:1}}constructor(e){this.state=p(),this._typeValidator=e??null}parse(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`parse() cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h();return this._withCatch(()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=this._parse(t.value,r),a=i.typeOk?this._runValidatorsSync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}safeParse(e,t){try{return{data:this.parse(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}async parseAsync(e,t){let r=t??h();return this._withCatchAsync(async()=>{let t=this._prepareInput(e);if(t.skip)return t.value;let i=await this._parseAsync(t.value,r),a=i.typeOk?await this._runValidatorsAsync(i.data,r):[],o=[...i.issues,...a];if(o.length)throw new n(o);return this._runPostprocessors(i.data)})}async safeParseAsync(e,t){try{return{data:await this.parseAsync(e,t),success:!0}}catch(e){if(e instanceof n)return{error:e,success:!1};throw e}}_parseFullSync(e,t){if(this.state.hasAsyncChecks)throw new n([{code:l.custom,message:`Sync parsing cannot evaluate async checks. Use parseAsync().`,path:[]}]);let r=t??h(),i=this._prepareInput(e);if(i.skip)return{data:i.value,issues:[]};let a=this._parse(i.value,r),o=a.typeOk?this._runValidatorsSync(a.data,r):[],s=[...a.issues,...o];return s.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:a.data,issues:s}:{data:this._runPostprocessors(a.data),issues:[]}}async _parseFullAsync(e,t){let n=t??h(),r=this._prepareInput(e);if(r.skip)return{data:r.value,issues:[]};let i=await this._parseAsync(r.value,n),a=i.typeOk?await this._runValidatorsAsync(i.data,n):[],o=[...i.issues,...a];return o.length>0?this.state.catch?{data:this.state.catch(),issues:[]}:{data:i.data,issues:o}:{data:this._runPostprocessors(i.data),issues:[]}}check(e){return this._addCheck(e,!1)}checkAsync(e){return this._addCheck(e,!0)}_addCheck(e,t){let n=this._addConstraint((t,n)=>{let r=[],i=e(t,{addIssue:e=>r.push({...e,path:e.path??[]})});return i instanceof Promise?i.then(e=>g(e,r,n)):g(i,r,n)});return n.state.hasRuntimeChecks=!0,t&&(n.state.hasAsyncChecks=!0),n}optional(){let e=this._clone();return e.state.isOptional=!0,e}nullable(){let e=this._clone();return e.state.isNullable=!0,e}nullish(){let e=this._clone();return e.state.isOptional=!0,e.state.isNullable=!0,e}required(){let e=this._clone();return e.state.isOptional=!1,e}default(e){let t=this._clone();return t.state.defaultValue=typeof e==`function`?e:()=>f(e),t}catch(e){let t=this._clone();return t.state.catch=typeof e==`function`?e:()=>f(e),t}transform(e){let t=this._clone();return t.state.postprocessors.push(e),t}preprocess(e){let t=this._clone();return t.state.preprocessors.push(e),t}pipe(e){return new v(this,e)}label(e){let t=this._clone();return t.state.description=e,t}definition(){if(this.state.catch||this.state.defaultValue||this.state.postprocessors.length>0||this.state.preprocessors.length>0||this.state.hasRuntimeChecks)throw new e(`Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.`);return d(this._toDescriptorImpl())}get description(){return this.state.description}get isOptional(){return this.state.isOptional}get isNullable(){return this.state.isNullable}is(e){return this.safeParse(e).success}assert(e,t){let r=this._parseFullSync(e);if(r.issues.length===0)return;let i=t?r.issues.map(e=>({...e,message:e.path.length===0?`${t}: ${e.message}`:e.message})):r.issues;throw new n(i)}get kind(){return this._kind}get _kind(){return`unknown`}_describeBase(){return{...this.state.description===void 0?{}:{description:this.state.description},...this.state.isNullable?{isNullable:!0}:{},...this.state.isOptional?{isOptional:!0}:{}}}_addConstraint(e,t){let n=this._clone();return n.state.validators.push(e),t&&(n._annotations=t({...n._annotations})),n}_construct(e){let t=Object.assign(Object.create(Object.getPrototypeOf(this)),this,{state:e});return t._annotations={...this._annotations},t}_clone(){return this._construct(m(this.state))}_copyStateTo(e){return e.state=m(this.state),e}_toDescriptorImpl(){return{...this._describeBase(),kind:`unknown`}}_withCatch(e){if(!this.state.catch)return e();try{return e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}async _withCatchAsync(e){if(!this.state.catch)return e();try{return await e()}catch(e){if(e instanceof n)return this.state.catch();throw e}}_prepareInput(e){let t=this._runPreprocessors(e),n=t===void 0&&this.state.defaultValue?this.state.defaultValue():t;return this.state.isOptional&&n===void 0||this.state.isNullable&&n===null?{skip:!0,value:n}:{skip:!1,value:n}}_runPreprocessors(e){let t=e;for(let e of this.state.preprocessors)t=e(t);return t}_runPostprocessors(e){let t=e;for(let e of this.state.postprocessors)t=e(t);return t}_runValidatorsSync(e,t){if(this._typeValidator){let r=this._typeValidator(e,t);if(r instanceof Promise)throw new n([{code:l.custom,message:`Type validator returned a Promise. Use parseAsync() for async validation.`,path:[]}]);if(r&&r.length>0)return r}let r=[];for(let i of this.state.validators){let a=i(e,t);if(a instanceof Promise)throw new n([{code:l.custom,message:`Sync parsing received an async check. Use checkAsync() and parseAsync().`,path:[]}]);a&&r.push(...a)}return r}async _runValidatorsAsync(e,t){if(this._typeValidator){let n=await this._typeValidator(e,t);if(n&&n.length>0)return n}let n=[];for(let r of this.state.validators){let i=await r(e,t);i&&n.push(...i)}return n}_parse(e,t){return{data:e,issues:[],typeOk:!0}}_parseAsync(e,t){return Promise.resolve(this._parse(e,t))}},v=class extends _{from;to;get _kind(){return`pipe`}constructor(e,t){super(),this.from=e,this.to=t}_parse(e,t){let n=this.from._parseFullSync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=this.to._parseFullSync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}async _parseAsync(e,t){let n=await this.from._parseFullAsync(e,t);if(n.issues.length>0)return{data:e,issues:n.issues,typeOk:!1};let r=await this.to._parseFullAsync(n.data,t);return r.issues.length>0?{data:n.data,issues:r.issues,typeOk:!1}:{data:r.data,issues:[],typeOk:!0}}_toDescriptorImpl(){return{...this._describeBase(),from:this.from.definition(),kind:`pipe`,to:this.to.definition()}}};export{l as ErrorCode,v as PipeSchema,_ as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,h as _makeCtx,r as fail,i as joinIssuePath,a as prependIssuePath,o as resolveMessage};
2
2
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","names":["deepFreeze","value","child","materializeValue","item","out","key","mapValue","isPlainObject","entry","defineOwnProperty","defaultState","cloneState","state","_makeCtx","messages","createParseContext","normalizeValidateResult","issues","ctxIssues","result","ErrorCode","ctx","Schema","typeValidator","SpellValidationError","c","prepared","core","validationIssues","allIssues","error","fn","next","issue","r","async","cloned","defaultValue","fallback","PipeSchema","description","SpellDefinitionError","label","validator","mergeAnnotations","target","processed","withDefault","current","preprocess","postprocess","typeResult","validate","_value","from","to","first","second","SpellError","fail","joinIssuePath","prependIssuePath","resolveMessage"],"sources":["../src/core.ts"],"sourcesContent":["import { isPlainObject } from '@vielzeug/arsenal';\n\nimport { SpellDefinitionError, SpellValidationError } from './errors';\nimport { createParseContext } from './messages';\nimport { defineOwnProperty } from './safe-object';\nimport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n schemaInput,\n schemaOutput,\n type ValidateFn,\n type ValidateResult,\n} from './types';\n\nexport {\n fail,\n joinIssuePath,\n prependIssuePath,\n resolveMessage,\n SpellDefinitionError,\n SpellError,\n SpellValidationError,\n} from './errors';\nexport {\n type AcceptsMissing,\n type AnySchema,\n type CheckContext,\n ErrorCode,\n type FlatError,\n type FlatErrorFirst,\n type Infer,\n type InferInput,\n type InferOutput,\n type Issue,\n type IssuePath,\n type IssuePathSegment,\n type JsonSchema,\n type MessageFn,\n type Messages,\n type ParseContext,\n type ParseResult,\n type SchemaDescriptor,\n type StandardSchemaV1,\n type SyncParsable,\n type ValidateFn,\n type ValidateResult,\n};\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);\n\n return Object.freeze(value);\n}\n\nfunction materializeValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') return value;\n\n if (Array.isArray(value)) return value.map((item) => materializeValue(item)) as T;\n\n if (value instanceof Date) return new Date(value.getTime()) as T;\n\n if (value instanceof Map) {\n const out = new Map<unknown, unknown>();\n\n for (const [key, mapValue] of value.entries()) out.set(materializeValue(key), materializeValue(mapValue));\n\n return out as T;\n }\n\n if (value instanceof Set) return new Set([...value.values()].map((item) => materializeValue(item))) as T;\n\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) defineOwnProperty(out, key, materializeValue(entry));\n\n return out as T;\n }\n\n return value;\n}\n\n/* -------------------- Schema State -------------------- */\n\ntype Preprocessor = (value: unknown) => unknown;\ntype Postprocessor = (value: unknown) => unknown;\n\nexport interface SchemaState<Output = unknown> {\n catch?: () => Output;\n defaultValue?: () => Output;\n description?: string;\n hasAsyncChecks: boolean;\n hasRuntimeChecks: boolean;\n isNullable: boolean;\n isOptional: boolean;\n postprocessors: Postprocessor[];\n preprocessors: Preprocessor[];\n validators: ValidateFn[];\n}\n\nfunction defaultState<Output>(): SchemaState<Output> {\n return {\n hasAsyncChecks: false,\n hasRuntimeChecks: false,\n isNullable: false,\n isOptional: false,\n postprocessors: [],\n preprocessors: [],\n validators: [],\n };\n}\n\nfunction cloneState<Output>(state: SchemaState<Output>): SchemaState<Output> {\n return {\n catch: state.catch,\n defaultValue: state.defaultValue,\n description: state.description,\n hasAsyncChecks: state.hasAsyncChecks,\n hasRuntimeChecks: state.hasRuntimeChecks,\n isNullable: state.isNullable,\n isOptional: state.isOptional,\n postprocessors: [...state.postprocessors],\n preprocessors: [...state.preprocessors],\n validators: [...state.validators],\n };\n}\n\n/* -------------------- Parse-value return type -------------------- */\n\n/** Parse-value return type for `_parse` implementations. Emitted as part of the public class surface. */\nexport type ParseValue = { data: unknown; issues: Issue[]; typeOk: boolean };\n\n/* -------------------- ParseContext default -------------------- */\n\n/** @internal */\nexport function _makeCtx(messages?: Messages): ParseContext {\n return messages ? { messages } : createParseContext();\n}\n\n/* -------------------- ValidateResult normalizer -------------------- */\n\nfunction normalizeValidateResult(result: ValidateResult, ctxIssues: Issue[], ctx: ParseContext): Issue[] | null {\n const issues = [...ctxIssues];\n\n if (typeof result === 'string') {\n issues.push({ code: ErrorCode.custom, message: result, path: [] });\n } else if (result === false && issues.length === 0) {\n issues.push({ code: ErrorCode.custom, message: ctx.messages.check.default(), path: [] });\n }\n\n return issues.length ? issues : null;\n}\n\n/* -------------------- Base Schema -------------------- */\n\nexport class Schema<Output = unknown, Input = Output> implements StandardSchemaV1<Input, Output> {\n declare readonly [schemaInput]: Input;\n declare readonly [schemaOutput]: Output;\n\n protected state: SchemaState<Output>;\n\n protected _annotations: Record<string, unknown> = {};\n\n private _typeValidator: ValidateFn | null = null;\n\n get '~standard'(): StandardSchemaV1.Props<Input, Output> {\n return {\n validate: async (value) => {\n const result = await this.safeParseAsync(value);\n\n if (result.success) return { value: result.data };\n\n return { issues: result.error.issues.map(({ message, path }) => ({ message, path })) };\n },\n vendor: 'vielzeug',\n version: 1,\n };\n }\n\n constructor(typeValidator?: ValidateFn) {\n this.state = defaultState<Output>();\n this._typeValidator = typeValidator ?? null;\n }\n\n /* -------------------- Parse -------------------- */\n\n parse(value: unknown, ctx?: ParseContext): Output {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'parse() cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n\n return this._withCatch(() => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n safeParse(value: unknown, ctx?: ParseContext): ParseResult<Output> {\n try {\n return {\n data: (this.parse as unknown as (value: unknown, ctx?: ParseContext) => Output)(value, ctx),\n success: true,\n };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n async parseAsync(value: unknown, ctx?: ParseContext): Promise<Output> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as Output;\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(core.data) as Output;\n });\n }\n\n async safeParseAsync(value: unknown, ctx?: ParseContext): Promise<ParseResult<Output>> {\n try {\n return { data: await this.parseAsync(value, ctx), success: true };\n } catch (error) {\n if (error instanceof SpellValidationError) return { error, success: false };\n\n throw error;\n }\n }\n\n /**\n * Internal full parse without throwing. Returns { data, issues }.\n * Used by composite schemas (array, object, union, etc.) to avoid\n * the try/catch + object allocation overhead of safeParse().\n * @internal\n */\n _parseFullSync(value: unknown, ctx?: ParseContext): { data: unknown; issues: Issue[] } {\n if (this.state.hasAsyncChecks) {\n throw new SpellValidationError([\n { code: ErrorCode.custom, message: 'Sync parsing cannot evaluate async checks. Use parseAsync().', path: [] },\n ]);\n }\n\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = this._parse(prepared.value, c);\n const validationIssues = core.typeOk ? this._runValidatorsSync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /**\n * Async version of _parseFullSync.\n * @internal\n */\n async _parseFullAsync(value: unknown, ctx?: ParseContext): Promise<{ data: unknown; issues: Issue[] }> {\n const c = ctx ?? _makeCtx();\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return { data: prepared.value, issues: [] };\n\n const core = await this._parseAsync(prepared.value, c);\n const validationIssues = core.typeOk ? await this._runValidatorsAsync(core.data, c) : [];\n const allIssues = [...core.issues, ...validationIssues];\n\n if (allIssues.length > 0) {\n if (this.state.catch) return { data: this.state.catch(), issues: [] };\n\n return { data: core.data, issues: allIssues };\n }\n\n return { data: this._runPostprocessors(core.data), issues: [] };\n }\n\n /* -------------------- Validators -------------------- */\n\n /**\n * Add a synchronous domain rule. For asynchronous work, use `checkAsync()`;\n * making execution mode explicit prevents unchecked Promise-returning callbacks.\n */\n check<F extends (value: Output, ctx: CheckContext) => ValidateResult | Promise<ValidateResult>>(\n fn: ReturnType<F> extends PromiseLike<unknown> ? never : F,\n ): this {\n return this._addCheck(fn as (value: Output, ctx: CheckContext) => ValidateResult, false);\n }\n\n checkAsync(fn: (value: Output, ctx: CheckContext) => Promise<ValidateResult>): this {\n return this._addCheck(fn, true);\n }\n\n protected _addCheck(\n fn:\n | ((value: Output, ctx: CheckContext) => ValidateResult)\n | ((value: Output, ctx: CheckContext) => Promise<ValidateResult>),\n async: boolean,\n ): this {\n const validator: ValidateFn = (value, ctx) => {\n const ctxIssues: Issue[] = [];\n const checkCtx: CheckContext = {\n addIssue: (issue) => ctxIssues.push({ ...issue, path: issue.path ?? [] } as Issue),\n };\n const result = fn(value as Output, checkCtx);\n\n if (result instanceof Promise) {\n return result.then((r) => normalizeValidateResult(r, ctxIssues, ctx!));\n }\n\n return normalizeValidateResult(result, ctxIssues, ctx!);\n };\n\n const next = this._addConstraint(validator);\n\n next.state.hasRuntimeChecks = true;\n\n if (async) next.state.hasAsyncChecks = true;\n\n return next;\n }\n\n /* -------------------- Nullability / Optionality -------------------- */\n\n optional(): Schema<Output | undefined, Input | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | undefined, Input | undefined>;\n\n cloned.state.isOptional = true;\n\n return cloned as Schema<Output | undefined, Input | undefined> & AcceptsMissing;\n }\n\n nullable(): Schema<Output | null, Input | null> {\n const cloned = this._clone() as unknown as Schema<Output | null, Input | null>;\n\n cloned.state.isNullable = true;\n\n return cloned;\n }\n\n nullish(): Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing {\n const cloned = this._clone() as unknown as Schema<Output | null | undefined, Input | null | undefined>;\n\n cloned.state.isOptional = true;\n cloned.state.isNullable = true;\n\n return cloned as Schema<Output | null | undefined, Input | null | undefined> & AcceptsMissing;\n }\n\n required(): Schema<Exclude<Output, undefined>, Exclude<Input, undefined>> {\n const cloned = this._clone() as unknown as Schema<Exclude<Output, undefined>, Exclude<Input, undefined>>;\n\n cloned.state.isOptional = false;\n\n return cloned;\n }\n\n /* -------------------- Transforms -------------------- */\n\n default(defaultValue: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.defaultValue =\n typeof defaultValue === 'function' ? (defaultValue as () => Output) : () => materializeValue(defaultValue);\n\n return cloned as this & AcceptsMissing;\n }\n\n catch(fallback: Output | (() => Output)): this & AcceptsMissing {\n const cloned = this._clone();\n\n cloned.state.catch = typeof fallback === 'function' ? (fallback as () => Output) : () => materializeValue(fallback);\n\n return cloned as this & AcceptsMissing;\n }\n\n transform<NewOutput>(fn: (value: Output) => NewOutput): Schema<NewOutput, Input> {\n const next = this._clone() as unknown as Schema<NewOutput, Input>;\n\n next.state.postprocessors.push(fn as (v: unknown) => unknown);\n\n return next;\n }\n\n preprocess(fn: (value: unknown) => unknown): this {\n const cloned = this._clone();\n\n cloned.state.preprocessors.push(fn);\n\n return cloned;\n }\n\n pipe<B extends AnySchema>(next: B): PipeSchema<B, this> {\n return new PipeSchema(this, next);\n }\n\n /* -------------------- Introspection -------------------- */\n\n label(description: string): this {\n const cloned = this._clone();\n\n cloned.state.description = description;\n\n return cloned;\n }\n\n definition(): SchemaDescriptor {\n if (\n this.state.catch ||\n this.state.defaultValue ||\n this.state.postprocessors.length > 0 ||\n this.state.preprocessors.length > 0 ||\n this.state.hasRuntimeChecks\n ) {\n throw new SpellDefinitionError(\n 'Schemas with checks, transforms, defaults, catches, or preprocessors have no declarative definition.',\n );\n }\n\n return deepFreeze(this._toDescriptorImpl()) as SchemaDescriptor;\n }\n\n get description(): string | undefined {\n return this.state.description;\n }\n\n get isOptional(): boolean {\n return this.state.isOptional;\n }\n\n get isNullable(): boolean {\n return this.state.isNullable;\n }\n\n is(value: unknown): value is Output {\n return this.safeParse(value).success;\n }\n\n assert(value: unknown, label?: string): asserts value is Output {\n const result = this._parseFullSync(value);\n\n if (result.issues.length === 0) return;\n\n const issues = label\n ? result.issues.map((issue) => ({\n ...issue,\n message: issue.path.length === 0 ? `${label}: ${issue.message}` : issue.message,\n }))\n : result.issues;\n\n throw new SpellValidationError(issues);\n }\n\n get kind(): string {\n return this._kind;\n }\n\n protected get _kind(): string {\n return 'unknown';\n }\n\n /* -------------------- Protected helpers -------------------- */\n\n protected _describeBase(): { description?: string; isNullable?: true; isOptional?: true } {\n return {\n ...(this.state.description !== undefined ? { description: this.state.description } : {}),\n ...(this.state.isNullable ? { isNullable: true as const } : {}),\n ...(this.state.isOptional ? { isOptional: true as const } : {}),\n };\n }\n\n protected _addConstraint(\n validator: ValidateFn,\n mergeAnnotations?: (current: Record<string, unknown>) => Record<string, unknown>,\n ): this {\n const next = this._clone();\n\n next.state.validators.push(validator);\n\n if (mergeAnnotations) {\n next._annotations = mergeAnnotations({ ...next._annotations });\n }\n\n return next;\n }\n\n protected _construct(state: SchemaState<any>): this {\n const next = Object.assign(Object.create(Object.getPrototypeOf(this)), this, { state }) as this;\n\n next._annotations = { ...this._annotations };\n\n return next;\n }\n\n protected _clone(): this {\n return this._construct(cloneState(this.state));\n }\n\n protected _copyStateTo<T extends Schema<any, any>>(target: T): T {\n target.state = cloneState(this.state);\n\n return target;\n }\n\n protected _toDescriptorImpl(): SchemaDescriptor {\n return { ...this._describeBase(), kind: 'unknown' };\n }\n\n /* -------------------- Private -------------------- */\n\n private _withCatch<T>(fn: () => T): T {\n if (!this.state.catch) return fn();\n\n try {\n return fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected async _withCatchAsync<T>(fn: () => Promise<T>): Promise<T> {\n if (!this.state.catch) return fn();\n\n try {\n return await fn();\n } catch (error) {\n if (error instanceof SpellValidationError) return this.state.catch() as unknown as T;\n\n throw error;\n }\n }\n\n protected _prepareInput(value: unknown): { skip: true; value: null | undefined } | { skip: false; value: unknown } {\n const processed = this._runPreprocessors(value);\n const withDefault = processed === undefined && this.state.defaultValue ? this.state.defaultValue() : processed;\n\n if ((this.state.isOptional && withDefault === undefined) || (this.state.isNullable && withDefault === null)) {\n return { skip: true, value: withDefault };\n }\n\n return { skip: false, value: withDefault };\n }\n\n protected _runPreprocessors(value: unknown): unknown {\n let current = value;\n\n for (const preprocess of this.state.preprocessors) current = preprocess(current);\n\n return current;\n }\n\n protected _runPostprocessors(value: unknown): unknown {\n let current = value;\n\n for (const postprocess of this.state.postprocessors) current = postprocess(current);\n\n return current;\n }\n\n private _runValidatorsSync(value: unknown, ctx: ParseContext): Issue[] {\n if (this._typeValidator) {\n const typeResult = this._typeValidator(value, ctx);\n\n if (typeResult instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Type validator returned a Promise. Use parseAsync() for async validation.',\n path: [],\n },\n ]);\n }\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = validate(value, ctx);\n\n if (result instanceof Promise) {\n throw new SpellValidationError([\n {\n code: ErrorCode.custom,\n message: 'Sync parsing received an async check. Use checkAsync() and parseAsync().',\n path: [],\n },\n ]);\n }\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected async _runValidatorsAsync(value: unknown, ctx: ParseContext): Promise<Issue[]> {\n if (this._typeValidator) {\n const typeResult = await this._typeValidator(value, ctx);\n\n if (typeResult && typeResult.length > 0) return typeResult;\n }\n\n const issues: Issue[] = [];\n\n for (const validate of this.state.validators) {\n const result = await validate(value, ctx);\n\n if (result) issues.push(...result);\n }\n\n return issues;\n }\n\n protected _parse(_value: unknown, _ctx: ParseContext): ParseValue {\n return { data: _value, issues: [], typeOk: true };\n }\n\n /**\n * Async counterpart of `_parse`. Composites override this to parse their\n * children through `_parseFullAsync`, which keeps async checks reachable at\n * any nesting depth. The default defers to the synchronous `_parse`.\n */\n protected _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n return Promise.resolve(this._parse(value, ctx));\n }\n}\n\n/* -------------------- PipeSchema -------------------- */\n\nexport class PipeSchema<To extends AnySchema, From extends AnySchema> extends Schema<\n InferOutput<To>,\n InferInput<From>\n> {\n readonly from: From;\n readonly to: To;\n\n protected override get _kind(): string {\n return 'pipe';\n }\n\n constructor(from: From, to: To) {\n super();\n this.from = from;\n this.to = to;\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n const first = this.from._parseFullSync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = this.to._parseFullSync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override async _parseAsync(value: unknown, ctx: ParseContext): Promise<ParseValue> {\n const first = await this.from._parseFullAsync(value, ctx);\n\n if (first.issues.length > 0) return { data: value, issues: first.issues, typeOk: false };\n\n const second = await this.to._parseFullAsync(first.data, ctx);\n\n return second.issues.length > 0\n ? { data: first.data, issues: second.issues, typeOk: false }\n : { data: second.data, issues: [], typeOk: true };\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n return {\n ...this._describeBase(),\n from: this.from.definition(),\n kind: 'pipe',\n to: this.to.definition(),\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgB,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgB,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAO,GAAQ,WAAa,EAAI,CAAG,EAAI,CAChD,CAEA,SAAgB,EAAiB,EAAiB,EAAkC,CAClF,OAAO,EAAO,IAAK,IAAW,CAAE,GAAG,EAAO,KAAM,CAAC,EAAQ,GAAG,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgB,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAAC,GAAQ,EAAK,SAAW,EAAU,GAEhC,EACJ,IAAK,GACA,OAAO,GAAY,UAAY,GAAoB,QAAS,EAAgB,OAAO,EAAQ,GAAG,EAC3F,OAAO,CAAO,CACtB,CAAC,CACD,KAAK,CAAS,CACnB,CAKA,IAAa,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAAS,EAAa,EAAyB,CAC7C,OAAO,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFS,EAAK,OAAS,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAI,EAAQ,IAAI,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAAS,EAAW,EAAoC,EAA8C,CACpG,OAAO,EAAK,SAAW,EAAM,QAAU,EAAK,OAAO,EAAS,IAAU,IAAY,EAAM,EAAM,CAChG,CAKA,IAAa,EAAb,cAA0C,CAAW,CAAC,EAEzC,EAAb,cAA0C,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAM,EAAa,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAG,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAM,EAA2B,CAAC,EAC5B,EAAuB,CAAC,EACxB,EAAU,IAAI,IAEpB,IAAK,IAAM,KAAS,KAAK,OACvB,GAAI,EAAM,KAAK,SAAW,EACxB,EAAW,KAAK,EAAM,OAAO,MACxB,CACL,IAAM,EAAM,KAAK,UAAU,EAAM,IAAI,EAC/B,EAAW,EAAQ,IAAI,CAAG,EAE5B,IAAa,IAAA,IAGf,EAAQ,IAAI,EAAK,EAAY,MAAM,EACnC,EAAY,KAAK,CAAE,SAAU,CAAC,EAAM,OAAO,EAAG,KAAM,CAAC,GAAG,EAAM,IAAI,CAAE,CAAC,GAHrE,EAAY,EAAS,EAAE,SAAS,KAAK,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAa,EAAY,IAAK,IAAQ,CAAE,QAAS,EAAG,SAAS,GAAK,KAAM,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAG,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAU,EAAW,EAAM,KAAM,CAAI,CAAC,CAAC,CAAC,IAAK,GAAU,EAAM,OAAO,CACjG,CACF"}
1
+ {"version":3,"file":"errors.cjs","names":["fail","resolveMessage","msg","ctx","prependIssuePath","issues","issue","prefix","joinIssuePath","path","segment","separator","SpellError","message","opts","formatIssues","code","pathsEqual","left","right","index","SpellDefinitionError","SpellValidationError","fieldErrors","formErrors","pathMap","key","existing","fe"],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgBA,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgBC,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAOC,GAAQ,WAAaA,EAAIC,CAAG,EAAID,CAChD,CAEA,SAAgBE,EAAiB,EAAiB,EAAkC,CAClF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAQ,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgBE,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAACC,GAAQA,EAAK,SAAW,EAAU,GAEhCA,EACJ,IAAK,GACA,OAAOC,GAAY,UAAYA,GAAoB,QAASA,EAAgB,OAAOA,EAAQ,GAAG,EAC3F,OAAOA,CAAO,CACtB,CAAC,CACD,KAAKC,CAAS,CACnB,CAKA,IAAaC,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAASC,EAAa,EAAyB,CAC7C,OAAOV,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFSI,EAAK,OAASA,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAII,EAAQ,IAAIG,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUR,IAAYS,EAAMC,EAAM,CAChG,CAKA,IAAaC,EAAb,cAA0CT,CAAW,CAAC,EAEzCU,EAAb,cAA0CV,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAMG,EAAaV,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGA,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAMkB,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,EAAU,IAAI,IAEpB,IAAK,IAAMnB,KAAS,KAAK,OACvB,GAAIA,EAAM,KAAK,SAAW,EACxBkB,EAAW,KAAKlB,EAAM,OAAO,MACxB,CACL,IAAMoB,EAAM,KAAK,UAAUpB,EAAM,IAAI,EAC/BqB,EAAWF,EAAQ,IAAIC,CAAG,EAE5BC,IAAa,IAAA,IAGfF,EAAQ,IAAIC,EAAKH,EAAY,MAAM,EACnCA,EAAY,KAAK,CAAE,SAAU,CAACjB,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,CAAC,GAHrEiB,EAAYI,EAAS,EAAE,SAAS,KAAKrB,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAaiB,EAAY,IAAK,IAAQ,CAAE,QAASK,EAAG,SAAS,GAAK,KAAMA,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAGnB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUQ,EAAWX,EAAM,KAAMG,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUH,EAAM,OAAO,CACjG,CACF,E"}
package/dist/errors.js CHANGED
@@ -1,3 +1,3 @@
1
1
  function e(e,t,n){return[{code:e,message:t,params:n,path:[]}]}function t(e,t){return typeof e==`function`?e(t):e}function n(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}function r(e,t=`.`){return!e||e.length===0?``:e.map(e=>typeof e==`object`&&e&&`key`in e?String(e.key):String(e)).join(t)}var i=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}};function a(e){return e.map(({code:e,message:t,path:n})=>`${n.length?n.join(`.`):`value`}: ${t} [${e}]`).join(`
2
- `)}function o(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var s=class extends i{},c=class extends i{issues;constructor(e,t){super(a(e),{cause:t}),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=new Map;for(let r of this.issues)if(r.path.length===0)t.push(r.message);else{let t=JSON.stringify(r.path),i=n.get(t);i===void 0?(n.set(t,e.length),e.push({messages:[r.message],path:[...r.path]})):e[i]?.messages.push(r.message)}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(e=>({message:e.messages[0],path:e.path})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>o(t.path,e)).map(e=>e.message)}};export{s as SpellDefinitionError,i as SpellError,c as SpellValidationError,e as fail,r as joinIssuePath,n as prependIssuePath,t as resolveMessage};
2
+ `)}function o(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var s=class extends i{},c=class extends i{issues;constructor(e,t){super(a(e),{cause:t}),this.issues=Object.freeze([...e])}flatten(){let e=[],t=[],n=/* @__PURE__ */ new Map;for(let r of this.issues)if(r.path.length===0)t.push(r.message);else{let t=JSON.stringify(r.path),i=n.get(t);i===void 0?(n.set(t,e.length),e.push({messages:[r.message],path:[...r.path]})):e[i]?.messages.push(r.message)}return{fieldErrors:e,formErrors:t}}flattenFirst(){let{fieldErrors:e,formErrors:t}=this.flatten();return{fieldErrors:e.map(e=>({message:e.messages[0],path:e.path})),formErrors:t}}messagesAt(...e){return this.issues.filter(t=>o(t.path,e)).map(e=>e.message)}};export{s as SpellDefinitionError,i as SpellError,c as SpellValidationError,e as fail,r as joinIssuePath,n as prependIssuePath,t as resolveMessage};
3
3
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgB,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgB,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAO,GAAQ,WAAa,EAAI,CAAG,EAAI,CAChD,CAEA,SAAgB,EAAiB,EAAiB,EAAkC,CAClF,OAAO,EAAO,IAAK,IAAW,CAAE,GAAG,EAAO,KAAM,CAAC,EAAQ,GAAG,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgB,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAAC,GAAQ,EAAK,SAAW,EAAU,GAEhC,EACJ,IAAK,GACA,OAAO,GAAY,UAAY,GAAoB,QAAS,EAAgB,OAAO,EAAQ,GAAG,EAC3F,OAAO,CAAO,CACtB,CAAC,CACD,KAAK,CAAS,CACnB,CAKA,IAAa,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAAS,EAAa,EAAyB,CAC7C,OAAO,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFS,EAAK,OAAS,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAI,EAAQ,IAAI,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAAS,EAAW,EAAoC,EAA8C,CACpG,OAAO,EAAK,SAAW,EAAM,QAAU,EAAK,OAAO,EAAS,IAAU,IAAY,EAAM,EAAM,CAChG,CAKA,IAAa,EAAb,cAA0C,CAAW,CAAC,EAEzC,EAAb,cAA0C,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAM,EAAa,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAG,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAM,EAA2B,CAAC,EAC5B,EAAuB,CAAC,EACxB,EAAU,IAAI,IAEpB,IAAK,IAAM,KAAS,KAAK,OACvB,GAAI,EAAM,KAAK,SAAW,EACxB,EAAW,KAAK,EAAM,OAAO,MACxB,CACL,IAAM,EAAM,KAAK,UAAU,EAAM,IAAI,EAC/B,EAAW,EAAQ,IAAI,CAAG,EAE5B,IAAa,IAAA,IAGf,EAAQ,IAAI,EAAK,EAAY,MAAM,EACnC,EAAY,KAAK,CAAE,SAAU,CAAC,EAAM,OAAO,EAAG,KAAM,CAAC,GAAG,EAAM,IAAI,CAAE,CAAC,GAHrE,EAAY,EAAS,EAAE,SAAS,KAAK,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAa,EAAY,IAAK,IAAQ,CAAE,QAAS,EAAG,SAAS,GAAK,KAAM,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAG,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAU,EAAW,EAAM,KAAM,CAAI,CAAC,CAAC,CAAC,IAAK,GAAU,EAAM,OAAO,CACjG,CACF"}
1
+ {"version":3,"file":"errors.js","names":["fail","resolveMessage","msg","ctx","prependIssuePath","issues","issue","prefix","joinIssuePath","path","segment","separator","SpellError","message","opts","formatIssues","code","pathsEqual","left","right","index","SpellDefinitionError","SpellValidationError","fieldErrors","formErrors","pathMap","key","existing","fe"],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, IssuePath, MessageFn } from './types';\n\n/* -------------------- Helpers -------------------- */\n\ntype IssueParams<C extends string> = Extract<Issue, { code: C }> extends { params: infer P } ? P : undefined;\n\n/**\n * Creates a single-error failure array. Use in validator functions instead of building the array manually.\n * Typed overloads ensure params match the given error code.\n */\nexport function fail<C extends ErrorCode>(code: C, message: string, params: IssueParams<C>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[];\nexport function fail(code: string, message: string, params?: Record<string, unknown>): Issue[] {\n return [{ code, message, params, path: [] } as Issue];\n}\n\n/** Resolve a message value or factory against a context. Re-exported by `core` for schema modules. */\nexport function resolveMessage<Ctx extends Record<string, unknown>>(msg: MessageFn<Ctx>, ctx: Ctx): string {\n return typeof msg === 'function' ? msg(ctx) : msg;\n}\n\nexport function prependIssuePath(issues: Issue[], prefix: string | number): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [prefix, ...issue.path] }));\n}\n\n/**\n * Flattens an issue path into a UI key such as `'permissions.0.slug'`. Handles spell-native\n * `(string | number)[]` paths and Standard Schema paths with `{ key }` segments; empty or\n * undefined paths join to `''`.\n */\nexport function joinIssuePath(path: IssuePath | undefined, separator = '.'): string {\n if (!path || path.length === 0) return '';\n\n return path\n .map((segment) => {\n if (typeof segment === 'object' && segment !== null && 'key' in segment) return String(segment.key);\n return String(segment);\n })\n .join(separator);\n}\n\n/* -------------------- SpellError -------------------- */\n\n/** Base class for all spell errors. Use `instanceof SpellError` to catch any spell-originated error. */\nexport class SpellError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/* -------------------- SpellValidationError -------------------- */\n\nfunction formatIssues(issues: Issue[]): string {\n return issues\n .map(({ code, message, path }) => {\n const pathStr = path.length ? path.join('.') : 'value';\n\n return `${pathStr}: ${message} [${code}]`;\n })\n .join('\\n');\n}\n\nfunction pathsEqual(left: readonly (string | number)[], right: readonly (string | number)[]): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index]);\n}\n\nexport type FlatError = { messages: string[]; path: (string | number)[] };\nexport type FlatErrorFirst = { message: string; path: (string | number)[] };\n\nexport class SpellDefinitionError extends SpellError {}\n\nexport class SpellValidationError extends SpellError {\n readonly issues: Issue[];\n\n constructor(issues: Issue[], cause?: unknown) {\n super(formatIssues(issues), { cause });\n this.issues = Object.freeze([...issues]) as Issue[];\n }\n\n flatten(): { fieldErrors: FlatError[]; formErrors: string[] } {\n const fieldErrors: FlatError[] = [];\n const formErrors: string[] = [];\n const pathMap = new Map<string, number>();\n\n for (const issue of this.issues) {\n if (issue.path.length === 0) {\n formErrors.push(issue.message);\n } else {\n const key = JSON.stringify(issue.path);\n const existing = pathMap.get(key);\n\n if (existing !== undefined) {\n fieldErrors[existing]?.messages.push(issue.message);\n } else {\n pathMap.set(key, fieldErrors.length);\n fieldErrors.push({ messages: [issue.message], path: [...issue.path] });\n }\n }\n }\n\n return { fieldErrors, formErrors };\n }\n\n flattenFirst(): { fieldErrors: FlatErrorFirst[]; formErrors: string[] } {\n const { fieldErrors, formErrors } = this.flatten();\n\n return {\n fieldErrors: fieldErrors.map((fe) => ({ message: fe.messages[0]!, path: fe.path })),\n formErrors,\n };\n }\n\n /** Returns every message attached to exactly `path`, in issue order. */\n messagesAt(...path: (string | number)[]): string[] {\n return this.issues.filter((issue) => pathsEqual(issue.path, path)).map((issue) => issue.message);\n }\n}\n"],"mappings":"AAYA,SAAgBA,EAAK,EAAc,EAAiB,EAA2C,CAC7F,MAAO,CAAC,CAAE,OAAM,UAAS,SAAQ,KAAM,CAAC,CAAE,CAAU,CACtD,CAGA,SAAgBC,EAAoD,EAAqB,EAAkB,CACzG,OAAO,OAAOC,GAAQ,WAAaA,EAAIC,CAAG,EAAID,CAChD,CAEA,SAAgBE,EAAiB,EAAiB,EAAkC,CAClF,OAAOC,EAAO,IAAK,IAAW,CAAE,GAAGC,EAAO,KAAM,CAACC,EAAQ,GAAGD,EAAM,IAAI,CAAE,EAAE,CAC5E,CAOA,SAAgBE,EAAc,EAA6B,EAAY,IAAa,CAGlF,MAFI,CAACC,GAAQA,EAAK,SAAW,EAAU,GAEhCA,EACJ,IAAK,GACA,OAAOC,GAAY,UAAYA,GAAoB,QAASA,EAAgB,OAAOA,EAAQ,GAAG,EAC3F,OAAOA,CAAO,CACtB,CAAC,CACD,KAAKC,CAAS,CACnB,CAKA,IAAaC,EAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMC,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAIA,SAASC,EAAa,EAAyB,CAC7C,OAAOV,EACJ,KAAK,CAAE,OAAM,UAAS,UAGd,GAFSI,EAAK,OAASA,EAAK,KAAK,GAAG,EAAI,QAE7B,IAAII,EAAQ,IAAIG,EAAK,EACxC,CAAC,CACD,KAAK;CAAI,CACd,CAEA,SAASC,EAAW,EAAoC,EAA8C,CACpG,OAAOC,EAAK,SAAWC,EAAM,QAAUD,EAAK,OAAO,EAAS,IAAUR,IAAYS,EAAMC,EAAM,CAChG,CAKA,IAAaC,EAAb,cAA0CT,CAAW,CAAC,EAEzCU,EAAb,cAA0CV,CAAW,CACnD,OAEA,YAAY,EAAiB,EAAiB,CAC5C,MAAMG,EAAaV,CAAM,EAAG,CAAE,OAAM,CAAC,EACrC,KAAK,OAAS,OAAO,OAAO,CAAC,GAAGA,CAAM,CAAC,CACzC,CAEA,SAA8D,CAC5D,IAAMkB,EAA2B,CAAC,EAC5BC,EAAuB,CAAC,EACxBC,kBAAU,IAAI,IAEpB,IAAK,IAAMnB,KAAS,KAAK,OACvB,GAAIA,EAAM,KAAK,SAAW,EACxBkB,EAAW,KAAKlB,EAAM,OAAO,MACxB,CACL,IAAMoB,EAAM,KAAK,UAAUpB,EAAM,IAAI,EAC/BqB,EAAWF,EAAQ,IAAIC,CAAG,EAE5BC,IAAa,IAAA,IAGfF,EAAQ,IAAIC,EAAKH,EAAY,MAAM,EACnCA,EAAY,KAAK,CAAE,SAAU,CAACjB,EAAM,OAAO,EAAG,KAAM,CAAC,GAAGA,EAAM,IAAI,CAAE,CAAC,GAHrEiB,EAAYI,EAAS,EAAE,SAAS,KAAKrB,EAAM,OAAO,CAKtD,CAGF,MAAO,CAAE,cAAa,YAAW,CACnC,CAEA,cAAwE,CACtE,GAAM,CAAE,cAAa,cAAe,KAAK,QAAQ,EAEjD,MAAO,CACL,YAAaiB,EAAY,IAAK,IAAQ,CAAE,QAASK,EAAG,SAAS,GAAK,KAAMA,EAAG,IAAK,EAAE,EAClF,YACF,CACF,CAGA,WAAW,GAAGnB,EAAqC,CACjD,OAAO,KAAK,OAAO,OAAQ,GAAUQ,EAAWX,EAAM,KAAMG,CAAI,CAAC,CAAC,CAAC,IAAK,GAAUH,EAAM,OAAO,CACjG,CACF,E"}
@@ -1 +1 @@
1
- {"version":3,"file":"formats.cjs","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
1
+ {"version":3,"file":"formats.cjs","names":["isEmail","v","_DEFAULT_URL_PROTOCOLS","isUrl","parsed","protocols","p","isUuid","isIsoDate","d","isIsoDateTime","isIp","n","o","isCuid","isCuid2","isUlid","isNanoid","length","isBase64","isBase64url","isHex","isHexColor","isEmoji","isJwt","isTime","isDuration","isSemver","isSlug","isNumeric"],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgBA,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAKC,CAAC,CAClE,CAEA,IAAMC,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgBC,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAMC,EAAS,IAAI,IAAIH,CAAC,EAGxB,OAFgBI,EAAY,IAAI,IAAIA,EAAU,IAAK,GAAMC,EAAE,YAAY,CAAC,CAAC,EAAIJ,EAAA,CAE9D,IAAIE,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgBG,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAKN,CAAC,CACjF,CAEA,SAAgBO,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAKP,CAAC,EAAG,MAAO,GAE3C,IAAMQ,EAAI,IAAI,KAAKR,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAMQ,EAAE,QAAQ,CAAC,GAAKA,EAAE,YAAY,CAAC,CAAC,WAAWR,CAAC,CACnE,CAEA,SAAgBS,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAKT,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAKA,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgBU,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAKV,CAAC,EAClC,OAAOA,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAMW,EAAI,SAASC,EAAG,EAAE,EAExB,OAAOD,GAAK,GAAKA,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAWX,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgBa,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAKb,CAAC,CACjC,CAEA,SAAgBc,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAKd,CAAC,CACrC,CAEA,SAAgBe,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAKf,CAAC,CAC/C,CAMA,SAAgBgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAOhB,EAAE,SAAWiB,GAAU,mBAAmB,KAAKjB,CAAC,CACzD,CAEA,SAAgBkB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAKlB,CAAC,CAClG,CAMA,SAAgBmB,EAAY,EAAoB,CAG9C,OAFInB,EAAE,SAAW,GAAKA,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAKA,CAAC,CACxC,CAEA,SAAgBoB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAKpB,CAAC,CAChC,CAEA,SAAgBqB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAKrB,CAAC,CACrE,CAEA,SAAgBsB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAKtB,CAAC,CAC/C,CAEA,SAAgBuB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAKvB,CAAC,CAClE,CAEA,SAAgBwB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAKxB,CAAC,CAC1D,CAEA,SAAgByB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAKzB,CAAC,CAC9F,CAEA,SAAgB0B,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L1B,CACF,CACF,CAEA,SAAgB2B,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK3B,CAAC,CAC5C,CAEA,SAAgB4B,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK5B,CAAC,CAC3D,C"}
package/dist/formats.js CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(e)}var t=new Set([`http`,`https`]);function n(e,n){try{let r=new URL(e);return(n?new Set(n.map(e=>e.toLowerCase())):t).has(r.protocol.replace(`:`,``).toLowerCase())}catch{return!1}}function r(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}function i(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return!1;let t=new Date(e);return!Number.isNaN(t.getTime())&&t.toISOString().startsWith(e)}function a(e){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})?$/.test(e)&&!Number.isNaN(new Date(e).getTime())}function o(e){if(/^(\d{1,3}\.){3}\d{1,3}$/.test(e))return e.split(`.`).every(e=>{let t=parseInt(e,10);return t>=0&&t<=255});try{return new URL(`http://[${e}]/`),!0}catch{return!1}}function s(e){return/^c[a-z0-9]{8,}$/.test(e)}function c(e){return/^[a-z][a-z0-9]{23}$/.test(e)}function l(e){return/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(e)}function u(e,t=21){return e.length===t&&/^[A-Za-z0-9_-]+$/.test(e)}function d(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(e)}function f(e){return e.length===0||e.length%4==1?!1:/^[A-Za-z0-9_-]*={0,2}$/.test(e)}function p(e){return/^[A-Fa-f0-9]+$/.test(e)}function m(e){return/^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(e)}function h(e){return/^\p{Extended_Pictographic}+$/u.test(e)}function g(e){return/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(e)}function _(e){return/^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/.test(e)}function v(e){return/^P(?=\d|T\d)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+(?:\.\d+)?S)?)?$/.test(e)}function y(e){return/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/.test(e)}function b(e){return/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)}function x(e){return/^[-+]?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?$/i.test(e)}export{d as isBase64,f as isBase64url,s as isCuid,c as isCuid2,v as isDuration,e as isEmail,h as isEmoji,p as isHex,m as isHexColor,o as isIp,i as isIsoDate,a as isIsoDateTime,g as isJwt,u as isNanoid,x as isNumeric,y as isSemver,b as isSlug,_ as isTime,l as isUlid,n as isUrl,r as isUuid};
1
+ function e(e){return/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(e)}var t=/* @__PURE__ */ new Set([`http`,`https`]);function n(e,n){try{let r=new URL(e);return(n?new Set(n.map(e=>e.toLowerCase())):t).has(r.protocol.replace(`:`,``).toLowerCase())}catch{return!1}}function r(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}function i(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return!1;let t=new Date(e);return!Number.isNaN(t.getTime())&&t.toISOString().startsWith(e)}function a(e){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})?$/.test(e)&&!Number.isNaN(new Date(e).getTime())}function o(e){if(/^(\d{1,3}\.){3}\d{1,3}$/.test(e))return e.split(`.`).every(e=>{let t=parseInt(e,10);return t>=0&&t<=255});try{return new URL(`http://[${e}]/`),!0}catch{return!1}}function s(e){return/^c[a-z0-9]{8,}$/.test(e)}function c(e){return/^[a-z][a-z0-9]{23}$/.test(e)}function l(e){return/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(e)}function u(e,t=21){return e.length===t&&/^[A-Za-z0-9_-]+$/.test(e)}function d(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(e)}function f(e){return e.length===0||e.length%4==1?!1:/^[A-Za-z0-9_-]*={0,2}$/.test(e)}function p(e){return/^[A-Fa-f0-9]+$/.test(e)}function m(e){return/^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(e)}function h(e){return/^\p{Extended_Pictographic}+$/u.test(e)}function g(e){return/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(e)}function _(e){return/^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/.test(e)}function v(e){return/^P(?=\d|T\d)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+(?:\.\d+)?S)?)?$/.test(e)}function y(e){return/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/.test(e)}function b(e){return/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(e)}function x(e){return/^[-+]?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?$/i.test(e)}export{d as isBase64,f as isBase64url,s as isCuid,c as isCuid2,v as isDuration,e as isEmail,h as isEmoji,p as isHex,m as isHexColor,o as isIp,i as isIsoDate,a as isIsoDateTime,g as isJwt,u as isNanoid,x as isNumeric,y as isSemver,b as isSlug,_ as isTime,l as isUlid,n as isUrl,r as isUuid};
2
2
  //# sourceMappingURL=formats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formats.js","names":[],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,IAAM,EAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgB,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAM,EAAS,IAAI,IAAI,CAAC,EAGxB,OAFgB,EAAY,IAAI,IAAI,EAAU,IAAK,GAAM,EAAE,YAAY,CAAC,CAAC,EAAI,EAAA,CAE9D,IAAI,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAK,CAAC,CACjF,CAEA,SAAgB,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAK,CAAC,EAAG,MAAO,GAE3C,IAAM,EAAI,IAAI,KAAK,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAK,EAAE,YAAY,CAAC,CAAC,WAAW,CAAC,CACnE,CAEA,SAAgB,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAK,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgB,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAM,EAAI,SAAS,EAAG,EAAE,EAExB,OAAO,GAAK,GAAK,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAW,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAK,CAAC,CACjC,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAK,CAAC,CACrC,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAMA,SAAgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAO,EAAE,SAAW,GAAU,mBAAmB,KAAK,CAAC,CACzD,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAK,CAAC,CAClG,CAMA,SAAgB,EAAY,EAAoB,CAG9C,OAFI,EAAE,SAAW,GAAK,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAK,CAAC,CACxC,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAK,CAAC,CAChC,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAK,CAAC,CACrE,CAEA,SAAgB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAK,CAAC,CAC/C,CAEA,SAAgB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAK,CAAC,CAClE,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAK,CAAC,CAC1D,CAEA,SAAgB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAK,CAAC,CAC9F,CAEA,SAAgB,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L,CACF,CACF,CAEA,SAAgB,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK,CAAC,CAC5C,CAEA,SAAgB,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK,CAAC,CAC3D"}
1
+ {"version":3,"file":"formats.js","names":["isEmail","v","_DEFAULT_URL_PROTOCOLS","isUrl","parsed","protocols","p","isUuid","isIsoDate","d","isIsoDateTime","isIp","n","o","isCuid","isCuid2","isUlid","isNanoid","length","isBase64","isBase64url","isHex","isHexColor","isEmoji","isJwt","isTime","isDuration","isSemver","isSlug","isNumeric"],"sources":["../src/formats.ts"],"sourcesContent":["/**\n * Pure string format validators.\n *\n * All functions take a `string` and return `boolean`. They are exported as part of the\n * public API so callers can use them independently of any Schema.\n *\n * ```ts\n * import { isEmail, isUuid } from '@vielzeug/spell/predicates';\n * isEmail('foo@bar.com'); // true\n * ```\n */\n\nexport function isEmail(v: string): boolean {\n return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(v);\n}\n\nconst _DEFAULT_URL_PROTOCOLS = new Set(['http', 'https']);\n\nexport function isUrl(v: string, protocols?: readonly string[]): boolean {\n try {\n const parsed = new URL(v);\n const allowed = protocols ? new Set(protocols.map((p) => p.toLowerCase())) : _DEFAULT_URL_PROTOCOLS;\n\n return allowed.has(parsed.protocol.replace(':', '').toLowerCase());\n } catch {\n return false;\n }\n}\n\nexport function isUuid(v: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);\n}\n\nexport function isIsoDate(v: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) return false;\n\n const d = new Date(v);\n\n return !Number.isNaN(d.getTime()) && d.toISOString().startsWith(v);\n}\n\nexport function isIsoDateTime(v: string): boolean {\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:\\d{2})?$/.test(v) &&\n !Number.isNaN(new Date(v).getTime())\n );\n}\n\nexport function isIp(v: string): boolean {\n // IPv4\n if (/^(\\d{1,3}\\.){3}\\d{1,3}$/.test(v)) {\n return v.split('.').every((o) => {\n const n = parseInt(o, 10);\n\n return n >= 0 && n <= 255;\n });\n }\n\n // IPv6: rely on URL parser\n try {\n new URL(`http://[${v}]/`);\n\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isCuid(v: string): boolean {\n return /^c[a-z0-9]{8,}$/.test(v);\n}\n\nexport function isCuid2(v: string): boolean {\n return /^[a-z][a-z0-9]{23}$/.test(v);\n}\n\nexport function isUlid(v: string): boolean {\n return /^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(v);\n}\n\n/**\n * Validates a NanoID string. The default NanoID length is 21 characters; pass a\n * custom length to validate IDs generated with non-default sizes.\n */\nexport function isNanoid(v: string, length = 21): boolean {\n return v.length === length && /^[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isBase64(v: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(v);\n}\n\n/**\n * Validates a base64url-encoded string (RFC 4648 §5). Accepts unpadded and padded forms.\n * A string whose length % 4 === 1 is never valid base64url.\n */\nexport function isBase64url(v: string): boolean {\n if (v.length === 0 || v.length % 4 === 1) return false;\n\n return /^[A-Za-z0-9_-]*={0,2}$/.test(v);\n}\n\nexport function isHex(v: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(v);\n}\n\nexport function isHexColor(v: string): boolean {\n return /^#(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(v);\n}\n\nexport function isEmoji(v: string): boolean {\n return /^\\p{Extended_Pictographic}+$/u.test(v);\n}\n\nexport function isJwt(v: string): boolean {\n return /^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/.test(v);\n}\n\nexport function isTime(v: string): boolean {\n return /^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d)?$/.test(v);\n}\n\nexport function isDuration(v: string): boolean {\n return /^P(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(\\d+H)?(\\d+M)?(\\d+(?:\\.\\d+)?S)?)?$/.test(v);\n}\n\nexport function isSemver(v: string): boolean {\n return /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/.test(\n v,\n );\n}\n\nexport function isSlug(v: string): boolean {\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v);\n}\n\nexport function isNumeric(v: string): boolean {\n return /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i.test(v);\n}\n"],"mappings":"AAYA,SAAgBA,EAAQ,EAAoB,CAC1C,MAAO,mDAAmD,KAAKC,CAAC,CAClE,CAEA,IAAMC,kBAAyB,IAAI,IAAI,CAAC,OAAQ,OAAO,CAAC,EAExD,SAAgBC,EAAM,EAAW,EAAwC,CACvE,GAAI,CACF,IAAMC,EAAS,IAAI,IAAIH,CAAC,EAGxB,OAFgBI,EAAY,IAAI,IAAIA,EAAU,IAAK,GAAMC,EAAE,YAAY,CAAC,CAAC,EAAIJ,EAAA,CAE9D,IAAIE,EAAO,SAAS,QAAQ,IAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CACnE,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgBG,EAAO,EAAoB,CACzC,MAAO,kEAAkE,KAAKN,CAAC,CACjF,CAEA,SAAgBO,EAAU,EAAoB,CAC5C,GAAI,CAAC,sBAAsB,KAAKP,CAAC,EAAG,MAAO,GAE3C,IAAMQ,EAAI,IAAI,KAAKR,CAAC,EAEpB,MAAO,CAAC,OAAO,MAAMQ,EAAE,QAAQ,CAAC,GAAKA,EAAE,YAAY,CAAC,CAAC,WAAWR,CAAC,CACnE,CAEA,SAAgBS,EAAc,EAAoB,CAChD,MACE,6EAA6E,KAAKT,CAAC,GACnF,CAAC,OAAO,MAAM,IAAI,KAAKA,CAAC,CAAC,CAAC,QAAQ,CAAC,CAEvC,CAEA,SAAgBU,EAAK,EAAoB,CAEvC,GAAI,0BAA0B,KAAKV,CAAC,EAClC,OAAOA,EAAE,MAAM,GAAG,CAAC,CAAC,MAAO,GAAM,CAC/B,IAAMW,EAAI,SAASC,EAAG,EAAE,EAExB,OAAOD,GAAK,GAAKA,GAAK,GACxB,CAAC,EAIH,GAAI,CAGF,OAFA,IAAI,IAAI,WAAWX,EAAE,GAAG,EAEjB,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,SAAgBa,EAAO,EAAoB,CACzC,MAAO,kBAAkB,KAAKb,CAAC,CACjC,CAEA,SAAgBc,EAAQ,EAAoB,CAC1C,MAAO,sBAAsB,KAAKd,CAAC,CACrC,CAEA,SAAgBe,EAAO,EAAoB,CACzC,MAAO,gCAAgC,KAAKf,CAAC,CAC/C,CAMA,SAAgBgB,EAAS,EAAW,EAAS,GAAa,CACxD,OAAOhB,EAAE,SAAWiB,GAAU,mBAAmB,KAAKjB,CAAC,CACzD,CAEA,SAAgBkB,EAAS,EAAoB,CAC3C,MAAO,mFAAmF,KAAKlB,CAAC,CAClG,CAMA,SAAgBmB,EAAY,EAAoB,CAG9C,OAFInB,EAAE,SAAW,GAAKA,EAAE,OAAS,GAAM,EAAU,GAE1C,yBAAyB,KAAKA,CAAC,CACxC,CAEA,SAAgBoB,EAAM,EAAoB,CACxC,MAAO,iBAAiB,KAAKpB,CAAC,CAChC,CAEA,SAAgBqB,EAAW,EAAoB,CAC7C,MAAO,sDAAsD,KAAKrB,CAAC,CACrE,CAEA,SAAgBsB,EAAQ,EAAoB,CAC1C,MAAO,gCAAgC,KAAKtB,CAAC,CAC/C,CAEA,SAAgBuB,EAAM,EAAoB,CACxC,MAAO,mDAAmD,KAAKvB,CAAC,CAClE,CAEA,SAAgBwB,EAAO,EAAoB,CACzC,MAAO,2CAA2C,KAAKxB,CAAC,CAC1D,CAEA,SAAgByB,EAAW,EAAoB,CAC7C,MAAO,+EAA+E,KAAKzB,CAAC,CAC9F,CAEA,SAAgB0B,EAAS,EAAoB,CAC3C,MAAO,sLAAsL,KAC3L1B,CACF,CACF,CAEA,SAAgB2B,EAAO,EAAoB,CACzC,MAAO,6BAA6B,KAAK3B,CAAC,CAC5C,CAEA,SAAgB4B,EAAU,EAAoB,CAC5C,MAAO,4CAA4C,KAAK5B,CAAC,CAC3D,C"}