@markup-carve/carve-lsp 0.1.4 → 0.1.7

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 (82) hide show
  1. package/README.md +41 -21
  2. package/dist/analyze.js +46 -8
  3. package/dist/analyze.js.map +1 -1
  4. package/dist/analyze.test.js +5 -4
  5. package/dist/analyze.test.js.map +1 -1
  6. package/dist/definition.d.ts +1 -1
  7. package/dist/definition.js +76 -0
  8. package/dist/definition.js.map +1 -1
  9. package/dist/include-completion.js +226 -30
  10. package/dist/include-completion.js.map +1 -1
  11. package/dist/include-completion.test.js +266 -7
  12. package/dist/include-completion.test.js.map +1 -1
  13. package/dist/include-definition.js +31 -4
  14. package/dist/include-definition.js.map +1 -1
  15. package/dist/include-denial.d.ts +33 -0
  16. package/dist/include-denial.js +41 -0
  17. package/dist/include-denial.js.map +1 -0
  18. package/dist/include-denial.test.d.ts +1 -0
  19. package/dist/include-denial.test.js +126 -0
  20. package/dist/include-denial.test.js.map +1 -0
  21. package/dist/include-directive.js +118 -11
  22. package/dist/include-directive.js.map +1 -1
  23. package/dist/include-directive.test.js +42 -0
  24. package/dist/include-directive.test.js.map +1 -1
  25. package/dist/include-merge-diagnostics.test.d.ts +1 -0
  26. package/dist/include-merge-diagnostics.test.js +220 -0
  27. package/dist/include-merge-diagnostics.test.js.map +1 -0
  28. package/dist/include-path.d.ts +11 -6
  29. package/dist/include-path.js +10 -1
  30. package/dist/include-path.js.map +1 -1
  31. package/dist/include-path.test.js +23 -0
  32. package/dist/include-path.test.js.map +1 -1
  33. package/dist/include-resolver-guards.test.d.ts +1 -0
  34. package/dist/include-resolver-guards.test.js +227 -0
  35. package/dist/include-resolver-guards.test.js.map +1 -0
  36. package/dist/include-root-containment.test.d.ts +1 -0
  37. package/dist/include-root-containment.test.js +169 -0
  38. package/dist/include-root-containment.test.js.map +1 -0
  39. package/dist/include-seam-mapping.test.d.ts +1 -0
  40. package/dist/include-seam-mapping.test.js +181 -0
  41. package/dist/include-seam-mapping.test.js.map +1 -0
  42. package/dist/include-seam-navigation.test.d.ts +1 -0
  43. package/dist/include-seam-navigation.test.js +141 -0
  44. package/dist/include-seam-navigation.test.js.map +1 -0
  45. package/dist/include-security-conformance.test.js +281 -35
  46. package/dist/include-security-conformance.test.js.map +1 -1
  47. package/dist/include-selection-diagnostics.test.d.ts +1 -0
  48. package/dist/include-selection-diagnostics.test.js +120 -0
  49. package/dist/include-selection-diagnostics.test.js.map +1 -0
  50. package/dist/include-selection-navigation.test.d.ts +1 -0
  51. package/dist/include-selection-navigation.test.js +75 -0
  52. package/dist/include-selection-navigation.test.js.map +1 -0
  53. package/dist/include-selection.d.ts +14 -0
  54. package/dist/include-selection.js +67 -0
  55. package/dist/include-selection.js.map +1 -0
  56. package/dist/include-settings.d.ts +47 -2
  57. package/dist/include-settings.js +69 -6
  58. package/dist/include-settings.js.map +1 -1
  59. package/dist/include-settings.test.js +118 -0
  60. package/dist/include-settings.test.js.map +1 -1
  61. package/dist/includes.d.ts +112 -6
  62. package/dist/includes.js +375 -134
  63. package/dist/includes.js.map +1 -1
  64. package/dist/lsp-stdio-client.d.ts +33 -0
  65. package/dist/lsp-stdio-client.js +92 -0
  66. package/dist/lsp-stdio-client.js.map +1 -0
  67. package/dist/position-encoding.test.js +97 -1
  68. package/dist/position-encoding.test.js.map +1 -1
  69. package/dist/position.d.ts +11 -0
  70. package/dist/position.js +23 -0
  71. package/dist/position.js.map +1 -1
  72. package/dist/preview-includes.test.d.ts +1 -0
  73. package/dist/preview-includes.test.js +141 -0
  74. package/dist/preview-includes.test.js.map +1 -0
  75. package/dist/preview.d.ts +7 -0
  76. package/dist/preview.js +14 -0
  77. package/dist/preview.js.map +1 -0
  78. package/dist/server-capabilities.test.js +3 -56
  79. package/dist/server-capabilities.test.js.map +1 -1
  80. package/dist/server.js +22 -7
  81. package/dist/server.js.map +1 -1
  82. package/package.json +2 -2
