@cavelang/canonical 0.31.0 → 0.32.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 CHANGED
@@ -57,6 +57,10 @@ preserves direction and makes reverse reads return the preferred opposite name.
57
57
  - full claim → canonicalized as usual (inverse resolution applies).
58
58
  - **Grouped claims** (§8.4): indented full triples stay independent and
59
59
  link to their parent with the `QUALIFIES` edge role (§13.2's role list).
60
+ - **Recursive prefix shorthand** (§8.5): incomplete headers prefix all
61
+ indented descendants and never materialize claims. Completed leaves retain
62
+ the nearest materialized parent edge, and their stored `raw` text is the
63
+ expanded self-contained claim.
60
64
  - **Declarations**: `A REVERSE B`, `OLD RENAMED-TO NEW`, and `X IS verb`
61
65
  claims update the registry after the line itself is canonicalized.
62
66
 
@@ -70,6 +74,20 @@ preserves direction and makes reverse reads return the preferred opposite name.
70
74
  - `WHEN NOT x`, never `UNLESS` (§8.2);
71
75
  - §3.2 anatomy order: payload, `+/- delta`, `(Nσ)`, contexts, tags,
72
76
  `@ N%` (omitted at 100%), `!`, `; comment`.
77
+ - recursive factoring of adjacent sibling claims through shared incomplete
78
+ prefixes, stopping before a header would itself parse as a complete claim.
79
+
80
+ For example, two canonical rows emit tersely without changing their keys:
81
+
82
+ ```cave
83
+ foo HAS
84
+ a: A
85
+ b: B
86
+ ```
87
+
88
+ The same factoring applies inside qualifier/grouping trees. Transaction
89
+ annotations remain directly above each materialized leaf, so annotated export
90
+ and sync preserve row identity.
73
91
 
74
92
  Emission of a complete canonicalization result is stable:
75
93
  `emit ∘ canonicalize ∘ emit ≡ emit`, and claim keys survive the round trip
@@ -101,6 +119,9 @@ parseable.
101
119
  operator input and CAVE-Q `WHERE value <op> ...` filters are unchanged.
102
120
  - **Three-way negation XOR** for qualifier conditions: inner `NOT`,
103
121
  qualifier-level `NOT`, and `UNLESS` each flip the condition's negation.
122
+ - **Comments do not fan out from headers**: a prefix header comment is
123
+ documentary only. Persisted comments stay on leaf claims, preventing one
124
+ comment from silently becoming metadata on several rows.
104
125
 
105
126
  ## Tests
106
127
 
@@ -178,7 +178,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
178
178
  document.lines.forEach((line, lineIndex) => {
179
179
  switch (line.kind) {
180
180
  case 'claim': {
181
- const { claim, writtenSubject } = buildClaim(line.claim, line.raw, line.line);
181
+ const { claim, writtenSubject } = buildClaim(line.claim, line.expanded ?? line.raw, line.line);
182
182
  const index = append(claim, line.line, writtenSubject, lineIndex);
183
183
  if (line.parent !== undefined) {
184
184
  const parent = byLine.get(line.parent);
@@ -196,7 +196,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
196
196
  return;
197
197
  }
198
198
  const full = { subject: parent.writtenSubject, ...line.body };
199
- const { claim, writtenSubject } = buildClaim(full, line.raw, line.line);
199
+ const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line);
200
200
  append(claim, line.line, writtenSubject, lineIndex);
201
201
  // §8.3: each continuation is an ordinary independent claim, so an
202
202
  // in-band declaration works here exactly as on a full line (§5.4).
@@ -210,7 +210,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
210
210
  return;
211
211
  }
212
212
  const full = conditionOf(line.payload, line.qualifier === 'UNLESS');
213
- const { claim, writtenSubject } = buildClaim(full, line.raw, line.line);
213
+ const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line);
214
214
  const index = append(claim, line.line, writtenSubject, lineIndex);
215
215
  edges.push({ parent: parent.index, role: roleOf[line.qualifier], child: index });
216
216
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/canonicalize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/canonicalize.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAA0B,MAAM,gBAAgB,CAAA;AAC9D,OAAO,KAAK,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAyCtD,gEAAgE;AAChE,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,MAW1C,CAAA;AAgBD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,KAAG,MAC3B,CAAA;AAIZ;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,SAAS,GAAG,MAC1B,CAAA;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,CAAA;CAC1D,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,GAAI,QAAQ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,UAAS,WAAgB,KAAG,MA6CvG,CAAA"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAA0B,MAAM,gBAAgB,CAAA;AAE9D,OAAO,KAAK,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAyCtD,gEAAgE;AAChE,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,MAW1C,CAAA;AAgBD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,KAAG,MAC3B,CAAA;AAIZ;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,SAAS,GAAG,MAC1B,CAAA;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,CAAA;CAC1D,CAAA;AAuHD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,GAAI,QAAQ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,UAAS,WAAgB,KAAG,MAoDvG,CAAA"}
package/dist/src/emit.js CHANGED
@@ -8,6 +8,7 @@
8
8
  * (`QUALIFIES` edges) re-indent as full lines.
9
9
  */
10
10
  import { Claim, Confidence, Tag, Value } from '@cavelang/core';
11
+ import { parseDocument, Token } from '@cavelang/parser';
11
12
  const payloadText = (payload) => {
12
13
  switch (payload.kind) {
13
14
  case 'relation':
@@ -86,6 +87,82 @@ const txLineRe = /^\s*;@\s+(\S+)\s*$/;
86
87
  * caller validates the id shape.
87
88
  */
88
89
  export const txOfLine = (raw) => txLineRe.exec(raw)?.[1];
90
+ const tokenText = (token) => {
91
+ switch (token.kind) {
92
+ case 'text':
93
+ return `"${token.text}"`;
94
+ case 'code':
95
+ return `\`${token.text}\``;
96
+ case 'word':
97
+ return token.text;
98
+ }
99
+ };
100
+ const renderParts = (text) => {
101
+ const split = Token.splitComment(text);
102
+ return {
103
+ tokens: Token.tokenize(split.head).map(tokenText),
104
+ ...split.comment === undefined ? {} : { comment: split.comment }
105
+ };
106
+ };
107
+ const commonPrefixLength = (items) => {
108
+ const shortest = Math.min(...items.map(item => item.tokens.length));
109
+ let length = 0;
110
+ while (length < shortest &&
111
+ items.every(item => item.tokens[length] === items[0].tokens[length])) {
112
+ length += 1;
113
+ }
114
+ return length;
115
+ };
116
+ /**
117
+ * A factored header is safe only while the accumulated text is not itself a
118
+ * materialized claim. This is the compatibility boundary with §8's existing
119
+ * indentation: complete lines keep qualifier/continuation/grouping meaning;
120
+ * incomplete lines may be shorthand prefixes (§8.5).
121
+ */
122
+ const isIncomplete = (tokens, topLevel) => {
123
+ const text = tokens.join(' ');
124
+ const document = parseDocument(topLevel ? text : `cave-root IS claim\n ${text}`);
125
+ return document.lines[document.lines.length - 1].kind === 'invalid';
126
+ };
127
+ const emitForest = (forest, depth, topLevel, inherited, lines) => {
128
+ let at = 0;
129
+ while (at < forest.length) {
130
+ const firstToken = forest[at].tokens[0];
131
+ let end = at + 1;
132
+ while (end < forest.length && forest[end].tokens[0] === firstToken) {
133
+ end += 1;
134
+ }
135
+ const run = forest.slice(at, end);
136
+ if (run.length > 1) {
137
+ const common = commonPrefixLength(run);
138
+ const shortest = Math.min(...run.map(item => item.tokens.length));
139
+ const maximum = Math.min(common, shortest - 1);
140
+ let safe = 0;
141
+ for (let length = 1; length <= maximum; length += 1) {
142
+ const candidate = [...inherited, ...run[0].tokens.slice(0, length)];
143
+ if (!isIncomplete(candidate, topLevel)) {
144
+ break;
145
+ }
146
+ safe = length;
147
+ }
148
+ if (safe > 0) {
149
+ const prefix = run[0].tokens.slice(0, safe);
150
+ lines.push(`${' '.repeat(depth)}${prefix.join(' ')}`);
151
+ emitForest(run.map(item => ({ node: item.node, tokens: item.tokens.slice(safe) })), depth + 1, topLevel, [...inherited, ...prefix], lines);
152
+ at = end;
153
+ continue;
154
+ }
155
+ }
156
+ const item = forest[at];
157
+ const indent = ' '.repeat(depth);
158
+ if (item.node.annotation !== undefined) {
159
+ lines.push(`${indent}${item.node.annotation}`);
160
+ }
161
+ lines.push(`${indent}${item.tokens.join(' ')}${item.node.comment === undefined ? '' : ` ; ${item.node.comment}`}`);
162
+ emitForest(item.node.children.map(node => ({ node, tokens: node.tokens })), depth + 1, false, [], lines);
163
+ at += 1;
164
+ }
165
+ };
89
166
  /**
90
167
  * Emits a whole canonicalization result as canonical CAVE text: top-level
91
168
  * claims in claim order, children indented two spaces per level.
@@ -113,39 +190,45 @@ export const emit = (result, options = {}) => {
113
190
  existing.push(edge);
114
191
  }
115
192
  }
116
- const lines = [];
117
193
  const expanded = new Set();
118
- const emitAt = (index, depth, role) => {
194
+ const nodeAt = (index, role) => {
119
195
  const { claim } = result.claims[index];
120
- const indent = ' '.repeat(depth);
196
+ const text = role === undefined || role === 'QUALIFIES' ?
197
+ emitClaim(claim) :
198
+ `${role} ${conditionText(claim)}`;
199
+ const parts = renderParts(text);
121
200
  const annotation = options.annotate?.(index);
122
- if (annotation !== undefined) {
123
- lines.push(`${indent}${annotation}`);
124
- }
125
- if (role === undefined || role === 'QUALIFIES') {
126
- lines.push(`${indent}${emitClaim(claim)}`);
127
- }
128
- else {
129
- lines.push(`${indent}${role} ${conditionText(claim)}`);
130
- }
131
201
  if (expanded.has(index)) {
132
- return;
202
+ return {
203
+ index,
204
+ tokens: parts.tokens,
205
+ ...parts.comment === undefined ? {} : { comment: parts.comment },
206
+ ...annotation === undefined ? {} : { annotation },
207
+ children: []
208
+ };
133
209
  }
134
210
  expanded.add(index);
135
- for (const edge of childEdges.get(index) ?? []) {
136
- emitAt(edge.child, depth + 1, edge.role);
137
- }
211
+ return {
212
+ index,
213
+ tokens: parts.tokens,
214
+ ...parts.comment === undefined ? {} : { comment: parts.comment },
215
+ ...annotation === undefined ? {} : { annotation },
216
+ children: (childEdges.get(index) ?? []).map(edge => nodeAt(edge.child, edge.role))
217
+ };
138
218
  };
219
+ const forest = [];
139
220
  result.claims.forEach((_, index) => {
140
221
  if (!isChild.has(index)) {
141
- emitAt(index, 0, undefined);
222
+ forest.push(nodeAt(index, undefined));
142
223
  }
143
224
  });
144
225
  result.claims.forEach((_, index) => {
145
226
  if (!expanded.has(index)) {
146
- emitAt(index, 0, undefined);
227
+ forest.push(nodeAt(index, undefined));
147
228
  }
148
229
  });
230
+ const lines = [];
231
+ emitForest(forest.map(node => ({ node, tokens: node.tokens })), 0, true, [], lines);
149
232
  return lines.length === 0 ? '' : `${lines.join('\n')}\n`;
150
233
  };
151
234
  //# sourceMappingURL=emit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavelang/canonical",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "type": "module",
5
5
  "description": "CAVE canonicalization — verb lifecycle and inverse registry, continuation expansion, canonical emitter.",
6
6
  "keywords": [
@@ -43,8 +43,8 @@
43
43
  "access": "public"
44
44
  },
45
45
  "dependencies": {
46
- "@cavelang/core": "0.31.0",
47
- "@cavelang/parser": "0.31.0"
46
+ "@cavelang/core": "0.32.0",
47
+ "@cavelang/parser": "0.32.0"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsc -b",
@@ -221,7 +221,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
221
221
  document.lines.forEach((line, lineIndex) => {
222
222
  switch (line.kind) {
223
223
  case 'claim': {
224
- const { claim, writtenSubject } = buildClaim(line.claim, line.raw, line.line)
224
+ const { claim, writtenSubject } = buildClaim(line.claim, line.expanded ?? line.raw, line.line)
225
225
  const index = append(claim, line.line, writtenSubject, lineIndex)
226
226
  if (line.parent !== undefined) {
227
227
  const parent = byLine.get(line.parent)
@@ -239,7 +239,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
239
239
  return
240
240
  }
241
241
  const full: Ast.Full = { subject: parent.writtenSubject, ...line.body }
242
- const { claim, writtenSubject } = buildClaim(full, line.raw, line.line)
242
+ const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line)
243
243
  append(claim, line.line, writtenSubject, lineIndex)
244
244
  // §8.3: each continuation is an ordinary independent claim, so an
245
245
  // in-band declaration works here exactly as on a full line (§5.4).
@@ -253,7 +253,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
253
253
  return
254
254
  }
255
255
  const full = conditionOf(line.payload, line.qualifier === 'UNLESS')
256
- const { claim, writtenSubject } = buildClaim(full, line.raw, line.line)
256
+ const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line)
257
257
  const index = append(claim, line.line, writtenSubject, lineIndex)
258
258
  edges.push({ parent: parent.index, role: roleOf[line.qualifier], child: index })
259
259
  return
package/src/emit.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import { Claim, Confidence, Tag, Value } from '@cavelang/core'
12
+ import { parseDocument, Token } from '@cavelang/parser'
12
13
  import type * as Canonicalize from './canonicalize.ts'
13
14
 
14
15
  const payloadText = (payload: Claim.Payload): undefined | string => {
@@ -108,6 +109,123 @@ export type EmitOptions = {
108
109
  readonly annotate?: (index: number) => undefined | string
109
110
  }
110
111
 
112
+ type RenderNode = {
113
+ readonly index: number
114
+ readonly tokens: readonly string[]
115
+ readonly comment?: string
116
+ readonly annotation?: string
117
+ readonly children: readonly RenderNode[]
118
+ }
119
+
120
+ type RenderItem = {
121
+ readonly node: RenderNode
122
+ readonly tokens: readonly string[]
123
+ }
124
+
125
+ const tokenText = (token: Token.t): string => {
126
+ switch (token.kind) {
127
+ case 'text':
128
+ return `"${token.text}"`
129
+ case 'code':
130
+ return `\`${token.text}\``
131
+ case 'word':
132
+ return token.text
133
+ }
134
+ }
135
+
136
+ const renderParts = (text: string): { tokens: readonly string[], comment?: string } => {
137
+ const split = Token.splitComment(text)
138
+ return {
139
+ tokens: Token.tokenize(split.head).map(tokenText),
140
+ ...split.comment === undefined ? {} : { comment: split.comment }
141
+ }
142
+ }
143
+
144
+ const commonPrefixLength = (items: readonly RenderItem[]): number => {
145
+ const shortest = Math.min(...items.map(item => item.tokens.length))
146
+ let length = 0
147
+ while (
148
+ length < shortest &&
149
+ items.every(item => item.tokens[length] === items[0]!.tokens[length])
150
+ ) {
151
+ length += 1
152
+ }
153
+ return length
154
+ }
155
+
156
+ /**
157
+ * A factored header is safe only while the accumulated text is not itself a
158
+ * materialized claim. This is the compatibility boundary with §8's existing
159
+ * indentation: complete lines keep qualifier/continuation/grouping meaning;
160
+ * incomplete lines may be shorthand prefixes (§8.5).
161
+ */
162
+ const isIncomplete = (tokens: readonly string[], topLevel: boolean): boolean => {
163
+ const text = tokens.join(' ')
164
+ const document = parseDocument(topLevel ? text : `cave-root IS claim\n ${text}`)
165
+ return document.lines[document.lines.length - 1]!.kind === 'invalid'
166
+ }
167
+
168
+ const emitForest = (
169
+ forest: readonly RenderItem[],
170
+ depth: number,
171
+ topLevel: boolean,
172
+ inherited: readonly string[],
173
+ lines: string[]
174
+ ): void => {
175
+ let at = 0
176
+ while (at < forest.length) {
177
+ const firstToken = forest[at]!.tokens[0]
178
+ let end = at + 1
179
+ while (end < forest.length && forest[end]!.tokens[0] === firstToken) {
180
+ end += 1
181
+ }
182
+ const run = forest.slice(at, end)
183
+ if (run.length > 1) {
184
+ const common = commonPrefixLength(run)
185
+ const shortest = Math.min(...run.map(item => item.tokens.length))
186
+ const maximum = Math.min(common, shortest - 1)
187
+ let safe = 0
188
+ for (let length = 1; length <= maximum; length += 1) {
189
+ const candidate = [...inherited, ...run[0]!.tokens.slice(0, length)]
190
+ if (!isIncomplete(candidate, topLevel)) {
191
+ break
192
+ }
193
+ safe = length
194
+ }
195
+ if (safe > 0) {
196
+ const prefix = run[0]!.tokens.slice(0, safe)
197
+ lines.push(`${' '.repeat(depth)}${prefix.join(' ')}`)
198
+ emitForest(
199
+ run.map(item => ({ node: item.node, tokens: item.tokens.slice(safe) })),
200
+ depth + 1,
201
+ topLevel,
202
+ [...inherited, ...prefix],
203
+ lines
204
+ )
205
+ at = end
206
+ continue
207
+ }
208
+ }
209
+
210
+ const item = forest[at]!
211
+ const indent = ' '.repeat(depth)
212
+ if (item.node.annotation !== undefined) {
213
+ lines.push(`${indent}${item.node.annotation}`)
214
+ }
215
+ lines.push(
216
+ `${indent}${item.tokens.join(' ')}${item.node.comment === undefined ? '' : ` ; ${item.node.comment}`}`
217
+ )
218
+ emitForest(
219
+ item.node.children.map(node => ({ node, tokens: node.tokens })),
220
+ depth + 1,
221
+ false,
222
+ [],
223
+ lines
224
+ )
225
+ at += 1
226
+ }
227
+ }
228
+
111
229
  /**
112
230
  * Emits a whole canonicalization result as canonical CAVE text: top-level
113
231
  * claims in claim order, children indented two spaces per level.
@@ -134,37 +252,44 @@ export const emit = (result: Pick<Canonicalize.Result, 'claims' | 'edges'>, opti
134
252
  existing.push(edge)
135
253
  }
136
254
  }
137
- const lines: string[] = []
138
255
  const expanded = new Set<number>()
139
- const emitAt = (index: number, depth: number, role: undefined | Canonicalize.EdgeRole): void => {
256
+ const nodeAt = (index: number, role: undefined | Canonicalize.EdgeRole): RenderNode => {
140
257
  const { claim } = result.claims[index]!
141
- const indent = ' '.repeat(depth)
258
+ const text = role === undefined || role === 'QUALIFIES' ?
259
+ emitClaim(claim) :
260
+ `${role} ${conditionText(claim)}`
261
+ const parts = renderParts(text)
142
262
  const annotation = options.annotate?.(index)
143
- if (annotation !== undefined) {
144
- lines.push(`${indent}${annotation}`)
145
- }
146
- if (role === undefined || role === 'QUALIFIES') {
147
- lines.push(`${indent}${emitClaim(claim)}`)
148
- } else {
149
- lines.push(`${indent}${role} ${conditionText(claim)}`)
150
- }
151
263
  if (expanded.has(index)) {
152
- return
264
+ return {
265
+ index,
266
+ tokens: parts.tokens,
267
+ ...parts.comment === undefined ? {} : { comment: parts.comment },
268
+ ...annotation === undefined ? {} : { annotation },
269
+ children: []
270
+ }
153
271
  }
154
272
  expanded.add(index)
155
- for (const edge of childEdges.get(index) ?? []) {
156
- emitAt(edge.child, depth + 1, edge.role)
273
+ return {
274
+ index,
275
+ tokens: parts.tokens,
276
+ ...parts.comment === undefined ? {} : { comment: parts.comment },
277
+ ...annotation === undefined ? {} : { annotation },
278
+ children: (childEdges.get(index) ?? []).map(edge => nodeAt(edge.child, edge.role))
157
279
  }
158
280
  }
281
+ const forest: RenderNode[] = []
159
282
  result.claims.forEach((_, index) => {
160
283
  if (!isChild.has(index)) {
161
- emitAt(index, 0, undefined)
284
+ forest.push(nodeAt(index, undefined))
162
285
  }
163
286
  })
164
287
  result.claims.forEach((_, index) => {
165
288
  if (!expanded.has(index)) {
166
- emitAt(index, 0, undefined)
289
+ forest.push(nodeAt(index, undefined))
167
290
  }
168
291
  })
292
+ const lines: string[] = []
293
+ emitForest(forest.map(node => ({ node, tokens: node.tokens })), 0, true, [], lines)
169
294
  return lines.length === 0 ? '' : `${lines.join('\n')}\n`
170
295
  }