@versionzero/schema 1.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 (401) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +246 -0
  3. package/package.json +84 -0
  4. package/src/compilation/handler-compilation.js +28 -0
  5. package/src/compilation/metadata-compilation.js +35 -0
  6. package/src/compilation/schema-compilation.js +142 -0
  7. package/src/compilation/selection-compilation.js +84 -0
  8. package/src/compilation/union-compilation.js +510 -0
  9. package/src/compilation/values-compilation.js +35 -0
  10. package/src/compiled-schema.js +1709 -0
  11. package/src/constants.js +1 -0
  12. package/src/core-library/index.js +32 -0
  13. package/src/core-library/processors/aggregation-operators.js +75 -0
  14. package/src/core-library/processors/alpha-constraint.js +20 -0
  15. package/src/core-library/processors/alphanum-constraint.js +20 -0
  16. package/src/core-library/processors/array-operator.js +51 -0
  17. package/src/core-library/processors/assert-constraint.js +75 -0
  18. package/src/core-library/processors/base64-constraint.js +26 -0
  19. package/src/core-library/processors/camel-case-operator.js +24 -0
  20. package/src/core-library/processors/capitalize-operator.js +16 -0
  21. package/src/core-library/processors/cardnum-constraint.js +193 -0
  22. package/src/core-library/processors/ceil-operator.js +44 -0
  23. package/src/core-library/processors/collapse-operator.js +29 -0
  24. package/src/core-library/processors/compact-operator.js +34 -0
  25. package/src/core-library/processors/compile-operator.js +65 -0
  26. package/src/core-library/processors/concat-operator.js +51 -0
  27. package/src/core-library/processors/conditional-operators.js +301 -0
  28. package/src/core-library/processors/constant-case-operator.js +16 -0
  29. package/src/core-library/processors/data-size-operator.js +86 -0
  30. package/src/core-library/processors/date-object-operator.js +54 -0
  31. package/src/core-library/processors/date-operator.js +67 -0
  32. package/src/core-library/processors/date-range-constraint.js +76 -0
  33. package/src/core-library/processors/defined-constraint.js +30 -0
  34. package/src/core-library/processors/each-operator.js +57 -0
  35. package/src/core-library/processors/email-constraint.js +112 -0
  36. package/src/core-library/processors/entries-operator.js +25 -0
  37. package/src/core-library/processors/eq-constraint.js +37 -0
  38. package/src/core-library/processors/filter-operator.js +74 -0
  39. package/src/core-library/processors/find-schema-operator.js +45 -0
  40. package/src/core-library/processors/flatten-operator.js +40 -0
  41. package/src/core-library/processors/floor-operator.js +47 -0
  42. package/src/core-library/processors/get-operator.js +44 -0
  43. package/src/core-library/processors/group-by-operator.js +84 -0
  44. package/src/core-library/processors/has-prefix-constraint.js +37 -0
  45. package/src/core-library/processors/has-suffix-constraint.js +35 -0
  46. package/src/core-library/processors/hex-constraint.js +20 -0
  47. package/src/core-library/processors/hostname-constraint.js +22 -0
  48. package/src/core-library/processors/http-url-constraint.js +27 -0
  49. package/src/core-library/processors/in-constraint.js +66 -0
  50. package/src/core-library/processors/index-by-operator.js +98 -0
  51. package/src/core-library/processors/index.js +131 -0
  52. package/src/core-library/processors/input-operator.js +23 -0
  53. package/src/core-library/processors/instanceof-constraint.js +38 -0
  54. package/src/core-library/processors/integer-constraint.js +22 -0
  55. package/src/core-library/processors/invoke-operator.js +33 -0
  56. package/src/core-library/processors/ipv4-constraint.js +188 -0
  57. package/src/core-library/processors/ipv6-constraint.js +205 -0
  58. package/src/core-library/processors/is-array-constraint.js +21 -0
  59. package/src/core-library/processors/is-date-constraint.js +22 -0
  60. package/src/core-library/processors/is-number-constraint.js +21 -0
  61. package/src/core-library/processors/is-object-constraint.js +21 -0
  62. package/src/core-library/processors/is-string-constraint.js +21 -0
  63. package/src/core-library/processors/join-operator.js +41 -0
  64. package/src/core-library/processors/json-constraint.js +22 -0
  65. package/src/core-library/processors/json-decode-operator.js +25 -0
  66. package/src/core-library/processors/json-encode-operator.js +35 -0
  67. package/src/core-library/processors/kebab-case-operator.js +23 -0
  68. package/src/core-library/processors/keys-operator.js +20 -0
  69. package/src/core-library/processors/length-constraint.js +85 -0
  70. package/src/core-library/processors/lookup-operator.js +84 -0
  71. package/src/core-library/processors/lowercase-operator.js +14 -0
  72. package/src/core-library/processors/map-operator.js +84 -0
  73. package/src/core-library/processors/match-operator.js +64 -0
  74. package/src/core-library/processors/matches-constraint.js +54 -0
  75. package/src/core-library/processors/math-operators.js +151 -0
  76. package/src/core-library/processors/merge-deep-operator.js +61 -0
  77. package/src/core-library/processors/merge-operator.js +54 -0
  78. package/src/core-library/processors/metadata-operator.js +100 -0
  79. package/src/core-library/processors/negative-constraint.js +23 -0
  80. package/src/core-library/processors/never-constraint.js +69 -0
  81. package/src/core-library/processors/non-empty-constraint.js +59 -0
  82. package/src/core-library/processors/not-constraint.js +71 -0
  83. package/src/core-library/processors/number-operator.js +24 -0
  84. package/src/core-library/processors/numeric-constraint.js +22 -0
  85. package/src/core-library/processors/object-operator.js +38 -0
  86. package/src/core-library/processors/omit-operator.js +57 -0
  87. package/src/core-library/processors/parallel-operator.js +64 -0
  88. package/src/core-library/processors/pascal-case-operator.js +16 -0
  89. package/src/core-library/processors/phone-constraint.js +235 -0
  90. package/src/core-library/processors/pick-operator.js +62 -0
  91. package/src/core-library/processors/pipeline-operator.js +63 -0
  92. package/src/core-library/processors/port-constraint.js +22 -0
  93. package/src/core-library/processors/positive-constraint.js +23 -0
  94. package/src/core-library/processors/process-operator.js +55 -0
  95. package/src/core-library/processors/property-operator.js +49 -0
  96. package/src/core-library/processors/range-constraint.js +72 -0
  97. package/src/core-library/processors/reference-operator.js +79 -0
  98. package/src/core-library/processors/require-constraint.js +74 -0
  99. package/src/core-library/processors/reverse-operator.js +20 -0
  100. package/src/core-library/processors/round-operator.js +53 -0
  101. package/src/core-library/processors/schema-handler-operators.js +54 -0
  102. package/src/core-library/processors/semver-constraint.js +282 -0
  103. package/src/core-library/processors/sequence-processors.js +406 -0
  104. package/src/core-library/processors/sort-operator.js +52 -0
  105. package/src/core-library/processors/split-operator.js +43 -0
  106. package/src/core-library/processors/string-extra-operators.js +141 -0
  107. package/src/core-library/processors/string-operator.js +34 -0
  108. package/src/core-library/processors/target-operator.js +30 -0
  109. package/src/core-library/processors/template-operator.js +60 -0
  110. package/src/core-library/processors/title-case-operator.js +17 -0
  111. package/src/core-library/processors/trim-operator.js +14 -0
  112. package/src/core-library/processors/truthy-constraint.js +35 -0
  113. package/src/core-library/processors/type-operator.js +24 -0
  114. package/src/core-library/processors/unique-operator.js +21 -0
  115. package/src/core-library/processors/uppercase-operator.js +14 -0
  116. package/src/core-library/processors/url-constraint.js +31 -0
  117. package/src/core-library/processors/url-decode-operator.js +50 -0
  118. package/src/core-library/processors/url-encode-operator.js +44 -0
  119. package/src/core-library/processors/uuid-constraint.js +31 -0
  120. package/src/core-library/processors/values-operator.js +20 -0
  121. package/src/core-library/schemas/any-schema.js +23 -0
  122. package/src/core-library/schemas/array-schema.js +8 -0
  123. package/src/core-library/schemas/boolean-schema.js +10 -0
  124. package/src/core-library/schemas/date-schema.js +12 -0
  125. package/src/core-library/schemas/function-schema.js +40 -0
  126. package/src/core-library/schemas/number-schema.js +9 -0
  127. package/src/core-library/schemas/object-schema.js +10 -0
  128. package/src/core-library/schemas/root-schema.js +21 -0
  129. package/src/core-library/schemas/string-schema.js +9 -0
  130. package/src/core-library-node/index.js +47 -0
  131. package/src/core-library-node/processors/base64-decode-operator.js +20 -0
  132. package/src/core-library-node/processors/base64-encode-operator.js +20 -0
  133. package/src/core-library-node/processors/buffer-operator.js +39 -0
  134. package/src/core-library-node/processors/directory-constraint.js +35 -0
  135. package/src/core-library-node/processors/executable-constraint.js +34 -0
  136. package/src/core-library-node/processors/file-constraint.js +34 -0
  137. package/src/core-library-node/processors/file-size-constraint.js +94 -0
  138. package/src/core-library-node/processors/is-buffer-constraint.js +21 -0
  139. package/src/core-library-node/processors/reachable-constraint.js +28 -0
  140. package/src/core-library-node/processors/readable-constraint.js +34 -0
  141. package/src/core-library-node/processors/writable-constraint.js +59 -0
  142. package/src/core-library-node/schemas/buffer-schema.js +10 -0
  143. package/src/errors.js +209 -0
  144. package/src/executor/array-executor.js +78 -0
  145. package/src/executor/conditional-executor.js +134 -0
  146. package/src/executor/each-executor.js +68 -0
  147. package/src/executor/executor.js +123 -0
  148. package/src/executor/object-executor.js +98 -0
  149. package/src/executor/parallel-executor.js +43 -0
  150. package/src/executor/pipeline-executor.js +65 -0
  151. package/src/executor/sequence-executor.js +206 -0
  152. package/src/executor/serial-executor.js +24 -0
  153. package/src/executor/step-executor.js +68 -0
  154. package/src/helpers/case.js +124 -0
  155. package/src/helpers/data-size.js +144 -0
  156. package/src/helpers/debug-sink.js +15 -0
  157. package/src/helpers/deep.js +280 -0
  158. package/src/helpers/format.js +121 -0
  159. package/src/helpers/has-string-properties.js +30 -0
  160. package/src/helpers/index.js +16 -0
  161. package/src/helpers/object.js +115 -0
  162. package/src/helpers/parse-date.js +75 -0
  163. package/src/helpers/path.js +28 -0
  164. package/src/helpers/regex.js +18 -0
  165. package/src/helpers/stringify.js +309 -0
  166. package/src/helpers/to-data.js +64 -0
  167. package/src/helpers/truthy.js +55 -0
  168. package/src/index.js +29 -0
  169. package/src/schema-compiler.js +531 -0
  170. package/src/schema-location.js +200 -0
  171. package/src/schema-resolver.js +546 -0
  172. package/src/schema.js +1182 -0
  173. package/src/traversal/executors/check-condition.js +42 -0
  174. package/src/traversal/executors/check-input.js +27 -0
  175. package/src/traversal/executors/check-required.js +19 -0
  176. package/src/traversal/executors/check-schema.js +45 -0
  177. package/src/traversal/executors/defaults.js +21 -0
  178. package/src/traversal/executors/enter-existing.js +25 -0
  179. package/src/traversal/executors/enter-input.js +25 -0
  180. package/src/traversal/executors/enter.js +37 -0
  181. package/src/traversal/executors/exit.js +74 -0
  182. package/src/traversal/executors/finalize.js +64 -0
  183. package/src/traversal/executors/index.js +42 -0
  184. package/src/traversal/executors/normalize.js +38 -0
  185. package/src/traversal/executors/prepare-existing.js +27 -0
  186. package/src/traversal/executors/prepare-pending.js +54 -0
  187. package/src/traversal/executors/resolve-union.js +50 -0
  188. package/src/traversal/executors/serialize.js +48 -0
  189. package/src/traversal/executors/transform-early.js +51 -0
  190. package/src/traversal/executors/transform.js +68 -0
  191. package/src/traversal/executors/traversal-state-executor.js +46 -0
  192. package/src/traversal/executors/validate.js +63 -0
  193. package/src/traversal/traversal-context.js +231 -0
  194. package/src/traversal/traversal-state.js +809 -0
  195. package/src/types.js +102 -0
  196. package/src/value-processor/composed-value-processor.js +43 -0
  197. package/src/value-processor/defined-value-processor.js +72 -0
  198. package/src/value-processor/function-value-processor.js +68 -0
  199. package/src/value-processor/parameterized-value-processor.js +45 -0
  200. package/src/value-processor/parameters-value-processor.js +178 -0
  201. package/src/value-processor/spec.js +89 -0
  202. package/src/value-processor/value-processor.js +105 -0
  203. package/types/compilation/handler-compilation.d.ts +13 -0
  204. package/types/compilation/metadata-compilation.d.ts +6 -0
  205. package/types/compilation/schema-compilation.d.ts +32 -0
  206. package/types/compilation/selection-compilation.d.ts +9 -0
  207. package/types/compilation/union-compilation.d.ts +42 -0
  208. package/types/compilation/values-compilation.d.ts +12 -0
  209. package/types/compiled-schema.d.ts +883 -0
  210. package/types/constants.d.ts +1 -0
  211. package/types/core-library/index.d.ts +7 -0
  212. package/types/core-library/processors/aggregation-operators.d.ts +24 -0
  213. package/types/core-library/processors/alpha-constraint.d.ts +9 -0
  214. package/types/core-library/processors/alphanum-constraint.d.ts +9 -0
  215. package/types/core-library/processors/array-operator.d.ts +12 -0
  216. package/types/core-library/processors/assert-constraint.d.ts +30 -0
  217. package/types/core-library/processors/base64-constraint.d.ts +11 -0
  218. package/types/core-library/processors/camel-case-operator.d.ts +17 -0
  219. package/types/core-library/processors/capitalize-operator.d.ts +11 -0
  220. package/types/core-library/processors/cardnum-constraint.d.ts +51 -0
  221. package/types/core-library/processors/ceil-operator.d.ts +30 -0
  222. package/types/core-library/processors/collapse-operator.d.ts +24 -0
  223. package/types/core-library/processors/compact-operator.d.ts +29 -0
  224. package/types/core-library/processors/compile-operator.d.ts +34 -0
  225. package/types/core-library/processors/concat-operator.d.ts +23 -0
  226. package/types/core-library/processors/conditional-operators.d.ts +219 -0
  227. package/types/core-library/processors/constant-case-operator.d.ts +9 -0
  228. package/types/core-library/processors/data-size-operator.d.ts +31 -0
  229. package/types/core-library/processors/date-object-operator.d.ts +16 -0
  230. package/types/core-library/processors/date-operator.d.ts +21 -0
  231. package/types/core-library/processors/date-range-constraint.d.ts +26 -0
  232. package/types/core-library/processors/defined-constraint.d.ts +20 -0
  233. package/types/core-library/processors/each-operator.d.ts +34 -0
  234. package/types/core-library/processors/email-constraint.d.ts +54 -0
  235. package/types/core-library/processors/entries-operator.d.ts +13 -0
  236. package/types/core-library/processors/eq-constraint.d.ts +20 -0
  237. package/types/core-library/processors/filter-operator.d.ts +35 -0
  238. package/types/core-library/processors/find-schema-operator.d.ts +28 -0
  239. package/types/core-library/processors/flatten-operator.d.ts +26 -0
  240. package/types/core-library/processors/floor-operator.d.ts +33 -0
  241. package/types/core-library/processors/get-operator.d.ts +31 -0
  242. package/types/core-library/processors/group-by-operator.d.ts +36 -0
  243. package/types/core-library/processors/has-prefix-constraint.d.ts +22 -0
  244. package/types/core-library/processors/has-suffix-constraint.d.ts +20 -0
  245. package/types/core-library/processors/hex-constraint.d.ts +9 -0
  246. package/types/core-library/processors/hostname-constraint.d.ts +11 -0
  247. package/types/core-library/processors/http-url-constraint.d.ts +9 -0
  248. package/types/core-library/processors/in-constraint.d.ts +27 -0
  249. package/types/core-library/processors/index-by-operator.d.ts +26 -0
  250. package/types/core-library/processors/index.d.ts +8 -0
  251. package/types/core-library/processors/input-operator.d.ts +20 -0
  252. package/types/core-library/processors/instanceof-constraint.d.ts +23 -0
  253. package/types/core-library/processors/integer-constraint.d.ts +9 -0
  254. package/types/core-library/processors/invoke-operator.d.ts +12 -0
  255. package/types/core-library/processors/ipv4-constraint.d.ts +37 -0
  256. package/types/core-library/processors/ipv6-constraint.d.ts +34 -0
  257. package/types/core-library/processors/is-array-constraint.d.ts +10 -0
  258. package/types/core-library/processors/is-date-constraint.d.ts +10 -0
  259. package/types/core-library/processors/is-number-constraint.d.ts +10 -0
  260. package/types/core-library/processors/is-object-constraint.d.ts +10 -0
  261. package/types/core-library/processors/is-string-constraint.d.ts +10 -0
  262. package/types/core-library/processors/join-operator.d.ts +29 -0
  263. package/types/core-library/processors/json-constraint.d.ts +10 -0
  264. package/types/core-library/processors/json-decode-operator.d.ts +9 -0
  265. package/types/core-library/processors/json-encode-operator.d.ts +27 -0
  266. package/types/core-library/processors/kebab-case-operator.d.ts +16 -0
  267. package/types/core-library/processors/keys-operator.d.ts +9 -0
  268. package/types/core-library/processors/length-constraint.d.ts +34 -0
  269. package/types/core-library/processors/lookup-operator.d.ts +36 -0
  270. package/types/core-library/processors/lowercase-operator.d.ts +9 -0
  271. package/types/core-library/processors/map-operator.d.ts +38 -0
  272. package/types/core-library/processors/match-operator.d.ts +34 -0
  273. package/types/core-library/processors/matches-constraint.d.ts +29 -0
  274. package/types/core-library/processors/math-operators.d.ts +91 -0
  275. package/types/core-library/processors/merge-deep-operator.d.ts +32 -0
  276. package/types/core-library/processors/merge-operator.d.ts +26 -0
  277. package/types/core-library/processors/metadata-operator.d.ts +56 -0
  278. package/types/core-library/processors/negative-constraint.d.ts +13 -0
  279. package/types/core-library/processors/never-constraint.d.ts +26 -0
  280. package/types/core-library/processors/non-empty-constraint.d.ts +28 -0
  281. package/types/core-library/processors/not-constraint.d.ts +28 -0
  282. package/types/core-library/processors/number-operator.d.ts +9 -0
  283. package/types/core-library/processors/numeric-constraint.d.ts +10 -0
  284. package/types/core-library/processors/object-operator.d.ts +10 -0
  285. package/types/core-library/processors/omit-operator.d.ts +24 -0
  286. package/types/core-library/processors/parallel-operator.d.ts +41 -0
  287. package/types/core-library/processors/pascal-case-operator.d.ts +9 -0
  288. package/types/core-library/processors/phone-constraint.d.ts +65 -0
  289. package/types/core-library/processors/pick-operator.d.ts +27 -0
  290. package/types/core-library/processors/pipeline-operator.d.ts +40 -0
  291. package/types/core-library/processors/port-constraint.d.ts +11 -0
  292. package/types/core-library/processors/positive-constraint.d.ts +13 -0
  293. package/types/core-library/processors/process-operator.d.ts +37 -0
  294. package/types/core-library/processors/property-operator.d.ts +34 -0
  295. package/types/core-library/processors/range-constraint.d.ts +30 -0
  296. package/types/core-library/processors/reference-operator.d.ts +38 -0
  297. package/types/core-library/processors/require-constraint.d.ts +29 -0
  298. package/types/core-library/processors/reverse-operator.d.ts +9 -0
  299. package/types/core-library/processors/round-operator.d.ts +34 -0
  300. package/types/core-library/processors/schema-handler-operators.d.ts +28 -0
  301. package/types/core-library/processors/semver-constraint.d.ts +43 -0
  302. package/types/core-library/processors/sequence-processors.d.ts +213 -0
  303. package/types/core-library/processors/sort-operator.d.ts +31 -0
  304. package/types/core-library/processors/split-operator.d.ts +33 -0
  305. package/types/core-library/processors/string-extra-operators.d.ts +83 -0
  306. package/types/core-library/processors/string-operator.d.ts +10 -0
  307. package/types/core-library/processors/target-operator.d.ts +27 -0
  308. package/types/core-library/processors/template-operator.d.ts +31 -0
  309. package/types/core-library/processors/title-case-operator.d.ts +12 -0
  310. package/types/core-library/processors/trim-operator.d.ts +9 -0
  311. package/types/core-library/processors/truthy-constraint.d.ts +23 -0
  312. package/types/core-library/processors/type-operator.d.ts +11 -0
  313. package/types/core-library/processors/unique-operator.d.ts +10 -0
  314. package/types/core-library/processors/uppercase-operator.d.ts +9 -0
  315. package/types/core-library/processors/url-constraint.d.ts +20 -0
  316. package/types/core-library/processors/url-decode-operator.d.ts +31 -0
  317. package/types/core-library/processors/url-encode-operator.d.ts +36 -0
  318. package/types/core-library/processors/uuid-constraint.d.ts +20 -0
  319. package/types/core-library/processors/values-operator.d.ts +9 -0
  320. package/types/core-library/schemas/any-schema.d.ts +2 -0
  321. package/types/core-library/schemas/array-schema.d.ts +2 -0
  322. package/types/core-library/schemas/boolean-schema.d.ts +2 -0
  323. package/types/core-library/schemas/date-schema.d.ts +2 -0
  324. package/types/core-library/schemas/function-schema.d.ts +2 -0
  325. package/types/core-library/schemas/number-schema.d.ts +2 -0
  326. package/types/core-library/schemas/object-schema.d.ts +2 -0
  327. package/types/core-library/schemas/root-schema.d.ts +2 -0
  328. package/types/core-library/schemas/string-schema.d.ts +2 -0
  329. package/types/core-library-node/index.d.ts +12 -0
  330. package/types/core-library-node/processors/base64-decode-operator.d.ts +9 -0
  331. package/types/core-library-node/processors/base64-encode-operator.d.ts +9 -0
  332. package/types/core-library-node/processors/buffer-operator.d.ts +15 -0
  333. package/types/core-library-node/processors/directory-constraint.d.ts +14 -0
  334. package/types/core-library-node/processors/executable-constraint.d.ts +17 -0
  335. package/types/core-library-node/processors/file-constraint.d.ts +13 -0
  336. package/types/core-library-node/processors/file-size-constraint.d.ts +43 -0
  337. package/types/core-library-node/processors/is-buffer-constraint.d.ts +10 -0
  338. package/types/core-library-node/processors/reachable-constraint.d.ts +13 -0
  339. package/types/core-library-node/processors/readable-constraint.d.ts +17 -0
  340. package/types/core-library-node/processors/writable-constraint.d.ts +18 -0
  341. package/types/core-library-node/schemas/buffer-schema.d.ts +2 -0
  342. package/types/errors.d.ts +58 -0
  343. package/types/executor/array-executor.d.ts +17 -0
  344. package/types/executor/conditional-executor.d.ts +45 -0
  345. package/types/executor/each-executor.d.ts +15 -0
  346. package/types/executor/executor.d.ts +84 -0
  347. package/types/executor/object-executor.d.ts +14 -0
  348. package/types/executor/parallel-executor.d.ts +27 -0
  349. package/types/executor/pipeline-executor.d.ts +11 -0
  350. package/types/executor/sequence-executor.d.ts +32 -0
  351. package/types/executor/serial-executor.d.ts +16 -0
  352. package/types/executor/step-executor.d.ts +14 -0
  353. package/types/helpers/case.d.ts +30 -0
  354. package/types/helpers/data-size.d.ts +25 -0
  355. package/types/helpers/debug-sink.d.ts +9 -0
  356. package/types/helpers/deep.d.ts +33 -0
  357. package/types/helpers/format.d.ts +14 -0
  358. package/types/helpers/has-string-properties.d.ts +5 -0
  359. package/types/helpers/index.d.ts +13 -0
  360. package/types/helpers/object.d.ts +46 -0
  361. package/types/helpers/parse-date.d.ts +6 -0
  362. package/types/helpers/path.d.ts +13 -0
  363. package/types/helpers/regex.d.ts +7 -0
  364. package/types/helpers/stringify.d.ts +33 -0
  365. package/types/helpers/to-data.d.ts +13 -0
  366. package/types/helpers/truthy.d.ts +26 -0
  367. package/types/index.d.ts +6 -0
  368. package/types/schema-compiler.d.ts +49 -0
  369. package/types/schema-location.d.ts +64 -0
  370. package/types/schema-resolver.d.ts +145 -0
  371. package/types/schema.d.ts +586 -0
  372. package/types/traversal/executors/check-condition.d.ts +8 -0
  373. package/types/traversal/executors/check-input.d.ts +6 -0
  374. package/types/traversal/executors/check-required.d.ts +6 -0
  375. package/types/traversal/executors/check-schema.d.ts +7 -0
  376. package/types/traversal/executors/defaults.d.ts +8 -0
  377. package/types/traversal/executors/enter-existing.d.ts +6 -0
  378. package/types/traversal/executors/enter-input.d.ts +8 -0
  379. package/types/traversal/executors/enter.d.ts +7 -0
  380. package/types/traversal/executors/exit.d.ts +6 -0
  381. package/types/traversal/executors/finalize.d.ts +6 -0
  382. package/types/traversal/executors/index.d.ts +15 -0
  383. package/types/traversal/executors/normalize.d.ts +7 -0
  384. package/types/traversal/executors/prepare-existing.d.ts +6 -0
  385. package/types/traversal/executors/prepare-pending.d.ts +6 -0
  386. package/types/traversal/executors/resolve-union.d.ts +6 -0
  387. package/types/traversal/executors/serialize.d.ts +11 -0
  388. package/types/traversal/executors/transform-early.d.ts +6 -0
  389. package/types/traversal/executors/transform.d.ts +6 -0
  390. package/types/traversal/executors/traversal-state-executor.d.ts +19 -0
  391. package/types/traversal/executors/validate.d.ts +6 -0
  392. package/types/traversal/traversal-context.d.ts +67 -0
  393. package/types/traversal/traversal-state.d.ts +97 -0
  394. package/types/types.d.ts +218 -0
  395. package/types/value-processor/composed-value-processor.d.ts +17 -0
  396. package/types/value-processor/defined-value-processor.d.ts +16 -0
  397. package/types/value-processor/function-value-processor.d.ts +15 -0
  398. package/types/value-processor/parameterized-value-processor.d.ts +14 -0
  399. package/types/value-processor/parameters-value-processor.d.ts +28 -0
  400. package/types/value-processor/spec.d.ts +22 -0
  401. package/types/value-processor/value-processor.d.ts +92 -0
