@metaobjectsdev/render 0.10.0 → 0.11.0-rc.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 (34) hide show
  1. package/README.md +19 -0
  2. package/package.json +1 -1
  3. package/dist/recover/coerce.d.ts +0 -5
  4. package/dist/recover/coerce.d.ts.map +0 -1
  5. package/dist/recover/coerce.js +0 -124
  6. package/dist/recover/coerce.js.map +0 -1
  7. package/dist/recover/json-forgiving-reader.d.ts +0 -5
  8. package/dist/recover/json-forgiving-reader.d.ts.map +0 -1
  9. package/dist/recover/json-forgiving-reader.js +0 -178
  10. package/dist/recover/json-forgiving-reader.js.map +0 -1
  11. package/dist/recover/locate.d.ts +0 -5
  12. package/dist/recover/locate.d.ts.map +0 -1
  13. package/dist/recover/locate.js +0 -75
  14. package/dist/recover/locate.js.map +0 -1
  15. package/dist/recover/recover-map.d.ts +0 -7
  16. package/dist/recover/recover-map.d.ts.map +0 -1
  17. package/dist/recover/recover-map.js +0 -36
  18. package/dist/recover/recover-map.js.map +0 -1
  19. package/dist/recover/recover.d.ts +0 -4
  20. package/dist/recover/recover.d.ts.map +0 -1
  21. package/dist/recover/recover.js +0 -115
  22. package/dist/recover/recover.js.map +0 -1
  23. package/dist/recover/strip.d.ts +0 -2
  24. package/dist/recover/strip.d.ts.map +0 -1
  25. package/dist/recover/strip.js +0 -17
  26. package/dist/recover/strip.js.map +0 -1
  27. package/dist/recover/types.d.ts +0 -117
  28. package/dist/recover/types.d.ts.map +0 -1
  29. package/dist/recover/types.js +0 -124
  30. package/dist/recover/types.js.map +0 -1
  31. package/dist/recover/xml-forgiving-reader.d.ts +0 -2
  32. package/dist/recover/xml-forgiving-reader.d.ts.map +0 -1
  33. package/dist/recover/xml-forgiving-reader.js +0 -79
  34. package/dist/recover/xml-forgiving-reader.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @metaobjectsdev/render
