@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
package/README.md CHANGED
@@ -1 +1,132 @@
1
- # Meet Jane
1
+ # Jane IO
2
+
3
+ [![pipeline status](https://gitlab.com/clementine-solution/open-source/jane-io/badges/main/pipeline.svg)](https://gitlab.com/clementine-solution/open-source/jane-io/-/commits/main)
4
+ [![coverage report](https://gitlab.com/clementine-solution/open-source/jane-io/badges/main/coverage.svg)](https://gitlab.com/clementine-solution/open-source/jane-io/-/commits/main)
5
+ [![npm version](https://img.shields.io/npm/v/@clementine-solutions/jane-io.svg)](https://www.npmjs.com/package/@clementine-solutions/jane-io)
6
+ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
7
+
8
+ > A clarity-first boundary system for shaping, validating, and transforming data with full introspection and policy control.
9
+
10
+ Jane IO is a TypeScript-first data validation library that emphasizes **explicit design**, **runtime safety**, and **comprehensive observability**. Unlike traditional validators, Jane treats data processing as a multi-stage pipeline with policy-driven decision making.
11
+
12
+ ## Key Features
13
+
14
+ - **Security-First**: Built-in protection against prototype pollution, circular references, and unsafe Unicode
15
+ - **Type-Safe**: Full TypeScript coverage with immutable, composable APIs
16
+ - **Observable**: Rich telemetry, diff tracking, and audit trails
17
+ - **Configurable**: Policy-driven behavior with multiple validation modes
18
+ - **Performant**: Lazy evaluation and efficient data structures
19
+ - **Extensible**: Plugin architecture for custom validators and parsers
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ npm install @clementine-solutions/jane-io
25
+ ```
26
+
27
+ ```bash
28
+ yarn add @clementine-solutions/jane-io
29
+ ```
30
+
31
+ ```bash
32
+ pnpm add @clementine-solutions/jane-io
33
+ ```
34
+
35
+ ## Quick Start
36
+
37
+ ```typescript
38
+ import { jane } from '@clementine-solutions/jane-io';
39
+
40
+ // Simple validation
41
+ const result = await jane.value("hello@example.com")
42
+ .parse("string")
43
+ .matches(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)
44
+ .run();
45
+
46
+ if (result.ok) {
47
+ console.log("Valid email:", result.value);
48
+ } else {
49
+ console.log("Issues:", result.issues);
50
+ }
51
+ ```
52
+
53
+ ## Documentation
54
+
55
+ - [Getting Started Guide](https://jane-io.com/docs/getting-started/introduction)
56
+ - [Conceptual Overview](https://jane-io.clementine.solutions/concepts/introduction/)
57
+
58
+ ## Use Cases
59
+
60
+ Jane excels at:
61
+
62
+ - **API Data Validation**: Secure processing of external inputs.
63
+ - **Configuration Management**: Structured config validation with audit trails.
64
+ - **Data Transformation Pipelines**: ETL workflows with error tracking.
65
+ - **Form Validation**: Complex multi-field validation scenarios.
66
+ - **Data Import/Export**: Safe handling of structured data.
67
+
68
+ ## Architecture
69
+
70
+ Jane's pipeline processes data through distinct stages:
71
+
72
+ ```mermaid
73
+ graph LR
74
+ A[Raw Input] --> B[Contain]
75
+ B --> C[Scan]
76
+ C --> D[Normalize]
77
+ D --> E[Parse]
78
+ E --> F[Validate]
79
+ F --> G[Policy]
80
+ G --> H[Result]
81
+ ```
82
+
83
+ - **Contain**: Structural safety and sanitization.
84
+ - **Scan**: Analysis and hazard detection.
85
+ - **Normalize**: Data hygiene and standardization.
86
+ - **Parse**: Semantic interpretation.
87
+ - **Validate**: Business rule enforcement.
88
+ - **Policy**: Decision-making and observability.
89
+
90
+ ## Security Features
91
+
92
+ - **Structural Hazard Detection**: Identifies circular references, excessive depth, and unsafe structures.
93
+ - **Unicode Safety**: Detects and handles bidirectional control characters.
94
+ - **Prototype Pollution Prevention**: Safe property access and key filtering.
95
+ - **Containment Sentinels**: Safe representation of dangerous values.
96
+ - **Immutable Processing**: No side effects or data mutation.
97
+
98
+ ## Observability
99
+
100
+ Jane provides comprehensive introspection:
101
+
102
+ ```typescript
103
+ const result = await jane.value(data)
104
+ .withDiff() // Track changes
105
+ .withExplain() // Explain decisions
106
+ .withReplay() // Reconstruct transformations
107
+ .withTelemetry(sink) // Custom telemetry
108
+ .run();
109
+
110
+ // Access detailed metadata
111
+ console.log(result.metadata);
112
+ console.log(result.diff);
113
+ console.log(result.explain);
114
+ ```
115
+
116
+ ## License
117
+
118
+ Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details.
119
+
120
+ ## Acknowledgments
121
+
122
+ Jane IO is built with care for the developer experience and runtime safety. Special thanks to the TypeScript community and the broader JavaScript ecosystem for inspiration and tooling.
123
+
124
+ ## Support
125
+
126
+ - **Issues**: [GitLab Issues](https://gitlab.com/clementine-solution/open-source/jane-io/issues)
127
+ - **Discussions**: [GitLab Discussions](https://gitlab.com/clementine-solution/open-source/jane-io/discussions)
128
+ - **Documentation**: [Jane IO Docs](https://jane-io.com/)
129
+
130
+ ---
131
+
132
+ **Jane IO** - Data validation with clarity and confidence.
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Diff
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Structural diff utilities used to compare safe and
7
+ * normalized values.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { DiffEntry, DiffFunction, FieldPath, JsonValue, PipelineBuilder } from '../shapes';
12
+ /**
13
+ * Computes a structural diff between two JSON‑compatible values.
14
+ *
15
+ * Delegates all traversal to `walkDiff`, collecting every change into a flat
16
+ * list of diff entries rooted at the top‑level path. Always returns a stable
17
+ * `{ entries }` object with no filtering or interpretation.
18
+ */
19
+ export declare const diff: DiffFunction;
20
+ /**
21
+ * Recursively walks two JSON‑compatible values and records structural changes.
22
+ *
23
+ * Compares primitives, arrays, and plain objects by shape and content, emitting
24
+ * diff entries at each divergent path. Keys and indices are traversed in a
25
+ * stable order, and non‑object mismatches are treated as direct value changes.
26
+ * All entries are appended to `out`; no filtering or interpretation occurs here.
27
+ */
28
+ export declare function walkDiff(before: JsonValue | undefined, after: JsonValue | undefined, path: FieldPath, out: DiffEntry[]): void;
29
+ /**
30
+ * Runs the pipeline and returns its computed diff.
31
+ *
32
+ * Delegates execution to the provided builder and exposes only the diff
33
+ * portion of the result. No additional processing or filtering occurs here.
34
+ */
35
+ export declare function runDiff<T>(builder: PipelineBuilder): Promise<import("../shapes").DiffResult | undefined>;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Diff
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Structural diff utilities used to compare safe and
7
+ * normalized values.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { isObject, isPlainObject } from '../common';
12
+ import { appendSegment, rootPath, setIndex, setKey } from '../field-path';
13
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
14
+ |* Diff *|
15
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
16
+ /**
17
+ * Computes a structural diff between two JSON‑compatible values.
18
+ *
19
+ * Delegates all traversal to `walkDiff`, collecting every change into a flat
20
+ * list of diff entries rooted at the top‑level path. Always returns a stable
21
+ * `{ entries }` object with no filtering or interpretation.
22
+ */
23
+ export const diff = (before, after) => {
24
+ const entries = [];
25
+ walkDiff(before, after, rootPath(), entries);
26
+ return { entries };
27
+ };
28
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
29
+ |* Walk Diff *|
30
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
31
+ /**
32
+ * Recursively walks two JSON‑compatible values and records structural changes.
33
+ *
34
+ * Compares primitives, arrays, and plain objects by shape and content, emitting
35
+ * diff entries at each divergent path. Keys and indices are traversed in a
36
+ * stable order, and non‑object mismatches are treated as direct value changes.
37
+ * All entries are appended to `out`; no filtering or interpretation occurs here.
38
+ */
39
+ export function walkDiff(before, after, path, out) {
40
+ if (before === after)
41
+ return;
42
+ if (!isObject(before) || !isObject(after)) {
43
+ out.push({
44
+ path,
45
+ kind: before === undefined ? 'added' : after === undefined ? 'removed' : 'changed',
46
+ before,
47
+ after,
48
+ });
49
+ return;
50
+ }
51
+ if (Array.isArray(before) && Array.isArray(after)) {
52
+ const max = Math.max(before.length, after.length);
53
+ for (let i = 0; i < max; i++) {
54
+ const childPath = appendSegment(path, setIndex(i));
55
+ walkDiff(before[i], after[i], childPath, out);
56
+ }
57
+ return;
58
+ }
59
+ if (isPlainObject(before) && isPlainObject(after)) {
60
+ const beforeKeys = Object.keys(before);
61
+ const afterKeys = Object.keys(after);
62
+ const allKeys = new Set([...beforeKeys, ...afterKeys]);
63
+ for (const key of allKeys) {
64
+ const childPath = appendSegment(path, setKey(key));
65
+ walkDiff(before[key], after[key], childPath, out);
66
+ }
67
+ return;
68
+ }
69
+ out.push({
70
+ path,
71
+ kind: 'changed',
72
+ before,
73
+ after,
74
+ });
75
+ }
76
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
77
+ |* Run Diff *|
78
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
79
+ /**
80
+ * Runs the pipeline and returns its computed diff.
81
+ *
82
+ * Delegates execution to the provided builder and exposes only the diff
83
+ * portion of the result. No additional processing or filtering occurs here.
84
+ */
85
+ export async function runDiff(builder) {
86
+ const result = await builder.run();
87
+ return result.diff;
88
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Explain
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Builds a human‑readable narrative of all pipeline events in
7
+ * order.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { ExplainFunction, PipelineBuilder } from '../shapes';
12
+ /**
13
+ * Builds a linear explanation of all pipeline events.
14
+ *
15
+ * Emits scan hazards, normalization events, diff entries, parse changes, and
16
+ * validation errors in pipeline order. Each event is mapped to a stable
17
+ * ExplainStep with its path, stage, kind, code, and message. No filtering or
18
+ * interpretation occurs; this is a direct narrative of what the pipeline saw.
19
+ */
20
+ export declare const explain: ExplainFunction;
21
+ /**
22
+ * Formats a value for human‑readable explain output.
23
+ *
24
+ * Produces stable string representations for primitives and falls back to
25
+ * compact JSON for objects. Never throws; errors during formatting degrade
26
+ * gracefully to `String(value)`.
27
+ */
28
+ export declare function format(value: unknown): string;
29
+ /**
30
+ * Runs the pipeline and returns its explain output.
31
+ *
32
+ * Delegates execution to the provided builder and exposes only the explain
33
+ * portion of the result. No additional processing or reshaping occurs here.
34
+ */
35
+ export declare function runExplain<T>(builder: PipelineBuilder): Promise<import("../shapes").ExplainResult | undefined>;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Explain
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Builds a human‑readable narrative of all pipeline events in
7
+ * order.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
12
+ |* Explain *|
13
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
14
+ /**
15
+ * Builds a linear explanation of all pipeline events.
16
+ *
17
+ * Emits scan hazards, normalization events, diff entries, parse changes, and
18
+ * validation errors in pipeline order. Each event is mapped to a stable
19
+ * ExplainStep with its path, stage, kind, code, and message. No filtering or
20
+ * interpretation occurs; this is a direct narrative of what the pipeline saw.
21
+ */
22
+ export const explain = ({ scanEvents, normalizationEvents, parseEvents, validationEvents, diff, }) => {
23
+ const steps = [];
24
+ for (const ev of scanEvents) {
25
+ steps.push({
26
+ path: ev.path,
27
+ stage: 'scan',
28
+ kind: 'hazard',
29
+ code: ev.code,
30
+ message: ev.message,
31
+ });
32
+ }
33
+ for (const ev of normalizationEvents) {
34
+ steps.push({
35
+ path: ev.path,
36
+ stage: 'normalize',
37
+ kind: ev.kind === 'fatal' ? 'hazard' : 'change',
38
+ code: ev.code,
39
+ message: ev.message,
40
+ });
41
+ }
42
+ if (diff) {
43
+ for (const entry of diff.entries) {
44
+ const message = entry.kind === 'added'
45
+ ? `Added value: ${format(entry.after)}`
46
+ : entry.kind === 'removed'
47
+ ? `Removed value: ${format(entry.before)}`
48
+ : `Changed from ${format(entry.before)} to ${format(entry.after)}`;
49
+ steps.push({
50
+ path: entry.path,
51
+ stage: 'normalize',
52
+ kind: 'change',
53
+ code: `normalize.${entry.kind}`,
54
+ message,
55
+ });
56
+ }
57
+ }
58
+ for (const ev of parseEvents) {
59
+ steps.push({
60
+ path: ev.path,
61
+ stage: 'parse',
62
+ kind: 'change',
63
+ code: ev.code,
64
+ message: ev.message,
65
+ });
66
+ }
67
+ for (const ev of validationEvents) {
68
+ steps.push({
69
+ path: ev.path,
70
+ stage: 'validate',
71
+ kind: 'error',
72
+ code: ev.code,
73
+ message: ev.message,
74
+ });
75
+ }
76
+ return { steps };
77
+ };
78
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
79
+ |* Format *|
80
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
81
+ /**
82
+ * Formats a value for human‑readable explain output.
83
+ *
84
+ * Produces stable string representations for primitives and falls back to
85
+ * compact JSON for objects. Never throws; errors during formatting degrade
86
+ * gracefully to `String(value)`.
87
+ */
88
+ export function format(value) {
89
+ try {
90
+ if (value === undefined)
91
+ return 'undefined';
92
+ if (value === null)
93
+ return 'null';
94
+ if (typeof value === 'string')
95
+ return JSON.stringify(value);
96
+ if (typeof value === 'number' || typeof value === 'boolean') {
97
+ return String(value);
98
+ }
99
+ return JSON.stringify(value, null, 0);
100
+ }
101
+ catch {
102
+ return String(value);
103
+ }
104
+ }
105
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
106
+ |* Run Explain *|
107
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
108
+ /**
109
+ * Runs the pipeline and returns its explain output.
110
+ *
111
+ * Delegates execution to the provided builder and exposes only the explain
112
+ * portion of the result. No additional processing or reshaping occurs here.
113
+ */
114
+ export async function runExplain(builder) {
115
+ const result = await builder.run();
116
+ return result.explain;
117
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Barrel File
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Re‑exports the public Analysis modules (Diff, Explain,
7
+ * Replay, Telemetry).
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ export { diff, walkDiff, runDiff } from './diff';
12
+ export { explain, format, runExplain } from './explain';
13
+ export { applyEntry, replay, runReplay } from './replay';
14
+ export { runTelemetry, telemetry } from './telemetry';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Barrel File
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Re‑exports the public Analysis modules (Diff, Explain,
7
+ * Replay, Telemetry).
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
12
+ |* Diff *|
13
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
14
+ export { diff, walkDiff, runDiff } from './diff';
15
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
16
+ |* Explain *|
17
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
18
+ export { explain, format, runExplain } from './explain';
19
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
20
+ |* Replay *|
21
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
22
+ export { applyEntry, replay, runReplay } from './replay';
23
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
24
+ |* Telemetry *|
25
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
26
+ export { runTelemetry, telemetry } from './telemetry';
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Replay
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Reconstructs intermediate states by applying diff entries
7
+ * in order.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { DiffEntry, InternalJsonValue, PipelineBuilder, ReplayFunction } from '../shapes';
12
+ /**
13
+ * Applies a single diff entry to an internal JSON value.
14
+ *
15
+ * Clones the current state, then sets or clears the value at the entry’s path
16
+ * according to its kind. Used by Replay to advance state one change at a time.
17
+ * Never mutates the original state.
18
+ */
19
+ export declare function applyEntry(state: InternalJsonValue, entry: DiffEntry): InternalJsonValue;
20
+ /**
21
+ * Replays a diff step‑by‑step to reconstruct intermediate states.
22
+ *
23
+ * Clones the initial value, applies each diff entry in order, and records a
24
+ * snapshot after every application. Produces a stable sequence of ReplayStep
25
+ * objects with index, entry, and resulting state. Never mutates inputs.
26
+ */
27
+ export declare const replay: ReplayFunction;
28
+ /**
29
+ * Runs the pipeline and returns its replay output.
30
+ *
31
+ * Delegates execution to the provided builder and exposes only the replay
32
+ * portion of the result. No additional processing or transformation occurs.
33
+ */
34
+ export declare function runReplay<T>(builder: PipelineBuilder): Promise<import("../shapes").ReplayResult | undefined>;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Replay
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Reconstructs intermediate states by applying diff entries
7
+ * in order.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import { setAtPath } from '../field-path';
12
+ import { deepClone } from '../pipeline';
13
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
14
+ |* Apply Entry *|
15
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
16
+ /**
17
+ * Applies a single diff entry to an internal JSON value.
18
+ *
19
+ * Clones the current state, then sets or clears the value at the entry’s path
20
+ * according to its kind. Used by Replay to advance state one change at a time.
21
+ * Never mutates the original state.
22
+ */
23
+ export function applyEntry(state, entry) {
24
+ const clone = deepClone(state);
25
+ switch (entry.kind) {
26
+ case 'added':
27
+ case 'changed':
28
+ return setAtPath(clone, entry.path, entry.after);
29
+ case 'removed':
30
+ return setAtPath(clone, entry.path, undefined);
31
+ }
32
+ }
33
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
34
+ |* Replay *|
35
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
36
+ /**
37
+ * Replays a diff step‑by‑step to reconstruct intermediate states.
38
+ *
39
+ * Clones the initial value, applies each diff entry in order, and records a
40
+ * snapshot after every application. Produces a stable sequence of ReplayStep
41
+ * objects with index, entry, and resulting state. Never mutates inputs.
42
+ */
43
+ export const replay = ({ before, diff }) => {
44
+ const steps = [];
45
+ let current = deepClone(before);
46
+ diff.forEach((entry, index) => {
47
+ current = applyEntry(current, entry);
48
+ steps.push({
49
+ index,
50
+ entry,
51
+ state: deepClone(current),
52
+ });
53
+ });
54
+ return { steps };
55
+ };
56
+ /* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— *\
57
+ |* Run Replay *|
58
+ \* ——— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ————— * ——— */
59
+ /**
60
+ * Runs the pipeline and returns its replay output.
61
+ *
62
+ * Delegates execution to the provided builder and exposes only the replay
63
+ * portion of the result. No additional processing or transformation occurs.
64
+ */
65
+ export async function runReplay(builder) {
66
+ const result = await builder.run();
67
+ return result.replay;
68
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Analysis | Telemetry
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Emits structured records for each pipeline stage for
7
+ * auditing and observability.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { PipelineBuilder, PipelineResult, TelemetryContext, TelemetryResult, TelemetrySink } from '../shapes';
12
+ /**
13
+ * Collects flat telemetry records for each pipeline stage.
14
+ *
15
+ * Emits one record per stage with boundary, pipeline, timestamp, and the
16
+ * stage‑specific payload (events, diff, explain, replay). Stages are reported
17
+ * in pipeline order, and a final `decide` record captures the policy outcome.
18
+ * No aggregation, filtering, or interpretation occurs here.
19
+ */
20
+ export declare function telemetry<T>(ctx: TelemetryContext<T>): TelemetryResult;
21
+ /**
22
+ * Runs the pipeline and emits telemetry if enabled by policy.
23
+ *
24
+ * Delegates execution to the builder, collects stage records through the
25
+ * telemetry helper, and forwards them to the provided sink. Returns the full
26
+ * pipeline result unchanged.
27
+ */
28
+ export declare function runTelemetry<T>(builder: PipelineBuilder, sink: TelemetrySink): Promise<PipelineResult<T>>;