@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.
- package/README.md +41 -21
- package/dist/analyze.js +46 -8
- package/dist/analyze.js.map +1 -1
- package/dist/analyze.test.js +5 -4
- package/dist/analyze.test.js.map +1 -1
- package/dist/definition.d.ts +1 -1
- package/dist/definition.js +76 -0
- package/dist/definition.js.map +1 -1
- package/dist/include-completion.js +226 -30
- package/dist/include-completion.js.map +1 -1
- package/dist/include-completion.test.js +266 -7
- package/dist/include-completion.test.js.map +1 -1
- package/dist/include-definition.js +31 -4
- package/dist/include-definition.js.map +1 -1
- package/dist/include-denial.d.ts +33 -0
- package/dist/include-denial.js +41 -0
- package/dist/include-denial.js.map +1 -0
- package/dist/include-denial.test.d.ts +1 -0
- package/dist/include-denial.test.js +126 -0
- package/dist/include-denial.test.js.map +1 -0
- package/dist/include-directive.js +118 -11
- package/dist/include-directive.js.map +1 -1
- package/dist/include-directive.test.js +42 -0
- package/dist/include-directive.test.js.map +1 -1
- package/dist/include-merge-diagnostics.test.d.ts +1 -0
- package/dist/include-merge-diagnostics.test.js +220 -0
- package/dist/include-merge-diagnostics.test.js.map +1 -0
- package/dist/include-path.d.ts +11 -6
- package/dist/include-path.js +10 -1
- package/dist/include-path.js.map +1 -1
- package/dist/include-path.test.js +23 -0
- package/dist/include-path.test.js.map +1 -1
- package/dist/include-resolver-guards.test.d.ts +1 -0
- package/dist/include-resolver-guards.test.js +227 -0
- package/dist/include-resolver-guards.test.js.map +1 -0
- package/dist/include-root-containment.test.d.ts +1 -0
- package/dist/include-root-containment.test.js +169 -0
- package/dist/include-root-containment.test.js.map +1 -0
- package/dist/include-seam-mapping.test.d.ts +1 -0
- package/dist/include-seam-mapping.test.js +181 -0
- package/dist/include-seam-mapping.test.js.map +1 -0
- package/dist/include-seam-navigation.test.d.ts +1 -0
- package/dist/include-seam-navigation.test.js +141 -0
- package/dist/include-seam-navigation.test.js.map +1 -0
- package/dist/include-security-conformance.test.js +281 -35
- package/dist/include-security-conformance.test.js.map +1 -1
- package/dist/include-selection-diagnostics.test.d.ts +1 -0
- package/dist/include-selection-diagnostics.test.js +120 -0
- package/dist/include-selection-diagnostics.test.js.map +1 -0
- package/dist/include-selection-navigation.test.d.ts +1 -0
- package/dist/include-selection-navigation.test.js +75 -0
- package/dist/include-selection-navigation.test.js.map +1 -0
- package/dist/include-selection.d.ts +14 -0
- package/dist/include-selection.js +67 -0
- package/dist/include-selection.js.map +1 -0
- package/dist/include-settings.d.ts +47 -2
- package/dist/include-settings.js +69 -6
- package/dist/include-settings.js.map +1 -1
- package/dist/include-settings.test.js +118 -0
- package/dist/include-settings.test.js.map +1 -1
- package/dist/includes.d.ts +112 -6
- package/dist/includes.js +375 -134
- package/dist/includes.js.map +1 -1
- package/dist/lsp-stdio-client.d.ts +33 -0
- package/dist/lsp-stdio-client.js +92 -0
- package/dist/lsp-stdio-client.js.map +1 -0
- package/dist/position-encoding.test.js +97 -1
- package/dist/position-encoding.test.js.map +1 -1
- package/dist/position.d.ts +11 -0
- package/dist/position.js +23 -0
- package/dist/position.js.map +1 -1
- package/dist/preview-includes.test.d.ts +1 -0
- package/dist/preview-includes.test.js +141 -0
- package/dist/preview-includes.test.js.map +1 -0
- package/dist/preview.d.ts +7 -0
- package/dist/preview.js +14 -0
- package/dist/preview.js.map +1 -0
- package/dist/server-capabilities.test.js +3 -56
- package/dist/server-capabilities.test.js.map +1 -1
- package/dist/server.js +22 -7
- package/dist/server.js.map +1 -1
- 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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"}
|
package/dist/include-path.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { IncludeSourceCache } from './include-cache.js';
|
|
2
2
|
/**
|
|
3
|
-
* Why a resolver refused a target.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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 {
|
package/dist/include-path.js
CHANGED
|
@@ -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');
|
package/dist/include-path.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"include-path.js","sourceRoot":"","sources":["../src/include-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"include-path.js","sourceRoot":"","sources":["../src/include-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1F,OAAO,IAAI,MAAM,WAAW,CAAA;AA4D5B,mFAAmF;AACnF,MAAM,SAAS,GAAG,oCAAoC,CAAA;AAEtD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,OAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAA;IAExD,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAW,EAAE;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC9C,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,IAAI,CAAA;QAC3B,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QAC9C,yEAAyE;QACzE,0DAA0D;QAC1D,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACxC,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAsB,EAAE;QACjE,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;QACzC,OAAO,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;gBAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,CAAA;gBAC7D,OAAO,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAA;YACtE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;gBACvC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE;QAC1B,kEAAkE;QAClE,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;YACpC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;YACrE,CAAC;YACD,uEAAuE;YACvE,4DAA4D;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;QACrE,CAAC;QAED,2EAA2E;QAC3E,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;QAClE,CAAC;QAED,qEAAqE;QACrE,yEAAyE;QACzE,QAAQ;QACR,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YACzC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAEnC,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC;YACH,qEAAqE;YACrE,sDAAsD;YACtD,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,oEAAoE;YACpE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;YACtC,OAAO,KAAK,KAAK,SAAS;gBACxB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE;gBACxD,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;QAChE,CAAC;QAED,2EAA2E;QAC3E,4EAA4E;QAC5E,0CAA0C;QAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAC/D,CAAC;QAED,2EAA2E;QAC3E,qDAAqD;QACrD,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QAC5D,CAAC;QAED,IAAI,EAAU,CAAA;QACd,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QAC5D,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;YAC1B,wEAAwE;YACxE,oDAAoD;YACpD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;YACxE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7D,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9C,IAAI,MAAM;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAA;YAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,IAAI,GAAG,CAAC,CAAA;YACZ,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,CAAA;gBAC5D,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAK;gBACjB,IAAI,IAAI,CAAC,CAAA;YACX,CAAC;YACD,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,IAAI;gBACR,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,IAAI;gBACX,OAAO;gBACP,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACjD,sEAAsE;gBACtE,mCAAmC;gBACnC,KAAK,EAAE,IAAI;aACH,CAAA;YACV,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACrD,OAAO,KAAK,CAAA;QACd,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAA;QACf,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -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
|