@vielzeug/spell 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +2 -18
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.d.ts +8 -7
  5. package/dist/core.d.ts.map +1 -1
  6. package/dist/core.js +1 -1
  7. package/dist/core.js.map +1 -1
  8. package/dist/errors.cjs +2 -2
  9. package/dist/errors.cjs.map +1 -1
  10. package/dist/errors.d.ts +1 -8
  11. package/dist/errors.d.ts.map +1 -1
  12. package/dist/errors.js +2 -2
  13. package/dist/errors.js.map +1 -1
  14. package/dist/formats.cjs.map +1 -1
  15. package/dist/formats.d.ts +1 -1
  16. package/dist/formats.js.map +1 -1
  17. package/dist/index.cjs +1 -2
  18. package/dist/index.d.ts +3 -11
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -2
  21. package/dist/json-schema.cjs +1 -1
  22. package/dist/json-schema.cjs.map +1 -1
  23. package/dist/json-schema.js +1 -1
  24. package/dist/json-schema.js.map +1 -1
  25. package/dist/s.cjs +1 -1
  26. package/dist/s.cjs.map +1 -1
  27. package/dist/s.d.ts +2 -3
  28. package/dist/s.d.ts.map +1 -1
  29. package/dist/s.js +1 -1
  30. package/dist/s.js.map +1 -1
  31. package/dist/schemas/array.cjs +1 -1
  32. package/dist/schemas/array.cjs.map +1 -1
  33. package/dist/schemas/array.d.ts +2 -2
  34. package/dist/schemas/array.d.ts.map +1 -1
  35. package/dist/schemas/array.js +1 -1
  36. package/dist/schemas/array.js.map +1 -1
  37. package/dist/schemas/bigint.cjs +1 -1
  38. package/dist/schemas/bigint.cjs.map +1 -1
  39. package/dist/schemas/bigint.d.ts +0 -7
  40. package/dist/schemas/bigint.d.ts.map +1 -1
  41. package/dist/schemas/bigint.js +1 -1
  42. package/dist/schemas/bigint.js.map +1 -1
  43. package/dist/schemas/boolean.cjs +1 -1
  44. package/dist/schemas/boolean.cjs.map +1 -1
  45. package/dist/schemas/boolean.d.ts +0 -7
  46. package/dist/schemas/boolean.d.ts.map +1 -1
  47. package/dist/schemas/boolean.js +1 -1
  48. package/dist/schemas/boolean.js.map +1 -1
  49. package/dist/schemas/date.cjs +1 -1
  50. package/dist/schemas/date.cjs.map +1 -1
  51. package/dist/schemas/date.d.ts +0 -6
  52. package/dist/schemas/date.d.ts.map +1 -1
  53. package/dist/schemas/date.js +1 -1
  54. package/dist/schemas/date.js.map +1 -1
  55. package/dist/schemas/intersect.cjs +1 -1
  56. package/dist/schemas/intersect.cjs.map +1 -1
  57. package/dist/schemas/intersect.d.ts +2 -2
  58. package/dist/schemas/intersect.d.ts.map +1 -1
  59. package/dist/schemas/intersect.js +1 -1
  60. package/dist/schemas/intersect.js.map +1 -1
  61. package/dist/schemas/map.cjs +1 -1
  62. package/dist/schemas/map.cjs.map +1 -1
  63. package/dist/schemas/map.d.ts +2 -2
  64. package/dist/schemas/map.d.ts.map +1 -1
  65. package/dist/schemas/map.js +1 -1
  66. package/dist/schemas/map.js.map +1 -1
  67. package/dist/schemas/number.cjs +1 -1
  68. package/dist/schemas/number.cjs.map +1 -1
  69. package/dist/schemas/number.d.ts +0 -6
  70. package/dist/schemas/number.d.ts.map +1 -1
  71. package/dist/schemas/number.js +1 -1
  72. package/dist/schemas/number.js.map +1 -1
  73. package/dist/schemas/object.cjs +1 -1
  74. package/dist/schemas/object.cjs.map +1 -1
  75. package/dist/schemas/object.d.ts +16 -7
  76. package/dist/schemas/object.d.ts.map +1 -1
  77. package/dist/schemas/object.js +1 -1
  78. package/dist/schemas/object.js.map +1 -1
  79. package/dist/schemas/record.cjs +1 -1
  80. package/dist/schemas/record.cjs.map +1 -1
  81. package/dist/schemas/record.d.ts +2 -2
  82. package/dist/schemas/record.d.ts.map +1 -1
  83. package/dist/schemas/record.js +1 -1
  84. package/dist/schemas/record.js.map +1 -1
  85. package/dist/schemas/set.cjs +1 -1
  86. package/dist/schemas/set.cjs.map +1 -1
  87. package/dist/schemas/set.d.ts +2 -2
  88. package/dist/schemas/set.d.ts.map +1 -1
  89. package/dist/schemas/set.js +1 -1
  90. package/dist/schemas/set.js.map +1 -1
  91. package/dist/schemas/string.cjs +1 -1
  92. package/dist/schemas/string.cjs.map +1 -1
  93. package/dist/schemas/string.d.ts +0 -7
  94. package/dist/schemas/string.d.ts.map +1 -1
  95. package/dist/schemas/string.js +1 -1
  96. package/dist/schemas/string.js.map +1 -1
  97. package/dist/schemas/tuple.cjs +1 -1
  98. package/dist/schemas/tuple.cjs.map +1 -1
  99. package/dist/schemas/tuple.d.ts +12 -6
  100. package/dist/schemas/tuple.d.ts.map +1 -1
  101. package/dist/schemas/tuple.js +1 -1
  102. package/dist/schemas/tuple.js.map +1 -1
  103. package/dist/schemas/union.cjs +1 -1
  104. package/dist/schemas/union.cjs.map +1 -1
  105. package/dist/schemas/union.d.ts +2 -2
  106. package/dist/schemas/union.d.ts.map +1 -1
  107. package/dist/schemas/union.js +1 -1
  108. package/dist/schemas/union.js.map +1 -1
  109. package/dist/schemas/variant.cjs +1 -1
  110. package/dist/schemas/variant.cjs.map +1 -1
  111. package/dist/schemas/variant.d.ts +12 -2
  112. package/dist/schemas/variant.d.ts.map +1 -1
  113. package/dist/schemas/variant.js +1 -1
  114. package/dist/schemas/variant.js.map +1 -1
  115. package/dist/spell.cjs +2 -2
  116. package/dist/spell.cjs.map +1 -1
  117. package/dist/spell.iife.js +2 -2
  118. package/dist/spell.iife.js.map +1 -1
  119. package/dist/spell.js +2 -2
  120. package/dist/spell.js.map +1 -1
  121. package/dist/types.cjs +1 -1
  122. package/dist/types.cjs.map +1 -1
  123. package/dist/types.d.ts +40 -2
  124. package/dist/types.d.ts.map +1 -1
  125. package/dist/types.js +1 -1
  126. package/dist/types.js.map +1 -1
  127. package/package.json +8 -8
  128. package/dist/index.cjs.map +0 -1
  129. package/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { ErrorCode, type Issue, type 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/** @internal */\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/* -------------------- 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 = issues;\n }\n\n /**\n * Returns the most-specific branch errors for `issue`, or the first union issue when omitted.\n * Surfaces the branch with the fewest issues at the deepest path — the one that \"came closest\" to matching.\n */\n bestMatch(issue?: Extract<Issue, { code: 'invalid_union' }>): Issue[] | null {\n const unionIssue =\n issue ??\n this.issues.find(\n (entry): entry is Extract<Issue, { code: 'invalid_union' }> => entry.code === ErrorCode.invalid_union,\n );\n\n if (!unionIssue) return null;\n\n const branches = unionIssue.params.errors;\n\n if (branches.length === 0) return null;\n\n const scored = branches.map((branchIssues) => {\n const maxDepth = branchIssues.reduce((d, i) => Math.max(d, i.path.length), 0);\n\n return { issues: branchIssues, score: maxDepth * 1000 - branchIssues.length };\n });\n\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.issues;\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":"+BAYA,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,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,CAChB,CAMA,UAAU,EAAmE,CAC3E,IAAM,EACJ,GACA,KAAK,OAAO,KACT,GAA8D,EAAM,OAAS,EAAA,UAAU,aAC1F,EAEF,GAAI,CAAC,EAAY,OAAO,KAExB,IAAM,EAAW,EAAW,OAAO,OAEnC,GAAI,EAAS,SAAW,EAAG,OAAO,KAElC,IAAM,EAAS,EAAS,IAAK,IAGpB,CAAE,OAAQ,EAAc,MAFd,EAAa,QAAQ,EAAG,IAAM,KAAK,IAAI,EAAG,EAAE,KAAK,MAAM,EAAG,CAErC,EAAW,IAAO,EAAa,MAAO,EAC7E,EAID,OAFA,EAAO,MAAM,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EAEhC,EAAO,EAAE,EAAE,MACpB,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":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, 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/** @internal */\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/* -------------------- 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 = issues;\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,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,CAChB,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"}
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ErrorCode, type Issue } from './types';
1
+ import type { ErrorCode, Issue } from './types';
2
2
  type IssueParams<C extends string> = Extract<Issue, {
3
3
  code: C;
4
4
  }> extends {
@@ -28,13 +28,6 @@ export declare class SpellDefinitionError extends SpellError {
28
28
  export declare class SpellValidationError extends SpellError {
29
29
  readonly issues: Issue[];
30
30
  constructor(issues: Issue[], cause?: unknown);
31
- /**
32
- * Returns the most-specific branch errors for `issue`, or the first union issue when omitted.
33
- * Surfaces the branch with the fewest issues at the deepest path — the one that "came closest" to matching.
34
- */
35
- bestMatch(issue?: Extract<Issue, {
36
- code: 'invalid_union';
37
- }>): Issue[] | null;
38
31
  flatten(): {
39
32
  fieldErrors: FlatError[];
40
33
  formErrors: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,KAAK,EAAkB,MAAM,SAAS,CAAC;AAIhE,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAE7G;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACrG,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AAU/F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAElF;AAID,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAkBD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAE5E,qBAAa,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBAEb,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;IAK5C;;;OAGG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI;IAwB5E,OAAO,IAAI;QAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAwB7D,YAAY,IAAI;QAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IASvE,wEAAwE;IACxE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;CAGnD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAa,MAAM,SAAS,CAAC;AAI3D,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAE7G;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;AACrG,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AAU/F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAElF;AAID,wGAAwG;AACxG,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;CAKjD;AAkBD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAE5E,qBAAa,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBAEb,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;IAK5C,OAAO,IAAI;QAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAwB7D,YAAY,IAAI;QAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IASvE,wEAAwE;IACxE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;CAGnD"}
package/dist/errors.js CHANGED
@@ -1,3 +1,3 @@
1
- import{ErrorCode as e}from"./types.js";function t(e,t,n){return[{code:e,message:t,params:n,path:[]}]}function n(e,t){return typeof e==`function`?e(t):e}function r(e,t){return e.map(e=>({...e,path:[t,...e.path]}))}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=e}bestMatch(t){let n=t??this.issues.find(t=>t.code===e.invalid_union);if(!n)return null;let r=n.params.errors;if(r.length===0)return null;let i=r.map(e=>({issues:e,score:e.reduce((e,t)=>Math.max(e,t.path.length),0)*1e3-e.length}));return i.sort((e,t)=>t.score-e.score),i[0]?.issues}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,t as fail,r as prependIssuePath,n as resolveMessage};
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]}))}var r=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}};function i(e){return e.map(({code:e,message:t,path:n})=>`${n.length?n.join(`.`):`value`}: ${t} [${e}]`).join(`
2
+ `)}function a(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var o=class extends r{},s=class extends r{issues;constructor(e,t){super(i(e),{cause:t}),this.issues=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=>a(t.path,e)).map(e=>e.message)}};export{o as SpellDefinitionError,r as SpellError,s as SpellValidationError,e as fail,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 { ErrorCode, type Issue, type 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/** @internal */\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/* -------------------- 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 = issues;\n }\n\n /**\n * Returns the most-specific branch errors for `issue`, or the first union issue when omitted.\n * Surfaces the branch with the fewest issues at the deepest path — the one that \"came closest\" to matching.\n */\n bestMatch(issue?: Extract<Issue, { code: 'invalid_union' }>): Issue[] | null {\n const unionIssue =\n issue ??\n this.issues.find(\n (entry): entry is Extract<Issue, { code: 'invalid_union' }> => entry.code === ErrorCode.invalid_union,\n );\n\n if (!unionIssue) return null;\n\n const branches = unionIssue.params.errors;\n\n if (branches.length === 0) return null;\n\n const scored = branches.map((branchIssues) => {\n const maxDepth = branchIssues.reduce((d, i) => Math.max(d, i.path.length), 0);\n\n return { issues: branchIssues, score: maxDepth * 1000 - branchIssues.length };\n });\n\n scored.sort((a, b) => b.score - a.score);\n\n return scored[0]?.issues;\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":"uCAYA,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,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,CAChB,CAMA,UAAU,EAAmE,CAC3E,IAAM,EACJ,GACA,KAAK,OAAO,KACT,GAA8D,EAAM,OAAS,EAAU,aAC1F,EAEF,GAAI,CAAC,EAAY,OAAO,KAExB,IAAM,EAAW,EAAW,OAAO,OAEnC,GAAI,EAAS,SAAW,EAAG,OAAO,KAElC,IAAM,EAAS,EAAS,IAAK,IAGpB,CAAE,OAAQ,EAAc,MAFd,EAAa,QAAQ,EAAG,IAAM,KAAK,IAAI,EAAG,EAAE,KAAK,MAAM,EAAG,CAErC,EAAW,IAAO,EAAa,MAAO,EAC7E,EAID,OAFA,EAAO,MAAM,EAAG,IAAM,EAAE,MAAQ,EAAE,KAAK,EAEhC,EAAO,EAAE,EAAE,MACpB,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":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { ErrorCode, Issue, 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/** @internal */\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/* -------------------- 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 = issues;\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,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,CAChB,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 +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';\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":[],"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"}
package/dist/formats.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  * public API so callers can use them independently of any Schema.
6
6
  *
7
7
  * ```ts
8
- * import { isEmail, isUuid } from '@vielzeug/spell';
8
+ * import { isEmail, isUuid } from '@vielzeug/spell/predicates';
9
9
  * isEmail('foo@bar.com'); // true
10
10
  * ```
11
11
  */
@@ -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';\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":[],"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./errors.cjs"),n=require("./messages.cjs"),r=require("./core.cjs"),i=require("./s.cjs");var a={createParseContext:n.createParseContext,fail:t.fail,prependIssuePath:t.prependIssuePath};exports.ErrorCode=e.ErrorCode,exports.PipeSchema=r.PipeSchema,exports.Schema=r.Schema,exports.SpellDefinitionError=t.SpellDefinitionError,exports.SpellError=t.SpellError,exports.SpellValidationError=t.SpellValidationError,exports.diagnostics=a,exports.s=i.s,exports.schemaMode=e.schemaMode;
2
- //# sourceMappingURL=index.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./messages.cjs"),n=require("./types.cjs"),r=require("./core.cjs"),i=require("./s.cjs");exports.ErrorCode=n.ErrorCode,exports.Schema=r.Schema,exports.SpellDefinitionError=e.SpellDefinitionError,exports.SpellError=e.SpellError,exports.SpellValidationError=e.SpellValidationError,exports.createParseContext=t.createParseContext,exports.s=i.s;
package/dist/index.d.ts CHANGED
@@ -1,13 +1,5 @@
1
- import { fail, prependIssuePath } from './errors';
2
- import { createParseContext } from './messages';
3
- export type { AnySchema, CheckContext, FlatError, FlatErrorFirst, Infer, InferInput, InferOutput, InferSchemaMode, Issue, JsonSchema, MergeSchemaModes, MessageFn, Messages, ParseContext, ParseResult, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateFn, ValidateResult, } from './core';
4
- export { ErrorCode, PipeSchema, Schema, SpellDefinitionError, SpellError, SpellValidationError, schemaMode, } from './core';
5
- export type { DeepPartial } from './messages';
1
+ export type { AnySchema, CheckContext, FlatError, FlatErrorFirst, Infer, InferInput, InferOutput, Issue, JsonSchema, MessageFn, Messages, ParseContext, ParseResult, SchemaDescriptor, SchemaWalker, StandardSchemaV1, ValidateResult, } from './core';
2
+ export { ErrorCode, Schema, SpellDefinitionError, SpellError, SpellValidationError } from './core';
3
+ export { createParseContext, type DeepPartial } from './messages';
6
4
  export { s } from './s';
7
- /** Error helpers and immutable parse-context creation are secondary operations. */
8
- export declare const diagnostics: {
9
- createParseContext: typeof createParseContext;
10
- fail: typeof fail;
11
- prependIssuePath: typeof prependIssuePath;
12
- };
13
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,EACL,UAAU,EACV,WAAW,EACX,eAAe,EACf,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,oBAAoB,EACpB,UAAU,EACV,oBAAoB,EACpB,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,mFAAmF;AACnF,eAAO,MAAM,WAAW;;;;CAIvB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,EACL,UAAU,EACV,WAAW,EACX,KAAK,EACL,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1 @@
1
- import{ErrorCode as e,schemaMode as t}from"./types.js";import{SpellDefinitionError as n,SpellError as r,SpellValidationError as i,fail as a,prependIssuePath as o}from"./errors.js";import{createParseContext as s}from"./messages.js";import{PipeSchema as c,Schema as l}from"./core.js";import{s as u}from"./s.js";var d={createParseContext:s,fail:a,prependIssuePath:o};export{e as ErrorCode,c as PipeSchema,l as Schema,n as SpellDefinitionError,r as SpellError,i as SpellValidationError,d as diagnostics,u as s,t as schemaMode};
2
- //# sourceMappingURL=index.js.map
1
+ import{SpellDefinitionError as e,SpellError as t,SpellValidationError as n}from"./errors.js";import{createParseContext as r}from"./messages.js";import{ErrorCode as i}from"./types.js";import{Schema as a}from"./core.js";import{s as o}from"./s.js";export{i as ErrorCode,a as Schema,e as SpellDefinitionError,t as SpellError,n as SpellValidationError,r as createParseContext,o as s};
@@ -1,2 +1,2 @@
1
- const e=require("./safe-object.cjs");function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`any`:case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e.defineOwnProperty(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}exports.definitionToJsonSchema=t,exports.descriptorToJsonSchema=n;
1
+ const e=require("./safe-object.cjs");function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e.defineOwnProperty(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}exports.definitionToJsonSchema=t,exports.descriptorToJsonSchema=n;
2
2
  //# sourceMappingURL=json-schema.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.cjs","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'any':\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.cjs","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineOwnProperty as e}from"./safe-object.js";function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`any`:case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}export{t as definitionToJsonSchema,n as descriptorToJsonSchema};
1
+ import{defineOwnProperty as e}from"./safe-object.js";function t(e){return n(e)}function n(e){let t=r(e),n=t;return e.isNullable&&(n={anyOf:[t,{type:`null`}]}),e.description&&(n={...n,description:e.description}),n}function r(t){switch(t.kind){case`unknown`:return{};case`array`:{let e={items:n(t.items),type:`array`};return t.minItems!==void 0&&(e.minItems=t.minItems),t.maxItems!==void 0&&(e.maxItems=t.maxItems),e}case`bigint`:return{type:`integer`};case`boolean`:return{type:`boolean`};case`date`:return{$comment:`Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.`};case`enum`:return{enum:[...t.values]};case`instanceof`:return{$comment:`Instances of "${t.className}" are not representable in JSON Schema.`};case`intersect`:return{allOf:t.branches.map(n)};case`lazy`:return{};case`literal`:return t.value===null?{type:`null`}:t.value===void 0?{}:{const:t.value};case`map`:return{$comment:`Map type — represented as an object with arbitrary string keys.`,additionalProperties:n(t.value),type:`object`};case`never`:return{not:{}};case`number`:{let e={type:t.typeHint===`integer`?`integer`:`number`};return t.minimum!==void 0&&(e.minimum=t.minimum),t.maximum!==void 0&&(e.maximum=t.maximum),t.exclusiveMinimum!==void 0&&(e.exclusiveMinimum=t.exclusiveMinimum),t.exclusiveMaximum!==void 0&&(e.exclusiveMaximum=t.exclusiveMaximum),t.multipleOf!==void 0&&(e.multipleOf=t.multipleOf),e}case`object`:{let r={},i=[];for(let[a,o]of Object.entries(t.fields))e(r,a,n(o)),o.isOptional||i.push(a);let a={properties:r,type:`object`};return i.length>0&&(a.required=i),t.strict&&(a.additionalProperties=!1),a}case`pipe`:return n(t.to);case`record`:return{additionalProperties:n(t.value),type:`object`};case`set`:return{$comment:`Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.`,items:n(t.items),type:`array`,uniqueItems:!0};case`string`:{let e={type:`string`};return t.minLength!==void 0&&(e.minLength=t.minLength),t.maxLength!==void 0&&(e.maxLength=t.maxLength),t.pattern!=null&&(e.pattern=t.pattern),t.format!==void 0&&(e.format=t.format),t.contentEncoding!==void 0&&(e.contentEncoding=t.contentEncoding),e}case`tuple`:{let e={prefixItems:t.items.map(n),type:`array`};return e.items=t.rest!==null&&n(t.rest),e}case`union`:return{anyOf:t.branches.map(n)};case`variant`:return{discriminator:{propertyName:t.discriminator},oneOf:Object.values(t.branches).map(n)}}}export{t as definitionToJsonSchema,n as descriptorToJsonSchema};
2
2
  //# sourceMappingURL=json-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'any':\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.js","names":[],"sources":["../src/json-schema.ts"],"sourcesContent":["import { defineOwnProperty } from './safe-object';\nimport type { JsonSchema, SchemaDescriptor } from './types';\n\nexport function definitionToJsonSchema(definition: SchemaDescriptor): JsonSchema {\n return descriptorToJsonSchema(definition);\n}\n\n/** Converts a schema definition to a draft 2020-12-compatible JSON Schema object. */\nexport function descriptorToJsonSchema(d: SchemaDescriptor): JsonSchema {\n const base = _descriptorToBase(d);\n let result: JsonSchema = base;\n\n if (d.isNullable) result = { anyOf: [base, { type: 'null' }] };\n\n if (d.description) result = { ...result, description: d.description };\n\n return result;\n}\n\nfunction _descriptorToBase(d: SchemaDescriptor): JsonSchema {\n switch (d.kind) {\n case 'unknown':\n return {};\n\n case 'array': {\n const out: JsonSchema = { items: descriptorToJsonSchema(d.items), type: 'array' };\n\n if (d.minItems !== undefined) out.minItems = d.minItems;\n\n if (d.maxItems !== undefined) out.maxItems = d.maxItems;\n\n return out;\n }\n\n case 'bigint':\n return { type: 'integer' };\n\n case 'boolean':\n return { type: 'boolean' };\n\n case 'date':\n return {\n $comment:\n 'Date objects are not representable in JSON Schema. Validate as a string with a date format in JSON contexts.',\n };\n\n case 'enum':\n return { enum: [...d.values] };\n\n case 'instanceof':\n return {\n $comment: `Instances of \"${d.className}\" are not representable in JSON Schema.`,\n };\n\n case 'intersect':\n return { allOf: d.branches.map(descriptorToJsonSchema) };\n\n case 'lazy':\n return {};\n\n case 'literal':\n if (d.value === null) return { type: 'null' };\n\n if (d.value === undefined) return {};\n\n return { const: d.value };\n\n case 'map':\n return {\n $comment: 'Map type — represented as an object with arbitrary string keys.',\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'never':\n return { not: {} };\n\n case 'number': {\n const out: JsonSchema = { type: d.typeHint === 'integer' ? 'integer' : 'number' };\n\n if (d.minimum !== undefined) out.minimum = d.minimum;\n\n if (d.maximum !== undefined) out.maximum = d.maximum;\n\n if (d.exclusiveMinimum !== undefined) out.exclusiveMinimum = d.exclusiveMinimum;\n\n if (d.exclusiveMaximum !== undefined) out.exclusiveMaximum = d.exclusiveMaximum;\n\n if (d.multipleOf !== undefined) out.multipleOf = d.multipleOf;\n\n return out;\n }\n\n case 'object': {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, fieldDescriptor] of Object.entries(d.fields)) {\n defineOwnProperty(properties, key, descriptorToJsonSchema(fieldDescriptor));\n\n if (!fieldDescriptor.isOptional) required.push(key);\n }\n\n const out: JsonSchema = { properties, type: 'object' };\n\n if (required.length > 0) out.required = required;\n\n if (d.strict) out.additionalProperties = false;\n\n return out;\n }\n\n case 'pipe':\n return descriptorToJsonSchema(d.to);\n\n case 'record':\n return {\n additionalProperties: descriptorToJsonSchema(d.value),\n type: 'object',\n };\n\n case 'set':\n return {\n $comment: 'Set<T> — no standard JSON Schema equivalent; treated as an ordered unique-item array.',\n items: descriptorToJsonSchema(d.items),\n type: 'array',\n uniqueItems: true,\n };\n\n case 'string': {\n const out: JsonSchema = { type: 'string' };\n\n if (d.minLength !== undefined) out.minLength = d.minLength;\n\n if (d.maxLength !== undefined) out.maxLength = d.maxLength;\n\n if (d.pattern != null) out.pattern = d.pattern;\n\n if (d.format !== undefined) out.format = d.format;\n\n if (d.contentEncoding !== undefined) out.contentEncoding = d.contentEncoding;\n\n return out;\n }\n\n case 'tuple': {\n const out: JsonSchema = {\n prefixItems: d.items.map(descriptorToJsonSchema),\n type: 'array',\n };\n\n if (d.rest !== null) {\n out.items = descriptorToJsonSchema(d.rest);\n } else {\n out.items = false;\n }\n\n return out;\n }\n\n case 'union':\n return { anyOf: d.branches.map(descriptorToJsonSchema) };\n case 'variant':\n return {\n discriminator: { propertyName: d.discriminator },\n oneOf: Object.values(d.branches).map(descriptorToJsonSchema),\n };\n }\n}\n"],"mappings":"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"}
package/dist/s.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/union.cjs"),m=require("./schemas/object.cjs"),h=require("./schemas/raw-or.cjs"),g=require("./schemas/record.cjs"),_=require("./schemas/set.cjs"),v=require("./schemas/string.cjs"),y=require("./schemas/tuple.cjs"),b=require("./schemas/variant.cjs");var x={any:()=>new e.Schema,array:e=>new t.ArraySchema(e),bigint:()=>new n.BigIntSchema,boolean:()=>new r.BooleanSchema,coerce:{bigint:()=>n.BigIntSchema.coerce(),boolean:()=>r.BooleanSchema.coerce(),date:()=>i.DateSchema.coerce(),number:()=>f.NumberSchema.coerce(),string:()=>v.StringSchema.coerce()},date:()=>new i.DateSchema,discriminatedUnion:(e,t)=>new b.VariantSchema(e,t),enum:e=>new a.EnumSchema(e),instanceof:e=>new o.InstanceOfSchema(e),intersect:(...e)=>new s.IntersectSchema(h.normalizeToSchemas(e)),lazy:e=>new c.LazySchema(e),literal:e=>new l.LiteralSchema(e),map:(e,t)=>new u.MapSchema(e,t),never:()=>new d.NeverSchema,null:()=>new l.LiteralSchema(null),number:()=>new f.NumberSchema,object:e=>new m.ObjectSchema(e),record:(e,t)=>new g.RecordSchema(e,t),set:e=>new _.SetSchema(e),string:()=>new v.StringSchema,tuple:e=>new y.TupleSchema(e),undefined:()=>new l.LiteralSchema(void 0),union:(...e)=>new p.UnionSchema(h.normalizeToSchemas(e)),unknown:()=>new e.Schema};exports.s=x;
1
+ const e=require("./core.cjs"),t=require("./schemas/array.cjs"),n=require("./schemas/bigint.cjs"),r=require("./schemas/boolean.cjs"),i=require("./schemas/date.cjs"),a=require("./schemas/enum.cjs"),o=require("./schemas/instanceof.cjs"),s=require("./schemas/intersect.cjs"),c=require("./schemas/lazy.cjs"),l=require("./schemas/literal.cjs"),u=require("./schemas/map.cjs"),d=require("./schemas/never.cjs"),f=require("./schemas/number.cjs"),p=require("./schemas/union.cjs"),m=require("./schemas/object.cjs"),h=require("./schemas/raw-or.cjs"),g=require("./schemas/record.cjs"),_=require("./schemas/set.cjs"),v=require("./schemas/string.cjs"),y=require("./schemas/tuple.cjs"),b=require("./schemas/variant.cjs");var x={array:e=>new t.ArraySchema(e),bigint:()=>new n.BigIntSchema,boolean:()=>new r.BooleanSchema,coerce:{bigint:()=>n.BigIntSchema.coerce(),boolean:()=>r.BooleanSchema.coerce(),date:()=>i.DateSchema.coerce(),number:()=>f.NumberSchema.coerce(),string:()=>v.StringSchema.coerce()},date:()=>new i.DateSchema,discriminatedUnion:(e,t)=>new b.VariantSchema(e,t),enum:e=>new a.EnumSchema(e),instanceof:e=>new o.InstanceOfSchema(e),intersect:(...e)=>new s.IntersectSchema(h.normalizeToSchemas(e)),lazy:e=>new c.LazySchema(e),literal:e=>new l.LiteralSchema(e),map:(e,t)=>new u.MapSchema(e,t),never:()=>new d.NeverSchema,null:()=>new l.LiteralSchema(null),number:()=>new f.NumberSchema,object:e=>new m.ObjectSchema(e),record:(e,t)=>new g.RecordSchema(e,t),set:e=>new _.SetSchema(e),string:()=>new v.StringSchema,tuple:e=>new y.TupleSchema(e),undefined:()=>new l.LiteralSchema(void 0),union:(...e)=>new p.UnionSchema(h.normalizeToSchemas(e)),unknown:()=>new e.Schema};exports.s=x;
2
2
  //# sourceMappingURL=s.cjs.map
package/dist/s.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<unknown> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBA+EA,IAAa,EAAI,CACf,QAxDkC,IAAI,EAAA,OAyDtC,MAxDmC,GAA8B,IAAI,EAAA,YAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAAA,aAyDtC,YAxDoC,IAAI,EAAA,cAyDxC,OAAQ,CAvBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EAAA,WA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAA,WAAW,CAAM,EA2D3F,WA1DsB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EA2DxG,WAzDA,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAA,WAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAA,cAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAAA,YAqDpC,SApDuC,IAAI,EAAA,cAAc,IAAI,EAqD7D,WApDkC,IAAI,EAAA,aAqDtC,OApDsC,GAA8B,IAAI,EAAA,aAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAA,UAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAAA,aAoDtC,MAnD4C,GAA6B,IAAI,EAAA,YAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAA,cAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,EAAA,MAiD5C"}
1
+ {"version":3,"file":"s.cjs","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"gsBA8EA,IAAa,EAAI,CACf,MAvDmC,GAA8B,IAAI,EAAA,YAAY,CAAM,EAwDvF,WAvDkC,IAAI,EAAA,aAwDtC,YAvDoC,IAAI,EAAA,cAwDxC,OAAQ,CAtBR,WAAqC,EAAA,aAAa,OAAO,EACzD,YAAuC,EAAA,cAAc,OAAO,EAC5D,SAAiC,EAAA,WAAW,OAAO,EACnD,WAAqC,EAAA,aAAa,OAAO,EACzD,WAAqC,EAAA,aAAa,OAAO,CAkBjD,EACR,SAxD8B,IAAI,EAAA,WAyDlC,oBA5BA,EACA,IACwB,IAAI,EAAA,cAAc,EAAe,CAAG,EA2B5D,KAzDyC,GAA6B,IAAI,EAAA,WAAW,CAAM,EA0D3F,WAzDsB,GAA0D,IAAI,EAAA,iBAAiB,CAAG,EA0DxG,WAxDA,GAAG,IAEH,IAAI,EAAA,gBAAgB,EAAA,mBAAmB,CAAK,CAA6C,EAuDzF,KAtDkC,GAClC,IAAI,EAAA,WAAW,CAAoF,EAsDnG,QArDwE,GACxE,IAAI,EAAA,cAAc,CAAK,EAqDvB,KApDsD,EAAc,IACpE,IAAI,EAAA,UAAU,EAAW,CAAW,EAoDpC,UAnDgC,IAAI,EAAA,YAoDpC,SAnDuC,IAAI,EAAA,cAAc,IAAI,EAoD7D,WAnDkC,IAAI,EAAA,aAoDtC,OAnDsC,GAA8B,IAAI,EAAA,aAAa,CAAK,EAoD1F,QAnDyD,EAAc,IACvE,IAAI,EAAA,aAAa,EAAW,CAAW,EAmDvC,IAlDiC,GAA4B,IAAI,EAAA,UAAU,CAAM,EAmDjF,WAlDkC,IAAI,EAAA,aAmDtC,MAlD4C,GAA6B,IAAI,EAAA,YAAY,CAAK,EAmD9F,cAlDiD,IAAI,EAAA,cAAc,IAAA,EAAS,EAmD5E,OAjDA,GAAG,IAEH,IAAI,EAAA,YAAY,EAAA,mBAAmB,CAAK,CAA6C,EAgDrF,YA/CsC,IAAI,EAAA,MAgD5C"}
package/dist/s.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';
1
+ import { type AnySchema, type InferInput, type InferOutput, type InferSchemaMode, Schema } from './core';
2
2
  import { ArraySchema } from './schemas/array';
3
3
  import { BigIntSchema } from './schemas/bigint';
4
4
  import { BooleanSchema } from './schemas/boolean';
@@ -29,7 +29,6 @@ import { VariantSchema } from './schemas/variant';
29
29
  * type User = Infer<typeof User>;
30
30
  */
31
31
  export declare const s: {
32
- any: () => Schema<unknown>;
33
32
  array: <T extends AnySchema>(schema: T) => ArraySchema<T>;
34
33
  bigint: () => BigIntSchema;
35
34
  boolean: () => BooleanSchema;
@@ -45,7 +44,7 @@ export declare const s: {
45
44
  enum: <const T extends EnumValues>(values: T) => EnumSchema<T>;
46
45
  instanceof: <T>(cls: new (...args: never[]) => T) => InstanceOfSchema<T>;
47
46
  intersect: <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(...items: T) => IntersectSchema<NormalizeItems<T> & readonly AnySchema[]>;
48
- lazy: <T extends AnySchema>(getter: () => T) => LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>>;
47
+ lazy: <T extends AnySchema>(getter: () => T) => LazySchema<InferOutput<T>, InferInput<T>, InferSchemaMode<T>>;
49
48
  literal: <T extends string | number | boolean | null | undefined>(value: T) => LiteralSchema<T>;
50
49
  map: <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V) => MapSchema<K, V>;
51
50
  never: () => NeverSchema;
package/dist/s.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
package/dist/s.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{UnionSchema as p}from"./schemas/union.js";import{ObjectSchema as m}from"./schemas/object.js";import{normalizeToSchemas as h}from"./schemas/raw-or.js";import{RecordSchema as g}from"./schemas/record.js";import{SetSchema as _}from"./schemas/set.js";import{StringSchema as v}from"./schemas/string.js";import{TupleSchema as y}from"./schemas/tuple.js";import{VariantSchema as b}from"./schemas/variant.js";var x={any:()=>new e,array:e=>new t(e),bigint:()=>new n,boolean:()=>new r,coerce:{bigint:()=>n.coerce(),boolean:()=>r.coerce(),date:()=>i.coerce(),number:()=>f.coerce(),string:()=>v.coerce()},date:()=>new i,discriminatedUnion:(e,t)=>new b(e,t),enum:e=>new a(e),instanceof:e=>new o(e),intersect:(...e)=>new s(h(e)),lazy:e=>new c(e),literal:e=>new l(e),map:(e,t)=>new u(e,t),never:()=>new d,null:()=>new l(null),number:()=>new f,object:e=>new m(e),record:(e,t)=>new g(e,t),set:e=>new _(e),string:()=>new v,tuple:e=>new y(e),undefined:()=>new l(void 0),union:(...e)=>new p(h(e)),unknown:()=>new e};export{x as s};
1
+ import{Schema as e}from"./core.js";import{ArraySchema as t}from"./schemas/array.js";import{BigIntSchema as n}from"./schemas/bigint.js";import{BooleanSchema as r}from"./schemas/boolean.js";import{DateSchema as i}from"./schemas/date.js";import{EnumSchema as a}from"./schemas/enum.js";import{InstanceOfSchema as o}from"./schemas/instanceof.js";import{IntersectSchema as s}from"./schemas/intersect.js";import{LazySchema as c}from"./schemas/lazy.js";import{LiteralSchema as l}from"./schemas/literal.js";import{MapSchema as u}from"./schemas/map.js";import{NeverSchema as d}from"./schemas/never.js";import{NumberSchema as f}from"./schemas/number.js";import{UnionSchema as p}from"./schemas/union.js";import{ObjectSchema as m}from"./schemas/object.js";import{normalizeToSchemas as h}from"./schemas/raw-or.js";import{RecordSchema as g}from"./schemas/record.js";import{SetSchema as _}from"./schemas/set.js";import{StringSchema as v}from"./schemas/string.js";import{TupleSchema as y}from"./schemas/tuple.js";import{VariantSchema as b}from"./schemas/variant.js";var x={array:e=>new t(e),bigint:()=>new n,boolean:()=>new r,coerce:{bigint:()=>n.coerce(),boolean:()=>r.coerce(),date:()=>i.coerce(),number:()=>f.coerce(),string:()=>v.coerce()},date:()=>new i,discriminatedUnion:(e,t)=>new b(e,t),enum:e=>new a(e),instanceof:e=>new o(e),intersect:(...e)=>new s(h(e)),lazy:e=>new c(e),literal:e=>new l(e),map:(e,t)=>new u(e,t),never:()=>new d,null:()=>new l(null),number:()=>new f,object:e=>new m(e),record:(e,t)=>new g(e,t),set:e=>new _(e),string:()=>new v,tuple:e=>new y(e),undefined:()=>new l(void 0),union:(...e)=>new p(h(e)),unknown:()=>new e};export{x as s};
2
2
  //# sourceMappingURL=s.js.map
package/dist/s.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sAny = (): Schema<unknown> => new Schema();\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, unknown, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, unknown, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n any: sAny,\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCA+EA,IAAa,EAAI,CACf,QAxDkC,IAAI,EAyDtC,MAxDmC,GAA8B,IAAI,EAAY,CAAM,EAyDvF,WAxDkC,IAAI,EAyDtC,YAxDoC,IAAI,EAyDxC,OAAQ,CAvBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAmBjD,EACR,SAzD8B,IAAI,EA0DlC,oBA7BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA4B5D,KA1DyC,GAA6B,IAAI,EAAW,CAAM,EA2D3F,WA1DsB,GAA0D,IAAI,EAAiB,CAAG,EA2DxG,WAzDA,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EAwDzF,KAvDkC,GAClC,IAAI,EAAW,CAA8E,EAuD7F,QAtDwE,GACxE,IAAI,EAAc,CAAK,EAsDvB,KArDsD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAqDpC,UApDgC,IAAI,EAqDpC,SApDuC,IAAI,EAAc,IAAI,EAqD7D,WApDkC,IAAI,EAqDtC,OApDsC,GAA8B,IAAI,EAAa,CAAK,EAqD1F,QApDyD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EAoDvC,IAnDiC,GAA4B,IAAI,EAAU,CAAM,EAoDjF,WAnDkC,IAAI,EAoDtC,MAnD4C,GAA6B,IAAI,EAAY,CAAK,EAoD9F,cAnDiD,IAAI,EAAc,IAAA,EAAS,EAoD5E,OAlDA,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EAiDrF,YAhDsC,IAAI,CAiD5C"}
1
+ {"version":3,"file":"s.js","names":[],"sources":["../src/s.ts"],"sourcesContent":["import { type AnySchema, type InferInput, type InferOutput, type InferSchemaMode, Schema } from './core';\nimport { ArraySchema } from './schemas/array';\nimport { BigIntSchema } from './schemas/bigint';\nimport { BooleanSchema } from './schemas/boolean';\nimport { DateSchema } from './schemas/date';\nimport { EnumSchema, type EnumValues } from './schemas/enum';\nimport { InstanceOfSchema } from './schemas/instanceof';\nimport { IntersectSchema } from './schemas/intersect';\nimport { LazySchema } from './schemas/lazy';\nimport { LiteralSchema } from './schemas/literal';\nimport { MapSchema } from './schemas/map';\nimport { NeverSchema } from './schemas/never';\nimport { NumberSchema } from './schemas/number';\nimport { ObjectSchema, type ObjectShape } from './schemas/object';\nimport { type NormalizeItems, normalizeToSchemas, type RawOrSchema } from './schemas/raw-or';\nimport { RecordSchema } from './schemas/record';\nimport { SetSchema } from './schemas/set';\nimport { StringSchema } from './schemas/string';\nimport { TupleSchema, type TupleSchemas } from './schemas/tuple';\nimport { UnionSchema } from './schemas/union';\nimport { VariantSchema } from './schemas/variant';\n\n/* -------------------- Internal factory functions -------------------- */\n\nconst sArray = <T extends AnySchema>(schema: T): ArraySchema<T> => new ArraySchema(schema);\nconst sBigint = (): BigIntSchema => new BigIntSchema();\nconst sBoolean = (): BooleanSchema => new BooleanSchema();\nconst sDate = (): DateSchema => new DateSchema();\nconst sEnum = <const T extends EnumValues>(values: T): EnumSchema<T> => new EnumSchema(values);\nconst sInstanceof = <T>(cls: new (...args: never[]) => T): InstanceOfSchema<T> => new InstanceOfSchema(cls);\nconst sIntersect = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): IntersectSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new IntersectSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sLazy = <T extends AnySchema>(getter: () => T): LazySchema<InferOutput<T>, InferInput<T>, InferSchemaMode<T>> =>\n new LazySchema(getter as unknown as () => Schema<InferOutput<T>, InferInput<T>, InferSchemaMode<T>>);\nconst sLiteral = <T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> =>\n new LiteralSchema(value);\nconst sMap = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): MapSchema<K, V> =>\n new MapSchema(keySchema, valueSchema);\nconst sNever = (): NeverSchema => new NeverSchema();\nconst sNull = (): LiteralSchema<null> => new LiteralSchema(null);\nconst sNumber = (): NumberSchema => new NumberSchema();\nconst sObject = <T extends ObjectShape>(shape: T): ObjectSchema<T> => new ObjectSchema(shape);\nconst sRecord = <K extends AnySchema, V extends AnySchema>(keySchema: K, valueSchema: V): RecordSchema<K, V> =>\n new RecordSchema(keySchema, valueSchema);\nconst sSet = <T extends AnySchema>(schema: T): SetSchema<T> => new SetSchema(schema);\nconst sString = (): StringSchema => new StringSchema();\nconst sTuple = <const T extends TupleSchemas>(items: T): TupleSchema<T> => new TupleSchema(items);\nconst sUndefined = (): LiteralSchema<undefined> => new LiteralSchema(undefined);\nconst sUnion = <T extends readonly [RawOrSchema, RawOrSchema, ...RawOrSchema[]]>(\n ...items: T\n): UnionSchema<NormalizeItems<T> & readonly AnySchema[]> =>\n new UnionSchema(normalizeToSchemas(items) as NormalizeItems<T> & readonly AnySchema[]);\nconst sUnknown = (): Schema<unknown> => new Schema();\nconst sVariant = <K extends string, M extends Record<string, ObjectSchema<any, any>>>(\n discriminator: K,\n map: M,\n): VariantSchema<K, M> => new VariantSchema(discriminator, map);\nconst sCoerce = {\n bigint: (): BigIntSchema<unknown> => BigIntSchema.coerce(),\n boolean: (): BooleanSchema<unknown> => BooleanSchema.coerce(),\n date: (): DateSchema<unknown> => DateSchema.coerce(),\n number: (): NumberSchema<unknown> => NumberSchema.coerce(),\n string: (): StringSchema<unknown> => StringSchema.coerce(),\n};\n\n/* -------------------- `s` namespace — the public API -------------------- */\n\n/**\n * Namespace of all schema factories. Use `s.string()`, `s.object()`, etc.\n *\n * @example\n * import { s, type Infer } from '@vielzeug/spell';\n *\n * const User = s.object({ name: s.string(), age: s.number().int().positive() });\n * type User = Infer<typeof User>;\n */\nexport const s = {\n array: sArray,\n bigint: sBigint,\n boolean: sBoolean,\n coerce: sCoerce,\n date: sDate,\n discriminatedUnion: sVariant,\n enum: sEnum,\n instanceof: sInstanceof,\n intersect: sIntersect,\n lazy: sLazy,\n literal: sLiteral,\n map: sMap,\n never: sNever,\n null: sNull,\n number: sNumber,\n object: sObject,\n record: sRecord,\n set: sSet,\n string: sString,\n tuple: sTuple,\n undefined: sUndefined,\n union: sUnion,\n unknown: sUnknown,\n};\n"],"mappings":"yhCA8EA,IAAa,EAAI,CACf,MAvDmC,GAA8B,IAAI,EAAY,CAAM,EAwDvF,WAvDkC,IAAI,EAwDtC,YAvDoC,IAAI,EAwDxC,OAAQ,CAtBR,WAAqC,EAAa,OAAO,EACzD,YAAuC,EAAc,OAAO,EAC5D,SAAiC,EAAW,OAAO,EACnD,WAAqC,EAAa,OAAO,EACzD,WAAqC,EAAa,OAAO,CAkBjD,EACR,SAxD8B,IAAI,EAyDlC,oBA5BA,EACA,IACwB,IAAI,EAAc,EAAe,CAAG,EA2B5D,KAzDyC,GAA6B,IAAI,EAAW,CAAM,EA0D3F,WAzDsB,GAA0D,IAAI,EAAiB,CAAG,EA0DxG,WAxDA,GAAG,IAEH,IAAI,EAAgB,EAAmB,CAAK,CAA6C,EAuDzF,KAtDkC,GAClC,IAAI,EAAW,CAAoF,EAsDnG,QArDwE,GACxE,IAAI,EAAc,CAAK,EAqDvB,KApDsD,EAAc,IACpE,IAAI,EAAU,EAAW,CAAW,EAoDpC,UAnDgC,IAAI,EAoDpC,SAnDuC,IAAI,EAAc,IAAI,EAoD7D,WAnDkC,IAAI,EAoDtC,OAnDsC,GAA8B,IAAI,EAAa,CAAK,EAoD1F,QAnDyD,EAAc,IACvE,IAAI,EAAa,EAAW,CAAW,EAmDvC,IAlDiC,GAA4B,IAAI,EAAU,CAAM,EAmDjF,WAlDkC,IAAI,EAmDtC,MAlD4C,GAA6B,IAAI,EAAY,CAAK,EAmD9F,cAlDiD,IAAI,EAAc,IAAA,EAAS,EAmD5E,OAjDA,GAAG,IAEH,IAAI,EAAY,EAAmB,CAAK,CAA6C,EAgDrF,YA/CsC,IAAI,CAgD5C"}
@@ -1,2 +1,2 @@
1
- const e=require("../types.cjs"),t=require("../errors.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`array`}checkAsync(e){return this._addCheck(e,!0)}constructor(e){super(),this.itemSchema=e}_parseItemsSync(e,n){let r=[],i=[];for(let a=0;a<e.length;a++){let o=this.itemSchema._parseFullSync(e[a],n);o.issues.length===0?i.push(o.data):(r.push(...t.prependIssuePath(o.issues,a)),i.push(e[a]))}return{data:i,issues:r}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:t.fail(e.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(n,r);return{data:i,issues:a,typeOk:!0}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;if(!Array.isArray(i))throw new t.SpellValidationError(t.fail(e.ErrorCode.invalid_type,a.messages.array.type()));let o=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,a))),s=[],c=[];for(let e=0;e<o.length;e++){let n=o[e];n.issues.length===0?c.push(n.data):(s.push(...t.prependIssuePath(n.issues,e)),c.push(i[e]))}let l=await this._runValidatorsAsync(c,a),u=[...s,...l];if(u.length>0)throw new t.SpellValidationError(u);return this._runPostprocessors(c)})}min(n,r){return this._addConstraint((i,a)=>i.length>=n?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(r??a.messages.array.min,{min:n,value:i}),{min:n}),e=>{let t=e;return{...t,minItems:t.minItems===void 0?n:Math.max(t.minItems,n)}})}max(n,r){return this._addConstraint((i,a)=>i.length<=n?null:t.fail(e.ErrorCode.too_big,t.resolveMessage(r??a.messages.array.max,{max:n,value:i}),{max:n}),e=>{let t=e;return{...t,maxItems:t.maxItems===void 0?n:Math.min(t.maxItems,n)}})}length(n,r){return this._addConstraint((i,a)=>i.length===n?null:t.fail(e.ErrorCode.invalid_length,t.resolveMessage(r??a.messages.array.length,{exact:n,value:i}),{exact:n}),e=>({...e,maxItems:n,minItems:n}))}nonEmpty(n){return this._addConstraint((r,i)=>{let a=r;return a.length>0?null:t.fail(e.ErrorCode.too_small,t.resolveMessage(n??i.messages.array.nonEmpty,{min:1,value:a}),{min:1})})}unique(n,r){let i=typeof n==`function`&&n.length===2,a=i?n:null,o=i?r:typeof n==`function`?n:void 0;return this._addConstraint((n,r)=>{let i=n,s;return s=a?i.every((e,t)=>i.slice(0,t).every(t=>!a(e,t))):new Set(i).size===i.length,s?null:t.fail(e.ErrorCode.invalid_unique,t.resolveMessage(o??r.messages.array.unique,{value:i}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.definition(),kind:`array`}}_walk(e){let t=this.itemSchema.walk(e);return e.array?e.array(this,t):super._walk(e)}};exports.ArraySchema=r;
1
+ const e=require("../errors.cjs"),t=require("../types.cjs"),n=require("../core.cjs");var r=class extends n.Schema{itemSchema;get _kind(){return`array`}checkAsync(e){return this._addCheck(e,!0)}constructor(e){super(),this.itemSchema=e}_parseItemsSync(t,n){let r=[],i=[];for(let a=0;a<t.length;a++){let o=this.itemSchema._parseFullSync(t[a],n);o.issues.length===0?i.push(o.data):(r.push(...e.prependIssuePath(o.issues,a)),i.push(t[a]))}return{data:i,issues:r}}_parse(n,r){if(!Array.isArray(n))return{data:n,issues:e.fail(t.ErrorCode.invalid_type,r.messages.array.type()),typeOk:!1};let{data:i,issues:a}=this._parseItemsSync(n,r);return{data:i,issues:a,typeOk:!0}}async parseAsync(r,i){let a=i??n._makeCtx();return this._withCatchAsync(async()=>{let n=this._prepareInput(r);if(n.skip)return n.value;let i=n.value;if(!Array.isArray(i))throw new e.SpellValidationError(e.fail(t.ErrorCode.invalid_type,a.messages.array.type()));let o=await Promise.all(i.map(e=>this.itemSchema._parseFullAsync(e,a))),s=[],c=[];for(let t=0;t<o.length;t++){let n=o[t];n.issues.length===0?c.push(n.data):(s.push(...e.prependIssuePath(n.issues,t)),c.push(i[t]))}let l=await this._runValidatorsAsync(c,a),u=[...s,...l];if(u.length>0)throw new e.SpellValidationError(u);return this._runPostprocessors(c)})}min(n,r){return this._addConstraint((i,a)=>i.length>=n?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(r??a.messages.array.min,{min:n,value:i}),{min:n}),e=>{let t=e;return{...t,minItems:t.minItems===void 0?n:Math.max(t.minItems,n)}})}max(n,r){return this._addConstraint((i,a)=>i.length<=n?null:e.fail(t.ErrorCode.too_big,e.resolveMessage(r??a.messages.array.max,{max:n,value:i}),{max:n}),e=>{let t=e;return{...t,maxItems:t.maxItems===void 0?n:Math.min(t.maxItems,n)}})}length(n,r){return this._addConstraint((i,a)=>i.length===n?null:e.fail(t.ErrorCode.invalid_length,e.resolveMessage(r??a.messages.array.length,{exact:n,value:i}),{exact:n}),e=>({...e,maxItems:n,minItems:n}))}nonEmpty(n){return this._addConstraint((r,i)=>{let a=r;return a.length>0?null:e.fail(t.ErrorCode.too_small,e.resolveMessage(n??i.messages.array.nonEmpty,{min:1,value:a}),{min:1})})}unique(n,r){let i=typeof n==`function`&&n.length===2,a=i?n:null,o=i?r:typeof n==`function`?n:void 0;return this._addConstraint((n,r)=>{let i=n,s;return s=a?i.every((e,t)=>i.slice(0,t).every(t=>!a(e,t))):new Set(i).size===i.length,s?null:e.fail(t.ErrorCode.invalid_unique,e.resolveMessage(o??r.messages.array.unique,{value:i}),{unique:!0})})}_toDescriptorImpl(){let e=this._annotations;return{...this._describeBase(),...e.maxItems===void 0?{}:{maxItems:e.maxItems},...e.minItems===void 0?{}:{minItems:e.minItems},items:this.itemSchema.definition(),kind:`array`}}_walk(e){let t=this.itemSchema.walk(e);return e.array?e.array(this,t):super._walk(e)}};exports.ArraySchema=r;
2
2
  //# sourceMappingURL=array.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n CheckContext,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<\n T extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>,\n> extends Schema<InferOutput<T>[], unknown, Mode> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n override checkAsync(\n this: ArraySchema<T, 'sync'>,\n fn: (value: InferOutput<T>[], ctx: CheckContext) => Promise<ValidateResult>,\n ): ArraySchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ArraySchema<T, 'async'>;\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T>[]> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync<InferOutput<T>[]>(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferOutput<T>[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as InferOutput<T>);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as InferOutput<T>[];\n });\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"array.cjs","names":[],"sources":["../../src/schemas/array.ts"],"sourcesContent":["import type {\n AnySchema,\n CheckContext,\n InferInput,\n InferOutput,\n InferSchemaMode,\n Issue,\n MergeSchemaModes,\n MessageFn,\n ParseContext,\n ParseValue,\n SchemaDescriptor,\n SchemaMode,\n SchemaWalker,\n ValidateResult,\n} from '../core';\n\nimport { _makeCtx, ErrorCode, fail, prependIssuePath, resolveMessage, Schema, SpellValidationError } from '../core';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface ArrayAnnotations extends Record<string, unknown> {\n maxItems?: number;\n minItems?: number;\n}\n\nexport class ArraySchema<\n T extends AnySchema,\n Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>,\n> extends Schema<InferOutput<T>[], InferInput<T>[], Mode> {\n readonly itemSchema: T;\n\n protected override get _kind(): string {\n return 'array';\n }\n\n override checkAsync(\n this: ArraySchema<T, 'sync'>,\n fn: (value: InferOutput<T>[], ctx: CheckContext) => Promise<ValidateResult>,\n ): ArraySchema<T, 'async'> {\n return this._addCheck(fn, true) as unknown as ArraySchema<T, 'async'>;\n }\n\n constructor(itemSchema: T) {\n super();\n this.itemSchema = itemSchema;\n }\n\n private _parseItemsSync(items: unknown[], ctx: ParseContext): { data: InferOutput<T>[]; issues: Issue[] } {\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const result = this.itemSchema._parseFullSync(items[i], ctx);\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(items[i] as InferOutput<T>);\n }\n }\n\n return { data: parsed, issues };\n }\n\n protected override _parse(value: unknown, ctx: ParseContext): ParseValue {\n if (!Array.isArray(value)) {\n return { data: value, issues: fail(ErrorCode.invalid_type, ctx.messages.array.type()), typeOk: false };\n }\n\n const { data: items, issues } = this._parseItemsSync(value, ctx);\n\n return { data: items, issues, typeOk: true };\n }\n\n override async parseAsync(value: unknown, ctx?: ParseContext): Promise<InferOutput<T>[]> {\n const c = ctx ?? _makeCtx();\n\n return this._withCatchAsync<InferOutput<T>[]>(async () => {\n const prepared = this._prepareInput(value);\n\n if (prepared.skip) return prepared.value as unknown as InferOutput<T>[];\n\n const raw = prepared.value;\n\n if (!Array.isArray(raw)) {\n throw new SpellValidationError(fail(ErrorCode.invalid_type, c.messages.array.type()));\n }\n\n const settled = await Promise.all(raw.map((item) => this.itemSchema._parseFullAsync(item, c)));\n\n const issues: Issue[] = [];\n const parsed: InferOutput<T>[] = [];\n\n for (let i = 0; i < settled.length; i++) {\n const result = settled[i];\n\n if (result.issues.length === 0) {\n parsed.push(result.data as InferOutput<T>);\n } else {\n issues.push(...prependIssuePath(result.issues, i));\n parsed.push(raw[i] as InferOutput<T>);\n }\n }\n\n const validationIssues = await this._runValidatorsAsync(parsed, c);\n const allIssues = [...issues, ...validationIssues];\n\n if (allIssues.length > 0) throw new SpellValidationError(allIssues);\n\n return this._runPostprocessors(parsed) as InferOutput<T>[];\n });\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.array.min, { min: length, value: value as unknown[] }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n minItems: ann.minItems === undefined ? length : Math.max(ann.minItems, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.array.max, { max: length, value: value as unknown[] }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as ArrayAnnotations;\n\n return {\n ...ann,\n maxItems: ann.maxItems === undefined ? length : Math.min(ann.maxItems, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: unknown[] }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as unknown[]).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.array.length, { exact, value: value as unknown[] }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxItems: exact, minItems: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: unknown[] }>): this {\n return this._addConstraint((value, ctx) => {\n const typed = value as unknown[];\n\n return typed.length > 0\n ? null\n : fail(ErrorCode.too_small, resolveMessage(message ?? ctx!.messages.array.nonEmpty, { min: 1, value: typed }), {\n min: 1,\n });\n });\n }\n\n /**\n * Validates that all array elements are unique.\n *\n * **Default behaviour:** Uniqueness is checked using JavaScript `Set` semantics, which means\n * **referential equality** for objects. Two structurally identical objects such as\n * `{ id: 1 }` and `{ id: 1 }` are considered different values and will not be\n * flagged as duplicates.\n *\n * **Custom equality:** Pass an `equalsFn` to use structural or domain-specific comparison\n * logic (e.g. compare by a specific field, or use deep equality).\n *\n * @example\n * s.array(s.object({ id: s.number() })).unique((a, b) => a.id === b.id)\n */\n unique(\n equalsFnOrMessage?: ((a: InferOutput<T>, b: InferOutput<T>) => boolean) | MessageFn<{ value: unknown[] }>,\n message?: MessageFn<{ value: unknown[] }>,\n ): this {\n const isCustomEqualsFn = typeof equalsFnOrMessage === 'function' && equalsFnOrMessage.length === 2;\n const equalsFn = isCustomEqualsFn ? (equalsFnOrMessage as (a: InferOutput<T>, b: InferOutput<T>) => boolean) : null;\n const resolvedMessage = isCustomEqualsFn\n ? message\n : typeof equalsFnOrMessage === 'function'\n ? (equalsFnOrMessage as MessageFn<{ value: unknown[] }>)\n : undefined;\n\n return this._addConstraint((value, ctx) => {\n const typed = value as InferOutput<T>[];\n let isUnique: boolean;\n\n if (equalsFn) {\n isUnique = typed.every((a, i) => typed.slice(0, i).every((b) => !equalsFn(a, b)));\n } else {\n isUnique = new Set(typed).size === typed.length;\n }\n\n if (isUnique) return null;\n\n return fail(\n ErrorCode.invalid_unique,\n resolveMessage(resolvedMessage ?? ctx!.messages.array.unique, { value: typed as unknown[] }),\n {\n unique: true,\n },\n );\n });\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as ArrayAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.maxItems !== undefined ? { maxItems: ann.maxItems } : {}),\n ...(ann.minItems !== undefined ? { minItems: ann.minItems } : {}),\n items: this.itemSchema.definition(),\n kind: 'array',\n };\n }\n\n protected override _walk<R>(visitor: SchemaWalker<R>): R | null {\n const item = this.itemSchema.walk(visitor);\n\n if (visitor.array) return visitor.array(this, item);\n\n return super._walk(visitor);\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import type { AnySchema, CheckContext, InferOutput, InferSchemaMode, MergeSchemaModes, MessageFn, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
1
+ import type { AnySchema, CheckContext, InferInput, InferOutput, InferSchemaMode, MergeSchemaModes, MessageFn, ParseContext, ParseValue, SchemaDescriptor, SchemaMode, SchemaWalker, ValidateResult } from '../core';
2
2
  import { Schema } from '../core';
3
- export declare class ArraySchema<T extends AnySchema, Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>> extends Schema<InferOutput<T>[], unknown, Mode> {
3
+ export declare class ArraySchema<T extends AnySchema, Mode extends SchemaMode = MergeSchemaModes<InferSchemaMode<T>>> extends Schema<InferOutput<T>[], InferInput<T>[], Mode> {
4
4
  readonly itemSchema: T;
5
5
  protected get _kind(): string;
6
6
  checkAsync(this: ArraySchema<T, 'sync'>, fn: (value: InferOutput<T>[], ctx: CheckContext) => Promise<ValidateResult>): ArraySchema<T, 'async'>;