@clementine-solutions/jane-io 1.0.0 → 1.0.1

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 (205) hide show
  1. package/README.md +132 -1
  2. package/dist/core/analysis/diff.d.ts +35 -0
  3. package/dist/core/analysis/explain.d.ts +35 -0
  4. package/dist/core/analysis/index.d.ts +14 -0
  5. package/dist/core/analysis/replay.d.ts +34 -0
  6. package/dist/core/analysis/telemetry.d.ts +28 -0
  7. package/dist/core/boundary-rules/at-most-one.d.ts +17 -0
  8. package/dist/core/boundary-rules/conditionally-required.d.ts +18 -0
  9. package/dist/core/boundary-rules/date-range.d.ts +17 -0
  10. package/dist/core/boundary-rules/index.d.ts +18 -0
  11. package/dist/core/boundary-rules/mutually-exclusive.d.ts +16 -0
  12. package/dist/core/boundary-rules/no-unknown-fields.d.ts +17 -0
  13. package/dist/core/boundary-rules/require-all.d.ts +16 -0
  14. package/dist/core/boundary-rules/require-one.d.ts +17 -0
  15. package/dist/core/common/events.d.ts +37 -0
  16. package/dist/core/common/fluent.d.ts +151 -0
  17. package/dist/core/common/index.d.ts +16 -0
  18. package/dist/core/common/policy.d.ts +170 -0
  19. package/dist/core/common/utilities.d.ts +59 -0
  20. package/dist/core/common/wildcard.d.ts +27 -0
  21. package/dist/core/field-path/construct.d.ts +77 -0
  22. package/dist/core/field-path/format.d.ts +41 -0
  23. package/dist/core/field-path/index.d.ts +14 -0
  24. package/dist/core/field-path/utilities.d.ts +85 -0
  25. package/dist/core/field-path/walk.d.ts +36 -0
  26. package/dist/core/fluent-registry.d.ts +138 -0
  27. package/dist/core/normalizers/array/compact-sparse-array.d.ts +22 -0
  28. package/dist/core/normalizers/array/flatten-one-level.d.ts +17 -0
  29. package/dist/core/normalizers/array/remove-empty-string-items.d.ts +6 -0
  30. package/dist/core/normalizers/array/remove-null-items.d.ts +16 -0
  31. package/dist/core/normalizers/array/remove-undefined-items.d.ts +16 -0
  32. package/dist/core/normalizers/date/invalid-date-to-undefined.d.ts +17 -0
  33. package/dist/core/normalizers/index.d.ts +28 -0
  34. package/dist/core/normalizers/normalizer-register.d.ts +17 -0
  35. package/dist/core/normalizers/number/infinity-to-undefined.d.ts +18 -0
  36. package/dist/core/normalizers/number/nan-to-undefined.d.ts +17 -0
  37. package/dist/core/normalizers/number/normalize-negative-zero.d.ts +16 -0
  38. package/dist/core/normalizers/object/remove-empty-array-keys.d.ts +17 -0
  39. package/dist/core/normalizers/object/remove-empty-object-keys.d.ts +16 -0
  40. package/dist/core/normalizers/object/remove-empty-string-keys.d.ts +16 -0
  41. package/dist/core/normalizers/object/remove-null-keys.d.ts +16 -0
  42. package/dist/core/normalizers/object/remove-undefined-keys.d.ts +16 -0
  43. package/dist/core/normalizers/string/collapse-whitespace.d.ts +17 -0
  44. package/dist/core/normalizers/string/empty-to-undefined.d.ts +16 -0
  45. package/dist/core/normalizers/string/trim.d.ts +16 -0
  46. package/dist/core/parsers/index.d.ts +22 -0
  47. package/dist/core/parsers/parse-array-string.d.ts +16 -0
  48. package/dist/core/parsers/parse-bigint-string.d.ts +16 -0
  49. package/dist/core/parsers/parse-binary-string.d.ts +16 -0
  50. package/dist/core/parsers/parse-boolean-string.d.ts +16 -0
  51. package/dist/core/parsers/parse-date-string.d.ts +16 -0
  52. package/dist/core/parsers/parse-duration-string.d.ts +16 -0
  53. package/dist/core/parsers/parse-hex-string.d.ts +16 -0
  54. package/dist/core/parsers/parse-integer-string.d.ts +16 -0
  55. package/dist/core/parsers/parse-json-string.d.ts +17 -0
  56. package/dist/core/parsers/parse-numeric-string.d.ts +16 -0
  57. package/dist/core/parsers/parse-object-string.d.ts +16 -0
  58. package/dist/core/parsers/parse-octal-string.d.ts +16 -0
  59. package/dist/core/parsers/parse-scientific-notation-string.d.ts +16 -0
  60. package/dist/core/parsers/parse-url-string.d.ts +16 -0
  61. package/dist/core/pipeline/boundary.d.ts +36 -0
  62. package/dist/core/pipeline/contain.d.ts +122 -0
  63. package/dist/core/pipeline/index.d.ts +16 -0
  64. package/dist/core/pipeline/normalize.d.ts +34 -0
  65. package/dist/core/pipeline/parse.d.ts +40 -0
  66. package/dist/core/pipeline/pipeline.d.ts +23 -0
  67. package/dist/core/pipeline/scan.d.ts +46 -0
  68. package/dist/core/pipeline/validate.d.ts +40 -0
  69. package/dist/core/scanners/any/scan-for-sentinels.d.ts +19 -0
  70. package/dist/core/scanners/array/array-is-deep.d.ts +19 -0
  71. package/dist/core/scanners/array/array-is-heterogenous.d.ts +18 -0
  72. package/dist/core/scanners/array/array-is-large.d.ts +19 -0
  73. package/dist/core/scanners/bigint/bigint-is-large.d.ts +20 -0
  74. package/dist/core/scanners/bigint/bigint-not-safe.d.ts +20 -0
  75. package/dist/core/scanners/date/date-is-before-epoch.d.ts +19 -0
  76. package/dist/core/scanners/date/date-is-far-future.d.ts +19 -0
  77. package/dist/core/scanners/date/date-is-invalid.d.ts +19 -0
  78. package/dist/core/scanners/index.d.ts +31 -0
  79. package/dist/core/scanners/number/number-is-infinite.d.ts +19 -0
  80. package/dist/core/scanners/number/number-is-nan.d.ts +19 -0
  81. package/dist/core/scanners/number/number-is-too-large.d.ts +20 -0
  82. package/dist/core/scanners/number/number-is-unsafe-integer.d.ts +19 -0
  83. package/dist/core/scanners/object/object-has-circular-references.d.ts +20 -0
  84. package/dist/core/scanners/object/object-has-many-keys.d.ts +19 -0
  85. package/dist/core/scanners/object/object-is-deep.d.ts +20 -0
  86. package/dist/core/scanners/scanner-registry.d.ts +19 -0
  87. package/dist/core/scanners/string/string-has-unsafe-unicode.d.ts +19 -0
  88. package/dist/core/scanners/string/string-has-whitespace-edges.d.ts +19 -0
  89. package/dist/core/scanners/string/string-is-long.d.ts +19 -0
  90. package/dist/core/scanners/unknown/unknown-not-scannable.d.ts +21 -0
  91. package/dist/core/shapes/analysis.d.ts +239 -0
  92. package/dist/core/shapes/boundary.d.ts +126 -0
  93. package/dist/core/shapes/events.d.ts +83 -0
  94. package/dist/core/shapes/field-path.d.ts +51 -0
  95. package/dist/core/shapes/index.d.ts +21 -0
  96. package/dist/core/shapes/normalize.d.ts +59 -0
  97. package/dist/core/shapes/parse.d.ts +75 -0
  98. package/dist/core/shapes/pipeline.d.ts +149 -0
  99. package/dist/core/shapes/policy.d.ts +158 -0
  100. package/dist/core/shapes/public.d.ts +92 -0
  101. package/dist/core/shapes/scan.d.ts +126 -0
  102. package/dist/core/shapes/validate.d.ts +65 -0
  103. package/dist/core/validators/array/array-max-items.d.ts +25 -0
  104. package/dist/core/validators/array/array-min-items.d.ts +25 -0
  105. package/dist/core/validators/array/array.d.ts +22 -0
  106. package/dist/core/validators/array/excludes.d.ts +25 -0
  107. package/dist/core/validators/array/has-unique-items.d.ts +24 -0
  108. package/dist/core/validators/array/includes.d.ts +24 -0
  109. package/dist/core/validators/array/items-equal.d.ts +25 -0
  110. package/dist/core/validators/array/no-empty-string-items.d.ts +24 -0
  111. package/dist/core/validators/array/no-null-items.d.ts +24 -0
  112. package/dist/core/validators/array/no-undefined-items.d.ts +24 -0
  113. package/dist/core/validators/array/non-empty-array.d.ts +24 -0
  114. package/dist/core/validators/array/not-sparse.d.ts +25 -0
  115. package/dist/core/validators/bigint/bigint-equals.d.ts +24 -0
  116. package/dist/core/validators/bigint/bigint-max.d.ts +25 -0
  117. package/dist/core/validators/bigint/bigint-min.d.ts +25 -0
  118. package/dist/core/validators/bigint/bigint-negative.d.ts +23 -0
  119. package/dist/core/validators/bigint/bigint-non-negative.d.ts +24 -0
  120. package/dist/core/validators/bigint/bigint-non-positive.d.ts +24 -0
  121. package/dist/core/validators/bigint/bigint-positive.d.ts +24 -0
  122. package/dist/core/validators/bigint/bigint-safe.d.ts +25 -0
  123. package/dist/core/validators/bigint/bigint.d.ts +20 -0
  124. package/dist/core/validators/boolean/boolean.d.ts +21 -0
  125. package/dist/core/validators/boolean/is-false.d.ts +22 -0
  126. package/dist/core/validators/boolean/is-true.d.ts +22 -0
  127. package/dist/core/validators/common/is-country-code.d.ts +17 -0
  128. package/dist/core/validators/common/is-currency-code.d.ts +17 -0
  129. package/dist/core/validators/common/is-email-strict.d.ts +17 -0
  130. package/dist/core/validators/common/is-email.d.ts +17 -0
  131. package/dist/core/validators/common/is-ip.d.ts +17 -0
  132. package/dist/core/validators/common/is-phone-strict.d.ts +17 -0
  133. package/dist/core/validators/common/is-phone.d.ts +17 -0
  134. package/dist/core/validators/common/is-port.d.ts +17 -0
  135. package/dist/core/validators/common/is-postal-code.d.ts +17 -0
  136. package/dist/core/validators/common/is-url.d.ts +17 -0
  137. package/dist/core/validators/common/is-uuid.d.ts +17 -0
  138. package/dist/core/validators/date/before-epoch.d.ts +28 -0
  139. package/dist/core/validators/date/date-now-required.d.ts +22 -0
  140. package/dist/core/validators/date/is-date.d.ts +21 -0
  141. package/dist/core/validators/date/is-far-future.d.ts +23 -0
  142. package/dist/core/validators/date/is-future.d.ts +24 -0
  143. package/dist/core/validators/date/is-past.d.ts +24 -0
  144. package/dist/core/validators/date/not-after.d.ts +25 -0
  145. package/dist/core/validators/date/not-before.d.ts +25 -0
  146. package/dist/core/validators/date/same-day.d.ts +25 -0
  147. package/dist/core/validators/date/same-month.d.ts +25 -0
  148. package/dist/core/validators/date/same-year.d.ts +24 -0
  149. package/dist/core/validators/date/too-early.d.ts +25 -0
  150. package/dist/core/validators/date/too-late.d.ts +25 -0
  151. package/dist/core/validators/date/weekday.d.ts +32 -0
  152. package/dist/core/validators/date/weekend.d.ts +27 -0
  153. package/dist/core/validators/index.d.ts +112 -0
  154. package/dist/core/validators/nullish/is-null-or-undefined.d.ts +22 -0
  155. package/dist/core/validators/nullish/is-null.d.ts +21 -0
  156. package/dist/core/validators/nullish/is-undefined.d.ts +21 -0
  157. package/dist/core/validators/number/finite.d.ts +22 -0
  158. package/dist/core/validators/number/integer.d.ts +22 -0
  159. package/dist/core/validators/number/less-than.d.ts +21 -0
  160. package/dist/core/validators/number/max.d.ts +21 -0
  161. package/dist/core/validators/number/min.d.ts +21 -0
  162. package/dist/core/validators/number/more-than.d.ts +21 -0
  163. package/dist/core/validators/number/negative.d.ts +20 -0
  164. package/dist/core/validators/number/non-negative.d.ts +19 -0
  165. package/dist/core/validators/number/non-positive.d.ts +19 -0
  166. package/dist/core/validators/number/number.d.ts +19 -0
  167. package/dist/core/validators/number/positive.d.ts +20 -0
  168. package/dist/core/validators/number/safe-integer.d.ts +19 -0
  169. package/dist/core/validators/object/deep-equals.d.ts +24 -0
  170. package/dist/core/validators/object/has-key.d.ts +23 -0
  171. package/dist/core/validators/object/has-value.d.ts +27 -0
  172. package/dist/core/validators/object/keys-equal.d.ts +26 -0
  173. package/dist/core/validators/object/max-keys.d.ts +24 -0
  174. package/dist/core/validators/object/min-keys.d.ts +24 -0
  175. package/dist/core/validators/object/missing-key.d.ts +23 -0
  176. package/dist/core/validators/object/no-empty-array-values.d.ts +23 -0
  177. package/dist/core/validators/object/no-empty-object-values.d.ts +23 -0
  178. package/dist/core/validators/object/no-null-values.d.ts +23 -0
  179. package/dist/core/validators/object/no-undefined-values.d.ts +23 -0
  180. package/dist/core/validators/object/non-empty-object.d.ts +21 -0
  181. package/dist/core/validators/object/only-keys.d.ts +23 -0
  182. package/dist/core/validators/object/plain-object.d.ts +22 -0
  183. package/dist/core/validators/string/alpha-num.d.ts +23 -0
  184. package/dist/core/validators/string/alpha.d.ts +24 -0
  185. package/dist/core/validators/string/chars-equal.d.ts +23 -0
  186. package/dist/core/validators/string/ends-with.d.ts +23 -0
  187. package/dist/core/validators/string/is-ascii.d.ts +24 -0
  188. package/dist/core/validators/string/is-printable.d.ts +25 -0
  189. package/dist/core/validators/string/matches.d.ts +23 -0
  190. package/dist/core/validators/string/max-length.d.ts +24 -0
  191. package/dist/core/validators/string/min-length.d.ts +24 -0
  192. package/dist/core/validators/string/no-lead-space.d.ts +23 -0
  193. package/dist/core/validators/string/no-repeat-space.d.ts +25 -0
  194. package/dist/core/validators/string/no-space.d.ts +24 -0
  195. package/dist/core/validators/string/no-trail-space.d.ts +23 -0
  196. package/dist/core/validators/string/non-empty.d.ts +22 -0
  197. package/dist/core/validators/string/not-one-of.d.ts +24 -0
  198. package/dist/core/validators/string/num-string.d.ts +23 -0
  199. package/dist/core/validators/string/one-of.d.ts +23 -0
  200. package/dist/core/validators/string/starts-with.d.ts +23 -0
  201. package/dist/core/validators/string/string.d.ts +21 -0
  202. package/dist/core/validators/string/trimmed.d.ts +24 -0
  203. package/dist/index.d.ts +83 -0
  204. package/dist/test.d.ts +1 -0
  205. package/package.json +2 -2
