@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
@@ -1,5 +1,10 @@
1
1
  import { pathToFileURL } from 'node:url';
2
2
  import { findDirectives } from './include-directive.js';
3
+ import { lineCount, sectionRange } from './include-selection.js';
4
+ const FILE_START = {
5
+ start: { line: 0, character: 0 },
6
+ end: { line: 0, character: 0 },
7
+ };
3
8
  export function includeDefinitionAt(source, position, options) {
4
9
  if (!options?.resolver)
5
10
  return null;
@@ -18,12 +23,34 @@ export function includeDefinitionAt(source, position, options) {
18
23
  return null;
19
24
  return {
20
25
  uri: pathToFileURL(resolved.id).toString(),
21
- range: {
22
- start: { line: 0, character: 0 },
23
- end: { line: 0, character: 0 },
24
- },
26
+ range: selectionRange(directive, resolved.source),
25
27
  };
26
28
  }
29
+ /**
30
+ * Where in the child the jump lands.
31
+ *
32
+ * A directive that selects a section or a line range names a PLACE, and both
33
+ * are already parsed onto the directive - throwing them away and landing on
34
+ * line 1 every time discards information the caller is holding. A selection
35
+ * that does not resolve falls back to the top of the file rather than refusing
36
+ * the jump: the file itself resolved, and `include-section` already reports
37
+ * the bad selection as a diagnostic.
38
+ */
39
+ function selectionRange(directive, source) {
40
+ if (directive.section !== undefined) {
41
+ return sectionRange(source, directive.section) ?? FILE_START;
42
+ }
43
+ if (directive.lines !== undefined) {
44
+ // A range starting past the end of the child has no line to land on, and
45
+ // definition can be invoked independently of the diagnostic that reports
46
+ // it, so the out-of-bounds position must not leave this function.
47
+ if (directive.lines.start > lineCount(source))
48
+ return FILE_START;
49
+ const line = directive.lines.start - 1;
50
+ return { start: { line, character: 0 }, end: { line, character: 0 } };
51
+ }
52
+ return FILE_START;
53
+ }
27
54
  function offsetAt(source, position) {
28
55
  let offset = 0;
29
56
  for (let line = 0; line < position.line; line += 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"include-definition.js","sourceRoot":"","sources":["../src/include-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGvD,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,QAAkB,EAClB,OAAmC;IAEnC,IAAI,CAAC,OAAO,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAA;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,IAAI,CAC/C,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CACnE,CAAA;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE;QAChD,KAAK;QACL,KAAK,EAAE,CAAC;QACR,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;KAChF,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO;QACL,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC1C,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;YAChC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SAC/B;KACF,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAkB;IAClD,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5C,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,MAAM,CAAA;QACrC,MAAM,GAAG,OAAO,GAAG,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;AAC7D,CAAC"}
1
+ {"version":3,"file":"include-definition.js","sourceRoot":"","sources":["../src/include-definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Diagnostic classification for a resolver refusal (PART 9 §19).
3
+ *
4
+ * The cross-engine RULE id stays `include-unresolved` for every refusal. Four
5
+ * include-conformance goldens pin it on exactly these shapes
6
+ * (`i10-fs-dotdot-escape-denied`, `i10-fs-symlink-dir-escape-denied`,
7
+ * `i10-fs-symlink-file-and-dotdot-denied`, `i10-fs-absolute-path-denied`), and
8
+ * the engine could not spell anything else if it wanted to: its resolver
9
+ * contract is `IncludeResolved | null`, so missing and refused arrive
10
+ * indistinguishable.
11
+ *
12
+ * A DIAGNOSTIC code is not that contract, and this server's resolver already
13
+ * computes the class - `outside-root` is not `not-found`. The diagnostic used
14
+ * to discard it, telling an author whose include was REFUSED that the file
15
+ * could not be found.
16
+ *
17
+ * Publishing the class discloses nothing: a target outside the root is refused
18
+ * whether or not it exists (the containment test runs on a canonical candidate
19
+ * built for a missing path too), and the absolute and remote refusals are
20
+ * decided from the spelling alone. §19 I7 is satisfied as before - the message
21
+ * is processor-generated, names the class in prose, and never carries a
22
+ * resolver error or a path the author did not write.
23
+ *
24
+ * The seam survives #187: once the engine's `expandIncludes` owns the walk, the
25
+ * adapter narrowing this resolver to `IncludeResolved | null` records the
26
+ * denial per directive path and hands `null` on, and the engine's
27
+ * `include-unresolved` warning is joined back to the class here.
28
+ */
29
+ import type { IncludeDenial } from './include-path.js';
30
+ /** Diagnostic code for a refusal, or undefined to keep `include-unresolved`. */
31
+ export declare function includeDenialCode(denial: IncludeDenial): string | undefined;
32
+ /** Message for a refusal, or undefined to keep the unresolved wording. */
33
+ export declare function includeDenialMessage(denial: IncludeDenial, includePath: string): string | undefined;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `not-found` is deliberately absent: a target that is merely missing IS
3
+ * unresolved, and keeping `include-unresolved` on it is what makes the new
4
+ * codes mean something.
5
+ *
6
+ * So is the include-security corpus's `no-root` class, for a different reason:
7
+ * it never reaches a resolver. A configured value that names no root leaves
8
+ * `includeOptionsFor` with no resolver to build, and the include pass is inert
9
+ * without one, so no directive is recognized and nothing is refused.
10
+ */
11
+ const DENIALS = {
12
+ 'outside-root': {
13
+ code: 'include-denied',
14
+ reason: 'it resolves outside the include root',
15
+ },
16
+ 'absolute-denied': {
17
+ code: 'include-denied',
18
+ reason: 'absolute include paths are not allowed',
19
+ },
20
+ 'remote-not-allowed': {
21
+ code: 'include-denied',
22
+ reason: 'remote includes are never fetched',
23
+ },
24
+ 'not-a-file': {
25
+ // §19 lists non-text content as its own degradation, and `include-non-text`
26
+ // is the canonical rule id for it. A FIFO, a device or a directory is no
27
+ // more a document than a binary file is.
28
+ code: 'include-non-text',
29
+ reason: 'the target is not a regular file',
30
+ },
31
+ };
32
+ /** Diagnostic code for a refusal, or undefined to keep `include-unresolved`. */
33
+ export function includeDenialCode(denial) {
34
+ return DENIALS[denial]?.code;
35
+ }
36
+ /** Message for a refusal, or undefined to keep the unresolved wording. */
37
+ export function includeDenialMessage(denial, includePath) {
38
+ const entry = DENIALS[denial];
39
+ return entry && `Include "${includePath}" was refused: ${entry.reason}.`;
40
+ }
41
+ //# sourceMappingURL=include-denial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"include-denial.js","sourceRoot":"","sources":["../src/include-denial.ts"],"names":[],"mappings":"AAqCA;;;;;;;;;GASG;AACH,MAAM,OAAO,GAAqD;IAChE,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,sCAAsC;KAC/C;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,wCAAwC;KACjD;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,mCAAmC;KAC5C;IACD,YAAY,EAAE;QACZ,4EAA4E;QAC5E,yEAAyE;QACzE,yCAAyC;QACzC,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,kCAAkC;KAC3C;CACF,CAAA;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;AAC9B,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB,CAClC,MAAqB,EACrB,WAAmB;IAEnB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,OAAO,KAAK,IAAI,YAAY,WAAW,kBAAkB,KAAK,CAAC,MAAM,GAAG,CAAA;AAC1E,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,126 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+ import { analyzeCarve } from './analyze.js';
7
+ import { fileSystemResolver } from './include-path.js';
8
+ import { resolveIncludes } from './includes.js';
9
+ // A containment refusal and a missing file are different failures, and PART 9
10
+ // §19 keeps one rule id for both (the include-conformance goldens `i10-fs-*`
11
+ // pin `include-unresolved` on every denial, and the engine's resolver contract
12
+ // returns a bare `null`). The DIAGNOSTIC is not that contract, so the code and
13
+ // the wording separate them. One assertion per test: a suite stops at the first
14
+ // failure, so rows behind it would never run.
15
+ function diagnose(source, denial) {
16
+ const result = analyzeCarve(source, {
17
+ includes: {
18
+ resolver: (includePath) => ({ ok: false, id: includePath, denial }),
19
+ sourcePath: '/ws/doc.crv',
20
+ includeRoot: '/ws',
21
+ },
22
+ });
23
+ const [diagnostic] = result.diagnostics.filter((item) => item.source === 'carve');
24
+ assert.ok(diagnostic, `expected a diagnostic for ${denial}`);
25
+ return diagnostic;
26
+ }
27
+ test('a containment refusal publishes include-denied, not include-unresolved', () => {
28
+ assert.equal(diagnose('{{ ../outside.crv }}\n', 'outside-root').code, 'include-denied');
29
+ });
30
+ test('a containment refusal says the target is outside the include root', () => {
31
+ assert.match(diagnose('{{ ../outside.crv }}\n', 'outside-root').message, /outside the include root/);
32
+ });
33
+ test('a containment refusal no longer claims the target could not be resolved', () => {
34
+ assert.doesNotMatch(diagnose('{{ ../outside.crv }}\n', 'outside-root').message, /could not be resolved/);
35
+ });
36
+ // The control. A file that really is missing must keep reporting as missing, or
37
+ // the new code means nothing.
38
+ test('a genuinely missing target still publishes include-unresolved', () => {
39
+ assert.equal(diagnose('{{ chapters/missing.crv }}\n', 'not-found').code, 'include-unresolved');
40
+ });
41
+ test('a genuinely missing target keeps its unresolved wording', () => {
42
+ assert.match(diagnose('{{ chapters/missing.crv }}\n', 'not-found').message, /could not be resolved/);
43
+ });
44
+ test('an absolute path refusal publishes include-denied', () => {
45
+ assert.equal(diagnose('{{ /etc/passwd }}\n', 'absolute-denied').code, 'include-denied');
46
+ });
47
+ test('an absolute path refusal says absolute paths are not allowed', () => {
48
+ assert.match(diagnose('{{ /etc/passwd }}\n', 'absolute-denied').message, /absolute include paths/);
49
+ });
50
+ test('a remote refusal publishes include-denied', () => {
51
+ assert.equal(diagnose('{{ https://host/x.crv }}\n', 'remote-not-allowed').code, 'include-denied');
52
+ });
53
+ test('a remote refusal says remote includes are never fetched', () => {
54
+ assert.match(diagnose('{{ https://host/x.crv }}\n', 'remote-not-allowed').message, /never fetched/);
55
+ });
56
+ // §19 lists non-text content as its own degradation and `include-non-text` is
57
+ // the canonical rule id for it; #191 already uses it for a NUL-bearing target.
58
+ // A FIFO, a device or a directory was still reported as a missing file.
59
+ test('a target that is not a regular file publishes include-non-text', () => {
60
+ assert.equal(diagnose('{{ chapters }}\n', 'not-a-file').code, 'include-non-text');
61
+ });
62
+ test('a resolver that throws keeps include-unresolved, since no class is known', () => {
63
+ const result = analyzeCarve('{{ a.crv }}\n', {
64
+ includes: {
65
+ resolver: () => {
66
+ throw new Error('ENOENT: open /home/someone/secret/a.crv');
67
+ },
68
+ sourcePath: '/ws/doc.crv',
69
+ },
70
+ });
71
+ assert.equal(result.diagnostics.find((item) => item.source === 'carve')?.code, 'include-unresolved');
72
+ });
73
+ // §19 I7. The internal token stays internal; the message names the class in the
74
+ // processor's own prose.
75
+ test('the internal denial token never reaches the published message', () => {
76
+ assert.doesNotMatch(diagnose('{{ ../outside.crv }}\n', 'outside-root').message, /outside-root/);
77
+ });
78
+ // The cross-engine contract. Changing this would diverge from four
79
+ // include-conformance goldens and could not survive #187, where the engine owns
80
+ // the warning and can only spell `include-unresolved`.
81
+ test('the cross-engine rule id on the warning is still include-unresolved', () => {
82
+ const result = resolveIncludes('{{ ../outside.crv }}\n', {
83
+ resolver: (includePath) => ({ ok: false, id: includePath, denial: 'outside-root' }),
84
+ });
85
+ assert.equal(result.warnings[0]?.rule, 'include-unresolved');
86
+ });
87
+ test('the warning carries the refusal class for the diagnostic layer to map', () => {
88
+ const result = resolveIncludes('{{ ../outside.crv }}\n', {
89
+ resolver: (includePath) => ({ ok: false, id: includePath, denial: 'outside-root' }),
90
+ });
91
+ assert.equal(result.warnings[0]?.denial, 'outside-root');
92
+ });
93
+ /**
94
+ * The reason distinguishing a refusal from a miss is not a host-layout probe:
95
+ * the answer does not depend on whether the refused target exists. Driven
96
+ * through the real filesystem resolver on a real tree, not a stub.
97
+ */
98
+ function outsideDiagnostics() {
99
+ const base = realpathSync(mkdtempSync(path.join(tmpdir(), 'carve-lsp-denial-')));
100
+ test.after(() => rmSync(base, { recursive: true, force: true }));
101
+ mkdirSync(path.join(base, 'root'));
102
+ writeFileSync(path.join(base, 'root', 'doc.crv'), '');
103
+ writeFileSync(path.join(base, 'present.crv'), 'TOP SECRET\n');
104
+ const root = path.join(base, 'root');
105
+ const analyze = (spec) => {
106
+ const result = analyzeCarve(`{{ ${spec} }}\n`, {
107
+ includes: {
108
+ resolver: fileSystemResolver(root),
109
+ sourcePath: path.join(root, 'doc.crv'),
110
+ includeRoot: root,
111
+ },
112
+ });
113
+ const diagnostic = result.diagnostics.find((item) => item.source === 'carve');
114
+ assert.ok(diagnostic, `expected a diagnostic for ${spec}`);
115
+ return `${String(diagnostic.code)} ${diagnostic.message}`;
116
+ };
117
+ return { present: analyze('../present.crv'), absent: analyze('../absent.crv') };
118
+ }
119
+ test('an outside target that exists is refused as include-denied', () => {
120
+ assert.match(outsideDiagnostics().present, /^include-denied /);
121
+ });
122
+ test('an outside target that exists and one that does not are indistinguishable', () => {
123
+ const { present, absent } = outsideDiagnostics();
124
+ assert.equal(present.replace('present', 'X'), absent.replace('absent', 'X'));
125
+ });
126
+ //# sourceMappingURL=include-denial.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"include-denial.test.js","sourceRoot":"","sources":["../src/include-denial.test.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,104 @@
12
12
  * engine to parse with (the pinned `@markup-carve/carve` predates the pass), so
13
13
  * it scans the raw document text and shields verbatim regions itself.
14
14
  */
15
- export const DIRECTIVE_SCAN_RE = /\{\{\s+(?:"((?:\\.|[^"\\])*)"|\u201c([^\u201d]*)\u201d|([^#@}\s"\u201c]+))((?:\s+#[A-Za-z_][\w-]*)?)(.*?)\s+\}\}/g;
16
- export const DIRECTIVE_FULL_RE = /^\{\{\s+(?:"((?:\\.|[^"\\])*)"|\u201c([^\u201d]*)\u201d|([^#@}\s"\u201c]+))((?:\s+#[A-Za-z_][\w-]*)?)(.*?)\s+\}\}$/;
17
- const OPTION_RE = /^@([A-Za-z_][\w-]*):([^#@}\s]+)$/;
15
+ /**
16
+ * A quoted run: its opening quote through the first unescaped matching one.
17
+ * PART 4's `quoted_value` has both spellings, and each excludes only its own
18
+ * quote, the backslash and the newline, so a `}}` between the quotes belongs to
19
+ * the run rather than closing the directive (PART 6 closer clause,
20
+ * markup-carve/carve#2013).
21
+ */
22
+ const DQUOTED_RUN = String.raw `"(?:\\.|[^"\\\n])*?"`;
23
+ const SQUOTED_RUN = String.raw `'(?:\\.|[^'\\\n])*?'`;
24
+ /**
25
+ * The option slot up to the closer, stepping OVER whole quoted runs. The two
26
+ * lookaheads are the exact negation of the runs beside them, so at any position
27
+ * either a run starts and only a run alternative is viable, or none does and
28
+ * only the single-character one is. No position is reachable two ways, so the
29
+ * lazy scan never backtracks across the alternation.
30
+ */
31
+ const QUOTE_AWARE_OPTIONS = String.raw `(?:${DQUOTED_RUN}|${SQUOTED_RUN}|(?!${DQUOTED_RUN})(?!${SQUOTED_RUN})[^\n])*?`;
32
+ const OPEN = String.raw `\{\{\s+`;
33
+ const PATH = String.raw `(?:"((?:\\.|[^"\\])*)"|\u201c([^\u201d]*)\u201d|([^#@}\s"\u201c]+))`;
34
+ const SECTION = String.raw `((?:\s+#[A-Za-z_][\w-]*)?)`;
35
+ const CLOSE = String.raw `\s+\}\}`;
36
+ const body = (options) => `${OPEN}${PATH}${SECTION}(${options})${CLOSE}`;
37
+ const QUOTE_AWARE_BODY = body(QUOTE_AWARE_OPTIONS);
38
+ /**
39
+ * The fallback reading, tried only where the quote-aware one finds no closer at
40
+ * all: an UNTERMINATED quote opens no run, so it must not pair with a quote that
41
+ * lies PAST the closer and leave the whole token unrecognized. Section 19
42
+ * forbids exactly one outcome, literal text with no diagnostic, and that is what
43
+ * dropping this branch would produce for `{{ a @k:"x }} said "hi"`.
44
+ */
45
+ const FIRST_PAIR_BODY = body(String.raw `.*?`);
46
+ export const DIRECTIVE_SCAN_RE = new RegExp(`(?:${QUOTE_AWARE_BODY})|(?:${FIRST_PAIR_BODY})`, 'g');
47
+ export const DIRECTIVE_FULL_RE = new RegExp(`^(?:${QUOTE_AWARE_BODY})$`);
48
+ const OPTION_KEY_RE = /^@([A-Za-z_][\w-]*):/;
49
+ /**
50
+ * The option slot split into `@key:value` parts on whitespace that falls
51
+ * OUTSIDE a quoted value, so `@k:"a b"` stays one part. A run that never closes
52
+ * is not a run, and its quote is an ordinary character.
53
+ */
54
+ function splitOptions(rest) {
55
+ const parts = [];
56
+ let current = '';
57
+ for (let i = 0; i < rest.length; i += 1) {
58
+ const ch = rest[i];
59
+ if (ch === '"' || ch === "'") {
60
+ const end = quotedRunEnd(rest, i);
61
+ if (end !== -1) {
62
+ current += rest.slice(i, end + 1);
63
+ i = end;
64
+ continue;
65
+ }
66
+ }
67
+ if (/\s/.test(ch)) {
68
+ if (current)
69
+ parts.push(current);
70
+ current = '';
71
+ continue;
72
+ }
73
+ current += ch;
74
+ }
75
+ if (current)
76
+ parts.push(current);
77
+ return parts;
78
+ }
79
+ /**
80
+ * The end index of the quoted run opening at `from`, or -1 when the quote is
81
+ * never closed on its line. A backslash escapes the next character.
82
+ */
83
+ function quotedRunEnd(text, from) {
84
+ const quote = text[from];
85
+ for (let i = from + 1; i < text.length; i += 1) {
86
+ const ch = text[i];
87
+ if (ch === '\n')
88
+ return -1;
89
+ if (ch === '\\') {
90
+ i += 1;
91
+ continue;
92
+ }
93
+ if (ch === quote)
94
+ return i;
95
+ }
96
+ return -1;
97
+ }
98
+ /**
99
+ * One `attribute_value` (PART 4): a quoted run in either quote, else the bare
100
+ * set. Returns the value with its quotes and escapes removed, or null when the
101
+ * text is not one whole value.
102
+ */
103
+ function readOptionValue(raw) {
104
+ if (raw === '')
105
+ return null;
106
+ if (raw[0] === '"' || raw[0] === "'") {
107
+ if (quotedRunEnd(raw, 0) !== raw.length - 1)
108
+ return null;
109
+ return raw.slice(1, -1).replace(/\\(.)/g, '$1');
110
+ }
111
+ return /^[^#@}\s"'\u201c]+$/.test(raw) ? raw : null;
112
+ }
18
113
  function unescapeQuotedPath(value) {
19
114
  return value.replace(/\\(["\\])/g, '$1');
20
115
  }
@@ -37,19 +132,23 @@ export function parseDirective(raw, onInvalidOption) {
37
132
  let shift = 0;
38
133
  const rest = m[5]?.trim();
39
134
  if (rest) {
40
- for (const part of rest.split(/\s+/)) {
41
- const opt = OPTION_RE.exec(part);
135
+ for (const part of splitOptions(rest)) {
136
+ const key = OPTION_KEY_RE.exec(part);
42
137
  const invalid = () => {
43
138
  // I1: an unrecognized (or malformed) option makes the directive
44
- // unresolvable - warning plus literal text, never a silent drop.
139
+ // unresolvable - warning plus literal text, never a silent drop. The
140
+ // part is reported as written, quotes and all, so the message names the
141
+ // option the author typed.
45
142
  if (part.startsWith('@'))
46
143
  onInvalidOption?.(part);
47
144
  return null;
48
145
  };
49
- if (!opt)
146
+ if (!key)
147
+ return invalid();
148
+ const value = readOptionValue(part.slice(key[0].length));
149
+ if (value === null)
50
150
  return invalid();
51
- const [, key, value] = opt;
52
- if (key === 'lines') {
151
+ if (key[1] === 'lines') {
53
152
  const lm = /^([1-9]\d*)-([1-9]\d*)$/.exec(value);
54
153
  if (!lm)
55
154
  return invalid();
@@ -57,7 +156,7 @@ export function parseDirective(raw, onInvalidOption) {
57
156
  if (lines.end < lines.start)
58
157
  return invalid();
59
158
  }
60
- else if (key === 'shift') {
159
+ else if (key[1] === 'shift') {
61
160
  // I8: a signed integer or the literal "auto", never both forms.
62
161
  if (value === 'auto')
63
162
  shift = 'auto';
@@ -149,8 +248,16 @@ export function findDirectives(source, onInvalidOption) {
149
248
  if (inVerbatim(start))
150
249
  continue;
151
250
  const parsed = parseDirective(m[0], (part) => onInvalidOption?.(part, start, end));
152
- if (!parsed)
251
+ if (!parsed) {
252
+ // A malformed token is ordinary text, so the scan RESUMES one character
253
+ // in rather than past it. A quote left open by the malformed token can
254
+ // otherwise pair with one inside a later directive and swallow it:
255
+ // `{{ a.crv @k:"x }} {{ b.crv @shift:"2" }}` would lose `b.crv`
256
+ // entirely. This is what the spec's engine-free reader does
257
+ // (markup-carve/carve scripts/spec/include-directive.mjs).
258
+ re.lastIndex = start + 1;
153
259
  continue;
260
+ }
154
261
  found.push({ ...parsed, start, end });
155
262
  }
156
263
  return found;
@@ -1 +1 @@
1
- {"version":3,"file":"include-directive.js","sourceRoot":"","sources":["../src/include-directive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"include-directive.js","sourceRoot":"","sources":["../src/include-directive.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,48 @@ test('a malformed shift value is an unknown option (i01-shift-malformed-value)',
41
41
  assert.deepEqual(findDirectives('{{ child @shift:x }}', (part) => seen.push(part)), []);
42
42
  assert.deepEqual(seen, ['@shift:x']);
43
43
  });
44
+ test('a quoted option value keeps its spaces (PART 4 attribute_value)', () => {
45
+ const seen = [];
46
+ const found = findDirectives('{{ child @title:"a b" }}', (part) => seen.push(part));
47
+ // `title` is not a defined option, so the directive stays literal - but the
48
+ // warning must name the option the author wrote, not a fragment of it.
49
+ assert.deepEqual(found, []);
50
+ assert.deepEqual(seen, ['@title:"a b"']);
51
+ });
52
+ test('a quoted value satisfies a known option', () => {
53
+ const [d] = findDirectives('{{ child @shift:"2" }}');
54
+ assert.ok(d);
55
+ assert.equal(d.shift, 2);
56
+ });
57
+ test('the closer is the first }} outside a quoted run (markup-carve/carve#2013)', () => {
58
+ const seen = [];
59
+ const source = '{{ ch.crv @label:"a }} more" }} {{ b.crv }}';
60
+ const found = findDirectives(source, (part) => seen.push(part));
61
+ // The first token ends at the pair AFTER the closing quote, so the second
62
+ // directive is recognized whole rather than out of the leftovers.
63
+ assert.deepEqual(seen, ['@label:"a }} more"']);
64
+ assert.deepEqual(found.map((d) => d.path), ['b.crv']);
65
+ assert.equal(found[0]?.start, source.indexOf('{{ b.crv'));
66
+ });
67
+ test("a single-quoted value is a run too", () => {
68
+ const seen = [];
69
+ assert.deepEqual(findDirectives("{{ ch.crv @label:'a }} b' }}", (part) => seen.push(part)), []);
70
+ assert.deepEqual(seen, ["@label:'a }} b'"]);
71
+ });
72
+ test('an unterminated quote opens no run, so the first pair closes the directive', () => {
73
+ const seen = [];
74
+ const found = findDirectives('{{ a.crv @k:"x }} said "hi"', (part) => seen.push(part));
75
+ assert.deepEqual(found, []);
76
+ assert.deepEqual(seen, ['@k:"x']);
77
+ });
78
+ test('a malformed token does not swallow the directive after it', () => {
79
+ const found = findDirectives('{{ a.crv @k:"x }} {{ b.crv @shift:"2" }}');
80
+ // The first token is not a directive (its value runs past the closer), so the
81
+ // scan resumes inside it and still recognizes the second one, the way the
82
+ // spec's engine-free reader does.
83
+ assert.deepEqual(found.map((d) => d.path), ['b.crv']);
84
+ assert.equal(found[0]?.shift, 2);
85
+ });
44
86
  test('several directives in one run are all found (i09a-multi-directive-one-run)', () => {
45
87
  const found = findDirectives('start {{ a.crv }} mid {{ b.crv }} end');
46
88
  assert.deepEqual(found.map((d) => d.path), ['a.crv', 'b.crv']);
@@ -1 +1 @@
1
- {"version":3,"file":"include-directive.test.js","sourceRoot":"","sources":["../src/include-directive.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"include-directive.test.js","sourceRoot":"","sources":["../src/include-directive.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};