@vibe-agent-toolkit/resources 0.1.38 → 0.1.39-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -24
- package/dist/frontmatter-link-validator.d.ts +9 -9
- package/dist/frontmatter-link-validator.d.ts.map +1 -1
- package/dist/frontmatter-link-validator.js +28 -27
- package/dist/frontmatter-link-validator.js.map +1 -1
- package/dist/frontmatter-validator.d.ts +3 -2
- package/dist/frontmatter-validator.d.ts.map +1 -1
- package/dist/frontmatter-validator.js +8 -14
- package/dist/frontmatter-validator.js.map +1 -1
- package/dist/html-link-parser.d.ts +47 -0
- package/dist/html-link-parser.d.ts.map +1 -0
- package/dist/html-link-parser.js +111 -0
- package/dist/html-link-parser.js.map +1 -0
- package/dist/html-transform.d.ts +45 -0
- package/dist/html-transform.d.ts.map +1 -0
- package/dist/html-transform.js +116 -0
- package/dist/html-transform.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/link-parser.d.ts +26 -2
- package/dist/link-parser.d.ts.map +1 -1
- package/dist/link-parser.js +40 -6
- package/dist/link-parser.js.map +1 -1
- package/dist/link-validator.d.ts +53 -6
- package/dist/link-validator.d.ts.map +1 -1
- package/dist/link-validator.js +100 -131
- package/dist/link-validator.js.map +1 -1
- package/dist/multi-schema-validator.d.ts.map +1 -1
- package/dist/multi-schema-validator.js +6 -8
- package/dist/multi-schema-validator.js.map +1 -1
- package/dist/resource-registry.d.ts +56 -13
- package/dist/resource-registry.d.ts.map +1 -1
- package/dist/resource-registry.js +165 -66
- package/dist/resource-registry.js.map +1 -1
- package/dist/schemas/link-auth.d.ts +382 -0
- package/dist/schemas/link-auth.d.ts.map +1 -0
- package/dist/schemas/link-auth.js +124 -0
- package/dist/schemas/link-auth.js.map +1 -0
- package/dist/schemas/project-config.d.ts +763 -171
- package/dist/schemas/project-config.d.ts.map +1 -1
- package/dist/schemas/project-config.js +5 -0
- package/dist/schemas/project-config.js.map +1 -1
- package/dist/schemas/resource-metadata.d.ts +46 -10
- package/dist/schemas/resource-metadata.d.ts.map +1 -1
- package/dist/schemas/resource-metadata.js +14 -1
- package/dist/schemas/resource-metadata.js.map +1 -1
- package/dist/schemas/validation-result.d.ts +36 -57
- package/dist/schemas/validation-result.d.ts.map +1 -1
- package/dist/schemas/validation-result.js +5 -27
- package/dist/schemas/validation-result.js.map +1 -1
- package/dist/types/resources.d.ts +1 -1
- package/dist/types/resources.d.ts.map +1 -1
- package/dist/types/resources.js.map +1 -1
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +14 -0
- package/dist/utils.js.map +1 -1
- package/package.json +4 -3
- package/src/frontmatter-link-validator.ts +28 -30
- package/src/frontmatter-validator.ts +19 -16
- package/src/html-link-parser.ts +140 -0
- package/src/html-transform.ts +157 -0
- package/src/index.ts +6 -1
- package/src/link-parser.ts +60 -11
- package/src/link-validator.ts +175 -145
- package/src/multi-schema-validator.ts +10 -8
- package/src/resource-registry.ts +205 -72
- package/src/schemas/link-auth.ts +146 -0
- package/src/schemas/project-config.ts +6 -0
- package/src/schemas/resource-metadata.ts +17 -1
- package/src/schemas/validation-result.ts +5 -29
- package/src/types/resources.ts +2 -1
- package/src/utils.ts +15 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structure-preserving HTML link rewriter.
|
|
3
|
+
*
|
|
4
|
+
* Rewrites `<a href>` and `<img src>` attribute VALUES in place by splicing the
|
|
5
|
+
* original source string at parse5-reported offsets. The document is never
|
|
6
|
+
* re-serialized (parse5's serializer normalizes whitespace, quotes, void
|
|
7
|
+
* elements, and the doctype), so unchanged input round-trips byte-for-byte.
|
|
8
|
+
*
|
|
9
|
+
* Uses the same `RewriteHref` callback model as `rewriteBodyLinks` — callers
|
|
10
|
+
* supply per-href target resolution; this module owns only the splice mechanics.
|
|
11
|
+
*
|
|
12
|
+
* Non-goal: `<base href>` is not honored. Relative hrefs are resolved by the
|
|
13
|
+
* caller against the file's own directory; a `<base>` element that would
|
|
14
|
+
* override that in a browser is ignored.
|
|
15
|
+
*/
|
|
16
|
+
import { parseHtmlDocument, walkElements } from './html-link-parser.js';
|
|
17
|
+
/** Tag name → the single link-bearing attribute we rewrite. */
|
|
18
|
+
const LINK_ATTR_BY_TAG = { a: 'href', img: 'src' };
|
|
19
|
+
/**
|
|
20
|
+
* Chars that force an unquoted HTML attribute value to be quoted. Follows the
|
|
21
|
+
* WHATWG unquoted-attribute-value rules: whitespace, quotes, `<`, `>`, plus
|
|
22
|
+
* backtick and `=` (a superset of paths we expect, kept strict for safety).
|
|
23
|
+
*/
|
|
24
|
+
const UNQUOTED_UNSAFE = /[\s"'`<>=]/;
|
|
25
|
+
/**
|
|
26
|
+
* Locate the value sub-range within an attribute's full source span.
|
|
27
|
+
*
|
|
28
|
+
* parse5 reports the whole-attribute span (`href="value"`); this finds the
|
|
29
|
+
* value's absolute offsets and the quote char. Returns undefined for boolean
|
|
30
|
+
* attributes (no `=`).
|
|
31
|
+
*/
|
|
32
|
+
function valueSpan(attrSource, base) {
|
|
33
|
+
const eq = attrSource.indexOf('=');
|
|
34
|
+
if (eq === -1) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
let i = eq + 1;
|
|
38
|
+
while (i < attrSource.length && /\s/.test(attrSource.charAt(i))) {
|
|
39
|
+
i += 1;
|
|
40
|
+
}
|
|
41
|
+
if (i >= attrSource.length) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const ch = attrSource.charAt(i);
|
|
45
|
+
if (ch === '"' || ch === "'") {
|
|
46
|
+
const close = attrSource.indexOf(ch, i + 1);
|
|
47
|
+
const end = close === -1 ? attrSource.length : close;
|
|
48
|
+
return { valueStart: base + i + 1, valueEnd: base + end, quote: ch };
|
|
49
|
+
}
|
|
50
|
+
return { valueStart: base + i, valueEnd: base + attrSource.length, quote: '' };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Encode a new value for writing. For quoted attributes the surrounding quotes
|
|
54
|
+
* stay in the source (we only replace the inner value), so we escape `&` and the
|
|
55
|
+
* active quote. For originally-unquoted values we keep them bare when safe, else
|
|
56
|
+
* wrap in double quotes.
|
|
57
|
+
*/
|
|
58
|
+
function encodeValue(newValue, quote) {
|
|
59
|
+
if (quote === '"' || quote === "'") {
|
|
60
|
+
const amp = newValue.replaceAll('&', '&');
|
|
61
|
+
return quote === '"' ? amp.replaceAll('"', '"') : amp.replaceAll("'", ''');
|
|
62
|
+
}
|
|
63
|
+
if (newValue.length > 0 && !UNQUOTED_UNSAFE.test(newValue)) {
|
|
64
|
+
return newValue.replaceAll('&', '&');
|
|
65
|
+
}
|
|
66
|
+
const escaped = newValue.replaceAll('&', '&').replaceAll('"', '"');
|
|
67
|
+
return `"${escaped}"`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Rewrite `<a href>` / `<img src>` values in `source` using `rewriteHref`.
|
|
71
|
+
* Returns `source` unchanged (byte-for-byte) when no value changes.
|
|
72
|
+
*
|
|
73
|
+
* A rewrite that is wanted (the href resolves to a new value) but cannot be
|
|
74
|
+
* spliced back — because parse5 omitted the source location or the attribute
|
|
75
|
+
* span is unparseable — is reported via `onUnapplied` rather than dropped
|
|
76
|
+
* silently. Malformed pages are exactly the ones that hit this path, so the
|
|
77
|
+
* caller can surface it instead of shipping a stale link.
|
|
78
|
+
*/
|
|
79
|
+
export function rewriteHtmlLinks(source, rewriteHref, onUnapplied) {
|
|
80
|
+
const { document } = parseHtmlDocument(source);
|
|
81
|
+
const edits = [];
|
|
82
|
+
for (const element of walkElements(document)) {
|
|
83
|
+
const attrName = LINK_ATTR_BY_TAG[element.tagName];
|
|
84
|
+
if (attrName === undefined) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const attr = element.attrs.find((a) => a.name === attrName);
|
|
88
|
+
if (attr === undefined) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Resolve first so we only record drops that actually lose a wanted edit.
|
|
92
|
+
const newValue = rewriteHref(attr.value);
|
|
93
|
+
if (newValue === attr.value) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const location = element.sourceCodeLocation?.attrs?.[attrName];
|
|
97
|
+
if (location === undefined) {
|
|
98
|
+
onUnapplied?.({ tagName: element.tagName, attr: attrName, from: attr.value, to: newValue, reason: 'no-source-location' });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const span = valueSpan(source.slice(location.startOffset, location.endOffset), location.startOffset);
|
|
102
|
+
if (span === undefined) {
|
|
103
|
+
onUnapplied?.({ tagName: element.tagName, attr: attrName, from: attr.value, to: newValue, reason: 'unparseable-attribute' });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
edits.push({ ...span, newValue });
|
|
107
|
+
}
|
|
108
|
+
// Apply descending by start offset so earlier edits don't shift later ones.
|
|
109
|
+
edits.sort((a, b) => b.valueStart - a.valueStart);
|
|
110
|
+
let result = source;
|
|
111
|
+
for (const edit of edits) {
|
|
112
|
+
result = result.slice(0, edit.valueStart) + encodeValue(edit.newValue, edit.quote) + result.slice(edit.valueEnd);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=html-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-transform.js","sourceRoot":"","sources":["../src/html-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGxE,+DAA+D;AAC/D,MAAM,gBAAgB,GAAuC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAavF;;;;GAIG;AACH,MAAM,eAAe,GAAG,YAAY,CAAC;AAErC;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,UAAkB,EAAE,IAAY;IACjD,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACf,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACjF,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,QAAgB,EAAE,KAAa;IAClD,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC;AAoBD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,WAAwB,EACxB,WAA8C;IAE9C,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAC1H,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC7H,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -32,7 +32,10 @@ export type { ResourceCollectionInterface } from './resource-collection-interfac
|
|
|
32
32
|
export type { LinkNodeType, LinkType, HeadingNode, ResourceLink, ResourceMetadata, ValidationIssue, ValidationResult, ProjectConfig, ResourcesConfig, CollectionConfig, CollectionValidation, ValidationMode, SkillFileEntry, SkillPackagingConfig, SkillsConfig, ClaudeConfig, ClaudeMarketplaceConfig, ClaudeMarketplacePluginEntry, } from './types.js';
|
|
33
33
|
export { LinkNodeTypeSchema, LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
34
34
|
export { ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
|
|
35
|
-
export { parseMarkdown, type ParseResult } from './link-parser.js';
|
|
35
|
+
export { parseMarkdown, classifyLink, isLocalFileLink, type ParseResult } from './link-parser.js';
|
|
36
|
+
export { parseHtml } from './html-link-parser.js';
|
|
37
|
+
export type { HtmlParseError } from './schemas/resource-metadata.js';
|
|
38
|
+
export { rewriteHtmlLinks, type UnappliedRewrite } from './html-transform.js';
|
|
36
39
|
export { validateFrontmatter } from './frontmatter-validator.js';
|
|
37
40
|
export { createAjvWithUriFormats } from './ajv-factory.js';
|
|
38
41
|
export { transformContent, type ContentTransformOptions, type LinkRewriteMatch, type LinkRewriteRule, type ResourceLookup, } from './content-transform.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGtF,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGtF,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG3E,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,yCAAyC,EACzC,+BAA+B,EAC/B,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,9 @@ export { ResourceCollection } from './resource-collection.js';
|
|
|
35
35
|
export { LinkNodeTypeSchema, LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
36
36
|
export { ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
|
|
37
37
|
// Export parser interface for advanced use cases
|
|
38
|
-
export { parseMarkdown } from './link-parser.js';
|
|
38
|
+
export { parseMarkdown, classifyLink, isLocalFileLink } from './link-parser.js';
|
|
39
|
+
export { parseHtml } from './html-link-parser.js';
|
|
40
|
+
export { rewriteHtmlLinks } from './html-transform.js';
|
|
39
41
|
// Export frontmatter validation
|
|
40
42
|
export { validateFrontmatter } from './frontmatter-validator.js';
|
|
41
43
|
// Public Ajv factory for adopters consuming VAT-generated schemas. Registers
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,+DAA+D;AAC/D,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAMnB,MAAM,wBAAwB,CAAC;AAEhC,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,oFAAoF;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA2B9D,qFAAqF;AACrF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,+DAA+D;AAC/D,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAMnB,MAAM,wBAAwB,CAAC;AAEhC,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,oFAAoF;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA2B9D,qFAAqF;AACrF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAoB,MAAM,kBAAkB,CAAC;AAElG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,qBAAqB,CAAC;AAE9E,gCAAgC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,6EAA6E;AAC7E,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,qDAAqD;AACrD,OAAO,EACL,gBAAgB,GAKjB,MAAM,wBAAwB,CAAC;AAEhC,kEAAkE;AAClE,0EAA0E;AAE1E,2EAA2E;AAC3E,OAAO,EAAE,gBAAgB,EAA+B,MAAM,YAAY,CAAC;AAE3E,sEAAsE;AACtE,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,yBAAyB,CAAC;AAEjC,+EAA+E;AAC/E,OAAO,EACL,yCAAyC,EACzC,+BAA+B,EAC/B,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAE/B,gCAAgC;AAChC,OAAO,EACL,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC"}
|
package/dist/link-parser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Markdown link parser and
|
|
2
|
+
* Markdown link parser and shared resource-parsing types.
|
|
3
3
|
*
|
|
4
4
|
* Parses markdown files to extract:
|
|
5
5
|
* - Links (regular, reference-style, autolinks)
|
|
@@ -7,10 +7,15 @@
|
|
|
7
7
|
* - File size and token estimates
|
|
8
8
|
*
|
|
9
9
|
* Uses unified/remark for robust markdown parsing with GFM support.
|
|
10
|
+
*
|
|
11
|
+
* Also defines the format-neutral `ParseResult` contract shared with the HTML
|
|
12
|
+
* parser (`html-link-parser.ts`). The `HtmlParseError` shape is Zod-sourced
|
|
13
|
+
* from `schemas/resource-metadata.ts` (single source of truth).
|
|
10
14
|
*/
|
|
15
|
+
import type { HtmlParseError } from './schemas/resource-metadata.js';
|
|
11
16
|
import type { HeadingNode, LinkType, ResourceLink } from './types.js';
|
|
12
17
|
/**
|
|
13
|
-
* Result of parsing a markdown
|
|
18
|
+
* Result of parsing a resource file (markdown or HTML).
|
|
14
19
|
*/
|
|
15
20
|
export interface ParseResult {
|
|
16
21
|
links: ResourceLink[];
|
|
@@ -20,6 +25,10 @@ export interface ParseResult {
|
|
|
20
25
|
content: string;
|
|
21
26
|
sizeBytes: number;
|
|
22
27
|
estimatedTokenCount: number;
|
|
28
|
+
/** Fragment targets (HTML `id`/`name` attributes). Markdown leaves this undefined. */
|
|
29
|
+
anchors?: string[];
|
|
30
|
+
/** HTML well-formedness diagnostics. Markdown leaves this undefined. */
|
|
31
|
+
parseErrors?: HtmlParseError[];
|
|
23
32
|
}
|
|
24
33
|
/**
|
|
25
34
|
* Parse a markdown file and extract all links, headings, and metadata.
|
|
@@ -53,7 +62,22 @@ export declare function parseMarkdown(filePath: string): Promise<ParseResult>;
|
|
|
53
62
|
* classifyLink('#heading') // 'anchor'
|
|
54
63
|
* classifyLink('./file.md') // 'local_file'
|
|
55
64
|
* classifyLink('./file.md#anchor') // 'local_file'
|
|
65
|
+
* classifyLink('docs/') // 'local_directory'
|
|
66
|
+
* classifyLink('./docs/') // 'local_directory'
|
|
67
|
+
* classifyLink('../docs/') // 'local_directory'
|
|
68
|
+
* classifyLink('/docs/') // 'local_directory'
|
|
69
|
+
* classifyLink('https://x.com/docs/') // 'external' (not a local ref)
|
|
56
70
|
* ```
|
|
57
71
|
*/
|
|
58
72
|
export declare function classifyLink(href: string): LinkType;
|
|
73
|
+
/**
|
|
74
|
+
* Returns true for link types that represent local filesystem targets — both
|
|
75
|
+
* regular files and directories. Other packages (e.g. agent-skills walker)
|
|
76
|
+
* import this predicate as the single source of truth for "should we treat
|
|
77
|
+
* this link like a file link during validation/traversal?"
|
|
78
|
+
*
|
|
79
|
+
* @param type - The classified link type
|
|
80
|
+
* @returns `true` for `'local_file'` and `'local_directory'`
|
|
81
|
+
*/
|
|
82
|
+
export declare function isLocalFileLink(type: LinkType): boolean;
|
|
59
83
|
//# sourceMappingURL=link-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwC1E;AA+ED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CA2DnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEvD"}
|
package/dist/link-parser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Markdown link parser and
|
|
2
|
+
* Markdown link parser and shared resource-parsing types.
|
|
3
3
|
*
|
|
4
4
|
* Parses markdown files to extract:
|
|
5
5
|
* - Links (regular, reference-style, autolinks)
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* - File size and token estimates
|
|
8
8
|
*
|
|
9
9
|
* Uses unified/remark for robust markdown parsing with GFM support.
|
|
10
|
+
*
|
|
11
|
+
* Also defines the format-neutral `ParseResult` contract shared with the HTML
|
|
12
|
+
* parser (`html-link-parser.ts`). The `HtmlParseError` shape is Zod-sourced
|
|
13
|
+
* from `schemas/resource-metadata.ts` (single source of truth).
|
|
10
14
|
*/
|
|
11
15
|
import { readFile, stat } from 'node:fs/promises';
|
|
12
16
|
import GithubSlugger from 'github-slugger';
|
|
@@ -151,6 +155,11 @@ function extractLinkText(node) {
|
|
|
151
155
|
* classifyLink('#heading') // 'anchor'
|
|
152
156
|
* classifyLink('./file.md') // 'local_file'
|
|
153
157
|
* classifyLink('./file.md#anchor') // 'local_file'
|
|
158
|
+
* classifyLink('docs/') // 'local_directory'
|
|
159
|
+
* classifyLink('./docs/') // 'local_directory'
|
|
160
|
+
* classifyLink('../docs/') // 'local_directory'
|
|
161
|
+
* classifyLink('/docs/') // 'local_directory'
|
|
162
|
+
* classifyLink('https://x.com/docs/') // 'external' (not a local ref)
|
|
154
163
|
* ```
|
|
155
164
|
*/
|
|
156
165
|
export function classifyLink(href) {
|
|
@@ -168,6 +177,12 @@ export function classifyLink(href) {
|
|
|
168
177
|
if (href.includes(':')) {
|
|
169
178
|
return 'unknown';
|
|
170
179
|
}
|
|
180
|
+
// Local directory: path component (before any # or ?) ends in '/'.
|
|
181
|
+
// Must come after all protocol guards so external URLs are never reclassified.
|
|
182
|
+
const pathPart = href.split(/[#?]/u)[0] ?? href;
|
|
183
|
+
if (pathPart.endsWith('/')) {
|
|
184
|
+
return 'local_directory';
|
|
185
|
+
}
|
|
171
186
|
// Links with anchors are still local file links
|
|
172
187
|
if (href.includes('#')) {
|
|
173
188
|
return 'local_file';
|
|
@@ -208,6 +223,18 @@ export function classifyLink(href) {
|
|
|
208
223
|
}
|
|
209
224
|
return 'unknown';
|
|
210
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Returns true for link types that represent local filesystem targets — both
|
|
228
|
+
* regular files and directories. Other packages (e.g. agent-skills walker)
|
|
229
|
+
* import this predicate as the single source of truth for "should we treat
|
|
230
|
+
* this link like a file link during validation/traversal?"
|
|
231
|
+
*
|
|
232
|
+
* @param type - The classified link type
|
|
233
|
+
* @returns `true` for `'local_file'` and `'local_directory'`
|
|
234
|
+
*/
|
|
235
|
+
export function isLocalFileLink(type) {
|
|
236
|
+
return type === 'local_file' || type === 'local_directory';
|
|
237
|
+
}
|
|
211
238
|
/**
|
|
212
239
|
* Extract headings from the markdown AST and build a nested tree structure.
|
|
213
240
|
*
|
|
@@ -275,7 +302,12 @@ function extractHeadingText(node) {
|
|
|
275
302
|
/**
|
|
276
303
|
* Extract text content from inline children nodes.
|
|
277
304
|
*
|
|
278
|
-
* Handles
|
|
305
|
+
* Handles leaf nodes (`text`, `inlineCode`) and recurses into container inline
|
|
306
|
+
* elements (`strong`, `emphasis`, `link`, `delete`) so that styled headings —
|
|
307
|
+
* e.g. `### **CRITICAL: ...**` — produce the same text (and therefore the same
|
|
308
|
+
* GitHub slug) as their plain-text equivalents. Without recursion, bold/italic
|
|
309
|
+
* headings yielded empty text and bogus slugs, causing false LINK_BROKEN_ANCHOR
|
|
310
|
+
* errors for links targeting them.
|
|
279
311
|
*
|
|
280
312
|
* @param children - Array of child nodes or undefined
|
|
281
313
|
* @returns Concatenated text content
|
|
@@ -286,12 +318,14 @@ function extractTextFromChildren(children) {
|
|
|
286
318
|
}
|
|
287
319
|
return children
|
|
288
320
|
.map((child) => {
|
|
289
|
-
|
|
321
|
+
// Leaf inline nodes (text, inlineCode) hold their content in `value`.
|
|
322
|
+
if (typeof child.value === 'string') {
|
|
290
323
|
return child.value;
|
|
291
324
|
}
|
|
292
|
-
//
|
|
293
|
-
|
|
294
|
-
|
|
325
|
+
// Container inline nodes (strong, emphasis, link, delete) hold text in
|
|
326
|
+
// their children — recurse to gather it.
|
|
327
|
+
if (child.children) {
|
|
328
|
+
return extractTextFromChildren(child.children);
|
|
295
329
|
}
|
|
296
330
|
return '';
|
|
297
331
|
})
|
package/dist/link-parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,OAAO,iBAAiB,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsB7B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,8BAA8B;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,+GAA+G;QAC/G,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,+GAA+G;QAC/G,IAAI,CAAC,QAAQ,CAAC;KACf,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7B,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,qCAAqC;IACrC,MAAM,SAAS,GAAG,OAAO,EAAE;SACxB,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS,CAAC;IAE9C,gBAAgB;IAChB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjC,uCAAuC;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,sBAAsB;IACtB,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE1E,oFAAoF;IACpF,wCAAwC;IACxC,OAAO;QACL,KAAK;QACL,QAAQ;QACR,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;QACjD,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;QAC3D,OAAO;QACP,SAAS;QACT,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,IAAU;IAC9B,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,8DAA8D;IAC9D,0EAA0E;IAC1E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC7C,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE;QACjC,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,GAAG;YACd,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;YAC/B,QAAQ,EAAE,MAAM;SACjB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,sGAAsG;IACtG,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,IAAmB,EAAE,EAAE;QACnD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,iFAAiF;YACjF,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;YAC/B,QAAQ,EAAE,eAAe;SAC1B,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,wDAAwD;IACxD,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,IAAI,EAAE,IAAI,CAAC,GAAG;YACd,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;YAC/B,QAAQ,EAAE,YAAY;SACvB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAA0B;IACjD,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,kFAAkF;IAClF,sFAAsF;IACtF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,mEAAmE;IACnE,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAChD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,gDAAgD;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,mCAAmC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,mFAAmF;IACnF,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5E,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,mEAAmE;IACnE,uFAAuF;IACvF,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,6DAA6D;IAC7D,2DAA2D;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IACD,2EAA2E;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,iBAAiB,CAAC;AAC7D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,qDAAqD;IACrD,kFAAkF;IAClF,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAgB;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;SAChC,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAa;IACvC,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC;AAaD;;;;;;;;;;;;GAYG;AACH,SAAS,uBAAuB,CAAC,QAAkC;IACjE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,sEAAsE;QACtE,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QACD,uEAAuE;QACvE,yCAAyC;QACzC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAGD;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,YAA2B;IACnD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,4BAA4B;QAC5B,MAAM,mBAAmB,GAAgB;YACvC,GAAG,OAAO;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,kEAAkE;QAClE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACvE,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,+BAA+B;YAC/B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC;gBACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClC,CAAC;IAED,wDAAwD;IACxD,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAuB;IACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,IAAU;IAIpC,IAAI,eAAoD,CAAC;IACzD,IAAI,YAAgC,CAAC;IAErC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAuB,EAAE,EAAE;QAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5E,eAAe,GAAG,MAAiC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,OAAO;QACL,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QACtE,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
package/dist/link-validator.d.ts
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* - Ignored files CAN link to non-ignored files (no error)
|
|
15
15
|
* - External resources (outside project) skip git-ignore checks
|
|
16
16
|
*/
|
|
17
|
+
import { type ValidationIssue } from '@vibe-agent-toolkit/agent-schema';
|
|
17
18
|
import { type GitTracker } from '@vibe-agent-toolkit/utils';
|
|
18
|
-
import type {
|
|
19
|
-
import type { HeadingNode, ResourceLink } from './types.js';
|
|
19
|
+
import type { ResourceLink } from './types.js';
|
|
20
20
|
import { resolveLocalHref } from './utils.js';
|
|
21
21
|
/**
|
|
22
22
|
* Options for link validation.
|
|
@@ -34,7 +34,7 @@ export interface ValidateLinkOptions {
|
|
|
34
34
|
*
|
|
35
35
|
* @param link - The link to validate
|
|
36
36
|
* @param sourceFilePath - Absolute path to the file containing the link
|
|
37
|
-
* @param
|
|
37
|
+
* @param fragmentsByFile - Fragment index: file path → set of valid fragments (markdown slugs + HTML id/name)
|
|
38
38
|
* @param options - Validation options (projectRoot, skipGitIgnoreCheck)
|
|
39
39
|
* @returns ValidationIssue if link is broken, null if valid
|
|
40
40
|
*
|
|
@@ -49,13 +49,13 @@ export interface ValidateLinkOptions {
|
|
|
49
49
|
* }
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export declare function validateLink(link: ResourceLink, sourceFilePath: string,
|
|
52
|
+
export declare function validateLink(link: ResourceLink, sourceFilePath: string, fragmentsByFile: FragmentIndex, options?: ValidateLinkOptions): Promise<ValidationIssue | null>;
|
|
53
53
|
/**
|
|
54
54
|
* Convert a resolution failure kind to a broken_file ValidationIssue. Returns
|
|
55
55
|
* null for `resolved` (caller continues) and `anchor_only` (defensive no-op —
|
|
56
56
|
* the parser classifies anchor-only hrefs as 'anchor', not 'local_file').
|
|
57
57
|
*/
|
|
58
|
-
export declare function resolutionFailureIssue(resolved: ReturnType<typeof resolveLocalHref>, link: ResourceLink, sourceFilePath: string): ValidationIssue | null;
|
|
58
|
+
export declare function resolutionFailureIssue(resolved: ReturnType<typeof resolveLocalHref>, link: ResourceLink, sourceFilePath: string, projectRoot?: string): ValidationIssue | null;
|
|
59
59
|
/**
|
|
60
60
|
* Convert a non-existent file result into a broken_file ValidationIssue.
|
|
61
61
|
* Returns null when the file exists.
|
|
@@ -64,11 +64,58 @@ export declare function fileExistenceIssue(fileResult: {
|
|
|
64
64
|
exists: boolean;
|
|
65
65
|
resolvedPath: string;
|
|
66
66
|
actualName?: string;
|
|
67
|
-
}, link: ResourceLink, sourceFilePath: string): ValidationIssue | null;
|
|
67
|
+
}, link: ResourceLink, sourceFilePath: string, projectRoot?: string): ValidationIssue | null;
|
|
68
68
|
/**
|
|
69
69
|
* Check git-ignore safety: a non-ignored source file must not link to a
|
|
70
70
|
* gitignored target. Returns a ValidationIssue when this rule is violated,
|
|
71
71
|
* null otherwise (including when checks are disabled or out of scope).
|
|
72
72
|
*/
|
|
73
73
|
export declare function gitIgnoreSafetyIssue(link: ResourceLink, sourceFilePath: string, resolvedTarget: string, options: ValidateLinkOptions | undefined): ValidationIssue | null;
|
|
74
|
+
/** Result of checking an anchor against the fragment index. */
|
|
75
|
+
export type AnchorCheck = 'skip' | 'valid' | 'broken';
|
|
76
|
+
/**
|
|
77
|
+
* A file's fragment targets plus how to match against them. HTML `id`/`name`
|
|
78
|
+
* anchors are matched case-sensitively; markdown heading slugs are case-folded.
|
|
79
|
+
* The policy lives on the entry rather than being re-derived from the file
|
|
80
|
+
* extension at match time, so a new resource format only has to set this flag.
|
|
81
|
+
*/
|
|
82
|
+
export interface FragmentIndexEntry {
|
|
83
|
+
/** `true` for case-sensitive matching (HTML ids), `false` for case-folded (markdown slugs). */
|
|
84
|
+
caseSensitive: boolean;
|
|
85
|
+
fragments: Set<string>;
|
|
86
|
+
}
|
|
87
|
+
/** File path → its fragment targets and matching policy. */
|
|
88
|
+
export type FragmentIndex = Map<string, FragmentIndexEntry>;
|
|
89
|
+
/**
|
|
90
|
+
* Whether a path is an HTML resource (`.html`/`.htm`). The single place the
|
|
91
|
+
* extension drives format-specific behavior: case-sensitive ids (via
|
|
92
|
+
* {@link fragmentIndexEntry}) and the HTML top-fragment navigation rule.
|
|
93
|
+
*/
|
|
94
|
+
export declare function isHtmlPath(filePath: string): boolean;
|
|
95
|
+
/** Build one index entry, choosing the case-folding policy from the file type. */
|
|
96
|
+
export declare function fragmentIndexEntry(filePath: string, fragments?: Set<string>): FragmentIndexEntry;
|
|
97
|
+
/**
|
|
98
|
+
* Build a {@link FragmentIndex} from `[path, fragments]` pairs, deriving each
|
|
99
|
+
* entry's matching policy from its path. Single construction path shared by the
|
|
100
|
+
* registry and tests.
|
|
101
|
+
*/
|
|
102
|
+
export declare function fragmentIndex(entries?: Iterable<readonly [string, Set<string>]>): FragmentIndex;
|
|
103
|
+
/**
|
|
104
|
+
* Check whether a fragment exists in the target file's anchor set.
|
|
105
|
+
*
|
|
106
|
+
* - `'skip'` — target file is not indexed; we cannot prove the anchor is
|
|
107
|
+
* broken, so callers must not emit an issue.
|
|
108
|
+
* - Matching follows the entry's `caseSensitive` policy (HTML ids exact,
|
|
109
|
+
* markdown slugs case-folded). The index carries the policy, so this never
|
|
110
|
+
* re-derives the folding rule from the file extension.
|
|
111
|
+
* - For HTML targets the empty fragment (`#`) and `top` (ASCII
|
|
112
|
+
* case-insensitive) are always valid: per the HTML fragment-navigation
|
|
113
|
+
* algorithm both scroll to the top of the document regardless of whether a
|
|
114
|
+
* matching element exists, so `href="#"` / `href="#top"` are not broken.
|
|
115
|
+
*
|
|
116
|
+
* @param anchor - Fragment without the leading `#`.
|
|
117
|
+
* @param targetFilePath - Absolute path of the file the fragment lives in.
|
|
118
|
+
* @param fragmentsByFile - Fragment index carrying each file's matching policy.
|
|
119
|
+
*/
|
|
120
|
+
export declare function checkAnchor(anchor: string, targetFilePath: string, fragmentsByFile: FragmentIndex): AnchorCheck;
|
|
74
121
|
//# sourceMappingURL=link-validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-validator.d.ts","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"link-validator.d.ts","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAkC,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuB9E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,aAAa,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA8BjC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAC7C,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,GAAG,IAAI,CAyBxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1E,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,eAAe,GAAG,IAAI,CAsBxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,mBAAmB,GAAG,SAAS,GACvC,eAAe,GAAG,IAAI,CA2BxB;AAiHD,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,+FAA+F;IAC/F,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED,4DAA4D;AAC5D,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,kBAAkB,CAE3G;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAM,GAAG,aAAa,CAMnG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,aAAa,GAC7B,WAAW,CAeb"}
|