@@ -0,0 +1,220 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { resolveIncludes } from './includes.js';
4
+ /*
5
+ * The four §19 degradations that only exist once the child is MERGED into the
6
+ * parent. None of them is decidable from the graph: a heading level clamps
7
+ * against the shift the parent asked for, an id or a footnote label collides
8
+ * with what the parent already claimed, and block content is only wrong
9
+ * because of the position the directive sits in.
10
+ *
11
+ * The server walked the graph and could report none of them. Delegating to the
12
+ * engine's expansion pass is what makes them reachable, so each one is pinned
13
+ * here at the seam this server publishes from.
14
+ */
15
+ function virtualResolver(files) {
16
+ return (includePath) => {
17
+ const source = files[includePath];
18
+ if (source === undefined)
19
+ return { ok: false, id: includePath, denial: 'not-found' };
20
+ return { ok: true, id: includePath, source, bytes: Buffer.byteLength(source, 'utf8') };
21
+ };
22
+ }
23
+ const rules = (warnings) => warnings.map((warning) => warning.rule);
24
+ // --- a heading shifted past level 6 --------------------------------------
25
+ test('a heading shifted past level 6 is reported as clamped', () => {
26
+ const result = resolveIncludes('{{ a @shift:+3 }}', {
27
+ resolver: virtualResolver({ a: '##### Deep\n' }),
28
+ });
29
+ assert.deepEqual(rules(result.warnings), ['include-heading-clamp']);
30
+ });
31
+ test('the clamp names the level it asked for and the level it got', () => {
32
+ const result = resolveIncludes('{{ a @shift:+3 }}', {
33
+ resolver: virtualResolver({ a: '##### Deep\n' }),
34
+ });
35
+ assert.match(result.warnings[0]?.message ?? '', /8 was clamped to 6/);
36
+ });
37
+ test('a shift that stays inside the range clamps nothing', () => {
38
+ const result = resolveIncludes('{{ a @shift:+1 }}', {
39
+ resolver: virtualResolver({ a: '##### Deep\n' }),
40
+ });
41
+ assert.deepEqual(result.warnings, []);
42
+ });
43
+ test('a clamp is attributed to the child, and anchored on the root directive', () => {
44
+ const source = 'Lead.\n\n{{ a @shift:+3 }}\n';
45
+ const result = resolveIncludes(source, {
46
+ resolver: virtualResolver({ a: '##### Deep\n' }),
47
+ sourcePath: '/root.crv',
48
+ });
49
+ const warning = result.warnings[0];
50
+ assert.equal(warning?.file, 'a');
51
+ assert.equal(warning?.start, source.indexOf('{{ a @shift:+3 }}'));
52
+ });
53
+ test('a clamp carries the position inside the child it happened in', () => {
54
+ const result = resolveIncludes('{{ a @shift:+3 }}', {
55
+ resolver: virtualResolver({ a: 'Intro.\n\n##### Deep\n' }),
56
+ sourcePath: '/root.crv',
57
+ });
58
+ assert.equal(result.warnings[0]?.within?.line, 3);
59
+ });
60
+ // --- a heading id the parent already claimed ------------------------------
61
+ test('an id the parent already claimed is reported as renamed', () => {
62
+ const result = resolveIncludes('{#intro}\n# Parent\n\n{{ a }}\n', {
63
+ resolver: virtualResolver({ a: '{#intro}\n# Child\n' }),
64
+ });
65
+ assert.deepEqual(rules(result.warnings), ['include-heading-id-rename']);
66
+ });
67
+ test('the rename names both the taken id and the one it was given', () => {
68
+ const result = resolveIncludes('{#intro}\n# Parent\n\n{{ a }}\n', {
69
+ resolver: virtualResolver({ a: '{#intro}\n# Child\n' }),
70
+ });
71
+ assert.match(result.warnings[0]?.message ?? '', /"intro" was renamed to "intro-2"/);
72
+ });
73
+ test('an id nothing else claims is left alone', () => {
74
+ const result = resolveIncludes('{#intro}\n# Parent\n\n{{ a }}\n', {
75
+ resolver: virtualResolver({ a: '{#body}\n# Child\n' }),
76
+ });
77
+ assert.deepEqual(result.warnings, []);
78
+ });
79
+ // --- a footnote label the parent already defined --------------------------
80
+ test('a footnote label the parent already defined is reported as renamed', () => {
81
+ const result = resolveIncludes('Parent[^a].\n\n[^a]: Parent note.\n\n{{ a }}\n', {
82
+ resolver: virtualResolver({ a: 'Child[^a].\n\n[^a]: Child note.\n' }),
83
+ });
84
+ assert.deepEqual(rules(result.warnings), ['include-footnote-rename']);
85
+ });
86
+ test('a footnote rename is attributed to the child that carried the label', () => {
87
+ const result = resolveIncludes('Parent[^a].\n\n[^a]: Parent note.\n\n{{ a }}\n', {
88
+ resolver: virtualResolver({ a: 'Child[^a].\n\n[^a]: Child note.\n' }),
89
+ sourcePath: '/root.crv',
90
+ });
91
+ assert.equal(result.warnings[0]?.file, 'a');
92
+ });
93
+ test('a label nothing else defines is left alone', () => {
94
+ const result = resolveIncludes('Parent[^a].\n\n[^a]: Parent note.\n\n{{ a }}\n', {
95
+ resolver: virtualResolver({ a: 'Child[^b].\n\n[^b]: Child note.\n' }),
96
+ });
97
+ assert.deepEqual(result.warnings, []);
98
+ });
99
+ // --- block content at an inline position ----------------------------------
100
+ test('an inline directive resolving to block content is reported', () => {
101
+ const result = resolveIncludes('See {{ a }} here.\n', {
102
+ resolver: virtualResolver({ a: '# Heading\n\nBody.\n' }),
103
+ });
104
+ assert.deepEqual(rules(result.warnings), ['include-block-in-inline']);
105
+ });
106
+ test('an inline directive resolving to one paragraph is silent', () => {
107
+ const result = resolveIncludes('See {{ a }} here.\n', {
108
+ resolver: virtualResolver({ a: 'just a phrase\n' }),
109
+ });
110
+ assert.deepEqual(result.warnings, []);
111
+ });
112
+ test('the same block child at a BLOCK position is fine', () => {
113
+ // The directive is what moved, not the child: block content is only wrong
114
+ // because of where it was asked for.
115
+ const result = resolveIncludes('{{ a }}\n', {
116
+ resolver: virtualResolver({ a: '# Heading\n\nBody.\n' }),
117
+ });
118
+ assert.deepEqual(result.warnings, []);
119
+ });
120
+ test('a block-in-inline warning is anchored on the directive, not the sentence', () => {
121
+ const source = 'See {{ a }} here.\n';
122
+ const result = resolveIncludes(source, {
123
+ resolver: virtualResolver({ a: '# Heading\n\nBody.\n' }),
124
+ });
125
+ assert.equal(result.warnings[0]?.start, source.indexOf('{{ a }}'));
126
+ assert.equal(result.warnings[0]?.end, source.indexOf('{{ a }}') + '{{ a }}'.length);
127
+ });
128
+ // --- read, then rejected ---------------------------------------------------
129
+ //
130
+ // A target is READ before most of §19's refusals can be decided, so "the
131
+ // resolver produced source" is not the same question as "the content is in the
132
+ // document". Only the second one may feed the outline or a seam location.
133
+ test('a child rejected for a missing section contributes no document', () => {
134
+ const result = resolveIncludes('{{ a #Gamma }}', {
135
+ resolver: virtualResolver({ a: '# Alpha\n\nText.\n' }),
136
+ });
137
+ assert.deepEqual(result.dependencies, [{ id: 'a', resolved: true }]);
138
+ assert.deepEqual(result.documents, []);
139
+ });
140
+ test('a child rejected for a line range past its end contributes no document', () => {
141
+ const result = resolveIncludes('{{ a @lines:40-50 }}', {
142
+ resolver: virtualResolver({ a: '# Alpha\n' }),
143
+ });
144
+ assert.deepEqual(result.documents, []);
145
+ });
146
+ test('a child that IS merged still contributes its document', () => {
147
+ // The negative control: the filter must not be an unconditional empty list.
148
+ const result = resolveIncludes('{{ a }}', {
149
+ resolver: virtualResolver({ a: '# Alpha\n' }),
150
+ });
151
+ assert.deepEqual(result.documents.map((document) => document.id), ['a']);
152
+ });
153
+ test('a grandchild merged through its parent contributes its own document', () => {
154
+ const result = resolveIncludes('{{ a }}', {
155
+ resolver: virtualResolver({ a: '# Alpha\n\n{{ b }}\n', b: '## Beta\n' }),
156
+ });
157
+ assert.deepEqual(result.documents.map((document) => document.id).sort(), ['a', 'b']);
158
+ });
159
+ test('a child whose only content is a footnote definition still contributes a document', () => {
160
+ // Its blocks are empty once the definition has moved into the parent, so the
161
+ // only §19 source stamp it leaves is on the footnote body.
162
+ const result = resolveIncludes('Parent[^x].\n\n{{ a }}\n', {
163
+ resolver: virtualResolver({ a: '[^x]: Note.\n' }),
164
+ });
165
+ assert.deepEqual(result.documents.map((document) => document.id), ['a']);
166
+ });
167
+ // --- the same target written twice ----------------------------------------
168
+ test('each occurrence of a repeated include carries its own diagnostic', () => {
169
+ // The engine expands the target once per occurrence and raises the warning
170
+ // each time, but reports only the file it arose in. Anchoring both at the
171
+ // first directive would leave the second with no diagnostic at all, on a
172
+ // document where it has exactly the same problem.
173
+ const source = 'Lead.\n\n{{ a }}\n\nMiddle.\n\n{{ a }}\n';
174
+ const result = resolveIncludes(source, {
175
+ resolver: virtualResolver({ a: 'Child.\n\n{{ missing }}\n' }),
176
+ sourcePath: '/root.crv',
177
+ });
178
+ assert.deepEqual(result.warnings.map((warning) => warning.start), [source.indexOf('{{ a }}'), source.lastIndexOf('{{ a }}')]);
179
+ });
180
+ test('both occurrences still name the child the problem is in', () => {
181
+ const result = resolveIncludes('{{ a }}\n\n{{ a }}\n', {
182
+ resolver: virtualResolver({ a: 'Child.\n\n{{ missing }}\n' }),
183
+ sourcePath: '/root.crv',
184
+ });
185
+ assert.deepEqual(result.warnings.map((warning) => warning.file), ['a', 'a']);
186
+ });
187
+ // --- the byte budget charges the file that was read ------------------------
188
+ test('a CRLF child is charged the bytes it actually occupies', () => {
189
+ // The budget bounds a size, so whatever this seam hands the engine has to be
190
+ // as long as the file the resolver read. Collapsing `\r\n` would charge one
191
+ // byte per line less than the file holds, and a budget of N bytes would
192
+ // admit close to 2N of them.
193
+ const child = 'a\r\nb\r\nc\r\n';
194
+ const result = resolveIncludes('{{ a }}', { resolver: virtualResolver({ a: child }) });
195
+ assert.equal(result.bytes, Buffer.byteLength(child, 'utf8'));
196
+ });
197
+ test('a carriage-return child is charged the bytes it actually occupies', () => {
198
+ const child = 'a\rb\rc\r';
199
+ const result = resolveIncludes('{{ a }}', { resolver: virtualResolver({ a: child }) });
200
+ assert.equal(result.bytes, Buffer.byteLength(child, 'utf8'));
201
+ });
202
+ test('a CRLF child stays inside a budget that fits it', () => {
203
+ const child = 'a\r\nb\r\n';
204
+ const result = resolveIncludes('{{ a }}', {
205
+ resolver: virtualResolver({ a: child }),
206
+ maxBytes: Buffer.byteLength(child, 'utf8'),
207
+ });
208
+ assert.deepEqual(result.warnings, []);
209
+ });
210
+ test('a CRLF child overruns a budget measured on its collapsed form', () => {
211
+ // The mutation guard for the line above: with `\r\n` collapsed this child
212
+ // would fit, and the bound would have been quietly widened.
213
+ const child = 'a\r\nb\r\n';
214
+ const result = resolveIncludes('{{ a }}', {
215
+ resolver: virtualResolver({ a: child }),
216
+ maxBytes: Buffer.byteLength(child.replace(/\r\n/g, '\n'), 'utf8'),
217
+ });
218
+ assert.deepEqual(result.warnings.map((warning) => warning.rule), ['include-budget']);
219
+ });
220
+ //# sourceMappingURL=include-merge-diagnostics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"include-merge-diagnostics.test.js","sourceRoot":"","sources":["../src/include-merge-diagnostics.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import type { IncludeSourceCache } from './include-cache.js';
2
2
  /**
3
- * Why a resolver refused a target. Reported on {@link IncludeWarning.detail},
4
- * never folded into the diagnostic message: §19 I7 requires a
5
- * processor-generated message naming the failure class, and the
6
- * include-conformance goldens (`i10-fs-*`) spell every containment denial as
7
- * the single rule `include-unresolved` so that a denial cannot be used to probe
8
- * host layout. The class is kept available for tooling and tests.
3
+ * Why a resolver refused a target. Carried on `IncludeWarning.denial` and
4
+ * mapped to a published diagnostic code and message by
5
+ * {@link ./include-denial.js}.
6
+ *
7
+ * The cross-engine RULE id stays `include-unresolved` for every refusal: the
8
+ * include-conformance goldens (`i10-fs-*`) pin it, and §19 I7 still forbids
9
+ * surfacing a resolver's own error text. What §19 I7 requires is a
10
+ * processor-generated message naming the failure class, which is exactly what
11
+ * the mapping produces - and no class here discloses anything the author did
12
+ * not write, since a target outside the root is refused identically whether or
13
+ * not it exists.
9
14
  */