@@ -0,0 +1,170 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Common | Policy
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Core types and helpers for defining, normalizing, and
7
+ * resolving policies that guide how Jane interprets events
8
+ * across all pipeline stages.
9
+ * @see https://jane-io.com
10
+ * ----------------------------------------------------------------------------
11
+ */
12
+ import type { EventCode, EventKind, FieldPath, Policy, PolicyContext, PolicyOverrides, PipelineResult, PipelineMetadata, BoundaryDecideConfig } from '../shapes';
13
+ import type { PolicyInput } from '../shapes/policy';
14
+ /**
15
+ * Raises an event’s severity by the given number of levels.
16
+ *
17
+ * Escalation moves the severity index upward and clamps it to the valid
18
+ * range. This helper is used by policy transforms to harden events without
19
+ * altering their underlying meaning or code.
20
+ */
21
+ export declare function applyEscalate(kind: EventKind, levels: number): EventKind;
22
+ /**
23
+ * Lowers an event’s severity by the given number of levels.
24
+ *
25
+ * Override moves the severity index downward and clamps it to the valid
26
+ * range. This helper is used by policy transforms to soften events without
27
+ * changing their underlying meaning or code.
28
+ */
29
+ export declare function applyOverride(kind: EventKind, levels: number): EventKind;
30
+ /**
31
+ * Clamps a severity index to the valid range.
32
+ *
33
+ * Severity levels are stored as an ordered list. This helper ensures that
34
+ * arithmetic on the index—such as escalation or override—never produces an
35
+ * out‑of‑bounds value. No interpretation occurs here; it simply enforces the
36
+ * valid numeric range.
37
+ */
38
+ export declare function clampSeverityIndex(i: number): number;
39
+ /**
40
+ * Compiles a user‑supplied severity map into override/escalation deltas.
41
+ *
42
+ * Each entry expresses a desired target severity for an event code. This
43
+ * helper compares the target against the baseline severity (“error”) and
44
+ * converts the difference into numeric levels suitable for the override and
45
+ * escalate policy transforms.
46
+ *
47
+ * Negative deltas become override levels; positive deltas become escalation
48
+ * levels. No interpretation occurs here—this function only computes the
49
+ * distance between severities.
50
+ */
51
+ export declare function compileSeverityMap(severity: Readonly<Partial<Record<EventCode, EventKind>>>): {
52
+ override: Readonly<Partial<Record<EventCode, number>>>;
53
+ escalate: Readonly<Partial<Record<EventCode, number>>>;
54
+ };
55
+ /**
56
+ * Creates a `decide`‑phase event.
57
+ *
58
+ * Decision events are emitted after validation when policy logic evaluates
59
+ * severity, overrides, escalation, and boundary rules. This helper ensures
60
+ * all decision events share a consistent shape and metadata.
61
+ */
62
+ export declare const decideEvent: (kind: EventKind, code: EventCode, path: FieldPath, message?: string, userMessage?: string, meta?: Record<string, unknown>) => import("../shapes").JaneEvent;
63
+ /**
64
+ * The baseline policy used when no user configuration is provided.
65
+ *
66
+ * Moderate mode applies no automatic rejects, reviews, or severity transforms.
67
+ * Scan and analysis features are disabled, and no structural exceptions are
68
+ * granted. This preset defines Jane’s neutral, predictable behavior and serves
69
+ * as the foundation for all policy merging.
70
+ */
71
+ export declare const defaultPolicy: Policy;
72
+ /**
73
+ * A permissive policy preset optimized for developer‑friendly behavior.
74
+ *
75
+ * Lax mode applies no rejects or reviews, downgrades all severities by one
76
+ * level via a wildcard override, disables scan and analysis features, and
77
+ * allows structural exceptions for bigint, map, and set. This preset favors
78
+ * flexibility and forgiveness during development and experimentation.
79
+ */
80
+ export declare const laxPolicy: Policy;
81
+ /**
82
+ * A strict boundary preset that rejects on any issue.
83
+ *
84
+ * This configuration forces boundary acceptance to “strict”, applies a
85
+ * wildcard reject to treat every issue as fatal, and hides nothing from the
86
+ * event or issue streams. It provides the most conservative, compliance‑grade
87
+ * boundary behavior.
88
+ */
89
+ export declare const boundaryPolicyStrict: BoundaryDecideConfig;
90
+ /**
91
+ * The neutral boundary preset used when no boundary configuration is supplied.
92
+ *
93
+ * Default mode requires all fields to be accepted, applies no reject or review
94
+ * patterns, and hides nothing from the event or issue streams. It provides a
95
+ * transparent, assumption‑free baseline for boundary evaluation.
96
+ */
97
+ export declare const boundaryPolicyDefault: BoundaryDecideConfig;
98
+ /**
99
+ * A permissive boundary preset that accepts if any field succeeds.
100
+ *
101
+ * Lax mode ignores all boundary‑level events, hides both events and issues
102
+ * from the result, and applies no reject or review patterns. It provides a
103
+ * forgiving, low‑visibility boundary configuration suited for exploratory or
104
+ * developer‑focused workflows.
105
+ */
106
+ export declare const boundaryPolicyLax: BoundaryDecideConfig;
107
+ /**
108
+ * A maximum‑scrutiny policy preset for safety‑critical pipelines.
109
+ *
110
+ * Strict mode enables scan, rejects high‑risk conditions outright, escalates
111
+ * all severities by one level, and requires review for large or complex
112
+ * structures. All analysis features are enabled, and no structural exceptions
113
+ * are granted. This preset enforces the most conservative, defensive behavior.
114
+ */
115
+ export declare const strictPolicy: Policy;
116
+ export declare function mergeBoundaryPolicies(base: Partial<BoundaryDecideConfig> | undefined, ...overrides: Array<Partial<BoundaryDecideConfig> | undefined>): BoundaryDecideConfig;
117
+ /**
118
+ * Merges a base policy with user‑supplied input into a final, normalized policy.
119
+ *
120
+ * This function applies field‑by‑field overrides, compiles public severity
121
+ * settings into internal override/escalation maps, and merges reject/review/warn
122
+ * patterns in a predictable order. It preserves all unspecified fields from the
123
+ * base policy and never introduces defaults beyond those already present.
124
+ */
125
+ export declare function normalizePolicy(base: Policy, input?: PolicyInput): Policy;
126
+ /**
127
+ * Resolves a numeric level for an event code from a sparse lookup table.
128
+ *
129
+ * Exact matches take priority. If none exist, wildcard patterns in the table
130
+ * are tested in insertion order using their compiled regular expressions.
131
+ * Returns the matched level or `undefined` when no pattern applies.
132
+ */
133
+ export declare function resolveLevel(code: EventCode, table: Readonly<Partial<Record<string, number>>>): number | undefined;
134
+ /**
135
+ * Applies policy transforms to events and produces the final pipeline decision.
136
+ *
137
+ * This function reshapes events using override, escalation, and warn rules,
138
+ * derives issues from the resulting severities, and evaluates reject/review
139
+ * patterns according to the active policy mode. It returns the full pipeline
140
+ * result with shaped events, extracted issues, and a final accept/review/reject
141
+ * decision. No data is modified—only event interpretation changes.
142
+ */
143
+ export declare function policyDecision<T>(ctx: PolicyContext<T>, metadata: PipelineMetadata): PipelineResult<T>;
144
+ /**
145
+ * Resolves the effective policy by merging defaults, explicit policy, and
146
+ * fluent‑API overrides.
147
+ *
148
+ * The default and explicit policies are combined first, then builder overrides
149
+ * are applied field‑by‑field with strict precedence. Only fields exposed to the
150
+ * fluent API are overrideable; all other structure is taken directly from the
151
+ * merged base. No inference or normalization occurs here—this function performs
152
+ * a final, literal merge for pipeline execution.
153
+ */
154
+ export declare function resolvePolicy(defaultPolicy: Policy, janePolicy: Policy | undefined, overrides: PolicyOverrides | undefined): Policy;
155
+ /**
156
+ * Returns the numeric index for a severity kind.
157
+ *
158
+ * Event kinds are stored in a fixed ordered list. Unknown kinds fall back to
159
+ * index 0 to guarantee a safe, deterministic baseline for all severity math.
160
+ * No interpretation occurs here—this is a simple lookup with a fallback.
161
+ */
162
+ export declare function severityIndex(kind: EventKind): number;
163
+ /**
164
+ * Fixed severity ladder from least to most severe.
165
+ *
166
+ * Policies, escalation math, and explain output rely on this exact ordering.
167
+ * Changing it is a breaking change because severity indices are used
168
+ * throughout the pipeline.
169
+ */
170
+ export declare const SEVERITY_ORDER: readonly EventKind[];
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Common | Utilities
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Shared low‑level helpers used across Jane’s core subsystems.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ /**
11
+ * Performs structural deep equality on contained values.
12
+ *
13
+ * Primitives are compared by value, arrays and plain objects by shape and
14
+ * recursively by content, and Date objects by timestamp. Non‑plain objects
15
+ * are rejected. Cycle detection ensures safe comparison of recursive
16
+ * structures. This function defines the structural equality model used
17
+ * throughout Jane’s containment and diff logic.
18
+ */
19
+ export declare function deepEqual(a: unknown, b: unknown, seen?: WeakMap<object, object>): boolean;
20
+ /**
21
+ * Generates a unique run identifier.
22
+ *
23
+ * Uses `crypto.randomUUID` when available for strong, collision‑resistant IDs.
24
+ * Falls back to a timestamp + entropy string in environments without UUID
25
+ * support. Always returns a stable string suitable for pipeline metadata.
26
+ */
27
+ export declare function generateRunId(): string;
28
+ /**
29
+ * Checks for non‑null object values.
30
+ *
31
+ * Used as a minimal guard before structural checks. Functions, arrays, and
32
+ * plain objects all satisfy this test; it only excludes `null` and primitives.
33
+ */
34
+ export declare function isObject(v: unknown): v is object;
35
+ /**
36
+ * Checks whether a value is a strict plain object.
37
+ *
38
+ * Excludes arrays, null, and objects with custom or null prototypes. Only
39
+ * `{}`‑shaped values created by `Object` with `Object.prototype` qualify.
40
+ * Used wherever structural rules require predictable, JSON‑compatible objects.
41
+ */
42
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
43
+ /**
44
+ * Checks whether a value is a JavaScript primitive.
45
+ *
46
+ * Includes all scalar literals plus `null` and `undefined`. Anything that is
47
+ * not an object and not a function qualifies. Used as a fast‑path guard before
48
+ * structural or container‑level checks.
49
+ */
50
+ export declare function isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol | null | undefined;
51
+ /**
52
+ * Safely stringifies arbitrary values for use in messages and telemetry.
53
+ *
54
+ * Primitives are returned directly, strings are truncated with JSON quoting,
55
+ * functions and symbols are rendered as descriptive sentinels, and objects are
56
+ * JSON‑encoded with circular‑reference protection. Output is always bounded by
57
+ * `maxLength` to prevent runaway logs or unreadable diagnostics.
58
+ */
59
+ export declare function safeStringify(value: unknown, maxLength?: number): string;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Common | Wildcard
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Wildcard pattern helpers used for event‑code matching in policy rules.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ import type { EventCode } from '../shapes';
11
+ /**
12
+ * Compiles a wildcard pattern into a safe, anchored regular expression.
13
+ *
14
+ * Escapes all regex metacharacters except `*`, which expands to `.*`. The
15
+ * result matches the entire string, ensuring predictable event‑code pattern
16
+ * checks in policy rules.
17
+ */
18
+ export declare function compileWildcard(pattern: string): RegExp;
19
+ export declare function getCompiledWildcard(pattern: string): RegExp;
20
+ /**
21
+ * Checks whether an event code matches any literal or wildcard pattern.
22
+ *
23
+ * Exact string matches take priority. Wildcard patterns are resolved through
24
+ * cached compiled expressions and tested in order. Returns `true` on the first
25
+ * match, otherwise `false`.
26
+ */
27
+ export declare function matchesWildcard(code: EventCode, patterns: readonly string[]): boolean;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Field Path | Construct
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Constructors for creating canonical, immutable FieldPath
7
+ * objects.
8
+ * @see https://jane-io.com
9
+ * ----------------------------------------------------------------------------
10
+ */
11
+ import type { FieldPath, FieldPathSegment, InternalJsonValue, SegmentIndex, SegmentKey } from '../shapes';
12
+ /**
13
+ * Appends a segment to an existing FieldPath.
14
+ *
15
+ * Produces a new canonical FieldPath by extending the current path’s segment
16
+ * list. Never mutates the original path.
17
+ */
18
+ export declare function appendSegment(path: FieldPath, segment: FieldPathSegment): FieldPath;
19
+ /**
20
+ * Produces a deep clone of an InternalJsonValue.
21
+ *
22
+ * Recursively copies arrays and plain objects while returning primitives,
23
+ * null, and undefined unchanged. Never mutates the input and never preserves
24
+ * references, ensuring safe use in diff, replay, and boundary evaluation.
25
+ */
26
+ export declare function cloneContainer(value: InternalJsonValue): InternalJsonValue;
27
+ /**
28
+ * Creates a shallow clone of a FieldPath.
29
+ *
30
+ * Copies the segment list into a new canonical FieldPath, ensuring callers
31
+ * never share mutable path state.
32
+ */
33
+ export declare function clonePath(path: FieldPath): FieldPath;
34
+ /**
35
+ * Creates a canonical FieldPath from a list of segments.
36
+ *
37
+ * Wraps the segment array with a stable toString() implementation and optional
38
+ * inputName. Produces a new immutable path object without modifying callers’
39
+ * data.
40
+ */
41
+ export declare function makeFieldPath(segments: FieldPathSegment[], inputName?: string): FieldPath;
42
+ /**
43
+ * Creates the root FieldPath.
44
+ *
45
+ * Produces an empty canonical path with an optional inputName. Used as the
46
+ * starting point for all path construction and never carries any segments.
47
+ */
48
+ export declare const rootPath: (inputName?: string) => FieldPath;
49
+ /**
50
+ * Sets a value at the given FieldPath.
51
+ *
52
+ * If the path is empty, returns the value directly. Otherwise delegates to the
53
+ * recursive setter, producing a new InternalJsonValue without mutating the
54
+ * original root.
55
+ */
56
+ export declare function setAtPath(root: InternalJsonValue, path: FieldPath, value: InternalJsonValue): InternalJsonValue;
57
+ /**
58
+ * Builds a FieldPath from the provided segments.
59
+ *
60
+ * Wraps the segment list in a canonical FieldPath object, ensuring callers
61
+ * always work with an immutable, well‑formed path representation.
62
+ */
63
+ export declare const setFieldPath: (...segments: FieldPathSegment[]) => FieldPath;
64
+ /**
65
+ * Creates an index segment.
66
+ *
67
+ * Wraps the numeric index in a canonical SegmentIndex object for use in
68
+ * FieldPath construction.
69
+ */
70
+ export declare const setIndex: (index: number) => SegmentIndex;
71
+ /**
72
+ * Creates a key segment.
73
+ *
74
+ * Wraps the string key in a canonical SegmentKey object for use in
75
+ * FieldPath construction.
76
+ */
77
+ export declare const setKey: (key: string) => SegmentKey;
@@ -0,0 +1,41 @@
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 type { FieldPath } from '../shapes';
12
+ /**
13
+ * Converts a list of raw parts into a FieldPath.
14
+ *
15
+ * Maps numbers to index segments and strings to key segments, producing a
16
+ * canonical FieldPath suitable for formatting, traversal, or boundary work.
17
+ */
18
+ export declare function arrayToFieldPath(parts: (string | number)[]): FieldPath;
19
+ /**
20
+ * Converts a FieldPath into its raw parts.
21
+ *
22
+ * Extracts each segment’s key or index in order, producing a simple array
23
+ * representation suitable for serialization or comparison.
24
+ */
25
+ export declare function fieldPathToArray(path: FieldPath): (string | number)[];
26
+ /**
27
+ * Converts a FieldPath into a user‑facing string.
28
+ *
29
+ * Uses dotted notation for safe keys and bracket notation for indexes or
30
+ * keys requiring escaping. Produces a stable, readable form for logs,
31
+ * errors, and policy messages.
32
+ */
33
+ export declare function fieldPathToUser(path: FieldPath): string;
34
+ /**
35
+ * Parses a user‑facing path string into a FieldPath.
36
+ *
37
+ * Supports dotted keys, bracketed indexes, and quoted/escaped keys. Normalizes
38
+ * the "$" root form and walks the string character‑by‑character to build a
39
+ * canonical segment list suitable for traversal and boundary evaluation.
40
+ */
41
+ export declare function userToFieldPath(user?: string): FieldPath;
@@ -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,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,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,138 @@
1
+ /**
2
+ * ----------------------------------------------------------------------------
3
+ * Registry | Fluent
4
+ * ----------------------------------------------------------------------------
5
+ * @package @clementine-solutions/jane
6
+ * @description Central registry of all built‑in validators and parsers.
7
+ * @see https://jane-io.com
8
+ * ----------------------------------------------------------------------------
9
+ */
10
+ /**
11
+ * Central registry of all built‑in Jane validators and parsers.
12
+ *
13
+ * This object provides a single, authoritative lookup table for every
14
+ * first‑party rule Jane ships with. Validators define how values are checked
15
+ * for correctness, while parsers convert raw input into structured forms.
16
+ * Keeping them together in one immutable registry ensures predictable
17
+ * resolution, consistent behavior across subsystems, and a stable surface
18
+ * for contributors extending or inspecting Jane’s rule set.
19
+ */
20
+ export declare const janeRegistry: {
21
+ readonly validators: {
22
+ readonly alphaNum: import("./shapes").ValidationRule;
23
+ readonly alpha: import("./shapes").ValidationRule;
24
+ readonly array: import("./shapes").ValidationRule;
25
+ readonly arrayMinItems: (min: number) => import("./shapes").ValidationRule;
26
+ readonly arrayMaxItems: (max: number) => import("./shapes").ValidationRule;
27
+ readonly beforeEpoch: import("./shapes").ValidationRule;
28
+ readonly bigint: import("./shapes").ValidationRule;
29
+ readonly bigintEquals: (target: bigint) => import("./shapes").ValidationRule;
30
+ readonly bigintMax: (max: bigint) => import("./shapes").ValidationRule;
31
+ readonly bigintMin: (min: bigint) => import("./shapes").ValidationRule;
32
+ readonly bigintNegative: import("./shapes").ValidationRule;
33
+ readonly bigintNonNegative: import("./shapes").ValidationRule;
34
+ readonly bigintNonPositive: import("./shapes").ValidationRule;
35
+ readonly bigintPositive: import("./shapes").ValidationRule;
36
+ readonly bigintSafe: import("./shapes").ValidationRule;
37
+ readonly boolean: import("./shapes").ValidationRule;
38
+ readonly charsEqual: (exact: number) => import("./shapes").ValidationRule;
39
+ readonly dateNowRequired: import("./shapes").ValidationRule;
40
+ readonly deepEquals: (expected: unknown) => import("./shapes").ValidationRule;
41
+ readonly endsWith: (suffix: string) => import("./shapes").ValidationRule;
42
+ readonly excludes: (item: unknown) => import("./shapes").ValidationRule;
43
+ readonly finite: import("./shapes").ValidationRule;
44
+ readonly hasKey: (requiredKey: string) => import("./shapes").ValidationRule;
45
+ readonly hasUniqueItems: import("./shapes").ValidationRule;
46
+ readonly hasValue: (target: unknown) => import("./shapes").ValidationRule;
47
+ readonly includes: (item: unknown) => import("./shapes").ValidationRule;
48
+ readonly integer: import("./shapes").ValidationRule;
49
+ readonly isAscii: import("./shapes").ValidationRule;
50
+ readonly isCountryCode: import("./shapes").ValidationRule;
51
+ readonly isCurrencyCode: import("./shapes").ValidationRule;
52
+ readonly isDate: import("./shapes").ValidationRule;
53
+ readonly isEmail: import("./shapes").ValidationRule;
54
+ readonly isEmailStrict: import("./shapes").ValidationRule;
55
+ readonly isFalse: import("./shapes").ValidationRule;
56
+ readonly isFarFuture: import("./shapes").ValidationRule;
57
+ readonly isFuture: import("./shapes").ValidationRule;
58
+ readonly isIp: import("./shapes").ValidationRule;
59
+ readonly isPast: import("./shapes").ValidationRule;
60
+ readonly isPhone: import("./shapes").ValidationRule;
61
+ readonly isPhoneStrict: import("./shapes").ValidationRule;
62
+ readonly isPort: import("./shapes").ValidationRule;
63
+ readonly isPostalCode: import("./shapes").ValidationRule;
64
+ readonly isPrintable: import("./shapes").ValidationRule;
65
+ readonly isNull: import("./shapes").ValidationRule;
66
+ readonly isNullOrUndefined: import("./shapes").ValidationRule;
67
+ readonly isTrue: import("./shapes").ValidationRule;
68
+ readonly isUrl: import("./shapes").ValidationRule;
69
+ readonly isUndefined: import("./shapes").ValidationRule;
70
+ readonly isUuid: import("./shapes").ValidationRule;
71
+ readonly itemsEqual: (exact: number) => import("./shapes").ValidationRule;
72
+ readonly keysEqual: (expectedKeys: readonly string[]) => import("./shapes").ValidationRule;
73
+ readonly lessThan: (limit: number) => import("./shapes").ValidationRule;
74
+ readonly matches: (pattern: RegExp) => import("./shapes").ValidationRule;
75
+ readonly max: (limit: number) => import("./shapes").ValidationRule;
76
+ readonly maxKeys: (maximum: number) => import("./shapes").ValidationRule;
77
+ readonly maxLength: (max: number) => import("./shapes").ValidationRule;
78
+ readonly min: (limit: number) => import("./shapes").ValidationRule;
79
+ readonly minKeys: (minimum: number) => import("./shapes").ValidationRule;
80
+ readonly minLength: (min: number) => import("./shapes").ValidationRule;
81
+ readonly missingKey: (requiredKeys: readonly string[]) => import("./shapes").ValidationRule;
82
+ readonly moreThan: (limit: number) => import("./shapes").ValidationRule;
83
+ readonly negative: import("./shapes").ValidationRule;
84
+ readonly noEmptyArrayValues: import("./shapes").ValidationRule;
85
+ readonly noEmptyObjectValues: import("./shapes").ValidationRule;
86
+ readonly noEmptyStringItems: import("./shapes").ValidationRule;
87
+ readonly noLeadSpace: import("./shapes").ValidationRule;
88
+ readonly noNullItems: import("./shapes").ValidationRule;
89
+ readonly noNullValues: import("./shapes").ValidationRule;
90
+ readonly noRepeatSpace: import("./shapes").ValidationRule;
91
+ readonly noSpace: import("./shapes").ValidationRule;
92
+ readonly noTrailSpace: import("./shapes").ValidationRule;
93
+ readonly noUndefinedItems: import("./shapes").ValidationRule;
94
+ readonly noUndefinedValues: import("./shapes").ValidationRule;
95
+ readonly nonEmpty: import("./shapes").ValidationRule;
96
+ readonly nonEmptyArray: import("./shapes").ValidationRule;
97
+ readonly nonEmptyObject: import("./shapes").ValidationRule;
98
+ readonly nonNegative: import("./shapes").ValidationRule;
99
+ readonly nonPositive: import("./shapes").ValidationRule;
100
+ readonly notAfter: (max: Date) => import("./shapes").ValidationRule;
101
+ readonly notBefore: (min: Date) => import("./shapes").ValidationRule;
102
+ readonly notOneOf: (disallowed: readonly string[]) => import("./shapes").ValidationRule;
103
+ readonly notSparse: import("./shapes").ValidationRule;
104
+ readonly number: import("./shapes").ValidationRule;
105
+ readonly numString: import("./shapes").ValidationRule;
106
+ readonly oneOf: (allowed: readonly string[]) => import("./shapes").ValidationRule;
107
+ readonly onlyKeys: (allowed: readonly string[]) => import("./shapes").ValidationRule;
108
+ readonly plainObject: import("./shapes").ValidationRule;
109
+ readonly positive: import("./shapes").ValidationRule;
110
+ readonly safeInteger: import("./shapes").ValidationRule;
111
+ readonly sameDay: (other: Date) => import("./shapes").ValidationRule;
112
+ readonly sameMonth: (other: Date) => import("./shapes").ValidationRule;
113
+ readonly sameYear: (other: Date) => import("./shapes").ValidationRule;
114
+ readonly startsWith: (prefix: string) => import("./shapes").ValidationRule;
115
+ readonly string: import("./shapes").ValidationRule;
116
+ readonly tooEarly: (min: Date) => import("./shapes").ValidationRule;
117
+ readonly tooLate: (max: Date) => import("./shapes").ValidationRule;
118
+ readonly trimmed: import("./shapes").ValidationRule;
119
+ readonly weekday: (required: number) => import("./shapes").ValidationRule;
120
+ readonly weekend: import("./shapes").ValidationRule;
121
+ };
122
+ readonly parsers: {
123
+ readonly numeric: import("./shapes").ParseRule<unknown>;
124
+ readonly integer: import("./shapes").ParseRule<unknown>;
125
+ readonly boolean: import("./shapes").ParseRule<unknown>;
126
+ readonly bigint: import("./shapes").ParseRule<unknown>;
127
+ readonly hex: import("./shapes").ParseRule<unknown>;
128
+ readonly binary: import("./shapes").ParseRule<unknown>;
129
+ readonly octal: import("./shapes").ParseRule<unknown>;
130
+ readonly date: import("./shapes").ParseRule<unknown>;
131
+ readonly json: import("./shapes").ParseRule<unknown>;
132
+ readonly array: import("./shapes").ParseRule<unknown>;
133
+ readonly object: import("./shapes").ParseRule<unknown>;
134
+ readonly url: import("./shapes").ParseRule<string>;
135
+ readonly duration: import("./shapes").ParseRule<unknown>;
136
+ readonly scientific: import("./shapes").ParseRule<unknown>;
137
+ };
138
+ };