@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,154 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Format
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Converts FieldPath structures into stable, user‑facing
7
+ * string forms.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { escapeKey, isDangerousKey, isSafeKey, setFieldPath, setIndex, setKey } from '.';
12
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
13
+ |* Array To Field Path *|
14
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
15
+ /**
16
+ * Converts a list of raw parts into a FieldPath.
17
+ *
18
+ * Maps numbers to index segments and strings to key segments, producing a
19
+ * canonical FieldPath suitable for formatting, traversal, or boundary work.
20
+ */
21
+ export function arrayToFieldPath(parts) {
22
+ return setFieldPath(...parts.map((part) => (typeof part === 'number' ? setIndex(part) : setKey(part))));
23
+ }
24
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
25
+ |* Field Path To Array *|
26
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
27
+ /**
28
+ * Converts a FieldPath into its raw parts.
29
+ *
30
+ * Extracts each segment’s key or index in order, producing a simple array
31
+ * representation suitable for serialization or comparison.
32
+ */
33
+ export function fieldPathToArray(path) {
34
+ return path.segments.map((segment) => (segment.kind === 'index' ? segment.index : segment.key));
35
+ }
36
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
37
+ |* Field Path To User *|
38
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
39
+ /**
40
+ * Converts a FieldPath into a user‑facing string.
41
+ *
42
+ * Uses dotted notation for safe keys and bracket notation for indexes or
43
+ * keys requiring escaping. Produces a stable, readable form for logs,
44
+ * errors, and policy messages.
45
+ */
46
+ export function fieldPathToUser(path) {
47
+ if (path.segments.length === 0)
48
+ return '$';
49
+ let out = '$';
50
+ for (const segment of path.segments) {
51
+ if (segment.kind === 'index') {
52
+ out += `[${segment.index}]`;
53
+ continue;
54
+ }
55
+ const key = segment.key;
56
+ if (isSafeKey(key) && !isDangerousKey(key)) {
57
+ out += `.${key}`;
58
+ }
59
+ else {
60
+ out += `[${escapeKey(key)}]`;
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
66
+ |* User To Field Path *|
67
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
68
+ /**
69
+ * Parses a user‑facing path string into a FieldPath.
70
+ *
71
+ * Supports dotted keys, bracketed indexes, and quoted/escaped keys. Normalizes
72
+ * the "$" root form and walks the string character‑by‑character to build a
73
+ * canonical segment list suitable for traversal and boundary evaluation.
74
+ */
75
+ export function userToFieldPath(user) {
76
+ if (!user || !user.trim() || user === '$') {
77
+ return setFieldPath();
78
+ }
79
+ let u = user;
80
+ if (u.startsWith('$')) {
81
+ u = u.slice(1);
82
+ if (u.startsWith('.')) {
83
+ u = u.slice(1);
84
+ }
85
+ }
86
+ const segments = [];
87
+ let i = 0;
88
+ while (i < u.length) {
89
+ const ch = u[i];
90
+ if (ch === '.') {
91
+ i++;
92
+ let key = '';
93
+ while (i < u.length && /[A-Za-z0-9_$]/.test(u[i])) {
94
+ key += u[i];
95
+ i++;
96
+ }
97
+ if (key.length > 0)
98
+ segments.push(setKey(key));
99
+ continue;
100
+ }
101
+ if (ch === '[') {
102
+ i++;
103
+ if (u[i] === '"') {
104
+ const start = i + 1;
105
+ let j = start;
106
+ while (j < u.length) {
107
+ const c = u[j];
108
+ if (c === '\\') {
109
+ j += 2;
110
+ continue;
111
+ }
112
+ if (c === '"')
113
+ break;
114
+ j++;
115
+ }
116
+ const rawInner = u.slice(start, j);
117
+ let key;
118
+ try {
119
+ key = JSON.parse('"' + rawInner + '"');
120
+ }
121
+ catch {
122
+ key = rawInner;
123
+ }
124
+ i = j + 1;
125
+ if (u[i] === ']')
126
+ i++;
127
+ segments.push(setKey(key));
128
+ continue;
129
+ }
130
+ let num = '';
131
+ while (i < u.length && /[0-9]/.test(u[i])) {
132
+ num += u[i];
133
+ i++;
134
+ }
135
+ if (u[i] === ']')
136
+ i++;
137
+ if (num.length > 0)
138
+ segments.push(setIndex(Number(num)));
139
+ continue;
140
+ }
141
+ if (/[A-Za-z_$]/.test(ch)) {
142
+ let key = '';
143
+ while (i < u.length && /[A-Za-z0-9_$]/.test(u[i])) {
144
+ key += u[i];
145
+ i++;
146
+ }
147
+ if (key.length > 0)
148
+ segments.push(setKey(key));
149
+ continue;
150
+ }
151
+ i++;
152
+ }
153
+ return { segments };
154
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Barrel File
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Re‑exports the Field Path modules to provide a unified
7
+ * public surface.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ export { appendSegment, cloneContainer, clonePath, makeFieldPath, rootPath, setAtPath, setFieldPath, setIndex, setKey, } from './construct';
12
+ export { arrayToFieldPath, fieldPathToArray, fieldPathToUser, userToFieldPath } from './format';
13
+ export { DANGEROUS_KEYS, escapeKey, isDangerousKey, isRoot, isSafeKey, lastSegment, parentPath, pathEquals, pathStartsWith, segmentsEqual, } from './utilities';
14
+ export { walk, walkArray, walkObject } from './walk';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Barrel File
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Re‑exports the Field Path modules to provide a unified
7
+ * public surface.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
12
+ |* Construct *|
13
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
14
+ export { appendSegment, cloneContainer, clonePath, makeFieldPath, rootPath, setAtPath, setFieldPath, setIndex, setKey, } from './construct';
15
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
16
+ |* Format *|
17
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
18
+ export { arrayToFieldPath, fieldPathToArray, fieldPathToUser, userToFieldPath } from './format';
19
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
20
+ |* Utilities *|
21
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
22
+ export { DANGEROUS_KEYS, escapeKey, isDangerousKey, isRoot, isSafeKey, lastSegment, parentPath, pathEquals, pathStartsWith, segmentsEqual, } from './utilities';
23
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
24
+ |* Walk *|
25
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
26
+ export { walk, walkArray, walkObject } from './walk';
@@ -0,0 +1,85 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Utilities
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Small helper functions supporting FieldPath construction,
7
+ * parsing, and formatting.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { FieldPath, FieldPathSegment } from '../shapes';
12
+ /**
13
+ * Keys that must never appear in dotted notation.
14
+ *
15
+ * These properties interact with JavaScript’s prototype chain and are always
16
+ * forced into bracket‑notation to prevent prototype‑pollution vectors in
17
+ * formatting, parsing, and boundary evaluation.
18
+ */
19
+ export declare const DANGEROUS_KEYS: Set<string>;
20
+ /**
21
+ * Escapes a key for bracket notation.
22
+ *
23
+ * Uses JSON string rules to preserve all characters exactly, ensuring keys
24
+ * round‑trip cleanly through user‑facing formatting and parsing.
25
+ */
26
+ export declare function escapeKey(key: string): string;
27
+ /**
28
+ * Checks whether a key is unsafe for dotted notation.
29
+ *
30
+ * Identifies prototype‑chain properties that must always be emitted in
31
+ * bracket‑notation to avoid prototype‑pollution vectors.
32
+ */
33
+ export declare function isDangerousKey(key: string): boolean;
34
+ /**
35
+ * Checks whether a FieldPath refers to the root.
36
+ *
37
+ * A path is the root when it contains no segments, representing the top‑level
38
+ * position in traversal, formatting, and boundary evaluation.
39
+ */
40
+ export declare const isRoot: (path: FieldPath) => boolean;
41
+ /**
42
+ * Checks whether a key is safe for dotted notation.
43
+ *
44
+ * Rejects prototype‑chain properties and ensures the key matches JavaScript
45
+ * identifier rules, allowing it to appear unescaped in user‑facing paths.
46
+ */
47
+ export declare function isSafeKey(key: string): boolean;
48
+ /**
49
+ * Returns the final segment of a FieldPath.
50
+ *
51
+ * Useful when validators, scanners, or boundary logic need to inspect the
52
+ * current traversal position without mutating the path.
53
+ */
54
+ export declare const lastSegment: (path: FieldPath) => FieldPathSegment | undefined;
55
+ /**
56
+ * Returns the parent of a FieldPath.
57
+ *
58
+ * Removes the final segment to move one level up in traversal. Root paths
59
+ * remain stable—slicing an empty path yields another empty path.
60
+ */
61
+ export declare function parentPath(path: FieldPath): FieldPath;
62
+ /**
63
+ * Checks whether two FieldPaths are structurally identical.
64
+ *
65
+ * Paths are equal only when they contain the same number of segments and each
66
+ * corresponding segment matches, ensuring deterministic behavior in diff,
67
+ * explain, and boundary evaluation.
68
+ */
69
+ export declare function pathEquals(a: FieldPath, b: FieldPath): boolean;
70
+ /**
71
+ * Checks whether one FieldPath is a prefix of another.
72
+ *
73
+ * Path **a** starts with **b** when b has no more segments than a and each
74
+ * corresponding segment matches. Used by diff, explain, and boundary logic
75
+ * to determine whether a rule or change applies to a nested position.
76
+ */
77
+ export declare function pathStartsWith(a: FieldPath, b: FieldPath): boolean;
78
+ /**
79
+ * Checks whether two segments are structurally identical.
80
+ *
81
+ * Segments must share the same kind, and their key or index values must
82
+ * match exactly. This is the atomic comparison used by all path‑level
83
+ * equality and prefix checks.
84
+ */
85
+ export declare const segmentsEqual: (a: FieldPathSegment, b: FieldPathSegment) => boolean;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Utilities
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Small helper functions supporting FieldPath construction,
7
+ * parsing, and formatting.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
12
+ |* Dangerous Keys *|
13
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
14
+ /**
15
+ * Keys that must never appear in dotted notation.
16
+ *
17
+ * These properties interact with JavaScript’s prototype chain and are always
18
+ * forced into bracket‑notation to prevent prototype‑pollution vectors in
19
+ * formatting, parsing, and boundary evaluation.
20
+ */
21
+ export const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
22
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
23
+ |* Escape Key *|
24
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
25
+ /**
26
+ * Escapes a key for bracket notation.
27
+ *
28
+ * Uses JSON string rules to preserve all characters exactly, ensuring keys
29
+ * round‑trip cleanly through user‑facing formatting and parsing.
30
+ */
31
+ export function escapeKey(key) {
32
+ return JSON.stringify(key);
33
+ }
34
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
35
+ |* Is Dangerous Key *|
36
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
37
+ /**
38
+ * Checks whether a key is unsafe for dotted notation.
39
+ *
40
+ * Identifies prototype‑chain properties that must always be emitted in
41
+ * bracket‑notation to avoid prototype‑pollution vectors.
42
+ */
43
+ export function isDangerousKey(key) {
44
+ return DANGEROUS_KEYS.has(key);
45
+ }
46
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
47
+ |* Is Root *|
48
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
49
+ /**
50
+ * Checks whether a FieldPath refers to the root.
51
+ *
52
+ * A path is the root when it contains no segments, representing the top‑level
53
+ * position in traversal, formatting, and boundary evaluation.
54
+ */
55
+ export const isRoot = (path) => path.segments.length === 0;
56
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
57
+ |* Is Safe Key *|
58
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
59
+ /**
60
+ * Checks whether a key is safe for dotted notation.
61
+ *
62
+ * Rejects prototype‑chain properties and ensures the key matches JavaScript
63
+ * identifier rules, allowing it to appear unescaped in user‑facing paths.
64
+ */
65
+ export function isSafeKey(key) {
66
+ if (DANGEROUS_KEYS.has(key))
67
+ return false;
68
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);
69
+ }
70
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
71
+ |* Last Segment *|
72
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
73
+ /**
74
+ * Returns the final segment of a FieldPath.
75
+ *
76
+ * Useful when validators, scanners, or boundary logic need to inspect the
77
+ * current traversal position without mutating the path.
78
+ */
79
+ export const lastSegment = (path) => path.segments[path.segments.length - 1];
80
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
81
+ |* Parent Path *|
82
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
83
+ /**
84
+ * Returns the parent of a FieldPath.
85
+ *
86
+ * Removes the final segment to move one level up in traversal. Root paths
87
+ * remain stable—slicing an empty path yields another empty path.
88
+ */
89
+ export function parentPath(path) {
90
+ return { segments: path.segments.slice(0, -1) };
91
+ }
92
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
93
+ |* Path Equals *|
94
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
95
+ /**
96
+ * Checks whether two FieldPaths are structurally identical.
97
+ *
98
+ * Paths are equal only when they contain the same number of segments and each
99
+ * corresponding segment matches, ensuring deterministic behavior in diff,
100
+ * explain, and boundary evaluation.
101
+ */
102
+ export function pathEquals(a, b) {
103
+ if (a.segments.length !== b.segments.length)
104
+ return false;
105
+ return a.segments.every((segment, i) => segmentsEqual(segment, b.segments[i]));
106
+ }
107
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
108
+ |* Path Starts With *|
109
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
110
+ /**
111
+ * Checks whether one FieldPath is a prefix of another.
112
+ *
113
+ * Path **a** starts with **b** when b has no more segments than a and each
114
+ * corresponding segment matches. Used by diff, explain, and boundary logic
115
+ * to determine whether a rule or change applies to a nested position.
116
+ */
117
+ export function pathStartsWith(a, b) {
118
+ if (b.segments.length > a.segments.length)
119
+ return false;
120
+ return b.segments.every((segment, i) => segmentsEqual(segment, a.segments[i]));
121
+ }
122
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
123
+ |* Segments Equal *|
124
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
125
+ /**
126
+ * Checks whether two segments are structurally identical.
127
+ *
128
+ * Segments must share the same kind, and their key or index values must
129
+ * match exactly. This is the atomic comparison used by all path‑level
130
+ * equality and prefix checks.
131
+ */
132
+ export const segmentsEqual = (a, b) => {
133
+ if (a.kind !== b.kind)
134
+ return false;
135
+ return a.kind === 'index'
136
+ ? a.index === b.index
137
+ : a.key === b.key;
138
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Walk
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Traversal helpers that walk JSON‑like data with FieldPath
7
+ * context.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { FieldPath } from '../shapes';
12
+ /**
13
+ * Recursively walks a JSON‑like value with FieldPath context.
14
+ *
15
+ * Visits the current node, then descends into arrays and plain objects,
16
+ * constructing child paths segment‑by‑segment. Prototype‑chain keys are
17
+ * skipped to avoid unsafe traversal during validation, scanning, and
18
+ * boundary evaluation.
19
+ */
20
+ export declare function walk(value: unknown, path: FieldPath, visit: (value: unknown, path: FieldPath) => Promise<void>): Promise<void>;
21
+ /**
22
+ * Visits each element of an array with FieldPath context.
23
+ *
24
+ * Emits a child path for every index and invokes the visitor without
25
+ * descending further. Used internally by higher‑level walkers that
26
+ * control recursion and traversal strategy.
27
+ */
28
+ export declare function walkArray(value: readonly unknown[], path: FieldPath, visit: (child: unknown, childPath: FieldPath) => Promise<void>): Promise<void>;
29
+ /**
30
+ * Visits each own property of an object with FieldPath context.
31
+ *
32
+ * Emits a child path for every safe key and invokes the visitor without
33
+ * descending further. Prototype‑chain keys are skipped to avoid unsafe
34
+ * traversal during validation, scanning, and boundary evaluation.
35
+ */
36
+ export declare function walkObject(value: Record<string, unknown>, path: FieldPath, visit: (child: unknown, childPath: FieldPath) => Promise<void>): Promise<void>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Walk
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Traversal helpers that walk JSON‑like data with FieldPath
7
+ * context.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { appendSegment, setIndex, setKey } from '../field-path';
12
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
13
+ |* Walk *|
14
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
15
+ /**
16
+ * Recursively walks a JSON‑like value with FieldPath context.
17
+ *
18
+ * Visits the current node, then descends into arrays and plain objects,
19
+ * constructing child paths segment‑by‑segment. Prototype‑chain keys are
20
+ * skipped to avoid unsafe traversal during validation, scanning, and
21
+ * boundary evaluation.
22
+ */
23
+ export async function walk(value, path, visit) {
24
+ await visit(value, path);
25
+ if (Array.isArray(value)) {
26
+ for (let i = 0; i < value.length; i++) {
27
+ const child = value[i];
28
+ const childPath = appendSegment(path, setIndex(i));
29
+ await walk(child, childPath, visit);
30
+ }
31
+ return;
32
+ }
33
+ if (value !== null && typeof value === 'object') {
34
+ const record = value;
35
+ for (const key of Object.keys(record)) {
36
+ if (!Object.prototype.hasOwnProperty.call(record, key))
37
+ continue;
38
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
39
+ continue;
40
+ const child = record[key];
41
+ const childPath = appendSegment(path, setKey(key));
42
+ await walk(child, childPath, visit);
43
+ }
44
+ return;
45
+ }
46
+ }
47
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
48
+ |* Walk Array *|
49
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
50
+ /**
51
+ * Visits each element of an array with FieldPath context.
52
+ *
53
+ * Emits a child path for every index and invokes the visitor without
54
+ * descending further. Used internally by higher‑level walkers that
55
+ * control recursion and traversal strategy.
56
+ */
57
+ export async function walkArray(value, path, visit) {
58
+ for (let index = 0; index < value.length; index++) {
59
+ await visit(value[index], appendSegment(path, setIndex(index)));
60
+ }
61
+ }
62
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
63
+ |* Walk Object *|
64
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
65
+ /**
66
+ * Visits each own property of an object with FieldPath context.
67
+ *
68
+ * Emits a child path for every safe key and invokes the visitor without
69
+ * descending further. Prototype‑chain keys are skipped to avoid unsafe
70
+ * traversal during validation, scanning, and boundary evaluation.
71
+ */
72
+ export async function walkObject(value, path, visit) {
73
+ for (const [key, child] of Object.entries(value)) {
74
+ if (!Object.prototype.hasOwnProperty.call(value, key))
75
+ continue;
76
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
77
+ continue;
78
+ await visit(child, appendSegment(path, setKey(key)));
79
+ }
80
+ }