@clementine-solutions/jane-io 1.0.0 → 1.0.2

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 (408) hide show
  1. package/README.md +132 -1
  2. package/dist/core/analysis/diff.d.ts +35 -0
  3. package/dist/core/analysis/diff.js +88 -0
  4. package/dist/core/analysis/explain.d.ts +35 -0
  5. package/dist/core/analysis/explain.js +117 -0
  6. package/dist/core/analysis/index.d.ts +14 -0
  7. package/dist/core/analysis/index.js +26 -0
  8. package/dist/core/analysis/replay.d.ts +34 -0
  9. package/dist/core/analysis/replay.js +68 -0
  10. package/dist/core/analysis/telemetry.d.ts +28 -0
  11. package/dist/core/analysis/telemetry.js +123 -0
  12. package/dist/core/boundary-rules/at-most-one.d.ts +17 -0
  13. package/dist/core/boundary-rules/at-most-one.js +38 -0
  14. package/dist/core/boundary-rules/conditionally-required.d.ts +18 -0
  15. package/dist/core/boundary-rules/conditionally-required.js +44 -0
  16. package/dist/core/boundary-rules/date-range.d.ts +17 -0
  17. package/dist/core/boundary-rules/date-range.js +39 -0
  18. package/dist/core/boundary-rules/index.d.ts +18 -0
  19. package/dist/core/boundary-rules/index.js +21 -0
  20. package/dist/core/boundary-rules/mutually-exclusive.d.ts +16 -0
  21. package/dist/core/boundary-rules/mutually-exclusive.js +38 -0
  22. package/dist/core/boundary-rules/no-unknown-fields.d.ts +17 -0
  23. package/dist/core/boundary-rules/no-unknown-fields.js +39 -0
  24. package/dist/core/boundary-rules/require-all.d.ts +16 -0
  25. package/dist/core/boundary-rules/require-all.js +39 -0
  26. package/dist/core/boundary-rules/require-one.d.ts +17 -0
  27. package/dist/core/boundary-rules/require-one.js +41 -0
  28. package/dist/core/common/events.d.ts +37 -0
  29. package/dist/core/common/events.js +82 -0
  30. package/dist/core/common/fluent.d.ts +151 -0
  31. package/dist/core/common/fluent.js +429 -0
  32. package/dist/core/common/index.d.ts +16 -0
  33. package/dist/core/common/index.js +31 -0
  34. package/dist/core/common/policy.d.ts +170 -0
  35. package/dist/core/common/policy.js +550 -0
  36. package/dist/core/common/utilities.d.ts +59 -0
  37. package/dist/core/common/utilities.js +177 -0
  38. package/dist/core/common/wildcard.d.ts +27 -0
  39. package/dist/core/common/wildcard.js +63 -0
  40. package/dist/core/field-path/construct.d.ts +77 -0
  41. package/dist/core/field-path/construct.js +189 -0
  42. package/dist/core/field-path/format.d.ts +41 -0
  43. package/dist/core/field-path/format.js +154 -0
  44. package/dist/core/field-path/index.d.ts +14 -0
  45. package/dist/core/field-path/index.js +26 -0
  46. package/dist/core/field-path/utilities.d.ts +85 -0
  47. package/dist/core/field-path/utilities.js +138 -0
  48. package/dist/core/field-path/walk.d.ts +36 -0
  49. package/dist/core/field-path/walk.js +80 -0
  50. package/dist/core/fluent-registry.d.ts +138 -0
  51. package/dist/core/fluent-registry.js +151 -0
  52. package/dist/core/normalizers/array/compact-sparse-array.d.ts +22 -0
  53. package/dist/core/normalizers/array/compact-sparse-array.js +40 -0
  54. package/dist/core/normalizers/array/flatten-one-level.d.ts +17 -0
  55. package/dist/core/normalizers/array/flatten-one-level.js +45 -0
  56. package/dist/core/normalizers/array/remove-empty-string-items.d.ts +6 -0
  57. package/dist/core/normalizers/array/remove-empty-string-items.js +34 -0
  58. package/dist/core/normalizers/array/remove-null-items.d.ts +16 -0
  59. package/dist/core/normalizers/array/remove-null-items.js +34 -0
  60. package/dist/core/normalizers/array/remove-undefined-items.d.ts +16 -0
  61. package/dist/core/normalizers/array/remove-undefined-items.js +34 -0
  62. package/dist/core/normalizers/date/invalid-date-to-undefined.d.ts +17 -0
  63. package/dist/core/normalizers/date/invalid-date-to-undefined.js +35 -0
  64. package/dist/core/normalizers/index.d.ts +28 -0
  65. package/dist/core/normalizers/index.js +46 -0
  66. package/dist/core/normalizers/normalizer-register.d.ts +17 -0
  67. package/dist/core/normalizers/normalizer-register.js +41 -0
  68. package/dist/core/normalizers/number/infinity-to-undefined.d.ts +18 -0
  69. package/dist/core/normalizers/number/infinity-to-undefined.js +35 -0
  70. package/dist/core/normalizers/number/nan-to-undefined.d.ts +17 -0
  71. package/dist/core/normalizers/number/nan-to-undefined.js +34 -0
  72. package/dist/core/normalizers/number/normalize-negative-zero.d.ts +16 -0
  73. package/dist/core/normalizers/number/normalize-negative-zero.js +33 -0
  74. package/dist/core/normalizers/object/remove-empty-array-keys.d.ts +17 -0
  75. package/dist/core/normalizers/object/remove-empty-array-keys.js +38 -0
  76. package/dist/core/normalizers/object/remove-empty-object-keys.d.ts +16 -0
  77. package/dist/core/normalizers/object/remove-empty-object-keys.js +42 -0
  78. package/dist/core/normalizers/object/remove-empty-string-keys.d.ts +16 -0
  79. package/dist/core/normalizers/object/remove-empty-string-keys.js +37 -0
  80. package/dist/core/normalizers/object/remove-null-keys.d.ts +16 -0
  81. package/dist/core/normalizers/object/remove-null-keys.js +37 -0
  82. package/dist/core/normalizers/object/remove-undefined-keys.d.ts +16 -0
  83. package/dist/core/normalizers/object/remove-undefined-keys.js +37 -0
  84. package/dist/core/normalizers/string/collapse-whitespace.d.ts +17 -0
  85. package/dist/core/normalizers/string/collapse-whitespace.js +35 -0
  86. package/dist/core/normalizers/string/empty-to-undefined.d.ts +16 -0
  87. package/dist/core/normalizers/string/empty-to-undefined.js +33 -0
  88. package/dist/core/normalizers/string/trim.d.ts +16 -0
  89. package/dist/core/normalizers/string/trim.js +34 -0
  90. package/dist/core/parsers/index.d.ts +22 -0
  91. package/dist/core/parsers/index.js +43 -0
  92. package/dist/core/parsers/parse-array-string.d.ts +16 -0
  93. package/dist/core/parsers/parse-array-string.js +36 -0
  94. package/dist/core/parsers/parse-bigint-string.d.ts +16 -0
  95. package/dist/core/parsers/parse-bigint-string.js +33 -0
  96. package/dist/core/parsers/parse-binary-string.d.ts +16 -0
  97. package/dist/core/parsers/parse-binary-string.js +33 -0
  98. package/dist/core/parsers/parse-boolean-string.d.ts +16 -0
  99. package/dist/core/parsers/parse-boolean-string.js +27 -0
  100. package/dist/core/parsers/parse-date-string.d.ts +16 -0
  101. package/dist/core/parsers/parse-date-string.js +30 -0
  102. package/dist/core/parsers/parse-duration-string.d.ts +16 -0
  103. package/dist/core/parsers/parse-duration-string.js +37 -0
  104. package/dist/core/parsers/parse-hex-string.d.ts +16 -0
  105. package/dist/core/parsers/parse-hex-string.js +29 -0
  106. package/dist/core/parsers/parse-integer-string.d.ts +16 -0
  107. package/dist/core/parsers/parse-integer-string.js +30 -0
  108. package/dist/core/parsers/parse-json-string.d.ts +17 -0
  109. package/dist/core/parsers/parse-json-string.js +35 -0
  110. package/dist/core/parsers/parse-numeric-string.d.ts +16 -0
  111. package/dist/core/parsers/parse-numeric-string.js +29 -0
  112. package/dist/core/parsers/parse-object-string.d.ts +16 -0
  113. package/dist/core/parsers/parse-object-string.js +36 -0
  114. package/dist/core/parsers/parse-octal-string.d.ts +16 -0
  115. package/dist/core/parsers/parse-octal-string.js +33 -0
  116. package/dist/core/parsers/parse-scientific-notation-string.d.ts +16 -0
  117. package/dist/core/parsers/parse-scientific-notation-string.js +30 -0
  118. package/dist/core/parsers/parse-url-string.d.ts +16 -0
  119. package/dist/core/parsers/parse-url-string.js +36 -0
  120. package/dist/core/pipeline/boundary.d.ts +36 -0
  121. package/dist/core/pipeline/boundary.js +256 -0
  122. package/dist/core/pipeline/contain.d.ts +122 -0
  123. package/dist/core/pipeline/contain.js +339 -0
  124. package/dist/core/pipeline/index.d.ts +16 -0
  125. package/dist/core/pipeline/index.js +37 -0
  126. package/dist/core/pipeline/normalize.d.ts +34 -0
  127. package/dist/core/pipeline/normalize.js +76 -0
  128. package/dist/core/pipeline/parse.d.ts +40 -0
  129. package/dist/core/pipeline/parse.js +91 -0
  130. package/dist/core/pipeline/pipeline.d.ts +23 -0
  131. package/dist/core/pipeline/pipeline.js +418 -0
  132. package/dist/core/pipeline/scan.d.ts +46 -0
  133. package/dist/core/pipeline/scan.js +115 -0
  134. package/dist/core/pipeline/validate.d.ts +40 -0
  135. package/dist/core/pipeline/validate.js +74 -0
  136. package/dist/core/scanners/any/scan-for-sentinels.d.ts +19 -0
  137. package/dist/core/scanners/any/scan-for-sentinels.js +35 -0
  138. package/dist/core/scanners/array/array-is-deep.d.ts +19 -0
  139. package/dist/core/scanners/array/array-is-deep.js +38 -0
  140. package/dist/core/scanners/array/array-is-heterogenous.d.ts +18 -0
  141. package/dist/core/scanners/array/array-is-heterogenous.js +39 -0
  142. package/dist/core/scanners/array/array-is-large.d.ts +19 -0
  143. package/dist/core/scanners/array/array-is-large.js +32 -0
  144. package/dist/core/scanners/bigint/bigint-is-large.d.ts +20 -0
  145. package/dist/core/scanners/bigint/bigint-is-large.js +34 -0
  146. package/dist/core/scanners/bigint/bigint-not-safe.d.ts +20 -0
  147. package/dist/core/scanners/bigint/bigint-not-safe.js +34 -0
  148. package/dist/core/scanners/date/date-is-before-epoch.d.ts +19 -0
  149. package/dist/core/scanners/date/date-is-before-epoch.js +32 -0
  150. package/dist/core/scanners/date/date-is-far-future.d.ts +19 -0
  151. package/dist/core/scanners/date/date-is-far-future.js +32 -0
  152. package/dist/core/scanners/date/date-is-invalid.d.ts +19 -0
  153. package/dist/core/scanners/date/date-is-invalid.js +31 -0
  154. package/dist/core/scanners/index.d.ts +31 -0
  155. package/dist/core/scanners/index.js +58 -0
  156. package/dist/core/scanners/number/number-is-infinite.d.ts +19 -0
  157. package/dist/core/scanners/number/number-is-infinite.js +31 -0
  158. package/dist/core/scanners/number/number-is-nan.d.ts +19 -0
  159. package/dist/core/scanners/number/number-is-nan.js +31 -0
  160. package/dist/core/scanners/number/number-is-too-large.d.ts +20 -0
  161. package/dist/core/scanners/number/number-is-too-large.js +33 -0
  162. package/dist/core/scanners/number/number-is-unsafe-integer.d.ts +19 -0
  163. package/dist/core/scanners/number/number-is-unsafe-integer.js +31 -0
  164. package/dist/core/scanners/object/object-has-circular-references.d.ts +20 -0
  165. package/dist/core/scanners/object/object-has-circular-references.js +43 -0
  166. package/dist/core/scanners/object/object-has-many-keys.d.ts +19 -0
  167. package/dist/core/scanners/object/object-has-many-keys.js +33 -0
  168. package/dist/core/scanners/object/object-is-deep.d.ts +20 -0
  169. package/dist/core/scanners/object/object-is-deep.js +38 -0
  170. package/dist/core/scanners/scanner-registry.d.ts +19 -0
  171. package/dist/core/scanners/scanner-registry.js +36 -0
  172. package/dist/core/scanners/string/string-has-unsafe-unicode.d.ts +19 -0
  173. package/dist/core/scanners/string/string-has-unsafe-unicode.js +32 -0
  174. package/dist/core/scanners/string/string-has-whitespace-edges.d.ts +19 -0
  175. package/dist/core/scanners/string/string-has-whitespace-edges.js +31 -0
  176. package/dist/core/scanners/string/string-is-long.d.ts +19 -0
  177. package/dist/core/scanners/string/string-is-long.js +32 -0
  178. package/dist/core/scanners/unknown/unknown-not-scannable.d.ts +21 -0
  179. package/dist/core/scanners/unknown/unknown-not-scannable.js +34 -0
  180. package/dist/core/shapes/analysis.d.ts +239 -0
  181. package/dist/core/shapes/analysis.js +11 -0
  182. package/dist/core/shapes/boundary.d.ts +126 -0
  183. package/dist/core/shapes/boundary.js +11 -0
  184. package/dist/core/shapes/events.d.ts +83 -0
  185. package/dist/core/shapes/events.js +10 -0
  186. package/dist/core/shapes/field-path.d.ts +51 -0
  187. package/dist/core/shapes/field-path.js +10 -0
  188. package/dist/core/shapes/index.d.ts +21 -0
  189. package/dist/core/shapes/index.js +11 -0
  190. package/dist/core/shapes/normalize.d.ts +59 -0
  191. package/dist/core/shapes/normalize.js +11 -0
  192. package/dist/core/shapes/parse.d.ts +75 -0
  193. package/dist/core/shapes/parse.js +11 -0
  194. package/dist/core/shapes/pipeline.d.ts +149 -0
  195. package/dist/core/shapes/pipeline.js +11 -0
  196. package/dist/core/shapes/policy.d.ts +158 -0
  197. package/dist/core/shapes/policy.js +11 -0
  198. package/dist/core/shapes/public.d.ts +92 -0
  199. package/dist/core/shapes/public.js +10 -0
  200. package/dist/core/shapes/scan.d.ts +126 -0
  201. package/dist/core/shapes/scan.js +11 -0
  202. package/dist/core/shapes/validate.d.ts +65 -0
  203. package/dist/core/shapes/validate.js +11 -0
  204. package/dist/core/validators/array/array-max-items.d.ts +25 -0
  205. package/dist/core/validators/array/array-max-items.js +42 -0
  206. package/dist/core/validators/array/array-min-items.d.ts +25 -0
  207. package/dist/core/validators/array/array-min-items.js +42 -0
  208. package/dist/core/validators/array/array.d.ts +22 -0
  209. package/dist/core/validators/array/array.js +34 -0
  210. package/dist/core/validators/array/excludes.d.ts +25 -0
  211. package/dist/core/validators/array/excludes.js +47 -0
  212. package/dist/core/validators/array/has-unique-items.d.ts +24 -0
  213. package/dist/core/validators/array/has-unique-items.js +46 -0
  214. package/dist/core/validators/array/includes.d.ts +24 -0
  215. package/dist/core/validators/array/includes.js +46 -0
  216. package/dist/core/validators/array/items-equal.d.ts +25 -0
  217. package/dist/core/validators/array/items-equal.js +42 -0
  218. package/dist/core/validators/array/no-empty-string-items.d.ts +24 -0
  219. package/dist/core/validators/array/no-empty-string-items.js +46 -0
  220. package/dist/core/validators/array/no-null-items.d.ts +24 -0
  221. package/dist/core/validators/array/no-null-items.js +46 -0
  222. package/dist/core/validators/array/no-undefined-items.d.ts +24 -0
  223. package/dist/core/validators/array/no-undefined-items.js +45 -0
  224. package/dist/core/validators/array/non-empty-array.d.ts +24 -0
  225. package/dist/core/validators/array/non-empty-array.js +45 -0
  226. package/dist/core/validators/array/not-sparse.d.ts +25 -0
  227. package/dist/core/validators/array/not-sparse.js +44 -0
  228. package/dist/core/validators/bigint/bigint-equals.d.ts +24 -0
  229. package/dist/core/validators/bigint/bigint-equals.js +57 -0
  230. package/dist/core/validators/bigint/bigint-max.d.ts +25 -0
  231. package/dist/core/validators/bigint/bigint-max.js +63 -0
  232. package/dist/core/validators/bigint/bigint-min.d.ts +25 -0
  233. package/dist/core/validators/bigint/bigint-min.js +87 -0
  234. package/dist/core/validators/bigint/bigint-negative.d.ts +23 -0
  235. package/dist/core/validators/bigint/bigint-negative.js +73 -0
  236. package/dist/core/validators/bigint/bigint-non-negative.d.ts +24 -0
  237. package/dist/core/validators/bigint/bigint-non-negative.js +72 -0
  238. package/dist/core/validators/bigint/bigint-non-positive.d.ts +24 -0
  239. package/dist/core/validators/bigint/bigint-non-positive.js +72 -0
  240. package/dist/core/validators/bigint/bigint-positive.d.ts +24 -0
  241. package/dist/core/validators/bigint/bigint-positive.js +72 -0
  242. package/dist/core/validators/bigint/bigint-safe.d.ts +25 -0
  243. package/dist/core/validators/bigint/bigint-safe.js +75 -0
  244. package/dist/core/validators/bigint/bigint.d.ts +20 -0
  245. package/dist/core/validators/bigint/bigint.js +38 -0
  246. package/dist/core/validators/boolean/boolean.d.ts +21 -0
  247. package/dist/core/validators/boolean/boolean.js +39 -0
  248. package/dist/core/validators/boolean/is-false.d.ts +22 -0
  249. package/dist/core/validators/boolean/is-false.js +48 -0
  250. package/dist/core/validators/boolean/is-true.d.ts +22 -0
  251. package/dist/core/validators/boolean/is-true.js +48 -0
  252. package/dist/core/validators/common/is-country-code.d.ts +17 -0
  253. package/dist/core/validators/common/is-country-code.js +36 -0
  254. package/dist/core/validators/common/is-currency-code.d.ts +17 -0
  255. package/dist/core/validators/common/is-currency-code.js +36 -0
  256. package/dist/core/validators/common/is-email-strict.d.ts +17 -0
  257. package/dist/core/validators/common/is-email-strict.js +36 -0
  258. package/dist/core/validators/common/is-email.d.ts +17 -0
  259. package/dist/core/validators/common/is-email.js +36 -0
  260. package/dist/core/validators/common/is-ip.d.ts +17 -0
  261. package/dist/core/validators/common/is-ip.js +37 -0
  262. package/dist/core/validators/common/is-phone-strict.d.ts +17 -0
  263. package/dist/core/validators/common/is-phone-strict.js +36 -0
  264. package/dist/core/validators/common/is-phone.d.ts +17 -0
  265. package/dist/core/validators/common/is-phone.js +36 -0
  266. package/dist/core/validators/common/is-port.d.ts +17 -0
  267. package/dist/core/validators/common/is-port.js +35 -0
  268. package/dist/core/validators/common/is-postal-code.d.ts +17 -0
  269. package/dist/core/validators/common/is-postal-code.js +36 -0
  270. package/dist/core/validators/common/is-url.d.ts +17 -0
  271. package/dist/core/validators/common/is-url.js +38 -0
  272. package/dist/core/validators/common/is-uuid.d.ts +17 -0
  273. package/dist/core/validators/common/is-uuid.js +36 -0
  274. package/dist/core/validators/date/before-epoch.d.ts +28 -0
  275. package/dist/core/validators/date/before-epoch.js +56 -0
  276. package/dist/core/validators/date/date-now-required.d.ts +22 -0
  277. package/dist/core/validators/date/date-now-required.js +48 -0
  278. package/dist/core/validators/date/is-date.d.ts +21 -0
  279. package/dist/core/validators/date/is-date.js +47 -0
  280. package/dist/core/validators/date/is-far-future.d.ts +23 -0
  281. package/dist/core/validators/date/is-far-future.js +46 -0
  282. package/dist/core/validators/date/is-future.d.ts +24 -0
  283. package/dist/core/validators/date/is-future.js +59 -0
  284. package/dist/core/validators/date/is-past.d.ts +24 -0
  285. package/dist/core/validators/date/is-past.js +59 -0
  286. package/dist/core/validators/date/not-after.d.ts +25 -0
  287. package/dist/core/validators/date/not-after.js +66 -0
  288. package/dist/core/validators/date/not-before.d.ts +25 -0
  289. package/dist/core/validators/date/not-before.js +66 -0
  290. package/dist/core/validators/date/same-day.d.ts +25 -0
  291. package/dist/core/validators/date/same-day.js +60 -0
  292. package/dist/core/validators/date/same-month.d.ts +25 -0
  293. package/dist/core/validators/date/same-month.js +59 -0
  294. package/dist/core/validators/date/same-year.d.ts +24 -0
  295. package/dist/core/validators/date/same-year.js +56 -0
  296. package/dist/core/validators/date/too-early.d.ts +25 -0
  297. package/dist/core/validators/date/too-early.js +57 -0
  298. package/dist/core/validators/date/too-late.d.ts +25 -0
  299. package/dist/core/validators/date/too-late.js +57 -0
  300. package/dist/core/validators/date/weekday.d.ts +32 -0
  301. package/dist/core/validators/date/weekday.js +65 -0
  302. package/dist/core/validators/date/weekend.d.ts +27 -0
  303. package/dist/core/validators/date/weekend.js +56 -0
  304. package/dist/core/validators/index.d.ts +112 -0
  305. package/dist/core/validators/index.js +139 -0
  306. package/dist/core/validators/nullish/is-null-or-undefined.d.ts +22 -0
  307. package/dist/core/validators/nullish/is-null-or-undefined.js +40 -0
  308. package/dist/core/validators/nullish/is-null.d.ts +21 -0
  309. package/dist/core/validators/nullish/is-null.js +39 -0
  310. package/dist/core/validators/nullish/is-undefined.d.ts +21 -0
  311. package/dist/core/validators/nullish/is-undefined.js +39 -0
  312. package/dist/core/validators/number/finite.d.ts +22 -0
  313. package/dist/core/validators/number/finite.js +40 -0
  314. package/dist/core/validators/number/integer.d.ts +22 -0
  315. package/dist/core/validators/number/integer.js +40 -0
  316. package/dist/core/validators/number/less-than.d.ts +21 -0
  317. package/dist/core/validators/number/less-than.js +39 -0
  318. package/dist/core/validators/number/max.d.ts +21 -0
  319. package/dist/core/validators/number/max.js +39 -0
  320. package/dist/core/validators/number/min.d.ts +21 -0
  321. package/dist/core/validators/number/min.js +39 -0
  322. package/dist/core/validators/number/more-than.d.ts +21 -0
  323. package/dist/core/validators/number/more-than.js +39 -0
  324. package/dist/core/validators/number/negative.d.ts +20 -0
  325. package/dist/core/validators/number/negative.js +38 -0
  326. package/dist/core/validators/number/non-negative.d.ts +19 -0
  327. package/dist/core/validators/number/non-negative.js +37 -0
  328. package/dist/core/validators/number/non-positive.d.ts +19 -0
  329. package/dist/core/validators/number/non-positive.js +37 -0
  330. package/dist/core/validators/number/number.d.ts +19 -0
  331. package/dist/core/validators/number/number.js +31 -0
  332. package/dist/core/validators/number/positive.d.ts +20 -0
  333. package/dist/core/validators/number/positive.js +38 -0
  334. package/dist/core/validators/number/safe-integer.d.ts +19 -0
  335. package/dist/core/validators/number/safe-integer.js +42 -0
  336. package/dist/core/validators/object/deep-equals.d.ts +24 -0
  337. package/dist/core/validators/object/deep-equals.js +47 -0
  338. package/dist/core/validators/object/has-key.d.ts +23 -0
  339. package/dist/core/validators/object/has-key.js +42 -0
  340. package/dist/core/validators/object/has-value.d.ts +27 -0
  341. package/dist/core/validators/object/has-value.js +59 -0
  342. package/dist/core/validators/object/keys-equal.d.ts +26 -0
  343. package/dist/core/validators/object/keys-equal.js +47 -0
  344. package/dist/core/validators/object/max-keys.d.ts +24 -0
  345. package/dist/core/validators/object/max-keys.js +43 -0
  346. package/dist/core/validators/object/min-keys.d.ts +24 -0
  347. package/dist/core/validators/object/min-keys.js +43 -0
  348. package/dist/core/validators/object/missing-key.d.ts +23 -0
  349. package/dist/core/validators/object/missing-key.js +42 -0
  350. package/dist/core/validators/object/no-empty-array-values.d.ts +23 -0
  351. package/dist/core/validators/object/no-empty-array-values.js +44 -0
  352. package/dist/core/validators/object/no-empty-object-values.d.ts +23 -0
  353. package/dist/core/validators/object/no-empty-object-values.js +44 -0
  354. package/dist/core/validators/object/no-null-values.d.ts +23 -0
  355. package/dist/core/validators/object/no-null-values.js +44 -0
  356. package/dist/core/validators/object/no-undefined-values.d.ts +23 -0
  357. package/dist/core/validators/object/no-undefined-values.js +44 -0
  358. package/dist/core/validators/object/non-empty-object.d.ts +21 -0
  359. package/dist/core/validators/object/non-empty-object.js +40 -0
  360. package/dist/core/validators/object/only-keys.d.ts +23 -0
  361. package/dist/core/validators/object/only-keys.js +43 -0
  362. package/dist/core/validators/object/plain-object.d.ts +22 -0
  363. package/dist/core/validators/object/plain-object.js +35 -0
  364. package/dist/core/validators/string/alpha-num.d.ts +23 -0
  365. package/dist/core/validators/string/alpha-num.js +50 -0
  366. package/dist/core/validators/string/alpha.d.ts +24 -0
  367. package/dist/core/validators/string/alpha.js +51 -0
  368. package/dist/core/validators/string/chars-equal.d.ts +23 -0
  369. package/dist/core/validators/string/chars-equal.js +49 -0
  370. package/dist/core/validators/string/ends-with.d.ts +23 -0
  371. package/dist/core/validators/string/ends-with.js +50 -0
  372. package/dist/core/validators/string/is-ascii.d.ts +24 -0
  373. package/dist/core/validators/string/is-ascii.js +53 -0
  374. package/dist/core/validators/string/is-printable.d.ts +25 -0
  375. package/dist/core/validators/string/is-printable.js +53 -0
  376. package/dist/core/validators/string/matches.d.ts +23 -0
  377. package/dist/core/validators/string/matches.js +50 -0
  378. package/dist/core/validators/string/max-length.d.ts +24 -0
  379. package/dist/core/validators/string/max-length.js +50 -0
  380. package/dist/core/validators/string/min-length.d.ts +24 -0
  381. package/dist/core/validators/string/min-length.js +50 -0
  382. package/dist/core/validators/string/no-lead-space.d.ts +23 -0
  383. package/dist/core/validators/string/no-lead-space.js +50 -0
  384. package/dist/core/validators/string/no-repeat-space.d.ts +25 -0
  385. package/dist/core/validators/string/no-repeat-space.js +52 -0
  386. package/dist/core/validators/string/no-space.d.ts +24 -0
  387. package/dist/core/validators/string/no-space.js +51 -0
  388. package/dist/core/validators/string/no-trail-space.d.ts +23 -0
  389. package/dist/core/validators/string/no-trail-space.js +50 -0
  390. package/dist/core/validators/string/non-empty.d.ts +22 -0
  391. package/dist/core/validators/string/non-empty.js +48 -0
  392. package/dist/core/validators/string/not-one-of.d.ts +24 -0
  393. package/dist/core/validators/string/not-one-of.js +51 -0
  394. package/dist/core/validators/string/num-string.d.ts +23 -0
  395. package/dist/core/validators/string/num-string.js +50 -0
  396. package/dist/core/validators/string/one-of.d.ts +23 -0
  397. package/dist/core/validators/string/one-of.js +50 -0
  398. package/dist/core/validators/string/starts-with.d.ts +23 -0
  399. package/dist/core/validators/string/starts-with.js +50 -0
  400. package/dist/core/validators/string/string.d.ts +21 -0
  401. package/dist/core/validators/string/string.js +39 -0
  402. package/dist/core/validators/string/trimmed.d.ts +24 -0
  403. package/dist/core/validators/string/trimmed.js +51 -0
  404. package/dist/index.d.ts +83 -0
  405. package/dist/index.js +26 -0
  406. package/dist/test.d.ts +1 -0
  407. package/dist/test.js +12 -0
  408. package/package.json +2 -2
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Positive
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that the value is a positive number.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ import type { ValidationRule } from '../../shapes';
11
+ /**
12
+ * Validate that the value is a positive number.
13
+ *
14
+ * This rule accepts only JavaScript numbers. Non-number values and NaN are rejected.
15
+ * If the value is numeric but not strictly greater than zero, a number.not.positive
16
+ * event is emitted.
17
+ *
18
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
19
+ */
20
+ export declare const positive: ValidationRule;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Positive
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that the value is a positive number.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ import { validationEvent } from '../../pipeline';
11
+ import { detectStructuralType } from '../../pipeline/scan';
12
+ import { safeStringify } from '../../common';
13
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
14
+ |* Implementation *|
15
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
16
+ /**
17
+ * Validate that the value is a positive number.
18
+ *
19
+ * This rule accepts only JavaScript numbers. Non-number values and NaN are rejected.
20
+ * If the value is numeric but not strictly greater than zero, a number.not.positive
21
+ * event is emitted.
22
+ *
23
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
24
+ */
25
+ export const positive = async (value, path) => {
26
+ const structuralType = detectStructuralType(value);
27
+ if (typeof value !== 'number' || Number.isNaN(value)) {
28
+ return [
29
+ validationEvent('error', 'type.not.valid', path, `Expected 'number' but received '${structuralType}'.`, `Please enter a valid number.`, { expected: 'number', actual: structuralType }),
30
+ ];
31
+ }
32
+ if (!(value > 0)) {
33
+ return [
34
+ validationEvent('error', 'number.not.positive', path, `${safeStringify(value)} must be > 0.`, `Please enter a positive number.`, { expected: `> 0`, actual: value }),
35
+ ];
36
+ }
37
+ return [];
38
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Safe Integer
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validates that a value is a safe integer.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ import type { ValidationRule } from '../../shapes';
11
+ /**
12
+ * Validates that a value is a safe integer.
13
+ *
14
+ * Safe integers must be whole numbers that fall within JavaScript’s
15
+ * IEEE‑754 safe range. This protects downstream logic from precision loss,
16
+ * overflow‑adjacent behavior, and malformed numeric input that appears valid
17
+ * but cannot be represented exactly.
18
+ */
19
+ export declare const safeInteger: ValidationRule;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Safe Integer
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validates that a value is a safe integer.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ import { validationEvent } from '../../pipeline';
11
+ import { detectStructuralType } from '../../pipeline/scan';
12
+ import { safeStringify } from '../../common';
13
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
14
+ |* Implementation *|
15
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
16
+ /**
17
+ * Validates that a value is a safe integer.
18
+ *
19
+ * Safe integers must be whole numbers that fall within JavaScript’s
20
+ * IEEE‑754 safe range. This protects downstream logic from precision loss,
21
+ * overflow‑adjacent behavior, and malformed numeric input that appears valid
22
+ * but cannot be represented exactly.
23
+ */
24
+ export const safeInteger = async (value, path) => {
25
+ const type = detectStructuralType(value);
26
+ if (typeof value !== 'number') {
27
+ return [
28
+ validationEvent('error', 'type.not.valid', path, `Expected 'number' but received '${type}'.`, `Please enter a valid number.`, { value, expected: 'number', actual: type }),
29
+ ];
30
+ }
31
+ if (!Number.isInteger(value)) {
32
+ return [
33
+ validationEvent('error', 'number.not.integer', path, `${safeStringify(value)} must be an integer.`, `Please enter a whole number.`, { value, expected: 'integer', actual: value }),
34
+ ];
35
+ }
36
+ if (!Number.isSafeInteger(value)) {
37
+ return [
38
+ validationEvent('error', 'number.not.safe-integer', path, `${safeStringify(value)} must be a safe integer.`, `Please enter a whole number within safe bounds.`, { value, expected: 'safe integer', actual: value }),
39
+ ];
40
+ }
41
+ return [];
42
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Deep Equals
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a value is deeply equal to an expected
7
+ * structural value.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a value is deeply equal to an expected structural value.
14
+ *
15
+ * Deep equality is performed against JSON-compatible values only:
16
+ * - primitives
17
+ * - arrays
18
+ * - plain objects (no class instances, Maps, Sets, Dates, etc.)
19
+ *
20
+ * If the value is not structural, an object.not.plain-object event is emitted.
21
+ * If the value is structural but not deeply equal, an object.not.deeply-equal event is emitted.
22
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
23
+ */
24
+ export declare const deepEquals: (expected: unknown) => ValidationRule;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Deep Equals
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a value is deeply equal to an expected
7
+ * structural value.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { deepEqual, isPlainObject } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a value is deeply equal to an expected structural value.
19
+ *
20
+ * Deep equality is performed against JSON-compatible values only:
21
+ * - primitives
22
+ * - arrays
23
+ * - plain objects (no class instances, Maps, Sets, Dates, etc.)
24
+ *
25
+ * If the value is not structural, an object.not.plain-object event is emitted.
26
+ * If the value is structural but not deeply equal, an object.not.deeply-equal event is emitted.
27
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
28
+ */
29
+ export const deepEquals = (expected) => async (value, path) => {
30
+ const structuralType = detectStructuralType(value);
31
+ // Accept primitives, arrays, and plain objects
32
+ const isStructuralValue = value === null ||
33
+ typeof value !== 'object' ||
34
+ Array.isArray(value) ||
35
+ isPlainObject(value);
36
+ if (!isStructuralValue) {
37
+ return [
38
+ validationEvent('error', 'object.not.plain-object', path, `Deep equality requires a structural value, but received '${structuralType}'.`, `Please provide a JSON-compatible value.`, { expected, actual: structuralType }),
39
+ ];
40
+ }
41
+ if (!deepEqual(value, expected)) {
42
+ return [
43
+ validationEvent('error', 'object.not.deeply-equal', path, `Value does not match the expected structure.`, `Please provide the correct value.`, { expected, actual: value }),
44
+ ];
45
+ }
46
+ return [];
47
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Has Key
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains a required own
7
+ * enumerable key.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a plain object contains a required own enumerable key.
14
+ *
15
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
16
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
17
+ *
18
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
19
+ * If the required key is missing, an object.missing-key event is emitted.
20
+ *
21
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
22
+ */
23
+ export declare const hasKey: (requiredKey: string) => ValidationRule;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Has Key
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains a required own
7
+ * enumerable key.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { isPlainObject } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a plain object contains a required own enumerable key.
19
+ *
20
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
21
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
22
+ *
23
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
24
+ * If the required key is missing, an object.missing-key event is emitted.
25
+ *
26
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
27
+ */
28
+ export const hasKey = (requiredKey) => async (value, path) => {
29
+ const structuralType = detectStructuralType(value);
30
+ if (!isPlainObject(value)) {
31
+ return [
32
+ validationEvent('error', 'object.not.plain-object', path, `Expected a plain object but received '${structuralType}'.`, `Please provide a JSON-compatible object.`, { expected: 'plain object', actual: structuralType }),
33
+ ];
34
+ }
35
+ const hasOwnKey = Object.prototype.hasOwnProperty.call(value, requiredKey);
36
+ if (!hasOwnKey) {
37
+ return [
38
+ validationEvent('error', 'object.has.missing-key', path, `Object must contain key '${requiredKey}'.`, `Please include the required key.`, { expected: requiredKey, actual: Object.keys(value) }),
39
+ ];
40
+ }
41
+ return [];
42
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Has Value
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that an array or plain object contains a value
7
+ * deeply equal to the target.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that an array or plain object contains a value deeply equal to the target.
14
+ *
15
+ * This rule accepts only JSON-compatible arrays and plain objects.
16
+ * Primitives, null, class instances, Maps, Sets, Dates, and other non-collection
17
+ * values are rejected.
18
+ *
19
+ * Arrays are searched using deep equality on each element.
20
+ * Objects are searched using deep equality on each own enumerable value.
21
+ *
22
+ * If the value is not a collection, an object.not.collection event is emitted.
23
+ * If the target value is not found, a value.not.found event is emitted.
24
+ *
25
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
26
+ */
27
+ export declare const hasValue: (target: unknown) => ValidationRule;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Has Value
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that an array or plain object contains a value
7
+ * deeply equal to the target.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { deepEqual, isPlainObject, safeStringify } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that an array or plain object contains a value deeply equal to the target.
19
+ *
20
+ * This rule accepts only JSON-compatible arrays and plain objects.
21
+ * Primitives, null, class instances, Maps, Sets, Dates, and other non-collection
22
+ * values are rejected.
23
+ *
24
+ * Arrays are searched using deep equality on each element.
25
+ * Objects are searched using deep equality on each own enumerable value.
26
+ *
27
+ * If the value is not a collection, an object.not.collection event is emitted.
28
+ * If the target value is not found, a value.not.found event is emitted.
29
+ *
30
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
31
+ */
32
+ export const hasValue = (target) => async (value, path) => {
33
+ const structuralType = detectStructuralType(value);
34
+ const isArray = structuralType === 'array';
35
+ const isPlainObjectValue = structuralType === 'object' && isPlainObject(value);
36
+ if (!isArray && !isPlainObjectValue) {
37
+ return [
38
+ validationEvent('error', 'object.has.missing-value', path, `Expected array or plain object but received '${structuralType}'.`, `Please provide a collection value.`, { expected: 'array | plain object', actual: structuralType }),
39
+ ];
40
+ }
41
+ const found = deepContainsValue(value, target);
42
+ if (!found) {
43
+ return [
44
+ validationEvent('error', 'value.not.found', path, `Value does not contain ${safeStringify(target)}.`, `Please include the required value.`, { expected: target, actual: value }),
45
+ ];
46
+ }
47
+ return [];
48
+ };
49
+ function deepContainsValue(container, target) {
50
+ if (deepEqual(container, target))
51
+ return true;
52
+ if (Array.isArray(container)) {
53
+ return container.some((item) => deepContainsValue(item, target));
54
+ }
55
+ if (isPlainObject(container)) {
56
+ return Object.values(container).some((item) => deepContainsValue(item, target));
57
+ }
58
+ return false;
59
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Keys Equal
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains exactly the expected
7
+ * set of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a plain object contains exactly the expected set of keys.
14
+ *
15
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
16
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
17
+ *
18
+ * The object must contain the same number of keys and the same key names as expectedKeys.
19
+ * Order does not matter. Keys must match exactly.
20
+ *
21
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
22
+ * If the key set does not match, an object.invalid-keys event is emitted.
23
+ *
24
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
25
+ */
26
+ export declare const keysEqual: (expectedKeys: readonly string[]) => ValidationRule;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Keys Equal
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains exactly the expected
7
+ * set of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { isPlainObject } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a plain object contains exactly the expected set of keys.
19
+ *
20
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
21
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
22
+ *
23
+ * The object must contain the same number of keys and the same key names as expectedKeys.
24
+ * Order does not matter. Keys must match exactly.
25
+ *
26
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
27
+ * If the key set does not match, an object.invalid-keys event is emitted.
28
+ *
29
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
30
+ */
31
+ export const keysEqual = (expectedKeys) => async (value, path) => {
32
+ const structuralType = detectStructuralType(value);
33
+ if (!isPlainObject(value)) {
34
+ return [
35
+ validationEvent('error', 'object.not.plain-object', path, `Expected a plain object but received '${structuralType}'.`, `Please provide a JSON-compatible object.`, { expected: 'plain object', actual: structuralType }),
36
+ ];
37
+ }
38
+ const actualKeys = Object.keys(value);
39
+ const sameLength = actualKeys.length === expectedKeys.length;
40
+ const sameMembers = sameLength && expectedKeys.every((key) => actualKeys.includes(key));
41
+ if (!sameMembers) {
42
+ return [
43
+ validationEvent('error', 'object.has.invalid-key', path, `Object keys must match exactly: ${expectedKeys.join(', ')}.`, `Please provide the correct set of keys.`, { expected: expectedKeys, actual: actualKeys }),
44
+ ];
45
+ }
46
+ return [];
47
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Maximum Keys (Max Keys)
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains no more than a
7
+ * specified number of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a plain object contains no more than a specified number of keys.
14
+ *
15
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
16
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
17
+ *
18
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
19
+ * If the object contains more than the allowed number of keys, an object.too.many-keys
20
+ * event is emitted.
21
+ *
22
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
23
+ */
24
+ export declare const maxKeys: (maximum: number) => ValidationRule;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Maximum Keys (Max Keys)
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains no more than a
7
+ * specified number of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { isPlainObject } from '../../common';
13
+ import { detectStructuralType } from '../../pipeline/scan';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a plain object contains no more than a specified number of keys.
19
+ *
20
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
21
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
22
+ *
23
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
24
+ * If the object contains more than the allowed number of keys, an object.too.many-keys
25
+ * event is emitted.
26
+ *
27
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
28
+ */
29
+ export const maxKeys = (maximum) => async (value, path) => {
30
+ const structuralType = detectStructuralType(value);
31
+ if (!isPlainObject(value)) {
32
+ return [
33
+ validationEvent('error', 'object.not.plain-object', path, `Expected a plain object but received '${structuralType}'.`, `Please provide a JSON-compatible object.`, { expected: 'plain object', actual: structuralType }),
34
+ ];
35
+ }
36
+ const keyCount = Object.keys(value).length;
37
+ if (keyCount > maximum) {
38
+ return [
39
+ validationEvent('error', 'object.too.many-keys', path, `Object has ${keyCount} keys but must have ≤ ${maximum}.`, `Please provide no more than ${maximum} keys.`, { expected: `≤ ${maximum}`, actual: keyCount }),
40
+ ];
41
+ }
42
+ return [];
43
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Minimum Keys (Min Keys)
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains at least a specified
7
+ * number of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a plain object contains at least a specified number of keys.
14
+ *
15
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
16
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
17
+ *
18
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
19
+ * If the object contains fewer than the required number of keys, an object.too.few-keys
20
+ * event is emitted.
21
+ *
22
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
23
+ */
24
+ export declare const minKeys: (minimum: number) => ValidationRule;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Minimum Keys (Min Keys)
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains at least a specified
7
+ * number of keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { isPlainObject } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a plain object contains at least a specified number of keys.
19
+ *
20
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
21
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
22
+ *
23
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
24
+ * If the object contains fewer than the required number of keys, an object.too.few-keys
25
+ * event is emitted.
26
+ *
27
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
28
+ */
29
+ export const minKeys = (minimum) => async (value, path) => {
30
+ const structuralType = detectStructuralType(value);
31
+ if (!isPlainObject(value)) {
32
+ return [
33
+ validationEvent('error', 'object.not.plain-object', path, `Expected a plain object but received '${structuralType}'.`, `Please provide a JSON-compatible object.`, { expected: 'plain object', actual: structuralType }),
34
+ ];
35
+ }
36
+ const keyCount = Object.keys(value).length;
37
+ if (keyCount < minimum) {
38
+ return [
39
+ validationEvent('error', 'object.too.few-keys', path, `Object has ${keyCount} keys but must have ≥ ${minimum}.`, `Please provide at least ${minimum} keys.`, { expected: `≥ ${minimum}`, actual: keyCount }),
40
+ ];
41
+ }
42
+ return [];
43
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Missing Keys
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains all required own
7
+ * enumerable keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ValidationRule } from '../../shapes';
12
+ /**
13
+ * Validate that a plain object contains all required own enumerable keys.
14
+ *
15
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
16
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
17
+ *
18
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
19
+ * If one or more required keys are missing, an object.missing-keys event is emitted.
20
+ *
21
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
22
+ */
23
+ export declare const missingKey: (requiredKeys: readonly string[]) => ValidationRule;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Validators | Missing Keys
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Validate that a plain object contains all required own
7
+ * enumerable keys.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { validationEvent } from '../../pipeline';
12
+ import { detectStructuralType } from '../../pipeline/scan';
13
+ import { isPlainObject } from '../../common';
14
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
15
+ |* Implementation *|
16
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
17
+ /**
18
+ * Validate that a plain object contains all required own enumerable keys.
19
+ *
20
+ * This rule accepts only JSON-compatible plain objects (prototype === Object.prototype).
21
+ * Arrays, null, class instances, Maps, Sets, Dates, and other non-plain objects are rejected.
22
+ *
23
+ * If the value is not a plain object, an object.not.plain-object event is emitted.
24
+ * If one or more required keys are missing, an object.missing-keys event is emitted.
25
+ *
26
+ * The rule is async-compatible and returns a readonly array of JaneEvent objects.
27
+ */
28
+ export const missingKey = (requiredKeys) => async (value, path) => {
29
+ const structuralType = detectStructuralType(value);
30
+ if (!isPlainObject(value)) {
31
+ return [
32
+ validationEvent('error', 'object.not.plain-object', path, `Expected a plain object but received '${structuralType}'.`, `Please provide a JSON-compatible object.`, { expected: 'plain object', actual: structuralType }),
33
+ ];
34
+ }
35
+ const missing = requiredKeys.filter((key) => !Object.prototype.hasOwnProperty.call(value, key));
36
+ if (missing.length > 0) {
37
+ return [
38
+ validationEvent('error', 'object.has.missing-key', path, `Object is missing required keys: ${missing.join(', ')}.`, `Please include all required keys.`, { expected: requiredKeys, actual: Object.keys(value) }),
39
+ ];
40
+ }
41
+ return [];
42
+ };