@@ -0,0 +1,74 @@
1
+
2
+ import { ValueProcessor } from "../../value-processor/value-processor.js";
3
+ import { ComposedValueProcessor } from '../../value-processor/composed-value-processor.js';
4
+ import { ConditionalExecutor } from '../../executor/conditional-executor.js';
5
+ import { Executor } from '../../executor/executor.js';
6
+ import { ConstraintError, SchemaError } from '../../errors.js';
7
+
8
+ /**
9
+ * ## $require
10
+ *
11
+ * Require that the provided processor returns a defined value; return the original input if so.
12
+ * Throws a constraint error if the processor does not return a defined value.
13
+ *
14
+ * May be used inline in a pipeline without parameters, or can have a single processor argument.
15
+ *
16
+ * ### Parameters
17
+ * - `processor` (ProcessorSpec, optional): Processor specification to check for a defined return value.
18
+ * If omitted, the input value itself is checked for defined-ness.
19
+ *
20
+ * ### Example
21
+ * ```js
22
+ * // Require the input to be defined (not undefined)
23
+ * new Schema('any').validator('$require')
24
+ *
25
+ * // Require a lookup to succeed (key must exist in the table)
26
+ * new Schema('string').validator({
27
+ * $require: {$lookup: {$literal: {admin: 1, user: 2, guest: 3}}}
28
+ * })
29
+ *
30
+ * // Require a nested path to resolve
31
+ * new Schema('object').validator({$require: {$get: 'metadata.version'}})
32
+ * ```
33
+ *
34
+ * @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
35
+ */
36
+ export const REQUIRE_CONSTRAINT = {
37
+ keyword: 'require',
38
+ build: (args) => {
39
+
40
+ /** @type {ValueProcessor|undefined} */
41
+ let processor;
42
+ if (Array.isArray(args)) {
43
+ if (args.length === 1) {
44
+ processor = args[0];
45
+ }
46
+ else if (args.length === 0) {
47
+ processor = new ComposedValueProcessor(new Executor(), []);
48
+ }
49
+ else {
50
+ throw new SchemaError('$require requires no more than a single processor argument');
51
+ }
52
+ }
53
+ else if (typeof args === 'object') {
54
+ processor = args.processor;
55
+ }
56
+ if (!(processor instanceof ValueProcessor)) {
57
+ throw new SchemaError('$require requires a processor argument');
58
+ }
59
+
60
+ const spec = args.length === 0? '$require' : {'$require': processor.spec};
61
+ const description = processor.description;
62
+
63
+ return new ComposedValueProcessor(
64
+ new ConditionalExecutor(processor,
65
+ { failure: (error) => {
66
+ if (error instanceof ConstraintError) {
67
+ throw error;
68
+ }
69
+ throw new ConstraintError('Processed value was undefined', {cause: error}); } },
70
+ [ConditionalExecutor.CHECK_DEFINED, ConditionalExecutor.PASS_ERROR]
71
+ ),
72
+ spec, description);
73
+ }
74
+ };
@@ -0,0 +1,20 @@
1
+ import { ConstraintError } from '../../errors.js';
2
+ import { formatValue } from '../../helpers/format.js';
3
+
4
+ /**
5
+ * ## $reverse
6
+ *
7
+ * Returns a new array with elements in reverse order. Non-mutating.
8
+ * Throws if the input is not an array.
9
+ *
10
+ * @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
11
+ */
12
+ export const REVERSE_OPERATOR = {
13
+ keyword: 'reverse',
14
+ process: (value, _target, location) => {
15
+ if (!Array.isArray(value)) {
16
+ throw new ConstraintError(`$reverse requires an array, got ${formatValue(value)}`, {location});
17
+ }
18
+ return [...value].reverse();
19
+ }
20
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * ## $round
3
+ *
4
+ * Rounds a numeric value to the nearest integer or to a specified number of decimal places.
5
+ * Safe to use in normalize phase (non-throwing). Non-numeric values pass through unchanged.
6
+ *
7
+ * ### Parameters
8
+ * - `precision` (number, optional): Number of decimal places. Defaults to 0 (integer rounding).
9
+ *
10
+ * **Examples**:
11
+ * - `3.7` with precision 0 → `4`
12
+ * - `3.14159` with precision 2 → `3.14`
13
+ * - `123.456` with precision 1 → `123.5`
14
+ * - `"not a number"` → `"not a number"` (passes through unchanged)
15
+ *
16
+ * ### Example
17
+ * ```js
18
+ * // Round to nearest integer
19
+ * new Schema('number').transformer('$round')
20
+ * // 3.5 → 4, 3.4 → 3
21
+ *
22
+ * // Round a price to 2 decimal places
23
+ * new Schema('number').transformer({$round: {precision: 2}})
24
+ * // 9.9950 → 9.99, 9.9951 → 10.00
25
+ *
26
+ * // Round a sensor reading to 1 decimal place
27
+ * new Schema('object', {
28
+ * temperature: new Schema('number').transformer({$round: {precision: 1}}),
29
+ * })
30
+ * ```
31
+ *
32
+ * @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
33
+ */
34
+ export const ROUND_OPERATOR = {
35
+ keyword: 'round',
36
+ parameters: [ { parameter: 'precision', default: 0 } ],
37
+
38
+ process: (value, _target, _location, options) => {
39
+ const precision = options.args.precision;
40
+ const multiplier = Math.pow(10, precision);
41
+ const num = Number(value);
42
+ if (!Number.isFinite(num)) {
43
+ return value; // Pass through non-numeric values unchanged
44
+ }
45
+ return Math.round(num * multiplier) / multiplier;
46
+ },
47
+ /*
48
+ description: precision > 0 ? `round(${precision})` : 'round'
49
+ };
50
+ }
51
+
52
+ */
53
+ };
@@ -0,0 +1,54 @@
1
+ import { CompiledSchema } from '../../compiled-schema.js';
2
+ import { SchemaError } from '../../errors.js';
3
+ import { formatValue } from '../../helpers/format.js';
4
+
5
+ /**
6
+ * ## $normalize
7
+ *
8
+ * Normalize the incoming value according using the provided schema
9
+ *
10
+ * ### Parameters
11
+ * - `schema` (CompiledSchema, required): the compiled schema to apply to the input value.
12
+ * Any `Schema` found in a handler pipeline will be automatically compiled;
13
+ * Use `$compile` to produce a `CompiledSchema` from a `Schema` literal value.
14
+ *
15
+ * ### Example
16
+ * ```js
17
+ * import { Schema, SchemaResolver } from '@versionzero/schema';
18
+ *
19
+ * const resolver = new SchemaResolver();
20
+ *
21
+ * const = await resolver.compile(
22
+ * new Schema('object')
23
+ * .property('collection', new Schema('array')
24
+ * .property('*', new Schema('string').normalizer('$trim').normalizer('$lowercase'))
25
+ * .property('chosen', new Schema('string').normalizer({$normalize: {'$find-schema': '^.collection.*'}})
26
+ * );
27
+ *
28
+ * ```
29
+ *
30
+ * @type {import('../../value-processor/value-processor.js').ValueProcessorDefinition}
31
+ */
32
+ export const NORMALIZE_OPERATOR = {
33
+ keyword: 'normalize',
34
+ parameters: [ { parameter: 'schema', required: true }, { parameter: 'value', required: false } ],
35
+
36
+ process: (value, target, location, options = {}) => {
37
+ const schema = options.args.schema;
38
+
39
+ if (!(schema instanceof CompiledSchema)) {
40
+ throw new SchemaError(`Schema argument must be an instance of CompiledSchema, got ${formatValue(schema)})`, {location});
41
+ }
42
+
43
+ const cycleCheck = (options.cycleCheck ?? new Set());
44
+
45
+ if (cycleCheck.has(location.schema)) {
46
+ throw new SchemaError(`Cycle detected while processing $normalize`, {location, value});
47
+ }
48
+ cycleCheck.add(location.schema);
49
+
50
+ const v = options.args.value ?? value;
51
+
52
+ return schema._normalizeValue(v, target, undefined, {cycleCheck}); // do not pass options, or outer schema context/paths will leak in!
53
+ }
54
+ };
@@ -0,0 +1,282 @@
1
+ import { ConstraintError, ResolverError } from '../../errors.js';
2
+
3
+ /**
4
+ * Strict semver regex per semver.org 2.0.0 spec.
5
+ * Groups: 1=major, 2=minor, 3=patch, 4=prerelease (optional), 5=build (optional)
6
+ */
7
+ const SEMVER_REGEX = /^(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-]+)*))?$/;
8
+
9
+ /**
10
+ * @typedef {{ major: number, minor: number, patch: number, prerelease: string[], build: string[] }} SemVer
11
+ */
12
+
13
+ /**
14
+ * Parse a semver string into its components.
15
+ * @param {string} str
16
+ * @returns {SemVer}
17
+ */
18
+ function parseSemVer(str) {
19
+ const m = SEMVER_REGEX.exec(str.trim());
20
+ if (!m) {
21
+ throw new ResolverError(`Invalid semver: "${str}"`);
22
+ }
23
+ return {
24
+ major: Number(m[1]),
25
+ minor: Number(m[2]),
26
+ patch: Number(m[3]),
27
+ prerelease: m[4] ? m[4].split('.') : [],
28
+ build: m[5] ? m[5].split('.') : [],
29
+ };
30
+ }
31
+
32
+ /**
33
+ * Compare two pre-release identifier arrays per semver 2.0.0 §11.
34
+ * Returns negative if a < b, 0 if equal, positive if a > b.
35
+ * @param {string[]} a
36
+ * @param {string[]} b
37
+ * @returns {number}
38
+ */
39
+ function comparePrerelease(a, b) {
40
+ // no prerelease on either — equal
41
+ if (a.length === 0 && b.length === 0) return 0;
42
+ // a version with prerelease has lower precedence than the release version
43
+ if (a.length === 0) return 1;
44
+ if (b.length === 0) return -1;
45
+
46
+ const len = Math.max(a.length, b.length);
47
+ for (let i = 0; i < len; i++) {
48
+ // fewer fields = lower precedence
49
+ if (i >= a.length) return -1;
50
+ if (i >= b.length) return 1;
51
+
52
+ const ai = a[i];
53
+ const bi = b[i];
54
+ if (ai === bi) continue;
55
+
56
+ const aNum = /^\d+$/.test(ai);
57
+ const bNum = /^\d+$/.test(bi);
58
+
59
+ // numeric identifiers always have lower precedence than alphanumeric
60
+ if (aNum && !bNum) return -1;
61
+ if (!aNum && bNum) return 1;
62
+
63
+ if (aNum && bNum) {
64
+ const diff = Number(ai) - Number(bi);
65
+ if (diff !== 0) return diff;
66
+ } else {
67
+ // both alphanumeric — lexicographic
68
+ if (ai < bi) return -1;
69
+ if (ai > bi) return 1;
70
+ }
71
+ }
72
+ return 0;
73
+ }
74
+
75
+ /**
76
+ * Compare two parsed semver objects. Build metadata is ignored per spec.
77
+ * Returns negative if a < b, 0 if equal, positive if a > b.
78
+ * @param {SemVer} a
79
+ * @param {SemVer} b
80
+ * @returns {number}
81
+ */
82
+ function compareSemVer(a, b) {
83
+ return (a.major - b.major)
84
+ || (a.minor - b.minor)
85
+ || (a.patch - b.patch)
86
+ || comparePrerelease(a.prerelease, b.prerelease);
87
+ }
88
+
89
+ // --- range parsing ---
90
+
91
+ /** @typedef {(v: SemVer) => boolean} SemVerPredicate */
92
+
93
+ /** Matches a single comparator: optional operator + semver */
94
+ const COMPARATOR_REGEX = /^(>=|<=|>|<|=)?\s*((?: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-]+)*))?)$/;
95
+
96
+ /**
97
+ * Parse a single comparator (e.g. '>=1.0.0', '<2.0.0', '1.2.3') into a predicate.
98
+ * @param {string} comp
99
+ * @returns {SemVerPredicate}
100
+ */
101
+ function parseComparator(comp) {
102
+ const m = COMPARATOR_REGEX.exec(comp.trim());
103
+ if (!m) {
104
+ throw new ResolverError(`Invalid semver comparator: "${comp}"`);
105
+ }
106
+ const op = m[1] || '=';
107
+ const target = parseSemVer(m[2]);
108
+
109
+ switch (op) {
110
+ case '=': return (v) => compareSemVer(v, target) === 0;
111
+ case '>': return (v) => compareSemVer(v, target) > 0;
112
+ case '>=': return (v) => compareSemVer(v, target) >= 0;
113
+ case '<': return (v) => compareSemVer(v, target) < 0;
114
+ case '<=': return (v) => compareSemVer(v, target) <= 0;
115
+ default: throw new ResolverError(`Unknown semver operator: "${op}"`);
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Parse a caret range (^1.2.3) into a predicate.
121
+ * ^major.minor.patch means >=major.minor.patch and:
122
+ * major > 0: < (major+1).0.0
123
+ * major === 0, minor > 0: < 0.(minor+1).0
124
+ * major === 0, minor === 0: < 0.0.(patch+1)
125
+ * @param {string} version
126
+ * @returns {SemVerPredicate}
127
+ */
128
+ function parseCaret(version) {
129
+ const min = parseSemVer(version);
130
+ /** @type {SemVer} */
131
+ let max;
132
+ if (min.major > 0) {
133
+ max = { major: min.major + 1, minor: 0, patch: 0, prerelease: [], build: [] };
134
+ } else if (min.minor > 0) {
135
+ max = { major: 0, minor: min.minor + 1, patch: 0, prerelease: [], build: [] };
136
+ } else {
137
+ max = { major: 0, minor: 0, patch: min.patch + 1, prerelease: [], build: [] };
138
+ }
139
+ return (v) => compareSemVer(v, min) >= 0 && compareSemVer(v, max) < 0;
140
+ }
141
+
142
+ /**
143
+ * Parse a tilde range (~1.2.3) into a predicate.
144
+ * ~major.minor.patch means >=major.minor.patch <major.(minor+1).0
145
+ * @param {string} version
146
+ * @returns {SemVerPredicate}
147
+ */
148
+ function parseTilde(version) {
149
+ const min = parseSemVer(version);
150
+ /** @type {SemVer} */
151
+ const max = { major: min.major, minor: min.minor + 1, patch: 0, prerelease: [], build: [] };
152
+ return (v) => compareSemVer(v, min) >= 0 && compareSemVer(v, max) < 0;
153
+ }
154
+
155
+ /**
156
+ * Parse a semver range expression into a predicate.
157
+ * Supports: comparators (>=, >, <=, <, =), caret (^), tilde (~),
158
+ * and space-separated AND of comparators.
159
+ * @param {string} range
160
+ * @returns {SemVerPredicate}
161
+ */
162
+ function parseRange(range) {
163
+ const trimmed = range.trim();
164
+
165
+ if (trimmed.startsWith('^')) {
166
+ return parseCaret(trimmed.slice(1));
167
+ }
168
+ if (trimmed.startsWith('~')) {
169
+ return parseTilde(trimmed.slice(1));
170
+ }
171
+
172
+ // space-separated AND of comparators
173
+ const parts = trimmed.split(/\s+/);
174
+ if (parts.length === 1) {
175
+ return parseComparator(parts[0]);
176
+ }
177
+ const predicates = parts.map(parseComparator);
178
+ return (v) => predicates.every(p => p(v));
179
+ }
180
+
181
+ /**
182
+ * ## $semver
183
+ *
184
+ * Validates that a string is a valid semantic version per the semver 2.0.0 spec.
185
+ *
186
+ * ### Parameters
187
+ * - `in` (string, optional): Semver range expression. Supports comparators
188
+ * (`>=1.0.0`, `<2.0.0`), caret (`^1.2.3`), tilde (`~1.2.3`), and
189
+ * space-separated AND (`>=1.0.0 <2.0.0`).
190
+ * - `min` (string, optional): Minimum version (inclusive).
191
+ * - `max` (string, optional): Maximum version (inclusive).
192
+ *
193
+ * Use either `in` OR `min`/`max`, not both.
194
+ *
195
+ * ### Example
196
+ * ```js
197
+ * // Format-only validation
198
+ * new Schema('string').validator('$semver')
199
+ *
200
+ * // Caret range (positional `in`)
201
+ * new Schema('string').validator({$semver: '^1.2.0'})
202
+ *
203
+ * // Tilde range
204
+ * new Schema('string').validator({$semver: '~1.2.0'})
205
+ *
206
+ * // Comparator range
207
+ * new Schema('string').validator({$semver: '>=1.0.0 <2.0.0'})
208
+ *
209
+ * // Explicit min/max (inclusive)
210
+ * new Schema('string').validator({$semver: {min: '1.0.0', max: '2.0.0'}})
211
+ * ```
212
+ *
213
+ * @type {import("../../value-processor/value-processor.js").ValueProcessorDefinition}
214
+ */
215
+ export const SEMVER_CONSTRAINT = {
216
+ keyword: 'semver',
217
+
218
+ parameters: [
219
+ { parameter: 'in', default: undefined, type: 'string' },
220
+ { parameter: 'min', default: undefined, type: 'string' },
221
+ { parameter: 'max', default: undefined, type: 'string' },
222
+ ],
223
+
224
+ process: (value, _target, _location, options) => {
225
+ const parsed = SEMVER_REGEX.exec(value);
226
+ if (!parsed) {
227
+ throw new ConstraintError('Invalid semver');
228
+ }
229
+
230
+ const { in: inRange, min, max } = options?.args ?? {};
231
+
232
+ if (inRange !== undefined && (min !== undefined || max !== undefined)) {
233
+ throw new ResolverError('$semver: "in" and "min"/"max" are mutually exclusive');
234
+ }
235
+
236
+ const ver = {
237
+ major: Number(parsed[1]),
238
+ minor: Number(parsed[2]),
239
+ patch: Number(parsed[3]),
240
+ prerelease: parsed[4] ? parsed[4].split('.') : [],
241
+ build: parsed[5] ? parsed[5].split('.') : [],
242
+ };
243
+
244
+ if (inRange !== undefined) {
245
+ const predicate = parseRange(inRange);
246
+ if (!predicate(ver)) {
247
+ throw new ConstraintError(`Version not in range "${inRange}"`);
248
+ }
249
+ }
250
+
251
+ if (min !== undefined) {
252
+ if (compareSemVer(ver, parseSemVer(min)) < 0) {
253
+ throw new ConstraintError(`Version below minimum ${min}`);
254
+ }
255
+ }
256
+ if (max !== undefined) {
257
+ if (compareSemVer(ver, parseSemVer(max)) > 0) {
258
+ throw new ConstraintError(`Version above maximum ${max}`);
259
+ }
260
+ }
261
+
262
+ return value;
263
+ },
264
+
265
+ describe: (args) => {
266
+ if (!args) return undefined;
267
+
268
+ const inProcessor = (Array.isArray(args) ? args[0] : args.in);
269
+ const minProcessor = (Array.isArray(args) ? args[1] : args.min);
270
+ const maxProcessor = (Array.isArray(args) ? args[2] : args.max);
271
+
272
+ const inVal = inProcessor?.description;
273
+ const min = minProcessor?.description;
274
+ const max = maxProcessor?.description;
275
+
276
+ if (inVal !== undefined) return `in ${inVal}`;
277
+ if (min !== undefined && max !== undefined) return `${min}–${max}`;
278
+ if (min !== undefined) return `≥${min}`;
279
+ if (max !== undefined) return `≤${max}`;
280
+ return undefined;
281
+ }
282
+ };