@nielspeter/eess-md 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +3 -1
  2. package/dist/builders/declaration-findings.d.ts +37 -0
  3. package/dist/builders/declaration-findings.d.ts.map +1 -0
  4. package/dist/builders/declaration-findings.js +128 -0
  5. package/dist/builders/declaration-findings.js.map +1 -0
  6. package/dist/builders/links.d.ts +60 -1
  7. package/dist/builders/links.d.ts.map +1 -1
  8. package/dist/builders/links.js +92 -1
  9. package/dist/builders/links.js.map +1 -1
  10. package/dist/conditions/linked-back.d.ts +17 -0
  11. package/dist/conditions/linked-back.d.ts.map +1 -0
  12. package/dist/conditions/linked-back.js +122 -0
  13. package/dist/conditions/linked-back.js.map +1 -0
  14. package/dist/conditions/resolve.d.ts +8 -40
  15. package/dist/conditions/resolve.d.ts.map +1 -1
  16. package/dist/conditions/resolve.js +26 -138
  17. package/dist/conditions/resolve.js.map +1 -1
  18. package/dist/corpus.d.ts +3 -0
  19. package/dist/corpus.d.ts.map +1 -1
  20. package/dist/corpus.js +7 -10
  21. package/dist/corpus.js.map +1 -1
  22. package/dist/index.d.ts +4 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/model/document.d.ts +8 -1
  27. package/dist/model/document.d.ts.map +1 -1
  28. package/dist/model/document.js +14 -3
  29. package/dist/model/document.js.map +1 -1
  30. package/dist/model/label.d.ts +35 -0
  31. package/dist/model/label.d.ts.map +1 -0
  32. package/dist/model/label.js +68 -0
  33. package/dist/model/label.js.map +1 -0
  34. package/dist/model/links.d.ts +43 -0
  35. package/dist/model/links.d.ts.map +1 -1
  36. package/dist/model/links.js +112 -11
  37. package/dist/model/links.js.map +1 -1
  38. package/dist/model/prose.d.ts +11 -0
  39. package/dist/model/prose.d.ts.map +1 -1
  40. package/dist/model/prose.js +50 -5
  41. package/dist/model/prose.js.map +1 -1
  42. package/dist/model/query.d.ts +7 -0
  43. package/dist/model/query.d.ts.map +1 -1
  44. package/dist/model/query.js +10 -3
  45. package/dist/model/query.js.map +1 -1
  46. package/dist/model/resolve-link.d.ts +142 -0
  47. package/dist/model/resolve-link.d.ts.map +1 -0
  48. package/dist/model/resolve-link.js +194 -0
  49. package/dist/model/resolve-link.js.map +1 -0
  50. package/dist/predicates/declared-block.d.ts +29 -0
  51. package/dist/predicates/declared-block.d.ts.map +1 -0
  52. package/dist/predicates/declared-block.js +47 -0
  53. package/dist/predicates/declared-block.js.map +1 -0
  54. package/dist/predicates/live-target.d.ts +12 -0
  55. package/dist/predicates/live-target.d.ts.map +1 -0
  56. package/dist/predicates/live-target.js +17 -0
  57. package/dist/predicates/live-target.js.map +1 -0
  58. package/dist/rules/adr.d.ts +14 -5
  59. package/dist/rules/adr.d.ts.map +1 -1
  60. package/dist/rules/adr.js +5 -27
  61. package/dist/rules/adr.js.map +1 -1
  62. package/dist/rules/ledger.d.ts +10 -6
  63. package/dist/rules/ledger.d.ts.map +1 -1
  64. package/dist/rules/ledger.js +80 -24
  65. package/dist/rules/ledger.js.map +1 -1
  66. package/package.json +6 -3
@@ -1,125 +1,45 @@
1
- import { posix } from 'node:path';
2
1
  import { mdViolation } from '../model/violation.js';