2
+
3
+ Logic-less, deterministic text render engine (Mustache) for MetaObjects templates — provider-resolved partials, format-driven escaping, and stable, snapshot-testable output. Zero runtime dependency on the rest of MetaObjects.
4
+
5
+ Part of the [MetaObjects](https://github.com/metaobjectsdev/metaobjects) monorepo.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @metaobjectsdev/render
11
+ ```
12
+
13
+ ## What it provides
14
+
15
+ - **`render()`** — render a MetaObjects `template.output` / `template.prompt` against a typed payload. Deterministic and cache-stable (no whitespace drift that would silently break exact-prefix prompt-cache hits), so output is snapshot-testable.
16
+ - **Provider-resolved partials + format-driven escaping** (text / html / xml / csv / json / markdown).
17
+ - **`verify()`** — a build-time drift check that every `{{field}}` referenced by a template resolves to a field on its payload value-object; a renamed field fails the build instead of silently degrading a prompt.
18
+
19
+ This engine backs the prompt-construction pillar — the generated `render<Name>()` helpers emitted by `@metaobjectsdev/codegen-ts` wrap it. See the **metaobjects-prompts** skill and the repo `docs/` for authoring `template.*` and payload VOs.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/render",
3
- "version": "0.10.0",
3
+ "version": "0.11.0-rc.1",
4
4
  "description": "Logic-less, deterministic text render engine (Mustache) for MetaObjects templates — provider-resolved partials, format-driven escaping, zero core dependency.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,5 +0,0 @@
1
- import type { FieldSpec, RecoverOptions, RecoveryReport } from "./types.js";
2
- /** Sentinel: the value was present but could not be coerced to the declared kind/vocabulary. */
3
- export declare const MALFORMED: unique symbol;
4
- export declare function coerceValue(raw: string | null, spec: FieldSpec, opts: RecoverOptions, fieldPath: string, report: RecoveryReport): unknown | typeof MALFORMED;
5
- //# sourceMappingURL=coerce.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["../../src/recover/coerce.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5E,gGAAgG;AAChG,eAAO,MAAM,SAAS,EAAE,OAAO,MAA2C,CAAC;AAE3E,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,GACrB,OAAO,GAAG,OAAO,SAAS,CAmC5B"}
@@ -1,124 +0,0 @@
1
- // Stage 7: canonicalize a raw scalar string per its FieldSpec. Returns the MALFORMED
2
- // sentinel when present-but-uncoercible. Mirrors Java Coerce.
3
- //
4
- // Tier-2 divergence (documented, parity with the C# port's KNOWN_GAPS): JS has one
5
- // number type. INT/LONG both truncate toward zero via Math.trunc and return `number`.
6
- // Coercion uses Number(...) + Number.isFinite, NOT Java's Double.parseDouble — so JS
7
- // does NOT accept Java's numeric suffixes ("42d"/"42f") or hex-float literals. The
8
- // load-bearing contract (finite-only acceptance; NaN/±Infinity → MALFORMED; numeric
9
- // classification) is identical across ports.
10
- import { FieldKind, Tolerance } from "./types.js";
11
- /** Sentinel: the value was present but could not be coerced to the declared kind/vocabulary. */
12
- export const MALFORMED = Symbol("recover.coerce.MALFORMED");
13
- export function coerceValue(raw, spec, opts, fieldPath, report) {
14
- if (raw == null)
15
- return MALFORMED;
16
- if (opts.onField != null) {
17
- const hooked = opts.onField(fieldPath, raw, spec);
18
- if (hooked != null) {
19
- report.addCoercion({ fieldPath, from: raw, to: stringify(hooked), kind: "onField" });
20
- return hooked;
21
- }
22
- }
23
- // Per-field runtime normalizer (bounded 20% surface). Keyed by field path, then simple name.
24
- const norm = opts.normalizers[fieldPath] ?? opts.normalizers[spec.name];
25
- if (norm != null) {
26
- const normalized = norm(raw);
27
- if (normalized != null) {
28
- report.addCoercion({ fieldPath, from: raw, to: stringify(normalized), kind: "normalizer" });
29
- return normalized;
30
- }
31
- }
32
- const ci = opts.tolerance !== Tolerance.STRICT;
33
- switch (spec.kind) {
34
- case FieldKind.ENUM:
35
- return coerceEnum(raw, spec, opts, fieldPath, report, ci);
36
- case FieldKind.INT:
37
- case FieldKind.LONG:
38
- return coerceInt(raw, spec, fieldPath, report);
39
- case FieldKind.DOUBLE:
40
- return coerceDouble(raw, spec, fieldPath, report);
41
- case FieldKind.BOOLEAN:
42
- return coerceBool(raw, ci);
43
- default:
44
- return raw;
45
- }
46
- }
47
- function coerceEnum(raw, spec, opts, path, report, ci) {
48
- if (spec.enumValues != null) {
49
- for (const v of spec.enumValues) {
50
- if (v === raw)
51
- return v;
52
- if (ci && v.toLowerCase() === raw.toLowerCase()) {
53
- report.addCoercion({ fieldPath: path, from: raw, to: v, kind: "case" });
54
- return v;
55
- }
56
- }
57
- }
58
- const schemaTarget = spec.enumAlias == null ? undefined : spec.enumAlias[raw];
59
- const runtimeTarget = opts.aliases[raw];
60
- if (runtimeTarget != null) {
61
- const kind = schemaTarget != null && schemaTarget !== runtimeTarget ? "runtime-alias-override" : "alias";
62
- report.addCoercion({ fieldPath: path, from: raw, to: runtimeTarget, kind });
63
- return runtimeTarget;
64
- }
65
- if (schemaTarget != null) {
66
- report.addCoercion({ fieldPath: path, from: raw, to: schemaTarget, kind: "alias" });
67
- return schemaTarget;
68
- }
69
- return MALFORMED;
70
- }
71
- function coerceInt(raw, spec, path, report) {
72
- const n = parseFiniteNumber(raw);
73
- if (n === null)
74
- return MALFORMED;
75
- return clamp(Math.trunc(n), spec, path, report);
76
- }
77
- function coerceDouble(raw, spec, path, report) {
78
- const n = parseFiniteNumber(raw);
79
- if (n === null)
80
- return MALFORMED;
81
- return clamp(n, spec, path, report);
82
- }
83
- /** Parse a trimmed numeric string; null if empty, non-numeric, or non-finite (NaN/±Infinity). */
84
- function parseFiniteNumber(raw) {
85
- const t = raw.trim();
86
- if (t.length === 0)
87
- return null;
88
- // Reject JS-only radix-prefixed literals (0x.., 0b.., 0o..) that Number() would
89
- // accept but Java/C# numeric parsing rejects → MALFORMED. Keeps cross-port parity.
90
- if (/^[+-]?0[xXbBoO]/.test(t))
91
- return null;
92
- const n = Number(t); // Number("") === 0, hence the empty guard above
93
- return Number.isFinite(n) ? n : null;
94
- }
95
- function clamp(n, spec, path, report) {
96
- let c = n;
97
- if (spec.min != null && c < spec.min)
98
- c = spec.min;
99
- if (spec.max != null && c > spec.max)
100
- c = spec.max;
101
- if (c !== n)
102
- report.addCoercion({ fieldPath: path, from: stringify(n), to: stringify(c), kind: "clamp" });
103
- return c;
104
- }
105
- function coerceBool(raw, ci) {
106
- const t = ci ? raw.trim().toLowerCase() : raw.trim();
107
- switch (t) {
108
- case "true":
109
- case "yes":
110
- case "1":
111
- return true;
112
- case "false":
113
- case "no":
114
- case "0":
115
- return false;
116
- default:
117
- return MALFORMED;
118
- }
119
- }
120
- /** Canonical string form (locale-independent), mirroring Java String.valueOf for the corpus. */
121
- function stringify(v) {
122
- return String(v);
123
- }
124
- //# sourceMappingURL=coerce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../src/recover/coerce.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /** Sentinel: a key appeared in the text but its value was empty/cut-off (present-but-garbled). */
2
- export declare const TRUNCATED: unique symbol;
3
- /** Parse a tolerant JSON object span into a forgiving record. Never throws. */
4
- export declare function readJson(span: string | null | undefined): Record<string, unknown>;
5
- //# sourceMappingURL=json-forgiving-reader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-forgiving-reader.d.ts","sourceRoot":"","sources":["../../src/recover/json-forgiving-reader.ts"],"names":[],"mappings":"AAGA,kGAAkG;AAClG,eAAO,MAAM,SAAS,EAAE,OAAO,MAAyC,CAAC;AA+JzE,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjF"}
@@ -1,178 +0,0 @@
1
- // Stage-4 tolerant JSON reader for the bounded corpus malformation set. Never throws.
2
- // Mirrors Java JsonForgivingReader. The no-hang + TRUNCATED contracts are load-bearing.
3
- /** Sentinel: a key appeared in the text but its value was empty/cut-off (present-but-garbled). */
4
- export const TRUNCATED = Symbol("recover.json.TRUNCATED");
5
- /** A character is JSON-insignificant whitespace. Mirrors Java Character.isWhitespace closely enough for the corpus. */
6
- function isWhitespace(c) {
7
- return c === " " || c === "\t" || c === "\n" || c === "\r" || c === "\f" || c === "\v" || /\s/.test(c);
8
- }
9
- function isLetterOrDigitOrUnderscore(c) {
10
- return /[A-Za-z0-9_]/.test(c);
11
- }
12
- class Reader {
13
- s = "";
14
- i = 0;
15
- read(span) {
16
- this.s = span ?? "";
17
- this.i = 0;
18
- this.ws();
19
- if (this.i >= this.s.length || this.s.charAt(this.i) !== "{")
20
- return {};
21
- const o = this.readValue();
22
- return isPlainObject(o) ? o : {};
23
- }
24
- readValue() {
25
- this.ws();
26
- if (this.i >= this.s.length)
27
- return null;
28
- const c = this.s.charAt(this.i);
29
- if (c === "{")
30
- return this.readObject();
31
- if (c === "[")
32
- return this.readArray();
33
- if (c === '"' || c === "'")
34
- return this.readString(c);
35
- return this.readBareScalar();
36
- }
37
- readObject() {
38
- const m = {};
39
- this.i++; // consume '{'
40
- for (;;) {
41
- this.ws();
42
- if (this.i >= this.s.length)
43
- return m; // truncation
44
- if (this.s.charAt(this.i) === "}") {
45
- this.i++;
46
- return m;
47
- }
48
- const key = this.readKey();
49
- if (key === null)
50
- return m; // truncation mid-key
51
- this.ws();
52
- if (this.i >= this.s.length || this.s.charAt(this.i) !== ":")
53
- return m; // truncation before value
54
- this.i++; // consume ':'
55
- this.ws();
56
- if (this.i >= this.s.length) {
57
- m[key] = TRUNCATED; // value cut off at EOF → present-but-garbled
58
- return m;
59
- }
60
- const v = this.readValue();
61
- if (v === null) {
62
- // present key, empty/zero-width value → present-but-garbled
63
- m[key] = TRUNCATED;
64
- this.ws();
65
- if (this.i < this.s.length && this.s.charAt(this.i) === ",") {
66
- this.i++;
67
- continue;
68
- }
69
- if (this.i < this.s.length && this.s.charAt(this.i) === "}")
70
- this.i++;
71
- return m;
72
- }
73
- m[key] = v;
74
- this.ws();
75
- if (this.i < this.s.length && this.s.charAt(this.i) === ",")
76
- this.i++; // optional/trailing comma
77
- }
78
- }
79
- readArray() {
80
- const xs = [];
81
- this.i++; // consume '['
82
- for (;;) {
83
- this.ws();
84
- if (this.i >= this.s.length)
85
- return xs;
86
- if (this.s.charAt(this.i) === "]") {
87
- this.i++;
88
- return xs;
89
- }
90
- if (this.s.charAt(this.i) === "}") {
91
- this.i++;
92
- return xs;
93
- } // malformed brace-close terminates array
94
- const v = this.readValue();
95
- if (v === null) {
96
- // zero-width / no value → stop (no spin)
97
- this.ws();
98
- if (this.i < this.s.length && (this.s.charAt(this.i) === "]" || this.s.charAt(this.i) === "}"))
99
- this.i++;
100
- return xs;
101
- }
102
- xs.push(v);
103
- this.ws();
104
- if (this.i < this.s.length && this.s.charAt(this.i) === ",")
105
- this.i++;
106
- else if (this.i < this.s.length && this.s.charAt(this.i) === "]") {
107
- this.i++;
108
- return xs;
109
- }
110
- else if (this.i >= this.s.length)
111
- return xs;
112
- else
113
- return xs; // any other non-separator char → stop
114
- }
115
- }
116
- readKey() {
117
- this.ws();
118
- if (this.i >= this.s.length)
119
- return null;
120
- const c = this.s.charAt(this.i);
121
- if (c === '"' || c === "'")
122
- return this.readString(c);
123
- const start = this.i;
124
- while (this.i < this.s.length && isLetterOrDigitOrUnderscore(this.s.charAt(this.i)))
125
- this.i++;
126
- return this.i > start ? this.s.substring(start, this.i) : null;
127
- }
128
- readString(quoteChar) {
129
- this.i++; // opening quote
130
- let sb = "";
131
- let esc = false;
132
- while (this.i < this.s.length) {
133
- const c = this.s.charAt(this.i++);
134
- if (esc) {
135
- sb += unescape(c);
136
- esc = false;
137
- }
138
- else if (c === "\\")
139
- esc = true;
140
- else if (c === quoteChar)
141
- return sb;
142
- else
143
- sb += c;
144
- }
145
- return sb; // unterminated string → return what we have
146
- }
147
- readBareScalar() {
148
- const start = this.i;
149
- while (this.i < this.s.length && ",}]".indexOf(this.s.charAt(this.i)) < 0)
150
- this.i++;
151
- const result = this.s.substring(start, this.i).trim();
152
- return result.length === 0 ? null : result; // null = no token read (zero-width)
153
- }
154
- ws() {
155
- while (this.i < this.s.length && isWhitespace(this.s.charAt(this.i)))
156
- this.i++;
157
- }
158
- }
159
- function unescape(c) {
160
- switch (c) {
161
- case "n":
162
- return "\n";
163
- case "t":
164
- return "\t";
165
- case "r":
166
- return "\r";
167
- default:
168
- return c;
169
- }
170
- }
171
- function isPlainObject(o) {
172
- return typeof o === "object" && o !== null && !Array.isArray(o);
173
- }
174
- /** Parse a tolerant JSON object span into a forgiving record. Never throws. */
175
- export function readJson(span) {
176
- return new Reader().read(span);
177
- }
178
- //# sourceMappingURL=json-forgiving-reader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-forgiving-reader.js","sourceRoot":"","sources":["../../src/recover/json-forgiving-reader.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /** First balanced {...}; if none closes, first '{' to end; null if no '{'. */
2
- export declare function locateJson(text: string | null | undefined): string | null;
3
- /** Span of <root>...</root>; if close absent, opener to end; null if no opener. */
4
- export declare function locateXml(text: string | null | undefined, rootName: string | null | undefined, caseInsensitive: boolean): string | null;
5
- //# sourceMappingURL=locate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"locate.d.ts","sourceRoot":"","sources":["../../src/recover/locate.ts"],"names":[],"mappings":"AAQA,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAWzE;AAyBD,mFAAmF;AACnF,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,eAAe,EAAE,OAAO,GACvB,MAAM,GAAG,IAAI,CAcf"}
@@ -1,75 +0,0 @@
1
- // Stages 2-3: isolate and select the payload root span.
2
- // Selection rule: first-closed-else-first-open. Mirrors Java Locate.
3
- /** Escape regex metacharacters (equivalent of Java Pattern.quote). */
4
- function quote(s) {
5
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
- }
7
- /** First balanced {...}; if none closes, first '{' to end; null if no '{'. */
8
- export function locateJson(text) {
9
- if (text == null)
10
- return null;
11
- let firstOpen = -1;
12
- for (let i = 0; i < text.length; i++) {
13
- if (text.charAt(i) === "{") {
14
- if (firstOpen < 0)
15
- firstOpen = i;
16
- const end = scanBalanced(text, i);
17
- if (end >= 0)
18
- return text.substring(i, end + 1);
19
- }
20
- }
21
- return firstOpen < 0 ? null : text.substring(firstOpen);
22
- }
23
- /** Returns index of the matching '}', or -1 if unterminated. String-aware. */
24
- function scanBalanced(s, open) {
25
- let depth = 0;
26
- let inStr = false;
27
- let esc = false;
28
- for (let i = open; i < s.length; i++) {
29
- const c = s.charAt(i);
30
- if (inStr) {
31
- if (esc)
32
- esc = false;
33
- else if (c === "\\")
34
- esc = true;
35
- else if (c === '"')
36
- inStr = false;
37
- continue;
38
- }
39
- if (c === '"')
40
- inStr = true;
41
- else if (c === "{")
42
- depth++;
43
- else if (c === "}") {
44
- depth--;
45
- if (depth === 0)
46
- return i;
47
- }
48
- }
49
- return -1;
50
- }
51
- /** Span of <root>...</root>; if close absent, opener to end; null if no opener. */
52
- export function locateXml(text, rootName, caseInsensitive) {
53
- if (text == null || rootName == null)
54
- return null;
55
- const flags = caseInsensitive ? "i" : "";
56
- const open = new RegExp(`<${quote(rootName)}(\\s[^>]*)?>`, flags).exec(text);
57
- if (open == null)
58
- return null;
59
- const start = open.index;
60
- const openEnd = open.index + open[0].length;
61
- const closeRe = new RegExp(`</${quote(rootName)}\\s*>`, flags);
62
- closeRe.lastIndex = openEnd;
63
- // Search for the close tag at-or-after the opener's end (Java close.find(open.end())).
64
- const close = matchFrom(closeRe, text, openEnd);
65
- if (close != null)
66
- return text.substring(start, close.index + close[0].length);
67
- return text.substring(start);
68
- }
69
- /** Find the first regex match at index >= `from` (emulates Java Matcher.find(int)). */
70
- function matchFrom(re, text, from) {
71
- const g = new RegExp(re.source, re.flags.includes("g") ? re.flags : re.flags + "g");
72
- g.lastIndex = from;
73
- return g.exec(text);
74
- }
75
- //# sourceMappingURL=locate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../src/recover/locate.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- export declare function asString(d: Record<string, unknown>, k: string): string | null;
2
- export declare function asInt(d: Record<string, unknown>, k: string): number | null;
3
- export declare function asLong(d: Record<string, unknown>, k: string): number | null;
4
- export declare function asDouble(d: Record<string, unknown>, k: string): number | null;
5
- export declare function asBool(d: Record<string, unknown>, k: string): boolean | null;
6
- export declare function asStringList(d: Record<string, unknown>, k: string): (string | null)[] | null;
7
- //# sourceMappingURL=recover-map.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-map.d.ts","sourceRoot":"","sources":["../../src/recover/recover-map.ts"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1E;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7E;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG5E;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAI5F"}
@@ -1,36 +0,0 @@
1
- // Null-safe coercions from a RecoverOutcome data map onto typed values. Generated
2
- // recover(...) calls these. Mirrors Java RecoverMap.
3
- //
4
- // Tier-2 divergence: JS has one number type, so asInt/asLong both return `number | null`
5
- // and truncate toward zero via Math.trunc (Java intValue()/longValue() also truncate).
6
- // The numeric helpers gate on actual numbers (mirroring Java `instanceof Number`): a
7
- // non-numeric string or a boolean returns null rather than coercing.
8
- export function asString(d, k) {
9
- const v = d[k];
10
- if (v == null)
11
- return null;
12
- return typeof v === "string" ? v : String(v);
13
- }
14
- export function asInt(d, k) {
15
- const v = d[k];
16
- return typeof v === "number" && Number.isFinite(v) ? Math.trunc(v) : null;
17
- }
18
- export function asLong(d, k) {
19
- const v = d[k];
20
- return typeof v === "number" && Number.isFinite(v) ? Math.trunc(v) : null;
21
- }
22
- export function asDouble(d, k) {
23
- const v = d[k];
24
- return typeof v === "number" && Number.isFinite(v) ? v : null;
25
- }
26
- export function asBool(d, k) {
27
- const v = d[k];
28
- return typeof v === "boolean" ? v : null;
29
- }
30
- export function asStringList(d, k) {
31
- const v = d[k];
32
- if (!Array.isArray(v))
33
- return null;
34
- return v.map((e) => (e == null ? null : typeof e === "string" ? e : String(e)));
35
- }
36
- //# sourceMappingURL=recover-map.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover-map.js","sourceRoot":"","sources":["../../src/recover/recover-map.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,qDAAqD;AACrD,EAAE;AACF,yFAAyF;AACzF,uFAAuF;AACvF,qFAAqF;AACrF,qEAAqE;AAErE,MAAM,UAAU,QAAQ,CAAC,CAA0B,EAAE,CAAS;IAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAA0B,EAAE,CAAS;IACzD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAA0B,EAAE,CAAS;IAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAA0B,EAAE,CAAS;IAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAA0B,EAAE,CAAS;IAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAA0B,EAAE,CAAS;IAChE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { RecoverOptions, RecoverOutcome, RecoverSchema } from "./types.js";
2
- /** The forgiving entry point: recover dirty `text` against `schema`. Never throws. */
3
- export declare function recover(text: string | null | undefined, schema: RecoverSchema, opts?: Partial<RecoverOptions> | null): RecoverOutcome;
4
- //# sourceMappingURL=recover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover.d.ts","sourceRoot":"","sources":["../../src/recover/recover.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAa,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQ3F,sFAAsF;AACtF,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,GACpC,cAAc,CA0BhB"}
@@ -1,115 +0,0 @@
1
- // Public entry point. Runs the staged pipeline; NEVER throws. Mirrors Java Recover.
2
- import { Format, FieldKind, FieldRecovery, Tolerance, normalizeOptions, } from "./types.js";
3
- import { RecoveryReport } from "./types.js";
4
- import { strip } from "./strip.js";
5
- import { locateJson, locateXml } from "./locate.js";
6
- import { readJson, TRUNCATED } from "./json-forgiving-reader.js";
7
- import { readXml } from "./xml-forgiving-reader.js";
8
- import { coerceValue, MALFORMED } from "./coerce.js";
9
- /** The forgiving entry point: recover dirty `text` against `schema`. Never throws. */
10
- export function recover(text, schema, opts) {
11
- const o = normalizeOptions(opts);
12
- const report = new RecoveryReport();
13
- const data = {};
14
- const stripped = strip(text);
15
- const ci = o.tolerance !== Tolerance.STRICT;
16
- const span = schema.format === Format.JSON ? locateJson(stripped) : locateXml(stripped, schema.rootName, ci);
17
- let raw;
18
- if (span == null) {
19
- raw = {};
20
- }
21
- else if (schema.format === Format.JSON) {
22
- raw = readJson(span);
23
- }
24
- else {
25
- raw = readXml(span, ci);
26
- }
27
- if (isEmptyRecord(raw) && (stripped.length === 0 || span == null)) {
28
- report.markEmpty();
29
- }
30
- extract(schema.fields, raw, "", data, report, o, ci);
31
- return { data, report };
32
- }
33
- function extract(fields, raw, prefix, data, report, o, ci) {
34
- for (const f of fields) {
35
- const path = prefix.length === 0 ? f.name : `${prefix}.${f.name}`;
36
- const present = lookup(raw, f.name, ci);
37
- if (present === undefined) {
38
- report.set(path, f.required ? FieldRecovery.LOST_REQUIRED : FieldRecovery.LOST_OPTIONAL);
39
- continue;
40
- }
41
- if (present === TRUNCATED) {
42
- // present-but-garbled (empty/cut-off value)
43
- report.set(path, FieldRecovery.MALFORMED);
44
- continue;
45
- }
46
- if (f.array) {
47
- // An array field: a single non-list value is treated as a one-element array
48
- // (e.g. a single repeated-XML tag). Each element is coerced/recursed independently.
49
- const elements = Array.isArray(present) ? present : [present];
50
- const out = [];
51
- let anyMalformed = false;
52
- for (let idx = 0; idx < elements.length; idx++) {
53
- const v = extractValue(f, elements[idx], `${path}[${idx}]`, report, o, ci);
54
- if (v === MALFORMED)
55
- anyMalformed = true;
56
- else
57
- out.push(v);
58
- }
59
- // Cross-port contract: a MALFORMED array still places its successfully-coerced
60
- // elements into data (partial recovery), UNLIKE a MALFORMED scalar which is absent.
61
- data[f.name] = out;
62
- report.set(path, anyMalformed ? FieldRecovery.MALFORMED : FieldRecovery.RECOVERED);
63
- continue;
64
- }
65
- if (Array.isArray(present)) {
66
- // a list where a singular value was expected
67
- report.set(path, FieldRecovery.MALFORMED);
68
- continue;
69
- }
70
- const v = extractValue(f, present, path, report, o, ci);
71
- if (v === MALFORMED) {
72
- report.set(path, FieldRecovery.MALFORMED);
73
- }
74
- else {
75
- data[f.name] = v;
76
- report.set(path, FieldRecovery.RECOVERED);
77
- }
78
- }
79
- }
80
- /** Coerce one (non-array) element: nested-object recursion or scalar coercion. Returns MALFORMED on failure. */
81
- function extractValue(f, present, path, report, o, ci) {
82
- if (f.kind === FieldKind.OBJECT) {
83
- if (f.nested != null && isPlainObject(present)) {
84
- const nestedData = {};
85
- extract(f.nested.fields, present, path, nestedData, report, o, ci);
86
- return nestedData;
87
- }
88
- return MALFORMED; // object expected but scalar/non-map present
89
- }
90
- const rawStr = typeof present === "string" ? present : stringifyScalar(present);
91
- return coerceValue(rawStr, f, o, path, report);
92
- }
93
- /** Case-folding lookup honoring tolerance. Returns `undefined` for absent (mirrors Java null). */
94
- function lookup(raw, name, ci) {
95
- if (Object.prototype.hasOwnProperty.call(raw, name))
96
- return raw[name];
97
- if (ci) {
98
- const lower = name.toLowerCase();
99
- for (const k of Object.keys(raw))
100
- if (k.toLowerCase() === lower)
101
- return raw[k];
102
- }
103
- return undefined;
104
- }
105
- function isPlainObject(o) {
106
- return typeof o === "object" && o !== null && !Array.isArray(o);
107
- }
108
- function isEmptyRecord(o) {
109
- return Object.keys(o).length === 0;
110
- }
111
- /** Mirror Java String.valueOf for non-string forgiving-reader scalars. */
112
- function stringifyScalar(v) {
113
- return String(v);
114
- }
115
- //# sourceMappingURL=recover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recover.js","sourceRoot":"","sources":["../../src/recover/recover.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function strip(raw: string | null | undefined): string;
2
- //# sourceMappingURL=strip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"strip.d.ts","sourceRoot":"","sources":["../../src/recover/strip.ts"],"names":[],"mappings":"AAMA,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAU5D"}
@@ -1,17 +0,0 @@
1
- // Stage 1: remove markdown code-fence markers. Prose around the payload is left for Locate.
2
- // Mirrors Java Strip.
3
- // Captures the body inside a fenced block; optional language tag (json/xml/etc) is dropped.
4
- const FENCE = /```[a-zA-Z0-9_-]*\s*\r?\n([\s\S]*?)\r?\n?```/;
5
- export function strip(raw) {
6
- if (raw == null)
7
- return "";
8
- const m = FENCE.exec(raw);
9
- if (m && m.index >= 0) {
10
- const before = raw.substring(0, m.index);
11
- const body = m[1] ?? "";
12
- const after = raw.substring(m.index + m[0].length);
13
- return (before + body + after).trim();
14
- }
15
- return raw.trim();
16
- }
17
- //# sourceMappingURL=strip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"strip.js","sourceRoot":"","sources":["../../src/recover/strip.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,sBAAsB;AAEtB,4FAA4F;AAC5F,MAAM,KAAK,GAAG,8CAA8C,CAAC;AAE7D,MAAM,UAAU,KAAK,CAAC,GAA8B;IAClD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -1,117 +0,0 @@
1
- /** Output format the dirty text claims to be. Corpus schema.json uses "JSON"/"XML". */
2
- export declare const Format: {
3
- readonly JSON: "JSON";
4
- readonly XML: "XML";
5
- };
6
- export type Format = (typeof Format)[keyof typeof Format];
7
- /** The coercion target kinds the engine understands. OBJECT = nested RecoverSchema. */
8
- export declare const FieldKind: {
9
- readonly STRING: "STRING";
10
- readonly INT: "INT";
11
- readonly LONG: "LONG";
12
- readonly DOUBLE: "DOUBLE";
13
- readonly BOOLEAN: "BOOLEAN";
14
- readonly ENUM: "ENUM";
15
- readonly OBJECT: "OBJECT";
16
- };
17
- export type FieldKind = (typeof FieldKind)[keyof typeof FieldKind];
18
- /**
19
- * FROZEN cross-port per-field recovery classification. Do not reorder or add
20
- * without an ADR. These string values are SERIALIZED in the conformance corpus.
21
- */
22
- export declare const FieldRecovery: {
23
- readonly RECOVERED: "RECOVERED";
24
- readonly DEFAULTED: "DEFAULTED";
25
- readonly LOST_OPTIONAL: "LOST_OPTIONAL";
26
- readonly LOST_REQUIRED: "LOST_REQUIRED";
27
- readonly MALFORMED: "MALFORMED";
28
- };
29
- export type FieldRecovery = (typeof FieldRecovery)[keyof typeof FieldRecovery];
30
- /**
31
- * STRICT: case-sensitive, minimal repair. NORMAL: case-insensitive keys/tags
32
- * (default). LOOSE: maximal repair (currently identical to NORMAL — reserved).
33
- */
34
- export declare const Tolerance: {
35
- readonly STRICT: "STRICT";
36
- readonly NORMAL: "NORMAL";
37
- readonly LOOSE: "LOOSE";
38
- };
39
- export type Tolerance = (typeof Tolerance)[keyof typeof Tolerance];
40
- /** A recorded normalization/coercion. kind e.g. "alias", "clamp", "case", "runtime-alias-override". */
41
- export interface Coercion {
42
- readonly fieldPath: string;
43
- readonly from: string;
44
- readonly to: string;
45
- readonly kind: string;
46
- }
47
- /**
48
- * One field's recover descriptor. enumValues/enumAlias non-null only for ENUM;
49
- * min/max non-null only for numeric range constraints; nested non-null only for OBJECT.
50
- */
51
- export interface FieldSpec {
52
- readonly name: string;
53
- readonly kind: FieldKind;
54
- readonly required: boolean;
55
- readonly array: boolean;
56
- readonly enumValues: readonly string[] | null;
57
- readonly enumAlias: Readonly<Record<string, string>> | null;
58
- readonly min: number | null;
59
- readonly max: number | null;
60
- readonly nested: RecoverSchema | null;
61
- }
62
- export declare function scalar(name: string, kind: FieldKind, required: boolean): FieldSpec;
63
- export declare function enumField(name: string, required: boolean, values: readonly string[] | null, aliases: Readonly<Record<string, string>> | null): FieldSpec;
64
- export declare function range(name: string, kind: FieldKind, required: boolean, min: number | null, max: number | null): FieldSpec;
65
- export declare function object(name: string, required: boolean, array: boolean, nested: RecoverSchema | null): FieldSpec;
66
- /** Top-level recover descriptor. rootName = the XML root tag / logical JSON root name. */
67
- export interface RecoverSchema {
68
- readonly format: Format;
69
- readonly rootName: string;
70
- readonly fields: readonly FieldSpec[];
71
- }
72
- export declare function recoverSchema(format: Format, rootName: string, fields: readonly FieldSpec[] | null): RecoverSchema;
73
- /**
74
- * ctx carries the field path and the FieldSpec; return null to fall through to
75
- * default coercion. The single bespoke-coercion hook (the bounded "20%").
76
- */
77
- export type OnField = (fieldPath: string, rawValue: string, spec: FieldSpec) => unknown | null;
78
- /**
79
- * Bounded runtime override surface. aliases/normalizers are MERGED with the
80
- * schema's, runtime winning on key conflict. onField is the single hook.
81
- */
82
- export interface RecoverOptions {
83
- readonly tolerance: Tolerance;
84
- readonly aliases: Readonly<Record<string, string>>;
85
- readonly normalizers: Readonly<Record<string, (raw: string) => unknown | null>>;
86
- readonly onField: OnField | null;
87
- }
88
- export declare function defaults(): RecoverOptions;
89
- /** Normalize a partial / undefined options bag into a complete RecoverOptions. */
90
- export declare function normalizeOptions(opts?: Partial<RecoverOptions> | null): RecoverOptions;
91
- /** Engine return. data is a forgiving record; Phase-2 codegen wraps it into a typed RecoveryResult<T>. */
92
- export interface RecoverOutcome {
93
- readonly data: Record<string, unknown>;
94
- readonly report: RecoveryReport;
95
- }
96
- /** Typed result of a generated recover(...): best-effort value (null where lost/malformed) + report. */
97
- export interface RecoveryResult<T> {
98
- readonly data: T | null;
99
- readonly report: RecoveryReport;
100
- }
101
- /** Mutable accumulator of per-field recovery classification, the degenerate-response flag, and coercion notes. */
102
- export declare class RecoveryReport {
103
- private readonly _states;
104
- private readonly _coercions;
105
- private _empty;
106
- set(fieldPath: string, state: FieldRecovery): void;
107
- addCoercion(c: Coercion): void;
108
- markEmpty(): void;
109
- isEmpty(): boolean;
110
- states(): ReadonlyMap<string, FieldRecovery>;
111
- coercions(): readonly Coercion[];
112
- lostRequired(): string[];
113
- malformed(): string[];
114
- hasLostRequired(): boolean;
115
- private byState;
116
- }
117
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/recover/types.ts"],"names":[],"mappings":"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"}
@@ -1,124 +0,0 @@
1
- // FR-010 recover engine — types & model (Tier-2 idiomatic TS port).
2
- //
3
- // Cross-port REFERENCE is the Java engine
4
- // (server/java/render/.../recover/). This file ports the Java records/enums to
5
- // idiomatic TS: enums become string-union `as const` objects (values match the
6
- // corpus / Java enum names exactly), records become readonly interfaces +
7
- // factory functions, and the mutable RecoveryReport is a class.
8
- /** Output format the dirty text claims to be. Corpus schema.json uses "JSON"/"XML". */
9
- export const Format = {
10
- JSON: "JSON",
11
- XML: "XML",
12
- };
13
- /** The coercion target kinds the engine understands. OBJECT = nested RecoverSchema. */
14
- export const FieldKind = {
15
- STRING: "STRING",
16
- INT: "INT",
17
- LONG: "LONG",
18
- DOUBLE: "DOUBLE",
19
- BOOLEAN: "BOOLEAN",
20
- ENUM: "ENUM",
21
- OBJECT: "OBJECT",
22
- };
23
- /**
24
- * FROZEN cross-port per-field recovery classification. Do not reorder or add
25
- * without an ADR. These string values are SERIALIZED in the conformance corpus.
26
- */
27
- export const FieldRecovery = {
28
- RECOVERED: "RECOVERED",
29
- // DEFAULTED is reserved (a future @default-backed value); the engine does not emit it yet.
30
- DEFAULTED: "DEFAULTED",
31
- LOST_OPTIONAL: "LOST_OPTIONAL",
32
- LOST_REQUIRED: "LOST_REQUIRED",
33
- MALFORMED: "MALFORMED",
34
- };
35
- /**
36
- * STRICT: case-sensitive, minimal repair. NORMAL: case-insensitive keys/tags
37
- * (default). LOOSE: maximal repair (currently identical to NORMAL — reserved).
38
- */
39
- export const Tolerance = {
40
- STRICT: "STRICT",
41
- NORMAL: "NORMAL",
42
- LOOSE: "LOOSE",
43
- };
44
- export function scalar(name, kind, required) {
45
- return { name, kind, required, array: false, enumValues: null, enumAlias: null, min: null, max: null, nested: null };
46
- }
47
- export function enumField(name, required, values, aliases) {
48
- return {
49
- name,
50
- kind: FieldKind.ENUM,
51
- required,
52
- array: false,
53
- enumValues: values == null ? null : [...values],
54
- enumAlias: aliases == null ? {} : { ...aliases },
55
- min: null,
56
- max: null,
57
- nested: null,
58
- };
59
- }
60
- export function range(name, kind, required, min, max) {
61
- return { name, kind, required, array: false, enumValues: null, enumAlias: null, min, max, nested: null };
62
- }
63
- export function object(name, required, array, nested) {
64
- return { name, kind: FieldKind.OBJECT, required, array, enumValues: null, enumAlias: null, min: null, max: null, nested };
65
- }
66
- export function recoverSchema(format, rootName, fields) {
67
- return { format, rootName, fields: fields == null ? [] : [...fields] };
68
- }
69
- export function defaults() {
70
- return { tolerance: Tolerance.NORMAL, aliases: {}, normalizers: {}, onField: null };
71
- }
72
- /** Normalize a partial / undefined options bag into a complete RecoverOptions. */
73
- export function normalizeOptions(opts) {
74
- if (opts == null)
75
- return defaults();
76
- return {
77
- tolerance: opts.tolerance ?? Tolerance.NORMAL,
78
- aliases: opts.aliases == null ? {} : { ...opts.aliases },
79
- normalizers: opts.normalizers == null ? {} : { ...opts.normalizers },
80
- onField: opts.onField ?? null,
81
- };
82
- }
83
- /** Mutable accumulator of per-field recovery classification, the degenerate-response flag, and coercion notes. */
84
- export class RecoveryReport {
85
- // Insertion-ordered (Map preserves insertion order, mirroring Java LinkedHashMap).
86
- _states = new Map();
87
- _coercions = [];
88
- _empty = false;
89
- set(fieldPath, state) {
90
- this._states.set(fieldPath, state);
91
- }
92
- addCoercion(c) {
93
- this._coercions.push(c);
94
- }
95
- markEmpty() {
96
- this._empty = true;
97
- }
98
- isEmpty() {
99
- return this._empty;
100
- }
101
- states() {
102
- return new Map(this._states);
103
- }
104
- coercions() {
105
- return [...this._coercions];
106
- }
107
- lostRequired() {
108
- return this.byState(FieldRecovery.LOST_REQUIRED);
109
- }
110
- malformed() {
111
- return this.byState(FieldRecovery.MALFORMED);
112
- }
113
- hasLostRequired() {
114
- return this.lostRequired().length > 0;
115
- }
116
- byState(s) {
117
- const out = [];
118
- for (const [k, v] of this._states)
119
- if (v === s)
120
- out.push(k);
121
- return out;
122
- }
123
- }
124
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recover/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,0CAA0C;AAC1C,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,gEAAgE;AAEhE,uFAAuF;AACvF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACF,CAAC;AAGX,uFAAuF;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACR,CAAC;AAGX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,WAAW;IACtB,2FAA2F;IAC3F,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;CACd,CAAC;AAGX;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACN,CAAC;AA2BX,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,IAAe,EAAE,QAAiB;IACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACvH,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,QAAiB,EACjB,MAAgC,EAChC,OAAgD;IAEhD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ;QACR,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAC/C,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE;QAChD,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAY,EACZ,IAAe,EACf,QAAiB,EACjB,GAAkB,EAClB,GAAkB;IAElB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,QAAiB,EAAE,KAAc,EAAE,MAA4B;IAClG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5H,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB,EAAE,MAAmC;IACjG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;AACzE,CAAC;AAmBD,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACtF,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,IAAqC;IACpE,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,QAAQ,EAAE,CAAC;IACpC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QACxD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QACpE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;KAC9B,CAAC;AACJ,CAAC;AAcD,kHAAkH;AAClH,MAAM,OAAO,cAAc;IACzB,mFAAmF;IAClE,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC3C,UAAU,GAAe,EAAE,CAAC;IACrC,MAAM,GAAG,KAAK,CAAC;IAEvB,GAAG,CAAC,SAAiB,EAAE,KAAoB;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,WAAW,CAAC,CAAW;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,CAAC;IAEO,OAAO,CAAC,CAAgB;QAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export declare function readXml(span: string | null | undefined, caseInsensitive: boolean): Record<string, unknown>;
2
- //# sourceMappingURL=xml-forgiving-reader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xml-forgiving-reader.d.ts","sourceRoot":"","sources":["../../src/recover/xml-forgiving-reader.ts"],"names":[],"mappings":"AAgBA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS1G"}
@@ -1,79 +0,0 @@
1
- // Stage-4 tolerant XML reader for the bounded corpus malformation set. Never throws.
2
- // Mirrors Java XmlForgivingReader. Must not index-out-of-range on a leading close tag.
3
- function quote(s) {
4
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5
- }
6
- /** Find first regex match at index >= `from` (emulates Java Matcher.find(int)). */
7
- function matchFrom(source, flags, text, from) {
8
- const g = new RegExp(source, flags.includes("g") ? flags : flags + "g");
9
- g.lastIndex = from;
10
- return g.exec(text);
11
- }
12
- const OPEN_TAG_SRC = "<([A-Za-z_][A-Za-z0-9_]*)(\\s[^>]*)?>";
13
- export function readXml(span, caseInsensitive) {
14
- const out = {};
15
- if (span == null || span.trim().length === 0)
16
- return out;
17
- const gt = span.indexOf(">");
18
- if (gt < 0)
19
- return out;
20
- const rootEnd = span.lastIndexOf("</");
21
- const inner = span.substring(gt + 1, rootEnd < 0 || rootEnd <= gt ? span.length : rootEnd);
22
- parseChildren(inner, caseInsensitive, out);
23
- return out;
24
- }
25
- function parseChildren(inner, ci, out) {
26
- const flags = ci ? "i" : "";
27
- let pos = 0;
28
- for (;;) {
29
- const m = matchFrom(OPEN_TAG_SRC, flags, inner, pos);
30
- if (m == null)
31
- break;
32
- const tag = m[1] ?? "";
33
- const key = ci ? tag.toLowerCase() : tag;
34
- const contentStart = m.index + m[0].length;
35
- const closeRe = `</${quote(tag)}\\s*>`;
36
- const close = matchFrom(closeRe, flags, inner, contentStart);
37
- let contentEnd;
38
- let next;
39
- if (close != null) {
40
- contentEnd = close.index;
41
- next = close.index + close[0].length;
42
- }
43
- else {
44
- // unclosed tag: recover text up to the next sibling open tag
45
- const sib = matchFrom(OPEN_TAG_SRC, flags, inner, contentStart);
46
- if (sib != null) {
47
- contentEnd = sib.index;
48
- next = contentEnd;
49
- }
50
- else {
51
- contentEnd = inner.length;
52
- next = inner.length;
53
- }
54
- }
55
- const content = inner.substring(contentStart, contentEnd);
56
- const value = content.includes("<") ? nestedOrText(content, ci) : content.trim();
57
- accumulate(out, key, value);
58
- pos = next;
59
- }
60
- }
61
- function nestedOrText(content, ci) {
62
- const nested = {};
63
- parseChildren(content, ci, nested);
64
- return Object.keys(nested).length === 0 ? content.trim() : nested;
65
- }
66
- function accumulate(out, key, value) {
67
- if (!Object.prototype.hasOwnProperty.call(out, key)) {
68
- out[key] = value;
69
- return;
70
- }
71
- const existing = out[key];
72
- if (Array.isArray(existing)) {
73
- existing.push(value);
74
- }
75
- else {
76
- out[key] = [existing, value];
77
- }
78
- }
79
- //# sourceMappingURL=xml-forgiving-reader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xml-forgiving-reader.js","sourceRoot":"","sources":["../../src/recover/xml-forgiving-reader.ts"],"names":[],"mappings":"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"}