@markup-carve/carve-lsp 0.1.6 → 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
@@ -1,41 +1,138 @@
1
+ /**
2
+ * Completion inside a `{{ … }}` include directive: the path, the `#section`
3
+ * it selects, and the option names and value shapes.
4
+ *
5
+ * Every slot is recognized against the SAME grammar the scanner enforces
6
+ * (`./include-directive.js`). A completion that inserts a spelling the scanner
7
+ * rejects is worse than no completion at all: the directive silently stops
8
+ * being a directive, with no include and no diagnostic - the exact failure
9
+ * this feature exists to prevent.
10
+ */
1
11
  import { readdirSync, readFileSync, realpathSync } from 'node:fs';
2
12
  import path from 'node:path';
3
- import { CompletionItemKind } from 'vscode-languageserver/node.js';
4
- import { scanDocument } from './workspace-index.js';
13
+ import { CompletionItemKind, } from 'vscode-languageserver/node.js';
14
+ import { lineCount, sections } from './include-selection.js';
15
+ /**
16
+ * The option names §19 defines, with the value shapes worth offering. The
17
+ * line range has no fixed values, so its shape is completed from the child's
18
+ * own length; the shift offset does, and `auto` is the one authors do not
19
+ * discover on their own.
20
+ */
21
+ const OPTION_NAMES = [
22
+ { name: 'lines', detail: 'Select a line range, N-M' },
23
+ { name: 'shift', detail: 'Shift heading levels by N, or auto' },
24
+ ];
25
+ /** Text between the innermost unclosed `{{` and the cursor, or null. */
26
+ function directiveInner(prefix) {
27
+ const open = prefix.lastIndexOf('{{');
28
+ if (open < 0)
29
+ return null;
30
+ const inner = prefix.slice(open + 2);
31
+ return inner.includes('}}') ? null : inner;
32
+ }
33
+ /**
34
+ * A complete path token, in every spelling the scanner accepts: bare, straight
35
+ * quoted, or curly quoted. A quoted path is the only way to name a file whose
36
+ * name contains a space, so a pattern that only matched the bare form would
37
+ * drop completion on exactly the directives that need the quotes.
38
+ */
39
+ const PATH_TOKEN = '(?:"(?:\\\\.|[^"\\\\])*"|\u201c[^\u201d]*\u201d|[^\\s#@}"\u201c]+)';
40
+ /** `{{ <path>` with nothing selected yet. */
41
+ const PATH_RE = /^(\s*)([^\s#@}"\u201c]*)$/;
42
+ /**
43
+ * `{{ "<path>` mid-typing, before the closing quote exists. The opening
44
+ * delimiter is captured because the two quote styles do not close each other:
45
+ * a curly-opened path closed with a straight quote is not a directive.
46
+ */
47
+ const QUOTED_PATH_RE = /^\s*(["\u201c])([^"\u201d]*)$/;
48
+ const CLOSING_QUOTE = { '"': '"', '\u201c': '\u201d' };
49
+ /** `{{ <path> #<fragment>`, and the ungrammatical `{{ <path>#<fragment>`. */
50
+ const FRAGMENT_RE = new RegExp(`^\\s*(${PATH_TOKEN})(\\s*)#([A-Za-z_][\\w-]*)?$`);
51
+ /** The leading path of a directive, however it is spelled. */
52
+ const LEADING_PATH_RE = new RegExp(`^\\s*(${PATH_TOKEN})`);
53
+ /**
54
+ * Everything that may legally precede an option: a path, an optional section,
55
+ * and options that are themselves complete. Without this an option would be
56
+ * offered after arbitrary text (`{{ ch1.crv nonsense @`), and taking it would
57
+ * leave a token the scanner refuses - the directive silently becoming prose,
58
+ * which is the one outcome this module exists to avoid.
59
+ */
60
+ const OPTION_PREFIX_RE = new RegExp(`^\\s*${PATH_TOKEN}(?:\\s+#[A-Za-z_][\\w-]*)?(?:\\s+@[A-Za-z_][\\w-]*:[^\\s#@}]+)*\\s*$`);
61
+ /** `{{ <path> … @<name>`, with whatever separator precedes the sigil. */
62
+ const OPTION_NAME_RE = /(\s*)@([A-Za-z_][\w-]*)?$/;
63
+ /** `{{ <path> … @<name>:<value>` */
64
+ const OPTION_VALUE_RE = /@([A-Za-z_][\w-]*):([^\s#@}]*)$/;
65
+ /** A path token as the scanner reads it: quotes stripped, escapes undone. */
66
+ function decodePath(token) {
67
+ if (token.startsWith('"')) {
68
+ return token.slice(1, token.endsWith('"') ? -1 : undefined).replace(/\\(["\\])/g, '$1');
69
+ }
70
+ if (token.startsWith('\u201c'))
71
+ return token.slice(1, token.endsWith('\u201d') ? -1 : undefined);
72
+ return token;
73
+ }
5
74
  export function includeCompletions(source, position, options) {
6
75
  if (!options?.sourcePath || !options.includeRoot)
7
76
  return [];
8
77
  const line = source.replace(/\r\n?/g, '\n').split('\n')[position.line] ?? '';
9
- const prefix = line.slice(0, position.character);
10
- const match = /\{\{\s*([^\s}@]*)$/.exec(prefix);
11
- if (!match)
78
+ const inner = directiveInner(line.slice(0, position.character));
79
+ if (inner === null)
12
80
  return [];
13
- const authored = match[1];
14
- const [filePart, fragment] = authored.split('#', 2);
15
81
  const root = realpathSafe(options.includeRoot);
16
82
  if (!root)
17
83
  return [];
18
- const base = path.resolve(path.dirname(options.sourcePath), path.dirname(filePart || '.'));
84
+ const value = OPTION_VALUE_RE.exec(inner);
85
+ if (value) {
86
+ return OPTION_PREFIX_RE.test(inner.slice(0, value.index))
87
+ ? optionValues(inner, value, position, options, root)
88
+ : [];
89
+ }
90
+ const name = OPTION_NAME_RE.exec(inner);
91
+ if (name) {
92
+ return OPTION_PREFIX_RE.test(inner.slice(0, name.index))
93
+ ? optionNames(inner, name, position)
94
+ : [];
95
+ }
96
+ const fragment = FRAGMENT_RE.exec(inner);
97
+ if (fragment)
98
+ return fragments(fragment, position, options, root);
99
+ const quoted = QUOTED_PATH_RE.exec(inner);
100
+ if (quoted)
101
+ return paths(quoted[2], position, options, root, CLOSING_QUOTE[quoted[1]]);
102
+ const asPath = PATH_RE.exec(inner);
103
+ return asPath ? paths(asPath[2], position, options, root, undefined) : [];
104
+ }
105
+ /** A path the bare token cannot spell, so the directive has to quote it. */
106
+ function needsQuoting(value) {
107
+ return /["\u201c\u201d#@}\s]/.test(value);
108
+ }
109
+ function escapeQuoted(value) {
110
+ return value.replace(/(["\\])/g, '\\$1');
111
+ }
112
+ function quote(value) {
113
+ return `"${escapeQuoted(value)}"`;
114
+ }
115
+ /**
116
+ * Files and directories under the containment root, filtered to `.crv`.
117
+ *
118
+ * `closer` is set when the author already opened a quoted path: the edit then
119
+ * stays inside the quotes and closes them with the delimiter that MATCHES the
120
+ * opening one, once a FILE is chosen. A name that cannot be spelled bare is
121
+ * quoted on the author's behalf instead, whole path and all - quoting is a
122
+ * property of the token, not of its last segment.
123
+ */
124
+ function paths(filePart, position, options, root, closer) {
125
+ // Split on the last separator rather than through `path.dirname`, which maps
126
+ // a trailing "sub/" to "." and would list the PARENT of the directory the
127
+ // author just opened. The backslash counts only where the platform treats it
128
+ // as a separator; on POSIX it is a legal character in a file name.
129
+ const slash = Math.max(filePart.lastIndexOf('/'), path.sep === '\\' ? filePart.lastIndexOf('\\') : -1);
130
+ const prefix = slash < 0 ? '' : filePart.slice(0, slash + 1);
131
+ const partial = slash < 0 ? filePart : filePart.slice(slash + 1);
132
+ const base = path.resolve(path.dirname(options.sourcePath), prefix || '.');
19
133
  const contained = realpathSafe(base);
20
134
  if (!contained || !isInside(root, contained))
21
135
  return [];
22
- const replaceStart = position.character - (fragment === undefined ? path.basename(filePart) : fragment).length;
23
- if (fragment !== undefined) {
24
- const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
25
- if (!target || !isInside(root, target))
26
- return [];
27
- let targetSource;
28
- try {
29
- targetSource = readFileSync(target, 'utf8');
30
- }
31
- catch {
32
- return [];
33
- }
34
- return scanDocument(target, targetSource)
35
- .filter((token) => token.kind === 'heading' && token.declaration)
36
- .map((token) => item(token.key, CompletionItemKind.Reference, position, replaceStart, 'Section in included file'));
37
- }
38
- const partial = path.basename(filePart);
39
136
  let entries;
40
137
  try {
41
138
  entries = readdirSync(contained, { withFileTypes: true });
@@ -45,13 +142,112 @@ export function includeCompletions(source, position, options) {
45
142
  }
46
143
  return entries
47
144
  .filter((entry) => entry.name.startsWith(partial) && (entry.isDirectory() || entry.name.endsWith('.crv')))
48
- .map((entry) => item(entry.name + (entry.isDirectory() ? '/' : ''), entry.isDirectory() ? CompletionItemKind.Folder : CompletionItemKind.File, position, replaceStart, 'Contained include path'));
145
+ .map((entry) => {
146
+ const directory = entry.isDirectory();
147
+ const label = entry.name + (directory ? '/' : '');
148
+ const full = prefix + label;
149
+ let start = position.character - partial.length;
150
+ let newText = label;
151
+ if (closer !== undefined) {
152
+ // Stay inside the quotes the author opened, and close them only once a
153
+ // FILE is chosen - a directory is a step on the way, not a whole path.
154
+ start = position.character - filePart.length;
155
+ newText = directory ? full : `${full}${closer}`;
156
+ }
157
+ else if (needsQuoting(full)) {
158
+ start = position.character - filePart.length;
159
+ newText = directory ? `"${escapeQuoted(full)}` : quote(full);
160
+ }
161
+ return item(label, directory ? CompletionItemKind.Folder : CompletionItemKind.File, position, start, 'Contained include path', newText);
162
+ });
163
+ }
164
+ /**
165
+ * Heading ids in the file the directive already names.
166
+ *
167
+ * The inserted text always carries the separating space, whether or not the
168
+ * author typed one. `{{ ch1.crv#intro }}` is NOT a directive - the scanner's
169
+ * path token stops at `#` and the remainder parses as a bad option - so
170
+ * completing into that spelling would hand back literal text. Detecting it and
171
+ * repairing it turns the trigger character into a fix rather than a trap.
172
+ */
173
+ function fragments(match, position, options, root) {
174
+ const filePart = decodePath(match[1]);
175
+ const tail = match[2].length + 1 + (match[3] ?? '').length;
176
+ const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
177
+ if (!target || !isInside(root, target))
178
+ return [];
179
+ const source = readSafe(target);
180
+ if (source === null)
181
+ return [];
182
+ const start = position.character - tail;
183
+ return sections(source).map((section) => item(`#${section.id}`, CompletionItemKind.Reference, position, start, 'Section in included file', ` #${section.id}`));
184
+ }
185
+ /**
186
+ * Option names §19 defines, minus any the directive already carries.
187
+ *
188
+ * Options are whitespace-separated, so the inserted text carries the separator
189
+ * whether or not the author typed one - `{{ ch1.crv @shift:1@lines:2-3 }}` is
190
+ * one unparsable option token, not two, and completing into it would hand back
191
+ * literal text for the same reason the unspaced fragment does.
192
+ */
193
+ function optionNames(inner, match, position) {
194
+ const separator = match[1];
195
+ const typed = match[2] ?? '';
196
+ const tail = separator.length + 1 + typed.length;
197
+ const before = inner.slice(0, inner.length - tail);
198
+ const start = position.character - tail;
199
+ return OPTION_NAMES.filter((option) => !new RegExp(`@${option.name}:`).test(before)).map((option) => item(`@${option.name}:`, CompletionItemKind.Property, position, start, option.detail, ` @${option.name}:`));
200
+ }
201
+ /** Value shapes for the option being typed. */
202
+ function optionValues(inner, match, position, options, root) {
203
+ const name = match[1];
204
+ const start = position.character - match[2].length;
205
+ if (name === 'shift') {
206
+ return [
207
+ item('auto', CompletionItemKind.Value, position, start, 'Fit heading levels to the include site'),
208
+ item('+1', CompletionItemKind.Value, position, start, 'Shift headings one level deeper'),
209
+ item('-1', CompletionItemKind.Value, position, start, 'Shift headings one level shallower'),
210
+ ];
211
+ }
212
+ if (name !== 'lines')
213
+ return [];
214
+ // The only range worth guessing is the whole file, and it is only worth
215
+ // offering because it also tells the author how long the child actually is.
216
+ const token = LEADING_PATH_RE.exec(inner)?.[1];
217
+ if (!token)
218
+ return [];
219
+ const filePart = decodePath(token);
220
+ const target = realpathSafe(path.resolve(path.dirname(options.sourcePath), filePart));
221
+ if (!target || !isInside(root, target))
222
+ return [];
223
+ const source = readSafe(target);
224
+ if (source === null)
225
+ return [];
226
+ const total = lineCount(source);
227
+ // An empty target has no line to select, and `1-0` is not a range the
228
+ // scanner accepts, so there is nothing honest to offer.
229
+ if (total === 0)
230
+ return [];
231
+ return [item(`1-${total}`, CompletionItemKind.Value, position, start, `Whole file (${total} lines)`)];
49
232
  }
50
- function item(label, kind, position, start, detail) {
51
- return { label, kind, detail, textEdit: {
233
+ function item(label, kind, position, start, detail, newText = label) {
234
+ return {
235
+ label,
236
+ kind,
237
+ detail,
238
+ textEdit: {
52
239
  range: { start: { line: position.line, character: start }, end: position },
53
- newText: label,
54
- } };
240
+ newText,
241
+ },
242
+ };
243
+ }
244
+ function readSafe(target) {
245
+ try {
246
+ return readFileSync(target, 'utf8');
247
+ }
248
+ catch {
249
+ return null;
250
+ }
55
251
  }
56
252
  function realpathSafe(value) {
57
253
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"include-completion.js","sourceRoot":"","sources":["../src/include-completion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"include-completion.js","sourceRoot":"","sources":["../src/include-completion.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,274 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { mkdtempSync, writeFileSync } from 'node:fs';
3
+ import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs';
4
4
  import { tmpdir } from 'node:os';
5
5
  import path from 'node:path';
6
6
  import { includeCompletions } from './include-completion.js';
7
- test('completes contained files and their heading fragments', () => {
7
+ import { findDirectives } from './include-directive.js';
8
+ /*
9
+ * Completion inside an include directive.
10
+ *
11
+ * The load-bearing property is that every suggestion inserts text the SCANNER
12
+ * accepts. The section half used to fire only on `path#fragment`, which is not
13
+ * the directive grammar - `findDirectives` returns nothing for it - so taking
14
+ * the suggestion silently turned the directive into prose.
15
+ */
16
+ function workspace() {
8
17
  const root = mkdtempSync(path.join(tmpdir(), 'carve-include-complete-'));
9
- const sourcePath = path.join(root, 'main.crv');
10
- writeFileSync(path.join(root, 'chapter.crv'), '# First section\n');
11
- const options = { sourcePath, includeRoot: root };
12
- assert.deepEqual(includeCompletions('{{ cha', { line: 0, character: 6 }, options).map((item) => item.label), ['chapter.crv']);
13
- assert.deepEqual(includeCompletions('{{ chapter.crv#Fir', { line: 0, character: 18 }, options).map((item) => item.label), ['First-section']);
18
+ writeFileSync(path.join(root, 'chapter.crv'), '# First section\n\nBody.\n\n## Deeper bit\n');
19
+ mkdirSync(path.join(root, 'parts'));
20
+ writeFileSync(path.join(root, 'parts', 'appendix.crv'), '# Appendix\n');
21
+ writeFileSync(path.join(root, 'with space.crv'), '# Spaced\n');
22
+ return { root, sourcePath: path.join(root, 'main.crv') };
23
+ }
24
+ const at = (line) => ({ line: 0, character: line.length });
25
+ const labels = (items) => items.map((item) => item.label);
26
+ function editOf(item) {
27
+ const edit = item?.textEdit;
28
+ assert.ok(edit && 'range' in edit, 'completion must carry a plain TextEdit');
29
+ return edit;
30
+ }
31
+ /** The line as it reads once the completion has been applied. */
32
+ function applied(text, item) {
33
+ const edit = editOf(item);
34
+ return text.slice(0, edit.range.start.character) + edit.newText + text.slice(edit.range.end.character);
35
+ }
36
+ // --- path -----------------------------------------------------------------
37
+ test('completes contained files from a partial name', () => {
38
+ const { root, sourcePath } = workspace();
39
+ const text = '{{ cha';
40
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
41
+ assert.deepEqual(labels(items), ['chapter.crv']);
42
+ });
43
+ test('a trailing separator lists that directory, not its parent', () => {
44
+ const { root, sourcePath } = workspace();
45
+ const text = '{{ parts/';
46
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
47
+ assert.deepEqual(labels(items), ['appendix.crv']);
48
+ });
49
+ test('a trailing separator replaces nothing already typed', () => {
50
+ const { root, sourcePath } = workspace();
51
+ const text = '{{ parts/';
52
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
53
+ assert.equal(editOf(item).range.start.character, text.length);
54
+ });
55
+ // --- section --------------------------------------------------------------
56
+ test('completes sections on the grammatical spelling, space and all', () => {
57
+ const { root, sourcePath } = workspace();
58
+ const text = '{{ chapter.crv #';
59
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
60
+ assert.deepEqual(labels(items), ['#First-section', '#Deeper-bit']);
61
+ });
62
+ test('completes sections from a partial fragment', () => {
63
+ const { root, sourcePath } = workspace();
64
+ const text = '{{ chapter.crv #Deep';
65
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
66
+ assert.deepEqual(labels(items), ['#First-section', '#Deeper-bit']);
67
+ });
68
+ test('the fragment spelled without its space still completes', () => {
69
+ const { root, sourcePath } = workspace();
70
+ const text = '{{ chapter.crv#Deep';
71
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
72
+ assert.ok(labels(items).includes('#Deeper-bit'));
73
+ });
74
+ test('the fragment spelled without its space is REPAIRED to carry one', () => {
75
+ const { root, sourcePath } = workspace();
76
+ const text = '{{ chapter.crv#Deep';
77
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '#Deeper-bit');
78
+ assert.equal(editOf(item).newText, ' #Deeper-bit');
79
+ });
80
+ test('applying a section completion yields text the scanner accepts', () => {
81
+ const { root, sourcePath } = workspace();
82
+ const text = '{{ chapter.crv#Deep';
83
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '#Deeper-bit');
84
+ const line = applied(text, item);
85
+ assert.equal(findDirectives(`${line} }}`).length, 1, `"${line} }}" must scan as one directive`);
86
+ });
87
+ test('applying a section completion selects the section it named', () => {
88
+ const { root, sourcePath } = workspace();
89
+ const text = '{{ chapter.crv#Deep';
90
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '#Deeper-bit');
91
+ assert.equal(findDirectives(`${applied(text, item)} }}`)[0]?.section, 'Deeper-bit');
92
+ });
93
+ // --- option names ---------------------------------------------------------
94
+ test('completes the option names after the sigil', () => {
95
+ const { root, sourcePath } = workspace();
96
+ const text = '{{ chapter.crv @';
97
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
98
+ assert.deepEqual(labels(items).sort(), ['@lines:', '@shift:']);
99
+ });
100
+ test('an option already spelled is not offered a second time', () => {
101
+ const { root, sourcePath } = workspace();
102
+ const text = '{{ chapter.crv @shift:2 @';
103
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
104
+ assert.deepEqual(labels(items), ['@lines:']);
105
+ });
106
+ test('an option completion replaces the sigil and its separator', () => {
107
+ const { root, sourcePath } = workspace();
108
+ const text = '{{ chapter.crv @li';
109
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
110
+ assert.equal(editOf(item).range.start.character, text.length - 4);
111
+ });
112
+ test('an option completion leaves the separator it replaced intact', () => {
113
+ const { root, sourcePath } = workspace();
114
+ const text = '{{ chapter.crv @li';
115
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
116
+ assert.equal(applied(text, item), '{{ chapter.crv @lines:');
117
+ });
118
+ test('applying an option completion yields text the scanner accepts', () => {
119
+ const { root, sourcePath } = workspace();
120
+ const text = '{{ chapter.crv @sh';
121
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '@shift:');
122
+ assert.equal(findDirectives(`${applied(text, item)}auto }}`).length, 1);
123
+ });
124
+ // --- option values --------------------------------------------------------
125
+ test('offers the shift value shapes, auto included', () => {
126
+ const { root, sourcePath } = workspace();
127
+ const text = '{{ chapter.crv @shift:';
128
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
129
+ assert.deepEqual(labels(items), ['auto', '+1', '-1']);
130
+ });
131
+ test('offers the whole-file line range, counted from the child', () => {
132
+ const { root, sourcePath } = workspace();
133
+ const text = '{{ chapter.crv @lines:';
134
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
135
+ assert.deepEqual(labels(items), ['1-5']);
136
+ });
137
+ test('applying a line-range completion yields text the scanner accepts', () => {
138
+ const { root, sourcePath } = workspace();
139
+ const text = '{{ chapter.crv @lines:';
140
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
141
+ assert.deepEqual(findDirectives(`${applied(text, item)} }}`)[0]?.lines, { start: 1, end: 5 });
142
+ });
143
+ // --- containment and quiet cases -----------------------------------------
144
+ test('offers nothing outside a directive', () => {
145
+ const { root, sourcePath } = workspace();
146
+ const text = 'A tag #hea and a mention @nam';
147
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
148
+ });
149
+ test('offers nothing once the directive is closed', () => {
150
+ const { root, sourcePath } = workspace();
151
+ const text = '{{ chapter.crv }} and then @';
152
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
153
+ });
154
+ test('offers no sections for a target outside the containment root', () => {
155
+ const { root, sourcePath } = workspace();
156
+ const text = '{{ ../escape.crv #';
157
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
158
+ });
159
+ // --- separators and quoted paths -----------------------------------------
160
+ // Regressions found by review: both branches below produced suggestions that
161
+ // the scanner rejects, or refused to fire on a directive that is perfectly
162
+ // legal.
163
+ test('an option typed against a previous value carries its separator', () => {
164
+ const { root, sourcePath } = workspace();
165
+ const text = '{{ chapter.crv @shift:1@';
166
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '@lines:');
167
+ assert.equal(editOf(item).newText, ' @lines:');
168
+ });
169
+ test('an option typed against a previous value still yields a parsable directive', () => {
170
+ const { root, sourcePath } = workspace();
171
+ const text = '{{ chapter.crv @shift:1@';
172
+ const item = includeCompletions(text, at(text), { sourcePath, includeRoot: root }).find((candidate) => candidate.label === '@lines:');
173
+ assert.equal(findDirectives(`${applied(text, item)}1-2 }}`).length, 1);
174
+ });
175
+ test('a quoted path completes its sections', () => {
176
+ const { root, sourcePath } = workspace();
177
+ const text = '{{ "with space.crv" #';
178
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
179
+ assert.deepEqual(labels(items), ['#Spaced']);
180
+ });
181
+ test('a quoted path completes its line range', () => {
182
+ const { root, sourcePath } = workspace();
183
+ const text = '{{ "with space.crv" @lines:';
184
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
185
+ assert.deepEqual(labels(items), ['1-1']);
186
+ });
187
+ test('a quoted path completes its option names', () => {
188
+ const { root, sourcePath } = workspace();
189
+ const text = '{{ "with space.crv" @';
190
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
191
+ assert.deepEqual(labels(items).sort(), ['@lines:', '@shift:']);
192
+ });
193
+ test('a half-typed quoted path completes the file name', () => {
194
+ const { root, sourcePath } = workspace();
195
+ const text = '{{ "with sp';
196
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
197
+ assert.deepEqual(labels(items), ['with space.crv']);
198
+ });
199
+ test('a quoted path is not offered a second set of quotes', () => {
200
+ const { root, sourcePath } = workspace();
201
+ const text = '{{ "with sp';
202
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
203
+ assert.equal(editOf(item).newText, 'with space.crv"');
204
+ });
205
+ // --- quoting, and what may precede an option -----------------------------
206
+ // Second review round: both branches below advertised a path or an option
207
+ // whose inserted form the scanner rejects.
208
+ test('a name that cannot be spelled bare is offered under its plain label', () => {
209
+ const { root, sourcePath } = workspace();
210
+ const text = '{{ with';
211
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
212
+ assert.deepEqual(labels(items), ['with space.crv']);
213
+ });
214
+ test('a name that cannot be spelled bare is INSERTED quoted', () => {
215
+ const { root, sourcePath } = workspace();
216
+ const text = '{{ with';
217
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
218
+ assert.equal(editOf(item).newText, '"with space.crv"');
219
+ });
220
+ test('a quoted path completion yields text the scanner accepts', () => {
221
+ const { root, sourcePath } = workspace();
222
+ const text = '{{ with';
223
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
224
+ assert.equal(findDirectives(`${applied(text, item)} }}`).length, 1);
225
+ });
226
+ test('a half-typed quoted path is closed by the completion', () => {
227
+ const { root, sourcePath } = workspace();
228
+ const text = '{{ "with sp';
229
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
230
+ assert.equal(applied(text, item), '{{ "with space.crv"');
231
+ });
232
+ test('a half-typed quoted path completion yields text the scanner accepts', () => {
233
+ const { root, sourcePath } = workspace();
234
+ const text = '{{ "with sp';
235
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
236
+ assert.equal(findDirectives(`${applied(text, item)} }}`)[0]?.path, 'with space.crv');
237
+ });
238
+ test('no option is offered after text that is not a directive prefix', () => {
239
+ const { root, sourcePath } = workspace();
240
+ const text = '{{ chapter.crv nonsense @';
241
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
242
+ });
243
+ test('no option value is offered after text that is not a directive prefix', () => {
244
+ const { root, sourcePath } = workspace();
245
+ const text = '{{ chapter.crv nonsense @shift:';
246
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
247
+ });
248
+ test('an option is still offered after a section, which IS a legal prefix', () => {
249
+ const { root, sourcePath } = workspace();
250
+ const text = '{{ chapter.crv #Deeper-bit @';
251
+ const items = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
252
+ assert.deepEqual(labels(items).sort(), ['@lines:', '@shift:']);
253
+ });
254
+ // --- curly quotes and an empty target ------------------------------------
255
+ // Third review round.
256
+ test('a curly-opened path is closed with the curly delimiter', () => {
257
+ const { root, sourcePath } = workspace();
258
+ const text = '{{ “with sp';
259
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
260
+ assert.equal(applied(text, item), '{{ “with space.crv”');
261
+ });
262
+ test('a curly-quoted completion yields text the scanner accepts', () => {
263
+ const { root, sourcePath } = workspace();
264
+ const text = '{{ “with sp';
265
+ const [item] = includeCompletions(text, at(text), { sourcePath, includeRoot: root });
266
+ assert.equal(findDirectives(`${applied(text, item)} }}`)[0]?.path, 'with space.crv');
267
+ });
268
+ test('an empty target is offered no line range', () => {
269
+ const { root, sourcePath } = workspace();
270
+ writeFileSync(path.join(root, 'empty.crv'), '');
271
+ const text = '{{ empty.crv @lines:';
272
+ assert.deepEqual(includeCompletions(text, at(text), { sourcePath, includeRoot: root }), []);
14
273
  });
15
274
  //# sourceMappingURL=include-completion.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"include-completion.test.js","sourceRoot":"","sources":["../src/include-completion.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAA;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC9C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IACjD,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAC7H,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;AAC9I,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"include-completion.test.js","sourceRoot":"","sources":["../src/include-completion.test.ts"],"names":[],"mappings":"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"}