3
- /**
4
- * Resolve an internal link's URL to its base repo-relative target(s), or `[]`
5
- * if it is a pure fragment (`#anchor`) or otherwise not a file reference.
6
- * Site-absolute links (leading `/`) yield the repo-root target plus, when
7
- * `rootDir` is set, the content-root target.
8
- */
9
- function resolveTargets(link, options) {
10
- const withoutFragment = link.url.split('#')[0] ?? '';
11
- if (withoutFragment === '')
12
- return []; // same-document anchor
13
- const decoded = decodeURIComponent(withoutFragment);
14
- if (decoded.startsWith('/')) {
15
- const repoRooted = posix.normalize(decoded.replace(/^\/+/, ''));
16
- return options.rootDir !== undefined
17
- ? [repoRooted, posix.normalize(posix.join(options.rootDir, repoRooted))]
18
- : [repoRooted];
19
- }
20
- const base = posix.dirname(link.doc.relPath);
21
- return [posix.normalize(posix.join(base, decoded))];
22
- }
23
- /** All repo-relative candidates for a target under the given options. */
24
- function candidates(target, options) {
25
- const out = [target];
26
- const bare = target.replace(/\/+$/, '');
27
- for (const ext of options.tryExtensions ?? []) {
28
- out.push(bare + ext);
29
- }
30
- if (options.tryIndex !== undefined) {
31
- out.push(posix.join(bare, options.tryIndex));
32
- }
33
- return out;
34
- }
35
- /**
36
- * Every known directory reachable from `fileIndex`'s files, derived from it
37
- * rather than new I/O: each indexed file's ancestors are known directories.
38
- * `fileIndex` itself spans the whole physical repo walk from `cwd`, not just
39
- * the corpus's configured `roots` (`roots` only filters which files become
40
- * *documents* — see `corpus()`), so a directory link can resolve against
41
- * something outside any configured root. Built only when `resolveDirectories`
42
- * is on — the cost of a directory-shaped link resolving is opt-in, so is the
43
- * cost of computing it.
44
- *
45
- * The repo root itself (`.`) is deliberately excluded — `[root](/)` still
46
- * won't resolve even with the option on. Nobody links "the whole repo," and
47
- * `resolveTargets` never had a resolvable shape for it before this option
48
- * existed either.
49
- */
50
- function directoryIndex(corpus) {
51
- const dirs = new Set();
52
- for (const rel of corpus.fileIndex) {
53
- let dir = posix.dirname(rel);
54
- while (dir !== '.' && dir !== '/' && !dirs.has(dir)) {
55
- dirs.add(dir);
56
- dir = posix.dirname(dir);
57
- }
58
- }
59
- return dirs;
60
- }
2
+ import { basenameIndex, linkTargets, movedLinkFix, resolveLink, } from '../model/resolve-link.js';
61
3
  /**
62
4
  * Condition: every (internal) link resolves to a file in the corpus's repo tree.
63
5
  * Closes over the `Corpus` for the file index. External links and pure anchors
64
6
  * are skipped. `options` adds extensionless-link resolution (`tryExtensions`,
65
7
  * `tryIndex`) for static-site corpora, and directory resolution
66
8
  * (`resolveDirectories`) for repo-hosted ones.
9
+ *
10
+ * Resolution is `resolveLink`'s (plan 0404): this condition only decides which
11
+ * of its cases count as resolved — a loaded document, an existing file outside
12
+ * the corpus, and (with `resolveDirectories`) a directory.
67
13
  */
