@uwmd/core 1.1.0
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.
- package/README.md +79 -0
- package/dist/agents/bancroft.d.ts +32 -0
- package/dist/agents/bancroft.d.ts.map +1 -0
- package/dist/agents/bancroft.js +292 -0
- package/dist/agents/bancroft.js.map +1 -0
- package/dist/agents/schemas.d.ts +13 -0
- package/dist/agents/schemas.d.ts.map +1 -0
- package/dist/agents/schemas.js +74 -0
- package/dist/agents/schemas.js.map +1 -0
- package/dist/bindings.d.ts +85 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +293 -0
- package/dist/bindings.js.map +1 -0
- package/dist/browser.d.ts +66 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +53 -0
- package/dist/browser.js.map +1 -0
- package/dist/calc/builtins.d.ts +4 -0
- package/dist/calc/builtins.d.ts.map +1 -0
- package/dist/calc/builtins.js +329 -0
- package/dist/calc/builtins.js.map +1 -0
- package/dist/calc/dependencies.d.ts +34 -0
- package/dist/calc/dependencies.d.ts.map +1 -0
- package/dist/calc/dependencies.js +101 -0
- package/dist/calc/dependencies.js.map +1 -0
- package/dist/calc/errors.d.ts +8 -0
- package/dist/calc/errors.d.ts.map +1 -0
- package/dist/calc/errors.js +18 -0
- package/dist/calc/errors.js.map +1 -0
- package/dist/calc/evaluator.d.ts +5 -0
- package/dist/calc/evaluator.d.ts.map +1 -0
- package/dist/calc/evaluator.js +184 -0
- package/dist/calc/evaluator.js.map +1 -0
- package/dist/calc/index.d.ts +14 -0
- package/dist/calc/index.d.ts.map +1 -0
- package/dist/calc/index.js +56 -0
- package/dist/calc/index.js.map +1 -0
- package/dist/calc/parser.d.ts +32 -0
- package/dist/calc/parser.d.ts.map +1 -0
- package/dist/calc/parser.js +361 -0
- package/dist/calc/parser.js.map +1 -0
- package/dist/cascade.d.ts +85 -0
- package/dist/cascade.d.ts.map +1 -0
- package/dist/cascade.js +172 -0
- package/dist/cascade.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +843 -0
- package/dist/cli.js.map +1 -0
- package/dist/codec.d.ts +25 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +62 -0
- package/dist/codec.js.map +1 -0
- package/dist/codecs.d.ts +6 -0
- package/dist/codecs.d.ts.map +1 -0
- package/dist/codecs.js +12 -0
- package/dist/codecs.js.map +1 -0
- package/dist/compactor.d.ts +11 -0
- package/dist/compactor.d.ts.map +1 -0
- package/dist/compactor.js +84 -0
- package/dist/compactor.js.map +1 -0
- package/dist/context-profiles.d.ts +30 -0
- package/dist/context-profiles.d.ts.map +1 -0
- package/dist/context-profiles.js +225 -0
- package/dist/context-profiles.js.map +1 -0
- package/dist/context.d.ts +55 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +288 -0
- package/dist/context.js.map +1 -0
- package/dist/dcf.d.ts +9 -0
- package/dist/dcf.d.ts.map +1 -0
- package/dist/dcf.js +75 -0
- package/dist/dcf.js.map +1 -0
- package/dist/debt.d.ts +11 -0
- package/dist/debt.d.ts.map +1 -0
- package/dist/debt.js +85 -0
- package/dist/debt.js.map +1 -0
- package/dist/defaults.d.ts +104 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +622 -0
- package/dist/defaults.js.map +1 -0
- package/dist/derived.d.ts +17 -0
- package/dist/derived.d.ts.map +1 -0
- package/dist/derived.js +29 -0
- package/dist/derived.js.map +1 -0
- package/dist/editor.d.ts +76 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +502 -0
- package/dist/editor.js.map +1 -0
- package/dist/envelope.d.ts +51 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +213 -0
- package/dist/envelope.js.map +1 -0
- package/dist/format.d.ts +60 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +115 -0
- package/dist/format.js.map +1 -0
- package/dist/gaps.d.ts +62 -0
- package/dist/gaps.d.ts.map +1 -0
- package/dist/gaps.js +272 -0
- package/dist/gaps.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +15 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +169 -0
- package/dist/init.js.map +1 -0
- package/dist/integrity-canonical.d.ts +17 -0
- package/dist/integrity-canonical.d.ts.map +1 -0
- package/dist/integrity-canonical.js +124 -0
- package/dist/integrity-canonical.js.map +1 -0
- package/dist/integrity.d.ts +54 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +244 -0
- package/dist/integrity.js.map +1 -0
- package/dist/modules.d.ts +24 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +322 -0
- package/dist/modules.js.map +1 -0
- package/dist/negotiation.d.ts +19 -0
- package/dist/negotiation.d.ts.map +1 -0
- package/dist/negotiation.js +70 -0
- package/dist/negotiation.js.map +1 -0
- package/dist/opstatement.d.ts +9 -0
- package/dist/opstatement.d.ts.map +1 -0
- package/dist/opstatement.js +80 -0
- package/dist/opstatement.js.map +1 -0
- package/dist/packs/excel-emit.d.ts +21 -0
- package/dist/packs/excel-emit.d.ts.map +1 -0
- package/dist/packs/excel-emit.js +135 -0
- package/dist/packs/excel-emit.js.map +1 -0
- package/dist/packs/index.d.ts +13 -0
- package/dist/packs/index.d.ts.map +1 -0
- package/dist/packs/index.js +37 -0
- package/dist/packs/index.js.map +1 -0
- package/dist/packs/industrial.d.ts +3 -0
- package/dist/packs/industrial.d.ts.map +1 -0
- package/dist/packs/industrial.js +115 -0
- package/dist/packs/industrial.js.map +1 -0
- package/dist/packs/multifamily.d.ts +3 -0
- package/dist/packs/multifamily.d.ts.map +1 -0
- package/dist/packs/multifamily.js +82 -0
- package/dist/packs/multifamily.js.map +1 -0
- package/dist/packs/office.d.ts +3 -0
- package/dist/packs/office.d.ts.map +1 -0
- package/dist/packs/office.js +108 -0
- package/dist/packs/office.js.map +1 -0
- package/dist/packs/retail.d.ts +3 -0
- package/dist/packs/retail.d.ts.map +1 -0
- package/dist/packs/retail.js +115 -0
- package/dist/packs/retail.js.map +1 -0
- package/dist/packs/self-storage.d.ts +3 -0
- package/dist/packs/self-storage.d.ts.map +1 -0
- package/dist/packs/self-storage.js +105 -0
- package/dist/packs/self-storage.js.map +1 -0
- package/dist/parser.d.ts +15 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +430 -0
- package/dist/parser.js.map +1 -0
- package/dist/protocol.d.ts +389 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +714 -0
- package/dist/protocol.js.map +1 -0
- package/dist/refinement.d.ts +63 -0
- package/dist/refinement.d.ts.map +1 -0
- package/dist/refinement.js +242 -0
- package/dist/refinement.js.map +1 -0
- package/dist/renderer.d.ts +22 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +478 -0
- package/dist/renderer.js.map +1 -0
- package/dist/rentroll.d.ts +21 -0
- package/dist/rentroll.d.ts.map +1 -0
- package/dist/rentroll.js +256 -0
- package/dist/rentroll.js.map +1 -0
- package/dist/report.d.ts +29 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +924 -0
- package/dist/report.js.map +1 -0
- package/dist/runner.d.ts +43 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +288 -0
- package/dist/runner.js.map +1 -0
- package/dist/sourcesuses.d.ts +14 -0
- package/dist/sourcesuses.d.ts.map +1 -0
- package/dist/sourcesuses.js +63 -0
- package/dist/sourcesuses.js.map +1 -0
- package/dist/types.d.ts +248 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/uwcsv.d.ts +23 -0
- package/dist/uwcsv.d.ts.map +1 -0
- package/dist/uwcsv.js +877 -0
- package/dist/uwcsv.js.map +1 -0
- package/dist/uwjson.d.ts +19 -0
- package/dist/uwjson.d.ts.map +1 -0
- package/dist/uwjson.js +61 -0
- package/dist/uwjson.js.map +1 -0
- package/dist/uwxml.d.ts +18 -0
- package/dist/uwxml.d.ts.map +1 -0
- package/dist/uwxml.js +297 -0
- package/dist/uwxml.js.map +1 -0
- package/dist/validator.d.ts +35 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +553 -0
- package/dist/validator.js.map +1 -0
- package/dist/valuation.d.ts +9 -0
- package/dist/valuation.d.ts.map +1 -0
- package/dist/valuation.js +34 -0
- package/dist/valuation.js.map +1 -0
- package/package.json +58 -0
package/dist/parser.js
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
// .uw.md parser — extracts frontmatter, section blocks, prose, and pipeline log
|
|
2
|
+
// Spec: UW_FORMAT_SPEC_v1.md §2.4 (annotation syntax), §2.7 (update semantics), §2.8 (multi-variant)
|
|
3
|
+
// ─── Regex patterns ───────────────────────────────────────────────────────────
|
|
4
|
+
// Opening fence: ```json uw:section=<id> [key=value ...]
|
|
5
|
+
const FENCE_OPEN_RE = /^```json\s+uw:section=(\S+)(.*)?$/;
|
|
6
|
+
// Closing fence: ``` (alone on line, optional trailing whitespace)
|
|
7
|
+
const FENCE_CLOSE_RE = /^```\s*$/;
|
|
8
|
+
// YAML frontmatter delimiter
|
|
9
|
+
const FRONTMATTER_RE = /^---\s*$/;
|
|
10
|
+
// Key=value pairs in fence annotation (value is any non-whitespace run)
|
|
11
|
+
const KV_RE = /(\w+)=([^\s]+)/g;
|
|
12
|
+
// ─── YAML frontmatter parser ──────────────────────────────────────────────────
|
|
13
|
+
// Deliberately implements a strict YAML SUBSET — see UW_FORMAT_SPEC_v1.md
|
|
14
|
+
// Appendix A "YAML subset" for the full grammar. The supported surface:
|
|
15
|
+
//
|
|
16
|
+
// - Scalars: string (bare or single/double-quoted), number, boolean, null, ~
|
|
17
|
+
// - Mappings: `key: value` and one-level nested `key:` + indented children
|
|
18
|
+
// - Sequences: `- item` lines under a key
|
|
19
|
+
// - Comments: `#` to end of line
|
|
20
|
+
// - Empty inline arrays: `[]`
|
|
21
|
+
//
|
|
22
|
+
// Explicitly REJECTED with UNSUPPORTED_YAML_FEATURE so authors are not lulled
|
|
23
|
+
// into thinking these work:
|
|
24
|
+
//
|
|
25
|
+
// - Anchors and aliases (`&name`, `*name`)
|
|
26
|
+
// - Explicit tags (`!!str`, `!!int`, `!Custom`)
|
|
27
|
+
// - Multi-line literal/folded scalars (`|`, `>`)
|
|
28
|
+
// - Flow-style mappings or sequences (`{a: 1}`, `[1, 2, 3]` other than `[]`)
|
|
29
|
+
// - Complex keys (`?` indicator)
|
|
30
|
+
// - YAML directives (`%YAML`, `%TAG`)
|
|
31
|
+
//
|
|
32
|
+
// Detection runs as a pre-pass on the frontmatter lines so we can point at the
|
|
33
|
+
// exact line that broke the contract.
|
|
34
|
+
const UNSUPPORTED_YAML_PATTERNS = [
|
|
35
|
+
// Anchor / alias indicators: `key: &name value` or `key: *name`. Must follow
|
|
36
|
+
// the colon (or appear at line start as a sequence-item alias).
|
|
37
|
+
{ pattern: /:\s*&\w/, feature: 'YAML anchor (&name)' },
|
|
38
|
+
{ pattern: /:\s*\*\w/, feature: 'YAML alias (*name)' },
|
|
39
|
+
{ pattern: /^\s*-\s*&\w/, feature: 'YAML anchor (&name) on sequence item' },
|
|
40
|
+
{ pattern: /^\s*-\s*\*\w/, feature: 'YAML alias (*name) on sequence item' },
|
|
41
|
+
// Explicit tags: `!!str`, `!!int`, `!Custom`. `!=` and `!==` are valid in
|
|
42
|
+
// strings, so require the next char to be a letter or another `!`.
|
|
43
|
+
{ pattern: /:\s*!!?[A-Za-z]/, feature: 'YAML explicit tag (!! / !)' },
|
|
44
|
+
// Multi-line literal/folded block scalars at end of a `key:` line.
|
|
45
|
+
{ pattern: /:\s*[|>][+-]?\s*(#.*)?$/, feature: 'YAML block scalar (| or >)' },
|
|
46
|
+
// Complex key indicator at start of a line.
|
|
47
|
+
{ pattern: /^\s*\?\s/, feature: 'YAML complex key (?)' },
|
|
48
|
+
// YAML directives.
|
|
49
|
+
{ pattern: /^%(YAML|TAG)\b/, feature: 'YAML directive (%YAML / %TAG)' },
|
|
50
|
+
];
|
|
51
|
+
export class UWMDParseError extends Error {
|
|
52
|
+
code;
|
|
53
|
+
line;
|
|
54
|
+
feature;
|
|
55
|
+
constructor(code, message, opts = {}) {
|
|
56
|
+
super(`[${code}] ${message}`);
|
|
57
|
+
this.name = 'UWMDParseError';
|
|
58
|
+
this.code = code;
|
|
59
|
+
this.line = opts.line;
|
|
60
|
+
this.feature = opts.feature;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function rejectUnsupportedYaml(lines) {
|
|
64
|
+
for (let n = 0; n < lines.length; n++) {
|
|
65
|
+
const line = lines[n];
|
|
66
|
+
// Strip trailing comment so `# anchor` text doesn't false-positive.
|
|
67
|
+
const codePart = stripYamlComment(line);
|
|
68
|
+
for (const { pattern, feature } of UNSUPPORTED_YAML_PATTERNS) {
|
|
69
|
+
if (pattern.test(codePart)) {
|
|
70
|
+
throw new UWMDParseError('UNSUPPORTED_YAML_FEATURE', `Frontmatter line ${n + 1} uses ${feature}, which is not part of the .uw.md YAML subset (see UW_FORMAT_SPEC_v1.md Appendix A).`, { line: n + 1, feature });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function stripYamlComment(line) {
|
|
76
|
+
// Conservative: only strip `#` that follows whitespace AND is not inside
|
|
77
|
+
// a quoted string. Good enough for a frontmatter-rejection pre-pass.
|
|
78
|
+
let inSingle = false;
|
|
79
|
+
let inDouble = false;
|
|
80
|
+
for (let i = 0; i < line.length; i++) {
|
|
81
|
+
const c = line[i];
|
|
82
|
+
if (c === "'" && !inDouble)
|
|
83
|
+
inSingle = !inSingle;
|
|
84
|
+
else if (c === '"' && !inSingle)
|
|
85
|
+
inDouble = !inDouble;
|
|
86
|
+
else if (c === '#' && !inSingle && !inDouble && (i === 0 || /\s/.test(line[i - 1]))) {
|
|
87
|
+
return line.slice(0, i);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return line;
|
|
91
|
+
}
|
|
92
|
+
function parseYamlFrontmatter(text) {
|
|
93
|
+
const result = {};
|
|
94
|
+
const lines = text.split('\n');
|
|
95
|
+
let i = 0;
|
|
96
|
+
while (i < lines.length) {
|
|
97
|
+
const line = lines[i];
|
|
98
|
+
const colonIdx = line.indexOf(':');
|
|
99
|
+
if (colonIdx === -1) {
|
|
100
|
+
i++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const key = line.slice(0, colonIdx).trim();
|
|
104
|
+
const rawVal = line.slice(colonIdx + 1).trim();
|
|
105
|
+
if (!key || key.startsWith('#')) {
|
|
106
|
+
i++;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Array: next lines are " - value" items (check BEFORE nested object)
|
|
110
|
+
if (rawVal === '' && i + 1 < lines.length && lines[i + 1].trim().startsWith('- ')) {
|
|
111
|
+
const arr = [];
|
|
112
|
+
i++;
|
|
113
|
+
while (i < lines.length && lines[i].trim().startsWith('- ')) {
|
|
114
|
+
arr.push(parseScalar(lines[i].trim().slice(2)));
|
|
115
|
+
i++;
|
|
116
|
+
}
|
|
117
|
+
result[key] = arr;
|
|
118
|
+
}
|
|
119
|
+
else if (rawVal === '' && i + 1 < lines.length && lines[i + 1].startsWith(' ') && !lines[i + 1].trim().startsWith('- ')) {
|
|
120
|
+
// Nested object: next lines are indented key: value pairs (not array items)
|
|
121
|
+
const nested = {};
|
|
122
|
+
i++;
|
|
123
|
+
while (i < lines.length && (lines[i].startsWith(' ') || lines[i].trim() === '')) {
|
|
124
|
+
const nLine = lines[i];
|
|
125
|
+
if (nLine.trim() === '' || nLine.trim().startsWith('#')) {
|
|
126
|
+
i++;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (nLine.trim().startsWith('- ')) {
|
|
130
|
+
i++;
|
|
131
|
+
continue;
|
|
132
|
+
} // skip list items in nested context
|
|
133
|
+
const nColon = nLine.indexOf(':');
|
|
134
|
+
if (nColon === -1) {
|
|
135
|
+
i++;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const nKey = nLine.slice(0, nColon).trim();
|
|
139
|
+
const nRaw = nLine.slice(nColon + 1).trim();
|
|
140
|
+
nested[nKey] = parseScalar(nRaw);
|
|
141
|
+
i++;
|
|
142
|
+
}
|
|
143
|
+
result[key] = nested;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
result[key] = parseScalar(rawVal);
|
|
147
|
+
i++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
function parseScalar(raw) {
|
|
153
|
+
if (raw === '' || raw === 'null' || raw === '~')
|
|
154
|
+
return null;
|
|
155
|
+
if (raw === 'true')
|
|
156
|
+
return true;
|
|
157
|
+
if (raw === 'false')
|
|
158
|
+
return false;
|
|
159
|
+
if (raw === '[]')
|
|
160
|
+
return [];
|
|
161
|
+
// Quoted string
|
|
162
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
163
|
+
return raw.slice(1, -1);
|
|
164
|
+
}
|
|
165
|
+
// Number
|
|
166
|
+
const num = Number(raw);
|
|
167
|
+
if (!Number.isNaN(num) && raw !== '')
|
|
168
|
+
return num;
|
|
169
|
+
return raw;
|
|
170
|
+
}
|
|
171
|
+
// ─── Fence annotation parser ──────────────────────────────────────────────────
|
|
172
|
+
function parseFenceAnnotation(sectionId, rest) {
|
|
173
|
+
const annotation = { section: sectionId };
|
|
174
|
+
KV_RE.lastIndex = 0;
|
|
175
|
+
let match = KV_RE.exec(rest);
|
|
176
|
+
while (match !== null) {
|
|
177
|
+
const key = match[1];
|
|
178
|
+
const value = match[2];
|
|
179
|
+
switch (key) {
|
|
180
|
+
case 'v':
|
|
181
|
+
annotation.v = Number.parseInt(value, 10);
|
|
182
|
+
break;
|
|
183
|
+
case 'superseded':
|
|
184
|
+
annotation.superseded = value === 'true';
|
|
185
|
+
break;
|
|
186
|
+
case 'confidence':
|
|
187
|
+
annotation.confidence = value;
|
|
188
|
+
break;
|
|
189
|
+
default:
|
|
190
|
+
annotation[key] = value;
|
|
191
|
+
}
|
|
192
|
+
match = KV_RE.exec(rest);
|
|
193
|
+
}
|
|
194
|
+
return annotation;
|
|
195
|
+
}
|
|
196
|
+
// ─── Multi-variant section IDs ────────────────────────────────────────────────
|
|
197
|
+
// These sections store parallel variants (not superseded — genuinely concurrent).
|
|
198
|
+
const MULTI_VARIANT_SECTIONS = new Set([
|
|
199
|
+
'operating_statement',
|
|
200
|
+
'stress_tests',
|
|
201
|
+
'due_diligence',
|
|
202
|
+
]);
|
|
203
|
+
// Sections routed to dedicated collections rather than the main sections map
|
|
204
|
+
const _RESERVED_SECTION_IDS = new Set([
|
|
205
|
+
'pipeline_log',
|
|
206
|
+
'custom_calculations',
|
|
207
|
+
'custom_scenarios',
|
|
208
|
+
]);
|
|
209
|
+
// ─── Main parse function ──────────────────────────────────────────────────────
|
|
210
|
+
export function parseUWFile(content, options = {}) {
|
|
211
|
+
const { strict = false } = options;
|
|
212
|
+
// `.uw.md` is a portable text format. Strip the CR component of Windows
|
|
213
|
+
// CRLF endings while parsing, but retain `result.raw` byte-for-byte so Tier-2
|
|
214
|
+
// editors can still preserve untouched regions of the source document.
|
|
215
|
+
const lines = content.split(/\r?\n/);
|
|
216
|
+
const result = {
|
|
217
|
+
frontmatter: {},
|
|
218
|
+
sections: {},
|
|
219
|
+
prose: {},
|
|
220
|
+
pipeline_log: [],
|
|
221
|
+
custom_calculations: [],
|
|
222
|
+
custom_scenarios: [],
|
|
223
|
+
extensions: {},
|
|
224
|
+
superseded: {},
|
|
225
|
+
raw: content,
|
|
226
|
+
};
|
|
227
|
+
let i = 0;
|
|
228
|
+
// ── 1. YAML Frontmatter ──────────────────────────────────────────────────────
|
|
229
|
+
if (lines[0]?.trim() === '---') {
|
|
230
|
+
i = 1;
|
|
231
|
+
const yamlLines = [];
|
|
232
|
+
while (i < lines.length && !FRONTMATTER_RE.test(lines[i])) {
|
|
233
|
+
yamlLines.push(lines[i]);
|
|
234
|
+
i++;
|
|
235
|
+
}
|
|
236
|
+
i++; // move past closing ---
|
|
237
|
+
try {
|
|
238
|
+
// Hard reject unsupported YAML features (anchors, tags, block scalars,
|
|
239
|
+
// etc.) regardless of strict mode — these silently produced wrong data
|
|
240
|
+
// before, which is worse than a clean error.
|
|
241
|
+
rejectUnsupportedYaml(yamlLines);
|
|
242
|
+
result.frontmatter = parseYamlFrontmatter(yamlLines.join('\n'));
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
if (err instanceof UWMDParseError)
|
|
246
|
+
throw err;
|
|
247
|
+
if (strict)
|
|
248
|
+
throw new Error(`Frontmatter parse error: ${err}`);
|
|
249
|
+
result.frontmatter._parse_error = String(err);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// ── 2. Body scan ─────────────────────────────────────────────────────────────
|
|
253
|
+
// Collect prose lines between blocks; route each block to the right collection.
|
|
254
|
+
let proseLines = [];
|
|
255
|
+
while (i < lines.length) {
|
|
256
|
+
const line = lines[i];
|
|
257
|
+
const fenceMatch = FENCE_OPEN_RE.exec(line);
|
|
258
|
+
if (!fenceMatch) {
|
|
259
|
+
proseLines.push(line);
|
|
260
|
+
i++;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
// ── We hit a section block ─────────────────────────────────────────────────
|
|
264
|
+
const sectionId = fenceMatch[1];
|
|
265
|
+
const restAnnotation = fenceMatch[2] ?? '';
|
|
266
|
+
const annotation = parseFenceAnnotation(sectionId, restAnnotation);
|
|
267
|
+
const lineStart = i + 1; // 1-indexed
|
|
268
|
+
const capturedProse = proseLines.join('\n').trim();
|
|
269
|
+
proseLines = [];
|
|
270
|
+
// Collect JSON lines until closing ```
|
|
271
|
+
i++;
|
|
272
|
+
const jsonLines = [];
|
|
273
|
+
while (i < lines.length && !FENCE_CLOSE_RE.test(lines[i])) {
|
|
274
|
+
jsonLines.push(lines[i]);
|
|
275
|
+
i++;
|
|
276
|
+
}
|
|
277
|
+
// A recognized UW section fence must be closed. Treating the remainder of
|
|
278
|
+
// the document as malformed JSON in non-strict mode can silently swallow
|
|
279
|
+
// every following section, which is unsafe for an underwriting record.
|
|
280
|
+
if (i >= lines.length) {
|
|
281
|
+
throw new UWMDParseError('UNCLOSED_SECTION_FENCE', `Section '${sectionId}' opened at line ${lineStart} has no closing fence.`, { line: lineStart });
|
|
282
|
+
}
|
|
283
|
+
const lineEnd = i + 1; // 1-indexed, closing ```
|
|
284
|
+
i++; // move past closing ```
|
|
285
|
+
const rawJson = jsonLines.join('\n');
|
|
286
|
+
let parsed;
|
|
287
|
+
try {
|
|
288
|
+
parsed = JSON.parse(rawJson);
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
if (strict) {
|
|
292
|
+
throw new Error(`JSON parse error in section ${sectionId} at line ${lineStart}: ${err}`);
|
|
293
|
+
}
|
|
294
|
+
parsed = { _parse_error: String(err), _raw: rawJson };
|
|
295
|
+
}
|
|
296
|
+
const meta = parsed['_meta'] ?? {};
|
|
297
|
+
const block = {
|
|
298
|
+
annotation,
|
|
299
|
+
meta,
|
|
300
|
+
content: parsed,
|
|
301
|
+
prose: capturedProse,
|
|
302
|
+
rawJson,
|
|
303
|
+
lineStart,
|
|
304
|
+
lineEnd,
|
|
305
|
+
};
|
|
306
|
+
routeBlock(result, block, sectionId, annotation, capturedProse);
|
|
307
|
+
}
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
// ─── Block routing ────────────────────────────────────────────────────────────
|
|
311
|
+
function routeBlock(result, block, sectionId, annotation, prose) {
|
|
312
|
+
// Pipeline log — always append
|
|
313
|
+
if (sectionId === 'pipeline_log') {
|
|
314
|
+
result.pipeline_log.push(block);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
// Custom sections — always append (order matters; last is newest)
|
|
318
|
+
if (sectionId === 'custom_calculations') {
|
|
319
|
+
result.custom_calculations.push(block);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (sectionId === 'custom_scenarios') {
|
|
323
|
+
result.custom_scenarios.push(block);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
// Extension sections (x_ prefix)
|
|
327
|
+
if (sectionId.startsWith('x_')) {
|
|
328
|
+
result.extensions[sectionId] = block;
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
// Explicitly superseded block — goes to superseded archive, not current sections
|
|
332
|
+
if (annotation.superseded === true || block.meta?.superseded === true) {
|
|
333
|
+
if (!result.superseded[sectionId])
|
|
334
|
+
result.superseded[sectionId] = [];
|
|
335
|
+
result.superseded[sectionId].push(block);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
// Multi-variant sections — keyed by variant, multiple concurrent instances allowed
|
|
339
|
+
if (MULTI_VARIANT_SECTIONS.has(sectionId)) {
|
|
340
|
+
const variant = annotation.variant ?? 'default';
|
|
341
|
+
const existing = result.sections[sectionId];
|
|
342
|
+
if (!existing || !isMultiVariantMap(existing)) {
|
|
343
|
+
result.sections[sectionId] = { [variant]: block };
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const variantMap = existing;
|
|
347
|
+
const current = variantMap[variant];
|
|
348
|
+
if (!current) {
|
|
349
|
+
variantMap[variant] = block;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Replace if newer version
|
|
353
|
+
const currentV = current.annotation.v ?? current.meta?.version ?? 1;
|
|
354
|
+
const newV = annotation.v ?? block.meta?.version ?? 1;
|
|
355
|
+
if (newV > currentV) {
|
|
356
|
+
if (!result.superseded[sectionId])
|
|
357
|
+
result.superseded[sectionId] = [];
|
|
358
|
+
result.superseded[sectionId].push(current);
|
|
359
|
+
variantMap[variant] = block;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
if (!result.superseded[sectionId])
|
|
363
|
+
result.superseded[sectionId] = [];
|
|
364
|
+
result.superseded[sectionId].push(block);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
if (!result.prose[sectionId])
|
|
369
|
+
result.prose[sectionId] = prose;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
// Standard single-variant section
|
|
373
|
+
const existing = result.sections[sectionId];
|
|
374
|
+
if (!existing) {
|
|
375
|
+
result.sections[sectionId] = block;
|
|
376
|
+
result.prose[sectionId] = prose;
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
// Resolve version conflict: keep higher version as current
|
|
380
|
+
const existingBlock = existing;
|
|
381
|
+
const existingV = existingBlock.annotation.v ?? existingBlock.meta?.version ?? 1;
|
|
382
|
+
const newV = annotation.v ?? block.meta?.version ?? 1;
|
|
383
|
+
if (newV > existingV) {
|
|
384
|
+
if (!result.superseded[sectionId])
|
|
385
|
+
result.superseded[sectionId] = [];
|
|
386
|
+
result.superseded[sectionId].push(existingBlock);
|
|
387
|
+
result.sections[sectionId] = block;
|
|
388
|
+
result.prose[sectionId] = prose;
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
if (!result.superseded[sectionId])
|
|
392
|
+
result.superseded[sectionId] = [];
|
|
393
|
+
result.superseded[sectionId].push(block);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function isMultiVariantMap(val) {
|
|
397
|
+
if (typeof val !== 'object' || val === null)
|
|
398
|
+
return false;
|
|
399
|
+
// A UWBlock has annotation, meta, content — a variant map has string keys pointing to blocks
|
|
400
|
+
return !('annotation' in val);
|
|
401
|
+
}
|
|
402
|
+
// ─── Convenience: get current block for a section ─────────────────────────────
|
|
403
|
+
export function getSection(parsed, sectionId) {
|
|
404
|
+
const entry = parsed.sections[sectionId];
|
|
405
|
+
if (!entry)
|
|
406
|
+
return null;
|
|
407
|
+
if (isMultiVariantMap(entry))
|
|
408
|
+
return null; // use getSectionVariant for multi-variant
|
|
409
|
+
return entry;
|
|
410
|
+
}
|
|
411
|
+
export function getSectionVariant(parsed, sectionId, variant) {
|
|
412
|
+
const entry = parsed.sections[sectionId];
|
|
413
|
+
if (!entry || !isMultiVariantMap(entry))
|
|
414
|
+
return null;
|
|
415
|
+
return entry[variant] ?? null;
|
|
416
|
+
}
|
|
417
|
+
// ─── Deep get utility (for cross-section checks) ─────────────────────────────
|
|
418
|
+
// Resolves dot-path notation: "noi_model.net_operating_income"
|
|
419
|
+
// Array indices: "dcf.annual_cash_flows[0].net_cash_flow_levered"
|
|
420
|
+
export function deepGet(obj, path) {
|
|
421
|
+
const parts = path.replace(/\[(\d+)\]/g, '.$1').split('.');
|
|
422
|
+
let current = obj;
|
|
423
|
+
for (const part of parts) {
|
|
424
|
+
if (current === null || current === undefined)
|
|
425
|
+
return undefined;
|
|
426
|
+
current = current[part];
|
|
427
|
+
}
|
|
428
|
+
return current;
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|