10
15
  export type IncludeDenial = 'remote-not-allowed' | 'absolute-denied' | 'outside-root' | 'not-found' | 'not-a-file';
11
16
  export interface IncludeContext {
@@ -15,7 +15,7 @@
15
15
  * properties of the include GRAPH rather than of one path, so they live in
16
16
  * {@link ./includes.js} where the walk is.
17
17
  */
18
- import { closeSync, fstatSync, openSync, readSync, realpathSync } from 'node:fs';
18
+ import { closeSync, fstatSync, openSync, readSync, realpathSync, statSync } from 'node:fs';
19
19
  import path from 'node:path';
20
20
  /** A scheme with an authority (`https://…`), or a protocol-relative `//host/…`. */
21
21
  const REMOTE_RE = /^(?:[A-Za-z][A-Za-z0-9+.-]*:)?\/\//;
@@ -118,6 +118,15 @@ export function fileSystemResolver(includeRoot, opts = {}) {
118
118
  if (!contains(real)) {
119
119
  return { ok: false, id: includePath, denial: 'outside-root' };
120
120
  }
121
+ // Checked before opening: opening a FIFO for reading blocks until a writer
122
+ // appears, so the fstat check below would never run.
123
+ try {
124
+ if (!statSync(real).isFile())
125
+ return { ok: false, id: real, denial: 'not-a-file' };
126
+ }
127
+ catch {
128
+ return { ok: false, id: includePath, denial: 'not-found' };
129
+ }
121
130
  let fd;
122
131
  try {
123
132
  fd = openSync(real, 'r');
@@ -1 +1 @@
1
- {"version":3,"file":"include-path.js","sourceRoot":"","sources":["../src/include-path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"include-path.js","sourceRoot":"","sources":["../src/include-path.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import assert from 'node:assert/strict';
2
2
  import test from 'node:test';
3
+ import { spawnSync } from 'node:child_process';
3
4
  import { mkdirSync, mkdtempSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
4
5
  import { tmpdir } from 'node:os';
5
6
  import path from 'node:path';
@@ -166,6 +167,28 @@ test('a directory is not a document', () => {
166
167
  assert.equal(result.ok, false);
167
168
  assert.equal(result.ok === false && result.denial, 'not-a-file');
168
169
  });
170
+ // Unlike a directory, a FIFO cannot be refused after opening: the open itself
171
+ // blocks. The resolver runs in a child with a deadline, so a hang fails the
172
+ // test instead of stalling the suite.
173
+ test('a FIFO is refused without being opened', { skip: process.platform === 'win32' }, () => {
174
+ const dir = fixture({ 'main.crv': 'x\n' });
175
+ const made = spawnSync('mkfifo', [path.join(dir, 'pipe.crv')]);
176
+ assert.equal(made.status, 0, String(made.stderr));
177
+ const script = `
178
+ const { fileSystemResolver } = await import(${JSON.stringify(new URL('./include-path.js', import.meta.url).href)})
179
+ const r = fileSystemResolver(${JSON.stringify(dir)})('pipe.crv', { stack: [], depth: 0 })
180
+ process.stdout.write(JSON.stringify(r))
181
+ `;
182
+ const run = spawnSync(process.execPath, ['--input-type=module', '-e', script], {
183
+ timeout: 5000,
184
+ encoding: 'utf8',
185
+ });
186
+ assert.equal(run.signal, null, 'the resolver did not return within 5 s');
187
+ assert.equal(run.status, 0, run.stderr);
188
+ const result = JSON.parse(run.stdout);
189
+ assert.equal(result.ok, false);
190
+ assert.equal(result.denial, 'not-a-file');
191
+ });
169
192
  test('bytes are counted as encoded UTF-8, not as JavaScript characters', () => {
170
193
  const dir = fixture({ 'child.crv': 'éé\u{1f600}' });
171
194
  const resolve = fileSystemResolver(dir);
@@ -1 +1 @@
1
- {"version":3,"file":"include-path.test.js","sourceRoot":"","sources":["../src/include-path.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"include-path.test.js","sourceRoot":"","sources":["../src/include-path.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,227 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { resolveIncludes } from './includes.js';
4
+ // The guards that sit at the RESOLVER SEAM of the PART 9 §19 walk: the bound on
5
+ // resolver invocations, the terminality of a spent whole-walk total, and a
6
+ // target that did not resolve to text.
7
+ //
8
+ // Each assertion is its own test. A suite stops at the first failing assertion
9
+ // in a test, so several per test would hide every one behind it - and the
10
+ // mutation proof for this file depends on seeing exactly which guards go.
11
+ const NUL = String.fromCharCode(0);
12
+ /** In-memory resolver, matching the conformance suite's "virtual" mode. */
13
+ function virtualResolver(files, reads) {
14
+ return (includePath) => {
15
+ reads?.push(includePath);
16
+ const source = files[includePath];
17
+ if (source === undefined)
18
+ return { ok: false, id: includePath, denial: 'not-found' };
19
+ return { ok: true, id: includePath, source, bytes: Buffer.byteLength(source, 'utf8') };
20
+ };
21
+ }
22
+ /** A document of `n` directives, each naming a distinct target. */
23
+ function directives(n, name) {
24
+ return Array.from({ length: n }, (_, i) => `{{ ${name(i)} }}`).join('\n\n');
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // MUST bound resolver invocations per render
28
+ //
29
+ // The byte budget cannot stand in for this bound. A target that fails to
30
+ // resolve is never charged, so a document naming files that do not exist
31
+ // resolves every one of them with the budget untouched - which is the shape
32
+ // measured on this walk before the bound existed.
33
+ // ---------------------------------------------------------------------------
34
+ test('a document of unresolvable directives stops calling the resolver at the bound', () => {
35
+ const reads = [];
36
+ resolveIncludes(directives(50, (i) => `missing-${i}`), {
37
+ resolver: virtualResolver({}, reads),
38
+ maxResolverCalls: 10,
39
+ });
40
+ assert.equal(reads.length, 10);
41
+ });
42
+ test('the directive past the bound is never passed to the resolver', () => {
43
+ // §19: "A directive past the bound is left literal with a Warning and MUST
44
+ // NOT be passed to the resolver."
45
+ const reads = [];
46
+ resolveIncludes(directives(50, (i) => `missing-${i}`), {
47
+ resolver: virtualResolver({}, reads),
48
+ maxResolverCalls: 10,
49
+ });
50
+ assert.ok(!reads.includes('missing-10'), `the 11th target was read anyway: ${reads.join(',')}`);
51
+ });
52
+ test('the bound is reported as include-call-limit', () => {
53
+ const result = resolveIncludes(directives(50, (i) => `missing-${i}`), {
54
+ resolver: virtualResolver({}),
55
+ maxResolverCalls: 10,
56
+ });
57
+ assert.ok(result.warnings.some((w) => w.rule === 'include-call-limit'));
58
+ });
59
+ test('the byte budget alone does not bound unresolvable directives', () => {
60
+ // The regression this guard exists for: zero bytes charged, so a budget-only
61
+ // walk resolves every one of them.
62
+ const reads = [];
63
+ const result = resolveIncludes(directives(40, (i) => `missing-${i}`), {
64
+ resolver: virtualResolver({}, reads),
65
+ maxBytes: 8,
66
+ maxResolverCalls: 5,
67
+ });
68
+ assert.equal(result.bytes, 0, 'an unresolved target must charge nothing');
69
+ });
70
+ test('with the bound spent, the byte budget is still untouched', () => {
71
+ const result = resolveIncludes(directives(40, (i) => `missing-${i}`), {
72
+ resolver: virtualResolver({}),
73
+ maxResolverCalls: 5,
74
+ });
75
+ assert.equal(result.bytes, 0);
76
+ });
77
+ test('the call bound counts resolved targets too, not only failures', () => {
78
+ const reads = [];
79
+ resolveIncludes(directives(20, () => 'a'), {
80
+ resolver: virtualResolver({ a: 'Body.' }, reads),
81
+ maxResolverCalls: 6,
82
+ });
83
+ assert.equal(reads.length, 6);
84
+ });
85
+ test('a target refused by the bound is reported as an UNRESOLVED dependency', () => {
86
+ // The target would resolve perfectly well; it is the bound that refused it.
87
+ // So the entry must say unresolved - a host that re-validates on change needs
88
+ // to come back to it - which is what distinguishes this from an unbounded
89
+ // walk, where the same directive resolves.
90
+ const result = resolveIncludes('{{ missing }}\n\n{{ real }}', {
91
+ resolver: virtualResolver({ real: 'Body.' }),
92
+ maxResolverCalls: 1,
93
+ });
94
+ assert.deepEqual(result.dependencies.find((d) => d.id === 'real'), { id: 'real', resolved: false });
95
+ });
96
+ test('the call bound applies across the whole walk, not per document', () => {
97
+ // Three levels, one directive each: the bound is a whole-walk total, so a
98
+ // chain exhausts it exactly as a flat document does.
99
+ const reads = [];
100
+ resolveIncludes('{{ a }}', {
101
+ resolver: virtualResolver({ a: '{{ b }}', b: '{{ c }}', c: 'Bottom.' }, reads),
102
+ maxResolverCalls: 2,
103
+ });
104
+ assert.deepEqual(reads, ['a', 'b']);
105
+ });
106
+ test('the default bound is 1000, the §19 recommended floor', () => {
107
+ const reads = [];
108
+ resolveIncludes(directives(1200, (i) => `missing-${i}`), {
109
+ resolver: virtualResolver({}, reads),
110
+ });
111
+ assert.equal(reads.length, 1000);
112
+ });
113
+ // ---------------------------------------------------------------------------
114
+ // Refusal is terminal
115
+ //
116
+ // §19: once the byte budget or the call bound is spent, every remaining
117
+ // directive MUST degrade "without being resolved - not resolved and then
118
+ // refused".
119
+ // ---------------------------------------------------------------------------
120
+ test('once the call bound is spent, a resolvable target is not resolved either', () => {
121
+ const reads = [];
122
+ resolveIncludes(`${directives(3, (i) => `missing-${i}`)}\n\n{{ real }}`, {
123
+ resolver: virtualResolver({ real: 'Body.' }, reads),
124
+ maxResolverCalls: 3,
125
+ });
126
+ assert.ok(!reads.includes('real'), `a later target was resolved after refusal: ${reads.join(',')}`);
127
+ });
128
+ test('every directive after a spent budget is refused without a read', () => {
129
+ const child = 'x'.repeat(100);
130
+ const reads = [];
131
+ resolveIncludes('{{ a }}\n\n'.repeat(20), {
132
+ resolver: virtualResolver({ a: child }, reads),
133
+ maxBytes: 250,
134
+ });
135
+ // Two fit; the third is read and rejected by the charge that overruns the
136
+ // budget; the remaining seventeen are never read.
137
+ assert.equal(reads.length, 3);
138
+ });
139
+ test('a budget consumed exactly to the limit admits that directive and refuses the next', () => {
140
+ // The boundary: a budget of N bytes admits N bytes, so the charge that lands
141
+ // ON the limit is the last one that expands. The one after it overruns and
142
+ // latches, and everything past that degrades without a read.
143
+ const reads = [];
144
+ const result = resolveIncludes('{{ a }}\n\n{{ a }}\n\n{{ a }}', {
145
+ resolver: virtualResolver({ a: 'xxxxx' }, reads),
146
+ maxBytes: 5,
147
+ });
148
+ assert.deepEqual(reads, ['a', 'a']);
149
+ assert.deepEqual(result.warnings.map((warning) => warning.rule), ['include-budget', 'include-budget']);
150
+ });
151
+ test('a spent call bound keeps reporting include-call-limit, not include-budget', () => {
152
+ const result = resolveIncludes(directives(6, (i) => `missing-${i}`), {
153
+ resolver: virtualResolver({}),
154
+ maxResolverCalls: 2,
155
+ });
156
+ const rules = new Set(result.warnings.slice(2).map((w) => w.rule));
157
+ assert.deepEqual([...rules], ['include-call-limit']);
158
+ });
159
+ test('the call-limit message names the directive that was refused', () => {
160
+ const result = resolveIncludes(directives(3, (i) => `missing-${i}`), {
161
+ resolver: virtualResolver({}),
162
+ maxResolverCalls: 1,
163
+ });
164
+ const refused = result.warnings.find((w) => w.rule === 'include-call-limit');
165
+ assert.ok(refused?.message.includes('missing-1'), `message was: ${refused?.message}`);
166
+ });
167
+ test('a call-limit warning is anchored in the root document', () => {
168
+ const source = directives(3, (i) => `missing-${i}`);
169
+ const result = resolveIncludes(source, {
170
+ resolver: virtualResolver({}),
171
+ maxResolverCalls: 1,
172
+ });
173
+ const refused = result.warnings.find((w) => w.rule === 'include-call-limit');
174
+ assert.ok(refused && refused.end <= source.length, 'warning range escapes the root document');
175
+ });
176
+ // ---------------------------------------------------------------------------
177
+ // Text-only
178
+ //
179
+ // §19: "a binary or unreadable target is not an include" - Warning plus the
180
+ // literal directive. A binary file named `.crv` otherwise enters the walk as
181
+ // though it were source.
182
+ // ---------------------------------------------------------------------------
183
+ test('a target carrying a NUL byte is reported as non-text', () => {
184
+ const result = resolveIncludes('{{ bin }}', {
185
+ resolver: virtualResolver({ bin: `PK${NUL}${NUL}data` }),
186
+ });
187
+ assert.deepEqual(result.warnings.map((w) => w.rule), ['include-non-text']);
188
+ });
189
+ test('a non-text target does not become a child document', () => {
190
+ // `documents` feeds navigation and preview; a binary blob must not reach it.
191
+ const result = resolveIncludes('{{ bin }}', {
192
+ resolver: virtualResolver({ bin: `PK${NUL}data` }),
193
+ });
194
+ assert.deepEqual(result.documents, []);
195
+ });
196
+ test('a non-text target is charged no bytes', () => {
197
+ const result = resolveIncludes('{{ bin }}', {
198
+ resolver: virtualResolver({ bin: `PK${NUL}${'x'.repeat(500)}` }),
199
+ });
200
+ assert.equal(result.bytes, 0);
201
+ });
202
+ test('a non-text target is reported as an unresolved dependency', () => {
203
+ // Still watchable: replacing the binary with real source must re-validate.
204
+ const result = resolveIncludes('{{ bin }}', {
205
+ resolver: virtualResolver({ bin: `PK${NUL}data` }),
206
+ });
207
+ assert.deepEqual(result.dependencies, [{ id: 'bin', resolved: false }]);
208
+ });
209
+ test('a non-text target is not walked for directives of its own', () => {
210
+ const reads = [];
211
+ resolveIncludes('{{ bin }}', {
212
+ resolver: virtualResolver({ bin: `${NUL}{{ a }}`, a: 'Body.' }, reads),
213
+ });
214
+ assert.deepEqual(reads, ['bin']);
215
+ });
216
+ test('a sibling of a non-text target still resolves', () => {
217
+ // The non-text degradation is per directive, not a whole-walk refusal.
218
+ const result = resolveIncludes(`{{ bin }}\n\n{{ ok }}`, {
219
+ resolver: virtualResolver({ bin: `PK${NUL}`, ok: 'Body.' }),
220
+ });
221
+ assert.ok(result.documents.some((d) => d.id === 'ok'));
222
+ });
223
+ test('ordinary text with no NUL is unaffected', () => {
224
+ const result = resolveIncludes('{{ ok }}', { resolver: virtualResolver({ ok: '# Heading' }) });
225
+ assert.deepEqual(result.warnings, []);
226
+ });
227
+ //# sourceMappingURL=include-resolver-guards.test.js.map