68
14
  export function linkResolves(corpus, options = {}) {
69
15
  // Basename → repo files, for finding a uniquely-moved target of a broken link.
70
- const byBasename = new Map();
71
- for (const rel of corpus.fileIndex) {
72
- const base = rel.slice(rel.lastIndexOf('/') + 1);
73
- const list = byBasename.get(base);
74
- if (list)
75
- list.push(rel);
76
- else
77
- byBasename.set(base, [rel]);
78
- }
79
- const dirIndex = options.resolveDirectories === true ? directoryIndex(corpus) : undefined;
80
- // Bug 0137: a link that names a real directory and one that names nothing
81
- // at all both reported the identical "does not resolve" message — no hint
82
- // that `resolveDirectories` exists, or that this specific target would
83
- // resolve with it on. Built lazily (at most once, memoized) rather than
84
- // unconditionally alongside `dirIndex`, so the happy path (no violations)
85
- // never pays for it, and only when `resolveDirectories` is already off —
86
- // when it's on, a real directory already resolved above and can't reach
87
- // this branch at all.
88
- //
89
- // A site-absolute link with `rootDir` set yields two candidates
90
- // (repo-root, then content-root — see `resolveTargets`), and either can
91
- // independently be a real directory. Reporting whichever comes first
92
- // unlabelled can name the *wrong* one: a repo-root directory that happens
93
- // to share a name with the intended content-root page sends the author to
94
- // toggle `resolveDirectories`, which would resolve the unrelated
95
- // repo-root directory, not fix their actual (still-missing) page. Labelled
96
- // only when there are two candidates to disambiguate between — the common,
97
- // single-target case (no `rootDir`) is unaffected.
98
- let diagnosticDirIndex;
99
- const directoryHint = (target, label) => {
100
- diagnosticDirIndex ??= directoryIndex(corpus);
101
- const bare = target.replace(/\/+$/, '');
102
- return diagnosticDirIndex.has(bare)
103
- ? ` — "${bare}"${label} is a real directory; this check runs with resolveDirectories off`
104
- : '';
16
+ const byBasename = basenameIndex(corpus);
17
+ // Bug 0137: a link that names a real directory and one that names nothing at
18
+ // all both reported the identical "does not resolve" message — no hint that
19
+ // `resolveDirectories` exists, or that this specific target would resolve
20
+ // with it on. A site-absolute link with `rootDir` set has two candidates
21
+ // (repo-root, then content-root), and either can be a real directory.
22
+ // Reporting it unlabelled could name the *wrong* one: a repo-root directory
23
+ // sharing a name with the intended content-root page would send the author
24
+ // to toggle `resolveDirectories`, which resolves the unrelated directory, not
25
+ // their missing page. Labelled only when there are two candidates.
26
+ const directoryHint = (link, path) => {
27
+ const targets = linkTargets(link, options).map((t) => t.replace(/\/+$/, ''));
28
+ const label = targets.length > 1 ? (targets.indexOf(path) === 0 ? ' (repo-root)' : ' (content-root)') : '';
29
+ return ` — "${path}"${label} is a real directory; this check runs with resolveDirectories off`;
105
30
  };
106
31
  return {
107
32
  description: 'resolve to an existing file',
108
33
  evaluate: (links, ctx) => links.flatMap((link) => {
109
- if (link.external)
110
- return [];
111
- const targets = resolveTargets(link, options);
112
- if (targets.length === 0)
34
+ const target = resolveLink(link, corpus, options);
35
+ if (target.kind === 'external' ||
36
+ target.kind === 'self' ||
37
+ target.kind === 'document' ||
38
+ target.kind === 'not-in-corpus')
113
39
  return [];
114
- if (targets.some((t) => candidates(t, options).some((c) => corpus.fileIndex.has(c))))
40
+ if (target.kind === 'directory' && options.resolveDirectories === true)
115
41
  return [];
116
- if (dirIndex !== undefined && targets.some((t) => dirIndex.has(t.replace(/\/+$/, ''))))
117
- return [];
118
- const hint = options.resolveDirectories === true
119
- ? ''
120
- : (targets
121
- .map((t, i) => directoryHint(t, targets.length > 1 ? (i === 0 ? ' (repo-root)' : ' (content-root)') : ''))
122
- .find((h) => h) ?? '');
42
+ const hint = target.kind === 'directory' ? directoryHint(link, target.path) : '';
123
43
  return [
124
44
  mdViolation({
125
45
  element: `${link.doc.relPath} → ${link.url}`,
@@ -134,36 +54,4 @@ export function linkResolves(corpus, options = {}) {
134
54
  }),
135
55
  };
136
56
  }
137
- /**
138
- * If a broken link's basename uniquely names one file in the repo (the target
139
- * moved, not renamed), emit a deterministic autofix rewriting the URL to a path
140
- * relative to the linking document (plan 0066). Ambiguous basename, or a URL
141
- * whose exact span isn't known, → no fix.
142
- */
143
- function movedLinkFix(link, byBasename) {
144
- if (link.urlStart === undefined || link.urlEnd === undefined)
145
- return undefined;
146
- const path = link.url.split('#')[0] ?? '';
147
- const fragment = link.url.slice(path.length); // '' or '#anchor'
148
- const base = path.slice(path.replace(/\/+$/, '').lastIndexOf('/') + 1);
149
- const matches = byBasename.get(base) ?? [];
150
- if (matches.length !== 1)
151
- return undefined; // renamed (no match) or ambiguous → no fix
152
- const target = matches[0];
153
- if (target === undefined)
154
- return undefined;
155
- let rel = posix.relative(posix.dirname(link.doc.relPath), target);
156
- if (!rel.startsWith('.'))
157
- rel = './' + rel;
158
- const replacement = rel + fragment;
159
- if (replacement === link.url)
160
- return undefined;
161
- return {
162
- file: link.doc.file,
163
- start: link.urlStart,
164
- end: link.urlEnd,
165
- replacement,
166
- describe: `rewrite link "${link.url}" → "${replacement}"`,
167
- };
168
- }
169
57
  //# sourceMappingURL=resolve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/conditions/resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/conditions/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,GAEZ,MAAM,0BAA0B,CAAA;AASjC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,UAA8B,EAAE;IAC3E,+EAA+E;IAC/E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAExC,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,sEAAsE;IACtE,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,mEAAmE;IACnE,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE;QAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5E,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9F,OAAO,OAAO,IAAI,IAAI,KAAK,mEAAmE,CAAA;IAChG,CAAC,CAAA;IAED,OAAO;QACL,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CACvB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YACjD,IACE,MAAM,CAAC,IAAI,KAAK,UAAU;gBAC1B,MAAM,CAAC,IAAI,KAAK,MAAM;gBACtB,MAAM,CAAC,IAAI,KAAK,UAAU;gBAC1B,MAAM,CAAC,IAAI,KAAK,eAAe;gBAE/B,OAAO,EAAE,CAAA;YACX,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI;gBAAE,OAAO,EAAE,CAAA;YACjF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAChF,OAAO;gBACL,WAAW,CAAC;oBACV,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE;oBAC5C,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,iBAAiB,IAAI,CAAC,GAAG,2CAA2C,IAAI,EAAE;oBACnF,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;oBACzB,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC;oBACnC,OAAO,EAAE,GAAG;iBACb,CAAC;aACH,CAAA;QACH,CAAC,CAAC;KACL,CAAA;AACH,CAAC"}
package/dist/corpus.d.ts CHANGED
@@ -13,6 +13,9 @@ export interface CorpusOptions {
13
13
  * false (bug 0253): a frozen document's LINKS are still checked, and its code
14
14
  * pointers are excluded from `pointers().areLive()` — so they are not examined
15
15
  * at all. They are not "reported but never failed"; nothing reports them.
16
+ * A frozen record also cannot answer a declared relation: `links().haveLiveTargets()`
17
+ * drops a link into one, and `beLinkedBack()` reports it as frozen without it
18
+ * (plan 0406).
16
19
  *
17
20
  * Defaults to the near-universal `completed`/`archived`; extend for your
18
21
  * project's lifecycle folders (`delivered`, `wont-do`, …).
@@ -1 +1 @@
1
- {"version":3,"file":"corpus.d.ts","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,qFAAqF;IACrF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,4BAA4B;IAC5B,SAAS,IAAI,UAAU,EAAE,CAAA;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gGAAgG;IAChG,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACxC;AAKD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAwCrD"}
1
+ {"version":3,"file":"corpus.d.ts","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAIpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,qFAAqF;IACrF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,4BAA4B;IAC5B,SAAS,IAAI,UAAU,EAAE,CAAA;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,gGAAgG;IAChG,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACxC;AAKD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAsCrD"}
package/dist/corpus.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { walkFiles } from '@nielspeter/eess/internal';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import { fromMarkdown } from 'mdast-util-from-markdown';
5
- import { gfm } from 'micromark-extension-gfm';
6
- import { gfmFromMarkdown } from 'mdast-util-gfm';
7
4
  import picomatch from 'picomatch';
8
5
  import { buildDocument } from './model/document.js';
6
+ import { parseMarkdown } from './model/prose.js';
7
+ import { registerCorpusMatchers } from './model/resolve-link.js';
9
8
  const DEFAULT_FROZEN = ['**/completed/**', '**/archived/**'];
10
9
  const BUILTIN_IGNORE = ['node_modules', '.git', 'dist', 'coverage', '.output', '.nuxt', '.vercel'];
11
10
  /**
@@ -23,17 +22,12 @@ export function corpus(options) {
23
22
  const matchesFrozen = picomatch([...(options.frozen ?? DEFAULT_FROZEN)]);
24
23
  const matchesIgnore = options.ignore && options.ignore.length > 0 ? picomatch([...options.ignore]) : () => false;
25
24
  const fileIndex = new Set(allFiles);
26
- const gfmExt = gfm();
27
- const gfmMdast = gfmFromMarkdown();
28
25
  const documents = allFiles
29
26
  .filter((rel) => rel.endsWith('.md') && matchesRoot(rel) && !matchesIgnore(rel))
30
27
  .map((rel) => {
31
28
  const abs = join(root, rel);
32
29
  const text = readFileSync(abs, 'utf8');
33
- const tree = fromMarkdown(text, {
34
- extensions: [gfmExt],
35
- mdastExtensions: [gfmMdast],
36
- });
30
+ const tree = parseMarkdown(text);
37
31
  return buildDocument({
38
32
  file: abs,
39
33
  relPath: rel,
@@ -42,10 +36,13 @@ export function corpus(options) {
42
36
  root: tree,
43
37
  });
44
38
  });
45
- return {
39
+ const loaded = {
46
40
  documents: () => documents,
47
41
  root,
48
42
  fileIndex,
49
43
  };
44
+ // Kept so `resolveLink` can say why an existing file was not loaded (plan 0404).
45
+ registerCorpusMatchers(loaded, { inRoots: matchesRoot, ignored: matchesIgnore });
46
+ return loaded;
50
47
  }
51
48
  //# sourceMappingURL=corpus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"corpus.js","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAA;AA2CpE,MAAM,cAAc,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAA;AAC5D,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAElG;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,OAAsB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAA;IAE1C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;IACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAA;IAEhC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACjD,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,aAAa,GACjB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAA;IAE5F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAA;IACpB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAA;IAElC,MAAM,SAAS,GAAiB,QAAQ;SACrC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;SAC/E,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE;YAC9B,UAAU,EAAE,CAAC,MAAM,CAAC;YACpB,eAAe,EAAE,CAAC,QAAQ,CAAC;SAC5B,CAAC,CAAA;QACF,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC;YAC1B,IAAI;YACJ,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;QAC1B,IAAI;QACJ,SAAS;KACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"corpus.js","sourceRoot":"","sources":["../src/corpus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AA8ChE,MAAM,cAAc,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAA;AAC5D,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAElG;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,OAAsB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAA;IAE1C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;IACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAA;IAEhC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACjD,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,aAAa,GACjB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAA;IAE5F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnC,MAAM,SAAS,GAAiB,QAAQ;SACrC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;SAC/E,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC;YAC1B,IAAI;YACJ,IAAI,EAAE,IAAI;SACX,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,MAAM,MAAM,GAAW;QACrB,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;QAC1B,IAAI;QACJ,SAAS;KACV,CAAA;IACD,iFAAiF;IACjF,sBAAsB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;IAChF,OAAO,MAAM,CAAA;AACf,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { corpus } from './corpus.js';
2
2
  export type { CorpusOptions, Corpus } from './corpus.js';
3
3
  export type { Predicate, Condition, ConditionContext, ArchFix, PresetReportOptions, PresetBaseOptions, } from '@nielspeter/eess';
4
- export { RuleBuilder, finishPreset, generateCodeFrame, not, dispatchRule, validateOverrides, reportViolations, isArchConfigError, } from '@nielspeter/eess';
4
+ export { RuleBuilder, finishPreset, generateCodeFrame, not, dispatchRule, validateOverrides, reportViolations, isArchConfigError, ArchConfigError, } from '@nielspeter/eess';
5
5
  export { correspondence, CorrespondenceBuilder } from '@nielspeter/eess';
6
6
  export { collectResult, mergeCollectResults, hasEvidence } from '@nielspeter/eess';
7
7
  export type { CollectResult } from '@nielspeter/eess';
@@ -13,7 +13,10 @@ export type { ArchViolation } from './model/violation.js';
13
13
  export { docs, DocsRuleBuilder } from './builders/docs.js';
14
14
  export { links, LinkRuleBuilder } from './builders/links.js';
15
15
  export type { MdLink } from './builders/links.js';
16
+ export type { MdLinkBlock } from './model/links.js';
16
17
  export type { LinkResolveOptions } from './conditions/resolve.js';
18
+ export { resolveLink } from './model/resolve-link.js';
19
+ export type { LinkTarget, LinkToResolve, NotInCorpusReason } from './model/resolve-link.js';
17
20
  export { pointers, PointerRuleBuilder } from './builders/pointers.js';
18
21
  export type { MdPointer } from './builders/pointers.js';
19
22
  export { presentExternalRoots } from './conditions/pointer-resolve.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOxD,YAAY,EACV,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,YAAY,EACZ,iBAAiB,EAMjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AASzB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAOxE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAClF,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAMrD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGlF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtF,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC5D,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACrE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC7E,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGnG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAClE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOxD,YAAY,EACV,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,YAAY,EACZ,iBAAiB,EAMjB,gBAAgB,EAChB,iBAAiB,EAEjB,eAAe,GAChB,MAAM,kBAAkB,CAAA;AASzB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAOxE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAClF,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAMrD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGlF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtF,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC5D,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3F,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACrE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC7E,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGnG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAClE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;AACpE,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA"}
package/dist/index.js CHANGED
@@ -12,7 +12,9 @@ export { RuleBuilder, finishPreset, generateCodeFrame, not, dispatchRule, valida
12
12
  // without throwing nor catch what the seam throws. ADR-008 names
13
13
  // `reportViolations` as the one emitter, and ADR-014's configuration findings
14
14
  // arrive as an `ArchConfigError` a caller has to recognise.
15
- reportViolations, isArchConfigError, } from '@nielspeter/eess';
15
+ reportViolations, isArchConfigError,
16
+ // Bug 0284: `honestyAtClose` throws it for a half-declared vocabulary.
17
+ ArchConfigError, } from '@nielspeter/eess';
16
18
  // `correspondence`/`CorrespondenceBuilder`: not touched by this package's
17
19
  // OWN source (so the family.rules.ts code-import scan can't see this gap —
18
20
  // review found it manually), but this README's own "Binding a spec table to
@@ -33,6 +35,7 @@ export { matchTableRows } from './model/rows.js';
33
35
  // Entry points
34
36
  export { docs, DocsRuleBuilder } from './builders/docs.js';
35
37
  export { links, LinkRuleBuilder } from './builders/links.js';
38
+ export { resolveLink } from './model/resolve-link.js';
36
39
  export { pointers, PointerRuleBuilder } from './builders/pointers.js';
37
40
  export { presentExternalRoots } from './conditions/pointer-resolve.js';
38
41
  export { rows, RowsRuleBuilder } from './builders/rows.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,wCAAwC;AAExC,gBAAgB;AAChB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAgBpC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,YAAY,EACZ,iBAAiB;AACjB,4EAA4E;AAC5E,yEAAyE;AACzE,iEAAiE;AACjE,8EAA8E;AAC9E,4DAA4D;AAC5D,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAA;AACzB,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,+DAA+D;AAC/D,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,wBAAwB;AACxB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxE,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,iFAAiF;AACjF,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAYlF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGhD,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAEtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAG7E,oDAAoD;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,wCAAwC;AAExC,gBAAgB;AAChB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAgBpC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,GAAG,EACH,YAAY,EACZ,iBAAiB;AACjB,4EAA4E;AAC5E,yEAAyE;AACzE,iEAAiE;AACjE,8EAA8E;AAC9E,4DAA4D;AAC5D,gBAAgB,EAChB,iBAAiB;AACjB,uEAAuE;AACvE,eAAe,GAChB,MAAM,kBAAkB,CAAA;AACzB,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,+DAA+D;AAC/D,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,wBAAwB;AACxB,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxE,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,iFAAiF;AACjF,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAYlF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGhD,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAI5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAEtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAG7E,oDAAoD;AACpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { Root } from 'mdast';
1
+ import type { Root, RootContent } from 'mdast';
2
2
  /**
3
3
  * A heading in a markdown document.
4
4
  */
@@ -61,6 +61,13 @@ export interface MdDocument {
61
61
  /** mdast root (internal / advanced) */
62
62
  readonly root: Root;
63
63
  }
64
+ /** A heading's name as `sections` records it — shared so links and tables agree on section names. */
65
+ export declare function headingName(node: RootContent): string;
66
+ /**
67
+ * Move a running heading stack (index i is the current heading at depth i+1) past one heading.
68
+ * Shared by `buildDocument` (tables) and `collectLinks` (links), so both read one section path.
69
+ */
70
+ export declare function enterHeading(stack: string[], depth: number, name: string): void;
64
71
  /**
65
72
  * Build an `MdDocument` from a parsed mdast `Root`.
66
73
  *
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/model/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,OAAO,CAAA;AAE9C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oGAAoG;IACpG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,SAAS,WAAW,EAAE,CAAA;IAC3C,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CACpB;AAsBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;CACX,GAAG,UAAU,CAwCb"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/model/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAE9C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,yBAAyB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oGAAoG;IACpG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,SAAS,WAAW,EAAE,CAAA;IAC3C,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CACpB;AAkBD,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG/E;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;CACX,GAAG,UAAU,CAuCb"}
@@ -14,6 +14,18 @@ function nodeText(node) {
14
14
  }
15
15
  return '';
16
16
  }
17
+ /** A heading's name as `sections` records it — shared so links and tables agree on section names. */
18
+ export function headingName(node) {
19
+ return nodeText(node).trim();
20
+ }
21
+ /**
22
+ * Move a running heading stack (index i is the current heading at depth i+1) past one heading.
23
+ * Shared by `buildDocument` (tables) and `collectLinks` (links), so both read one section path.
24
+ */
25
+ export function enterHeading(stack, depth, name) {
26
+ stack.length = depth - 1;
27
+ stack[depth - 1] = name;
28
+ }
17
29
  function lineOf(node) {
18
30
  return node.position?.start.line ?? 0;
19
31
  }
@@ -32,10 +44,9 @@ export function buildDocument(args) {
32
44
  const headingStack = [];
33
45
  for (const node of args.root.children) {
34
46
  if (node.type === 'heading') {
35
- const name = nodeText(node).trim();
47
+ const name = headingName(node);
36
48
  sections.push({ name, depth: node.depth, line: lineOf(node) });
37
- headingStack.length = node.depth - 1;
38
- headingStack[node.depth - 1] = name;
49
+ enterHeading(headingStack, node.depth, name);
39
50
  }
40
51
  else if (node.type === 'table') {
41
52
  const rowsText = node.children.map((row) => row.children.map((cell) => nodeText(cell).trim()));
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/model/document.ts"],"names":[],"mappings":"AAoEA;;;;GAIG;AACH,SAAS,QAAQ,CAAC,IAAwB;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAA;IAC/B,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAA;IACxE,IAAI,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,MAAM,CAAC,IAAgD;IAC9D,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAM7B;IACC,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,UAAU,GAAkB,EAAE,CAAA;IACpC,yEAAyE;IACzE,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;YAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC9D,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;YACpC,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YAC9F,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAA;YACvC,uEAAuE;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM;gBACN,IAAI;gBACJ,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aACzD,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ;QACR,MAAM;QACN,UAAU;QACV,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/model/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The label grammar a Markdown record uses to declare something on a line —
3
+ * `**State:** Done`, `**Related to:** [a](a.md)` (plan 0405).
4
+ *
5
+ * One grammar, shared by the ledger's `State:` reader, `links().areLabelled()`,
6
+ * and the link walk's label-alone test, so `**Related to**:` cannot be a label to
7
+ * one and a misspelling to another. Every reader below is built from the same
8
+ * fragments; none restates a form by hand. Each caller decides case sensitivity
9
+ * when it compiles the pattern: the ledger reads `**state:**` as `State`,
10
+ * `areLabelled` matches the declared spelling exactly.
11
+ *
12
+ * Accepted forms, each optionally after a list marker: `**Label:**`, `**Label**:`,
13
+ * `__Label__:`, `Label:`. **The colon is required in every form.** Making it
14
+ * optional turned any line beginning with the word into a declaration: the ledger
15
+ * read `Stateless rendering is the default` as the state `less`, and `State
16
+ * machine transitions are documented` as `machine`.
17
+ *
18
+ * The link walk hands these readers a block's text from its content column, so
19
+ * an ordered-list marker, a task box or a blockquote `>` never reaches them; the
20
+ * optional bullet marker is kept for the ledger, which reads raw lines.
21
+ */
22
+ /** The regex source for a line that opens with `label`, in any accepted form. */
23
+ export declare function labelPattern(label: string): string;
24
+ /**
25
+ * The text of a **wrapped** label (`**Label:**`, `**Label**:`, `__Label__:`) that
26
+ * opens `line`, or `undefined`. The plain `Label:` form is deliberately absent:
27
+ * prose that begins "related to: …" is common, so only a wrapped label is read
28
+ * as an attempt to declare something.
29
+ */
30
+ export declare function wrappedLabelOf(line: string): string | undefined;
31
+ /** True when `line` is a label in any form and nothing else follows it. */
32
+ export declare function isLabelAlone(line: string): boolean;
33
+ /** Two label spellings that differ only in case or inner spacing. */
34
+ export declare function isNearMiss(found: string, declared: string): boolean;
35
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/model/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlD;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI/D;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAInE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The label grammar a Markdown record uses to declare something on a line —
3
+ * `**State:** Done`, `**Related to:** [a](a.md)` (plan 0405).
4
+ *
5
+ * One grammar, shared by the ledger's `State:` reader, `links().areLabelled()`,
6
+ * and the link walk's label-alone test, so `**Related to**:` cannot be a label to
7
+ * one and a misspelling to another. Every reader below is built from the same
8
+ * fragments; none restates a form by hand. Each caller decides case sensitivity
9
+ * when it compiles the pattern: the ledger reads `**state:**` as `State`,
10
+ * `areLabelled` matches the declared spelling exactly.
11
+ *
12
+ * Accepted forms, each optionally after a list marker: `**Label:**`, `**Label**:`,
13
+ * `__Label__:`, `Label:`. **The colon is required in every form.** Making it
14
+ * optional turned any line beginning with the word into a declaration: the ledger
15
+ * read `Stateless rendering is the default` as the state `less`, and `State
16
+ * machine transitions are documented` as `machine`.
17
+ *
18
+ * The link walk hands these readers a block's text from its content column, so
19
+ * an ordered-list marker, a task box or a blockquote `>` never reaches them; the
20
+ * optional bullet marker is kept for the ledger, which reads raw lines.
21
+ */
22
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
23
+ /** Leading space and an optional bullet marker — the ledger's raw-line prefix. */
24
+ const PREFIX = String.raw `^\s*(?:[-*+]\s+)?`;
25
+ /** The three wrapped forms over a label body (a regex source). */
26
+ const wrapped = (body) => String.raw `\*\*${body}:\*\*|\*\*${body}\*\*\s*:|__${body}__\s*:`;
27
+ /** The plain form over a label body (a regex source). */
28
+ const plain = (body) => String.raw `${body}\s*:`;
29
+ /**
30
+ * Any label's body. A plain body may be anything up to a colon: it is read only
31
+ * to ask whether a line is a label alone, and a plain line that is not the
32
+ * declared label never decides a declaration (`decidingBlock`), so a loose match
33
+ * here cannot hide one.
34
+ */
35
+ const ANY_WRAPPED = String.raw `([^*_\n]+?)`;
36
+ const ANY_PLAIN = String.raw `[^\s:*_][^:\n]*?`;
37
+ /** The regex source for a line that opens with `label`, in any accepted form. */
38
+ export function labelPattern(label) {
39
+ const l = escapeRe(label);
40
+ return `${PREFIX}(?:${wrapped(l)}|${plain(l)})\\s*`;
41
+ }
42
+ const WRAPPED_LABEL = new RegExp(`${PREFIX}(?:${wrapped(ANY_WRAPPED)})`);
43
+ const OPENS_WITH_LABEL = new RegExp(`${PREFIX}(?:${wrapped(ANY_WRAPPED)}|${plain(ANY_PLAIN)})`);
44
+ const LABEL_ALONE = new RegExp(`${OPENS_WITH_LABEL.source}\\s*$`);
45
+ /**
46
+ * The text of a **wrapped** label (`**Label:**`, `**Label**:`, `__Label__:`) that
47
+ * opens `line`, or `undefined`. The plain `Label:` form is deliberately absent:
48
+ * prose that begins "related to: …" is common, so only a wrapped label is read
49
+ * as an attempt to declare something.
50
+ */
51
+ export function wrappedLabelOf(line) {
52
+ const m = WRAPPED_LABEL.exec(line);
53
+ if (m === null)
54
+ return undefined;
55
+ return m[1] ?? m[2] ?? m[3];
56
+ }
57
+ /** True when `line` is a label in any form and nothing else follows it. */
58
+ export function isLabelAlone(line) {
59
+ return LABEL_ALONE.test(line);
60
+ }
61
+ /** Two label spellings that differ only in case or inner spacing. */
62
+ export function isNearMiss(found, declared) {
63
+ if (found === declared)
64
+ return false;
65
+ const norm = (s) => s.trim().replace(/\s+/g, ' ').toLowerCase();
66
+ return norm(found) === norm(declared);
67
+ }
68
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/model/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AAEhF,kFAAkF;AAClF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,mBAAmB,CAAA;AAE5C,kEAAkE;AAClE,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CACvC,MAAM,CAAC,GAAG,CAAA,OAAO,IAAI,aAAa,IAAI,cAAc,IAAI,QAAQ,CAAA;AAElE,yDAAyD;AACzD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAA,GAAG,IAAI,MAAM,CAAA;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAA,aAAa,CAAA;AAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA,kBAAkB,CAAA;AAE9C,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzB,OAAO,GAAG,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAA;AACrD,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;AACxE,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAC/F,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,OAAO,CAAC,CAAA;AAEjE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7B,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAgB;IACxD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACpC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC"}
@@ -18,7 +18,49 @@ export interface MdLinkRef {
18
18
  */
19
19
  readonly urlStart?: number;
20
20
  readonly urlEnd?: number;
21
+ /** The innermost block that holds this link (plan 0405); absent in a heading or a table cell. */
22
+ readonly block?: MdLinkBlock;
23
+ /**
24
+ * Every block enclosing this link, outermost first, ending with `block` — the
25
+ * paragraphs and list items it sits in, and a label alone on its paragraph for
26
+ * the lists directly after it (plan 0405). Mirrors `sectionPath`.
27
+ */
28
+ readonly blockPath?: readonly MdLinkBlock[];
29
+ /** The headings above this link, outermost first, as `MdTable.sectionPath` records them. */
30
+ readonly sectionPath?: readonly string[];
21
31
  }
32
+ /**
33
+ * A block that can hold a link (plan 0405): a paragraph or a list item.
34
+ *
35
+ * `line` is the block's first source line; `text` is that line from the block's
36
+ * content column, so a list marker (`-`, `1.`), a task box (`[ ]`) and a
37
+ * blockquote `>` are not part of it.
38
+ */
39
+ export interface MdLinkBlock {
40
+ readonly line: number;
41
+ readonly text: string;
42
+ }
43
+ /** A label written where no block starts — read by `areLabelled()`'s declaration scan. */
44
+ interface MdUnreadLabel {
45
+ readonly line: number;
46
+ readonly label: string;
47
+ /** `position`: not where a block starts; `format`: at a block's start, in a form the grammar does not read. */
48
+ readonly reason: 'position' | 'format';
49
+ }
50
+ /**
51
+ * Collect inline markdown links (`[text](url)`) from a document tree, each with
52
+ * the blocks that enclose it and the headings above it; plus every block, the
53
+ * enclosing blocks of each reference-style link, and every label written where
54
+ * no block starts (later in a paragraph, in a table cell, in a heading), which
55
+ * therefore declares nothing. Links inside fenced code are not parsed as `link`
56
+ * nodes by mdast, so they are naturally excluded.
57
+ */
58
+ export declare function collectLinkBlocks(root: Root, source?: string): {
59
+ links: MdLinkRef[];
60
+ references: (readonly MdLinkBlock[])[];
61
+ blocks: MdLinkBlock[];
62
+ unreadLabels: MdUnreadLabel[];
63
+ };
22
64
  /**
23
65
  * Collect inline markdown links (`[text](url)`) from a document tree. Links
24
66
  * inside fenced code are not parsed as `link` nodes by mdast, so they are
@@ -29,4 +71,5 @@ export declare function collectLinks(root: Root, source?: string): MdLinkRef[];
29
71
  export interface MdLink extends MdLinkRef {
30
72
  readonly doc: MdDocument;
31
73
  }
74
+ export {};
32
75
  //# sourceMappingURL=links.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,OAAO,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAKD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAoCrE;AAED,qGAAqG;AACrG,MAAM,WAAW,MAAO,SAAQ,SAAS;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACzB"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/model/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAS,MAAM,OAAO,CAAA;AAIxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,gFAAgF;AAChF,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,iBAAiB;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iGAAiG;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC3C,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAKD;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,0FAA0F;AAC1F,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,+GAA+G;IAC/G,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA;CACvC;AAmBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,MAAM,GACd;IACD,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,UAAU,EAAE,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,YAAY,EAAE,aAAa,EAAE,CAAA;CAC9B,CA8GA;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAErE;AAED,qGAAqG;AACrG,MAAM,WAAW,MAAO,SAAQ,SAAS;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACzB"}