@vibe-agent-toolkit/resources 0.1.14 → 0.1.15-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/dist/content-transform.d.ts +20 -3
- package/dist/content-transform.d.ts.map +1 -1
- package/dist/content-transform.js +84 -15
- package/dist/content-transform.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/link-parser.js +3 -0
- package/dist/link-parser.js.map +1 -1
- package/dist/schemas/resource-metadata.d.ts +17 -0
- package/dist/schemas/resource-metadata.d.ts.map +1 -1
- package/dist/schemas/resource-metadata.js +13 -0
- package/dist/schemas/resource-metadata.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/content-transform.ts +118 -14
- package/src/index.ts +2 -0
- package/src/link-parser.ts +3 -0
- package/src/schemas/resource-metadata.ts +16 -0
- package/src/types.ts +1 -0
|
@@ -78,11 +78,13 @@ export interface LinkRewriteRule {
|
|
|
78
78
|
* - `link.type` - Link type (local_file, anchor, external, email, unknown)
|
|
79
79
|
* - `link.resource.id` - Target resource ID (if resolved)
|
|
80
80
|
* - `link.resource.filePath` - Target resource file path (if resolved)
|
|
81
|
+
* - `link.resource.fileName` - Target resource file name with extension (if resolved)
|
|
81
82
|
* - `link.resource.extension` - Target resource file extension (if resolved)
|
|
82
83
|
* - `link.resource.mimeType` - Inferred MIME type (if resolved)
|
|
83
84
|
* - `link.resource.frontmatter.*` - Target resource frontmatter fields (if resolved)
|
|
84
85
|
* - `link.resource.sizeBytes` - Target resource size in bytes (if resolved)
|
|
85
86
|
* - `link.resource.estimatedTokenCount` - Target resource estimated token count (if resolved)
|
|
87
|
+
* - `link.resource.relativePath` - Relative path from sourceFilePath to resource (if both available)
|
|
86
88
|
* - Plus any variables from `context`
|
|
87
89
|
*/
|
|
88
90
|
template: string;
|
|
@@ -103,6 +105,18 @@ export interface ContentTransformOptions {
|
|
|
103
105
|
* These are merged at the top level of the template context.
|
|
104
106
|
*/
|
|
105
107
|
context?: Record<string, unknown>;
|
|
108
|
+
/**
|
|
109
|
+
* Absolute file path of the source document being transformed.
|
|
110
|
+
* When provided, enables `link.resource.relativePath` computation:
|
|
111
|
+
* `relative(dirname(sourceFilePath), link.resource.filePath)` using forward slashes.
|
|
112
|
+
*/
|
|
113
|
+
sourceFilePath?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Fallback template for links that match no rule.
|
|
116
|
+
* Without this option, unmatched links are left untouched (original markdown preserved).
|
|
117
|
+
* With this option, unmatched links are rendered through this template.
|
|
118
|
+
*/
|
|
119
|
+
defaultTemplate?: string;
|
|
106
120
|
}
|
|
107
121
|
/**
|
|
108
122
|
* Transform markdown content by rewriting links according to rules.
|
|
@@ -110,9 +124,12 @@ export interface ContentTransformOptions {
|
|
|
110
124
|
* This is a pure function that takes content, its parsed links, and transform options,
|
|
111
125
|
* and returns the content with matching links rewritten according to the first matching rule.
|
|
112
126
|
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
127
|
+
* Two passes are performed:
|
|
128
|
+
* 1. **Inline links** `[text](href)` — matched via rules, rendered through templates
|
|
129
|
+
* 2. **Definition lines** `[ref]: url` — matched via rules, rewritten in definition format
|
|
130
|
+
* or removed if orphaned (target not in registry)
|
|
131
|
+
*
|
|
132
|
+
* Links matching no rule are left untouched unless a `defaultTemplate` is provided.
|
|
116
133
|
*
|
|
117
134
|
* @param content - The markdown content to transform
|
|
118
135
|
* @param links - Parsed links from the content (from ResourceMetadata.links)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-transform.d.ts","sourceRoot":"","sources":["../src/content-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAmC/F;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CAC3D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,EAAE,gBAAgB,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"content-transform.d.ts","sourceRoot":"","sources":["../src/content-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAmC/F;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CAC3D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,EAAE,gBAAgB,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,gBAAgB,EAAE,eAAe,EAAE,CAAC;IAEpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAElC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0KD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,uBAAuB,GAC/B,MAAM,CAuHR"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
22
|
import path from 'node:path';
|
|
23
|
-
import { renderTemplate } from '@vibe-agent-toolkit/utils';
|
|
23
|
+
import { renderTemplate, toForwardSlash } from '@vibe-agent-toolkit/utils';
|
|
24
24
|
import { matchesGlobPattern, splitHrefAnchor } from './utils.js';
|
|
25
25
|
/**
|
|
26
26
|
* Extension-to-MIME-type mapping for common resource file types.
|
|
@@ -59,19 +59,24 @@ function inferMimeType(filePath) {
|
|
|
59
59
|
* @param fragment - The fragment string including '#' prefix, or empty string
|
|
60
60
|
* @param resource - The resolved target resource (if available)
|
|
61
61
|
* @param extraContext - Additional context variables
|
|
62
|
+
* @param sourceFilePath - Absolute path of the source document (for relativePath computation)
|
|
62
63
|
* @returns Template context object
|
|
63
64
|
*/
|
|
64
|
-
function buildTemplateContext(link, hrefWithoutFragment, fragment, resource, extraContext) {
|
|
65
|
+
function buildTemplateContext(link, hrefWithoutFragment, fragment, resource, extraContext, sourceFilePath) {
|
|
65
66
|
const resourceContext = resource === undefined
|
|
66
67
|
? undefined
|
|
67
68
|
: {
|
|
68
69
|
id: resource.id,
|
|
69
70
|
filePath: resource.filePath,
|
|
71
|
+
fileName: path.basename(resource.filePath),
|
|
70
72
|
extension: path.extname(resource.filePath),
|
|
71
73
|
mimeType: inferMimeType(resource.filePath),
|
|
72
74
|
frontmatter: resource.frontmatter,
|
|
73
75
|
sizeBytes: resource.sizeBytes,
|
|
74
76
|
estimatedTokenCount: resource.estimatedTokenCount,
|
|
77
|
+
relativePath: sourceFilePath === undefined
|
|
78
|
+
? undefined
|
|
79
|
+
: toForwardSlash(path.relative(path.dirname(sourceFilePath), resource.filePath)),
|
|
75
80
|
};
|
|
76
81
|
return {
|
|
77
82
|
...extraContext,
|
|
@@ -159,7 +164,7 @@ function findMatchingRule(link, resource, rules) {
|
|
|
159
164
|
return undefined;
|
|
160
165
|
}
|
|
161
166
|
/**
|
|
162
|
-
* Regex pattern matching markdown links: `[text](href)`
|
|
167
|
+
* Regex pattern matching inline markdown links: `[text](href)`
|
|
163
168
|
*
|
|
164
169
|
* Captures:
|
|
165
170
|
* - Group 0: Full match including brackets and parentheses
|
|
@@ -172,15 +177,28 @@ function findMatchingRule(link, resource, rules) {
|
|
|
172
177
|
*/
|
|
173
178
|
// eslint-disable-next-line sonarjs/slow-regex -- negated character classes [^\]] and [^)] are inherently non-backtracking
|
|
174
179
|
const MARKDOWN_LINK_REGEX = /\[([^\]]*)\]\(([^)]*)\)/g;
|
|
180
|
+
/**
|
|
181
|
+
* Regex pattern matching reference-style link definitions: `[ref]: url`
|
|
182
|
+
*
|
|
183
|
+
* Must appear at the start of a line (multiline flag).
|
|
184
|
+
* Captures:
|
|
185
|
+
* - Group 1: Reference identifier
|
|
186
|
+
* - Group 2: URL (may include trailing whitespace)
|
|
187
|
+
*/
|
|
188
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Controlled markdown reference link definitions on line boundaries
|
|
189
|
+
const MARKDOWN_DEFINITION_REGEX = /^\[([^\]]*?)\]:\s*(.+)$/gm;
|
|
175
190
|
/**
|
|
176
191
|
* Transform markdown content by rewriting links according to rules.
|
|
177
192
|
*
|
|
178
193
|
* This is a pure function that takes content, its parsed links, and transform options,
|
|
179
194
|
* and returns the content with matching links rewritten according to the first matching rule.
|
|
180
195
|
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
196
|
+
* Two passes are performed:
|
|
197
|
+
* 1. **Inline links** `[text](href)` — matched via rules, rendered through templates
|
|
198
|
+
* 2. **Definition lines** `[ref]: url` — matched via rules, rewritten in definition format
|
|
199
|
+
* or removed if orphaned (target not in registry)
|
|
200
|
+
*
|
|
201
|
+
* Links matching no rule are left untouched unless a `defaultTemplate` is provided.
|
|
184
202
|
*
|
|
185
203
|
* @param content - The markdown content to transform
|
|
186
204
|
* @param links - Parsed links from the content (from ResourceMetadata.links)
|
|
@@ -207,23 +225,27 @@ const MARKDOWN_LINK_REGEX = /\[([^\]]*)\]\(([^)]*)\)/g;
|
|
|
207
225
|
* ```
|
|
208
226
|
*/
|
|
209
227
|
export function transformContent(content, links, options) {
|
|
210
|
-
const { linkRewriteRules, resourceRegistry, context } = options;
|
|
211
|
-
// If there are no rules or no links, return content unchanged
|
|
212
|
-
if (linkRewriteRules.length === 0 || links.length === 0) {
|
|
228
|
+
const { linkRewriteRules, resourceRegistry, context, sourceFilePath, defaultTemplate } = options;
|
|
229
|
+
// If there are no rules, no default template, or no links, return content unchanged
|
|
230
|
+
if ((linkRewriteRules.length === 0 && defaultTemplate === undefined) || links.length === 0) {
|
|
213
231
|
return content;
|
|
214
232
|
}
|
|
233
|
+
// === Pass 1: Inline links [text](href) ===
|
|
215
234
|
// Build a lookup map from "[text](href)" to the corresponding ResourceLink.
|
|
216
235
|
// Multiple links can share the same text+href combination; we process them all
|
|
217
236
|
// with the first matching ResourceLink (they are identical in terms of match criteria).
|
|
218
237
|
const linkBySignature = new Map();
|
|
219
238
|
for (const link of links) {
|
|
239
|
+
if (link.nodeType === 'definition') {
|
|
240
|
+
continue; // Definitions are handled in pass 2
|
|
241
|
+
}
|
|
220
242
|
const signature = `[${link.text}](${link.href})`;
|
|
221
243
|
if (!linkBySignature.has(signature)) {
|
|
222
244
|
linkBySignature.set(signature, link);
|
|
223
245
|
}
|
|
224
246
|
}
|
|
225
|
-
// Replace markdown links in content
|
|
226
|
-
|
|
247
|
+
// Replace inline markdown links in content
|
|
248
|
+
let result = content.replaceAll(MARKDOWN_LINK_REGEX, (fullMatch, text, href) => {
|
|
227
249
|
// Find the corresponding ResourceLink
|
|
228
250
|
const signature = `[${text}](${href})`;
|
|
229
251
|
const link = linkBySignature.get(signature);
|
|
@@ -237,16 +259,63 @@ export function transformContent(content, links, options) {
|
|
|
237
259
|
: resourceRegistry.getResourceById(link.resolvedId);
|
|
238
260
|
// Find the first matching rule
|
|
239
261
|
const rule = findMatchingRule(link, resource, linkRewriteRules);
|
|
240
|
-
|
|
241
|
-
|
|
262
|
+
// Determine which template to use: matched rule, defaultTemplate, or leave untouched
|
|
263
|
+
const template = rule?.template ?? defaultTemplate;
|
|
264
|
+
if (template === undefined) {
|
|
265
|
+
// No rule matches and no default template - leave untouched
|
|
242
266
|
return fullMatch;
|
|
243
267
|
}
|
|
244
268
|
// Parse fragment from href
|
|
245
269
|
const [hrefWithoutFragment, anchor] = splitHrefAnchor(href);
|
|
246
270
|
const fragment = anchor === undefined ? '' : `#${anchor}`;
|
|
247
271
|
// Build template context and render
|
|
248
|
-
const templateContext = buildTemplateContext(link, hrefWithoutFragment, fragment, resource, context);
|
|
249
|
-
return renderTemplate(
|
|
272
|
+
const templateContext = buildTemplateContext(link, hrefWithoutFragment, fragment, resource, context, sourceFilePath);
|
|
273
|
+
return renderTemplate(template, templateContext);
|
|
250
274
|
});
|
|
275
|
+
// === Pass 2: Reference-style definitions [ref]: url ===
|
|
276
|
+
// Build lookup map for definition links (keyed by "identifier\0href")
|
|
277
|
+
const definitionByKey = new Map();
|
|
278
|
+
for (const link of links) {
|
|
279
|
+
if (link.nodeType !== 'definition') {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const key = `${link.text}\0${link.href}`;
|
|
283
|
+
if (!definitionByKey.has(key)) {
|
|
284
|
+
definitionByKey.set(key, link);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (definitionByKey.size > 0) {
|
|
288
|
+
result = result.replaceAll(MARKDOWN_DEFINITION_REGEX, (fullMatch, ref, href) => {
|
|
289
|
+
const trimmedHref = href.trim();
|
|
290
|
+
// Look up the corresponding definition ResourceLink
|
|
291
|
+
const key = `${ref}\0${trimmedHref}`;
|
|
292
|
+
const link = definitionByKey.get(key);
|
|
293
|
+
if (!link) {
|
|
294
|
+
return fullMatch;
|
|
295
|
+
}
|
|
296
|
+
// Resolve the target resource if available
|
|
297
|
+
const resource = link.resolvedId === undefined || resourceRegistry === undefined
|
|
298
|
+
? undefined
|
|
299
|
+
: resourceRegistry.getResourceById(link.resolvedId);
|
|
300
|
+
// Find matching rule (same rule set as inline links)
|
|
301
|
+
const rule = findMatchingRule(link, resource, linkRewriteRules);
|
|
302
|
+
const template = rule?.template ?? defaultTemplate;
|
|
303
|
+
if (template === undefined) {
|
|
304
|
+
return fullMatch;
|
|
305
|
+
}
|
|
306
|
+
// If resource is in registry and we have sourceFilePath: rewrite URL in definition format
|
|
307
|
+
if (resource !== undefined && sourceFilePath !== undefined) {
|
|
308
|
+
const [, anchor] = splitHrefAnchor(trimmedHref);
|
|
309
|
+
const fragment = anchor === undefined ? '' : `#${anchor}`;
|
|
310
|
+
const newRelPath = toForwardSlash(path.relative(path.dirname(sourceFilePath), resource.filePath));
|
|
311
|
+
return `[${ref}]: ${newRelPath}${fragment}`;
|
|
312
|
+
}
|
|
313
|
+
// Rule matched but no resource to rewrite to — remove orphaned definition
|
|
314
|
+
return '';
|
|
315
|
+
});
|
|
316
|
+
// Clean up excessive blank lines from removed definitions
|
|
317
|
+
result = result.replaceAll(/\n{3,}/g, '\n\n');
|
|
318
|
+
}
|
|
319
|
+
return result;
|
|
251
320
|
}
|
|
252
321
|
//# sourceMappingURL=content-transform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-transform.js","sourceRoot":"","sources":["../src/content-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"content-transform.js","sourceRoot":"","sources":["../src/content-transform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,8 +29,8 @@ export { ResourceRegistry, generateIdFromPath, type CrawlOptions, type ResourceR
|
|
|
29
29
|
export { ResourceQuery } from './resource-query.js';
|
|
30
30
|
export { ResourceCollection } from './resource-collection.js';
|
|
31
31
|
export type { ResourceCollectionInterface } from './resource-collection-interface.js';
|
|
32
|
-
export type { LinkType, HeadingNode, ResourceLink, ResourceMetadata, ValidationIssue, ValidationResult, ProjectConfig, ResourcesConfig, CollectionConfig, CollectionValidation, ValidationMode, } from './types.js';
|
|
33
|
-
export { LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
32
|
+
export type { LinkNodeType, LinkType, HeadingNode, ResourceLink, ResourceMetadata, ValidationIssue, ValidationResult, ProjectConfig, ResourcesConfig, CollectionConfig, CollectionValidation, ValidationMode, } from './types.js';
|
|
33
|
+
export { LinkNodeTypeSchema, LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
34
34
|
export { ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
|
|
35
35
|
export { parseMarkdown, type ParseResult } from './link-parser.js';
|
|
36
36
|
export { validateFrontmatter } from './frontmatter-validator.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,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,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;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,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,GACf,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;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@ export { ResourceQuery } from './resource-query.js';
|
|
|
32
32
|
// Export ResourceCollection for immutable collections with lazy duplicate detection
|
|
33
33
|
export { ResourceCollection } from './resource-collection.js';
|
|
34
34
|
// Export schemas for external use (e.g., JSON Schema generation, runtime validation)
|
|
35
|
-
export { LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
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
38
|
export { parseMarkdown } from './link-parser.js';
|
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;
|
|
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;AAqB9D,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;AAEnE,gCAAgC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,qDAAqD;AACrD,OAAO,EACL,gBAAgB,GAKjB,MAAM,wBAAwB,CAAC;AAEhC,kEAAkE;AAClE,0EAA0E"}
|
package/dist/link-parser.js
CHANGED
|
@@ -83,6 +83,7 @@ function extractLinks(tree) {
|
|
|
83
83
|
href: node.url,
|
|
84
84
|
type: classifyLink(node.url),
|
|
85
85
|
line: node.position?.start.line,
|
|
86
|
+
nodeType: 'link',
|
|
86
87
|
};
|
|
87
88
|
links.push(link);
|
|
88
89
|
});
|
|
@@ -97,6 +98,7 @@ function extractLinks(tree) {
|
|
|
97
98
|
href,
|
|
98
99
|
type: 'unknown', // Reference links need definition resolution
|
|
99
100
|
line: node.position?.start.line,
|
|
101
|
+
nodeType: 'linkReference',
|
|
100
102
|
};
|
|
101
103
|
links.push(link);
|
|
102
104
|
});
|
|
@@ -108,6 +110,7 @@ function extractLinks(tree) {
|
|
|
108
110
|
href: node.url,
|
|
109
111
|
type: classifyLink(node.url),
|
|
110
112
|
line: node.position?.start.line,
|
|
113
|
+
nodeType: 'definition',
|
|
111
114
|
};
|
|
112
115
|
links.push(link);
|
|
113
116
|
});
|
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;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,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;AAiBzC;;;;;;;;;;;;;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,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;
|
|
1
|
+
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,15 @@ import { z } from 'zod';
|
|
|
10
10
|
*/
|
|
11
11
|
export declare const LinkTypeSchema: z.ZodEnum<["local_file", "anchor", "external", "email", "unknown"]>;
|
|
12
12
|
export type LinkType = z.infer<typeof LinkTypeSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* AST node type that produced a link entry.
|
|
15
|
+
*
|
|
16
|
+
* - `link`: Inline link `[text](href)`
|
|
17
|
+
* - `linkReference`: Reference-style usage `[text][ref]`
|
|
18
|
+
* - `definition`: Reference-style definition `[ref]: url`
|
|
19
|
+
*/
|
|
20
|
+
export declare const LinkNodeTypeSchema: z.ZodEnum<["link", "linkReference", "definition"]>;
|
|
21
|
+
export type LinkNodeType = z.infer<typeof LinkNodeTypeSchema>;
|
|
13
22
|
/**
|
|
14
23
|
* Represents a heading node in the document's table of contents.
|
|
15
24
|
*
|
|
@@ -44,6 +53,7 @@ export declare const ResourceLinkSchema: z.ZodObject<{
|
|
|
44
53
|
resolvedPath: z.ZodOptional<z.ZodString>;
|
|
45
54
|
anchorTarget: z.ZodOptional<z.ZodString>;
|
|
46
55
|
resolvedId: z.ZodOptional<z.ZodString>;
|
|
56
|
+
nodeType: z.ZodOptional<z.ZodEnum<["link", "linkReference", "definition"]>>;
|
|
47
57
|
}, "strip", z.ZodTypeAny, {
|
|
48
58
|
type: "anchor" | "local_file" | "external" | "email" | "unknown";
|
|
49
59
|
text: string;
|
|
@@ -52,6 +62,7 @@ export declare const ResourceLinkSchema: z.ZodObject<{
|
|
|
52
62
|
resolvedPath?: string | undefined;
|
|
53
63
|
anchorTarget?: string | undefined;
|
|
54
64
|
resolvedId?: string | undefined;
|
|
65
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
55
66
|
}, {
|
|
56
67
|
type: "anchor" | "local_file" | "external" | "email" | "unknown";
|
|
57
68
|
text: string;
|
|
@@ -60,6 +71,7 @@ export declare const ResourceLinkSchema: z.ZodObject<{
|
|
|
60
71
|
resolvedPath?: string | undefined;
|
|
61
72
|
anchorTarget?: string | undefined;
|
|
62
73
|
resolvedId?: string | undefined;
|
|
74
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
63
75
|
}>;
|
|
64
76
|
export type ResourceLink = z.infer<typeof ResourceLinkSchema>;
|
|
65
77
|
/**
|
|
@@ -79,6 +91,7 @@ export declare const ResourceMetadataSchema: z.ZodObject<{
|
|
|
79
91
|
resolvedPath: z.ZodOptional<z.ZodString>;
|
|
80
92
|
anchorTarget: z.ZodOptional<z.ZodString>;
|
|
81
93
|
resolvedId: z.ZodOptional<z.ZodString>;
|
|
94
|
+
nodeType: z.ZodOptional<z.ZodEnum<["link", "linkReference", "definition"]>>;
|
|
82
95
|
}, "strip", z.ZodTypeAny, {
|
|
83
96
|
type: "anchor" | "local_file" | "external" | "email" | "unknown";
|
|
84
97
|
text: string;
|
|
@@ -87,6 +100,7 @@ export declare const ResourceMetadataSchema: z.ZodObject<{
|
|
|
87
100
|
resolvedPath?: string | undefined;
|
|
88
101
|
anchorTarget?: string | undefined;
|
|
89
102
|
resolvedId?: string | undefined;
|
|
103
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
90
104
|
}, {
|
|
91
105
|
type: "anchor" | "local_file" | "external" | "email" | "unknown";
|
|
92
106
|
text: string;
|
|
@@ -95,6 +109,7 @@ export declare const ResourceMetadataSchema: z.ZodObject<{
|
|
|
95
109
|
resolvedPath?: string | undefined;
|
|
96
110
|
anchorTarget?: string | undefined;
|
|
97
111
|
resolvedId?: string | undefined;
|
|
112
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
98
113
|
}>, "many">;
|
|
99
114
|
headings: z.ZodArray<z.ZodType<HeadingNode, z.ZodTypeDef, HeadingNode>, "many">;
|
|
100
115
|
frontmatter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -115,6 +130,7 @@ export declare const ResourceMetadataSchema: z.ZodObject<{
|
|
|
115
130
|
resolvedPath?: string | undefined;
|
|
116
131
|
anchorTarget?: string | undefined;
|
|
117
132
|
resolvedId?: string | undefined;
|
|
133
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
118
134
|
}[];
|
|
119
135
|
headings: HeadingNode[];
|
|
120
136
|
sizeBytes: number;
|
|
@@ -135,6 +151,7 @@ export declare const ResourceMetadataSchema: z.ZodObject<{
|
|
|
135
151
|
resolvedPath?: string | undefined;
|
|
136
152
|
anchorTarget?: string | undefined;
|
|
137
153
|
resolvedId?: string | undefined;
|
|
154
|
+
nodeType?: "link" | "linkReference" | "definition" | undefined;
|
|
138
155
|
}[];
|
|
139
156
|
headings: HeadingNode[];
|
|
140
157
|
sizeBytes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-metadata.d.ts","sourceRoot":"","sources":["../../src/schemas/resource-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,qEAM4B,CAAC;AAExD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAQpD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"resource-metadata.d.ts","sourceRoot":"","sources":["../../src/schemas/resource-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,qEAM4B,CAAC;AAExD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,oDAIqB,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAQpD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASiB,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeqB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -16,6 +16,18 @@ export const LinkTypeSchema = z.enum([
|
|
|
16
16
|
'email',
|
|
17
17
|
'unknown',
|
|
18
18
|
]).describe('Type of link found in markdown resources');
|
|
19
|
+
/**
|
|
20
|
+
* AST node type that produced a link entry.
|
|
21
|
+
*
|
|
22
|
+
* - `link`: Inline link `[text](href)`
|
|
23
|
+
* - `linkReference`: Reference-style usage `[text][ref]`
|
|
24
|
+
* - `definition`: Reference-style definition `[ref]: url`
|
|
25
|
+
*/
|
|
26
|
+
export const LinkNodeTypeSchema = z.enum([
|
|
27
|
+
'link',
|
|
28
|
+
'linkReference',
|
|
29
|
+
'definition',
|
|
30
|
+
]).describe('AST node type that produced this link');
|
|
19
31
|
/**
|
|
20
32
|
* Zod schema for heading nodes in the document's table of contents.
|
|
21
33
|
*
|
|
@@ -43,6 +55,7 @@ export const ResourceLinkSchema = z.object({
|
|
|
43
55
|
resolvedPath: z.string().optional().describe('Absolute file path (for local_file links)'),
|
|
44
56
|
anchorTarget: z.string().optional().describe('Target heading slug (for anchor links)'),
|
|
45
57
|
resolvedId: z.string().optional().describe('Resolved resource ID in the collection (for local_file links)'),
|
|
58
|
+
nodeType: LinkNodeTypeSchema.optional().describe('AST node type: link, linkReference, or definition'),
|
|
46
59
|
}).describe('Link found in a markdown resource');
|
|
47
60
|
/**
|
|
48
61
|
* Complete metadata for a markdown resource.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-metadata.js","sourceRoot":"","sources":["../../src/schemas/resource-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACnC,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,OAAO;IACP,SAAS;CACV,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-metadata.js","sourceRoot":"","sources":["../../src/schemas/resource-metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export type { SHA256 } from './schemas/checksum.js';
|
|
14
14
|
export { SHA256Schema } from './schemas/checksum.js';
|
|
15
|
-
export type { LinkType, HeadingNode, ResourceLink, ResourceMetadata, } from './schemas/resource-metadata.js';
|
|
15
|
+
export type { LinkNodeType, LinkType, HeadingNode, ResourceLink, ResourceMetadata, } from './schemas/resource-metadata.js';
|
|
16
16
|
export type { ValidationIssue, ValidationResult, } from './schemas/validation-result.js';
|
|
17
17
|
export type { CrawlOptions, ResourceRegistryOptions, ValidateOptions, RegistryStats, CollectionStat, CollectionStats, } from './resource-registry.js';
|
|
18
18
|
export { ResourceType, isJsonSchema, } from './types/resources.js';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA2BrD,uBAAuB;AACvB,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAY9B,0BAA0B;AAC1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAExC,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAWpC,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,sBAAsB;AACtB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,oBAAoB;AACpB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-agent-toolkit/resources",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15-rc.2",
|
|
4
4
|
"description": "Markdown resource parsing, validation, and link integrity checking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"author": "Jeff Dutton",
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@vibe-agent-toolkit/utils": "0.1.
|
|
36
|
+
"@vibe-agent-toolkit/utils": "0.1.15-rc.2",
|
|
37
37
|
"ajv": "^8.17.1",
|
|
38
38
|
"js-yaml": "^4.1.1",
|
|
39
39
|
"markdown-link-check": "^3.14.2",
|
package/src/content-transform.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
import path from 'node:path';
|
|
24
24
|
|
|
25
|
-
import { renderTemplate } from '@vibe-agent-toolkit/utils';
|
|
25
|
+
import { renderTemplate, toForwardSlash } from '@vibe-agent-toolkit/utils';
|
|
26
26
|
|
|
27
27
|
import type { LinkType, ResourceLink, ResourceMetadata } from './schemas/resource-metadata.js';
|
|
28
28
|
import { matchesGlobPattern, splitHrefAnchor } from './utils.js';
|
|
@@ -122,11 +122,13 @@ export interface LinkRewriteRule {
|
|
|
122
122
|
* - `link.type` - Link type (local_file, anchor, external, email, unknown)
|
|
123
123
|
* - `link.resource.id` - Target resource ID (if resolved)
|
|
124
124
|
* - `link.resource.filePath` - Target resource file path (if resolved)
|
|
125
|
+
* - `link.resource.fileName` - Target resource file name with extension (if resolved)
|
|
125
126
|
* - `link.resource.extension` - Target resource file extension (if resolved)
|
|
126
127
|
* - `link.resource.mimeType` - Inferred MIME type (if resolved)
|
|
127
128
|
* - `link.resource.frontmatter.*` - Target resource frontmatter fields (if resolved)
|
|
128
129
|
* - `link.resource.sizeBytes` - Target resource size in bytes (if resolved)
|
|
129
130
|
* - `link.resource.estimatedTokenCount` - Target resource estimated token count (if resolved)
|
|
131
|
+
* - `link.resource.relativePath` - Relative path from sourceFilePath to resource (if both available)
|
|
130
132
|
* - Plus any variables from `context`
|
|
131
133
|
*/
|
|
132
134
|
template: string;
|
|
@@ -150,6 +152,20 @@ export interface ContentTransformOptions {
|
|
|
150
152
|
* These are merged at the top level of the template context.
|
|
151
153
|
*/
|
|
152
154
|
context?: Record<string, unknown>;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Absolute file path of the source document being transformed.
|
|
158
|
+
* When provided, enables `link.resource.relativePath` computation:
|
|
159
|
+
* `relative(dirname(sourceFilePath), link.resource.filePath)` using forward slashes.
|
|
160
|
+
*/
|
|
161
|
+
sourceFilePath?: string;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Fallback template for links that match no rule.
|
|
165
|
+
* Without this option, unmatched links are left untouched (original markdown preserved).
|
|
166
|
+
* With this option, unmatched links are rendered through this template.
|
|
167
|
+
*/
|
|
168
|
+
defaultTemplate?: string;
|
|
153
169
|
}
|
|
154
170
|
|
|
155
171
|
/**
|
|
@@ -160,6 +176,7 @@ export interface ContentTransformOptions {
|
|
|
160
176
|
* @param fragment - The fragment string including '#' prefix, or empty string
|
|
161
177
|
* @param resource - The resolved target resource (if available)
|
|
162
178
|
* @param extraContext - Additional context variables
|
|
179
|
+
* @param sourceFilePath - Absolute path of the source document (for relativePath computation)
|
|
163
180
|
* @returns Template context object
|
|
164
181
|
*/
|
|
165
182
|
function buildTemplateContext(
|
|
@@ -168,17 +185,22 @@ function buildTemplateContext(
|
|
|
168
185
|
fragment: string,
|
|
169
186
|
resource: ResourceMetadata | undefined,
|
|
170
187
|
extraContext: Record<string, unknown> | undefined,
|
|
188
|
+
sourceFilePath: string | undefined,
|
|
171
189
|
): Record<string, unknown> {
|
|
172
190
|
const resourceContext = resource === undefined
|
|
173
191
|
? undefined
|
|
174
192
|
: {
|
|
175
193
|
id: resource.id,
|
|
176
194
|
filePath: resource.filePath,
|
|
195
|
+
fileName: path.basename(resource.filePath),
|
|
177
196
|
extension: path.extname(resource.filePath),
|
|
178
197
|
mimeType: inferMimeType(resource.filePath),
|
|
179
198
|
frontmatter: resource.frontmatter,
|
|
180
199
|
sizeBytes: resource.sizeBytes,
|
|
181
200
|
estimatedTokenCount: resource.estimatedTokenCount,
|
|
201
|
+
relativePath: sourceFilePath === undefined
|
|
202
|
+
? undefined
|
|
203
|
+
: toForwardSlash(path.relative(path.dirname(sourceFilePath), resource.filePath)),
|
|
182
204
|
};
|
|
183
205
|
|
|
184
206
|
return {
|
|
@@ -289,7 +311,7 @@ function findMatchingRule(
|
|
|
289
311
|
}
|
|
290
312
|
|
|
291
313
|
/**
|
|
292
|
-
* Regex pattern matching markdown links: `[text](href)`
|
|
314
|
+
* Regex pattern matching inline markdown links: `[text](href)`
|
|
293
315
|
*
|
|
294
316
|
* Captures:
|
|
295
317
|
* - Group 0: Full match including brackets and parentheses
|
|
@@ -303,15 +325,29 @@ function findMatchingRule(
|
|
|
303
325
|
// eslint-disable-next-line sonarjs/slow-regex -- negated character classes [^\]] and [^)] are inherently non-backtracking
|
|
304
326
|
const MARKDOWN_LINK_REGEX = /\[([^\]]*)\]\(([^)]*)\)/g;
|
|
305
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Regex pattern matching reference-style link definitions: `[ref]: url`
|
|
330
|
+
*
|
|
331
|
+
* Must appear at the start of a line (multiline flag).
|
|
332
|
+
* Captures:
|
|
333
|
+
* - Group 1: Reference identifier
|
|
334
|
+
* - Group 2: URL (may include trailing whitespace)
|
|
335
|
+
*/
|
|
336
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Controlled markdown reference link definitions on line boundaries
|
|
337
|
+
const MARKDOWN_DEFINITION_REGEX = /^\[([^\]]*?)\]:\s*(.+)$/gm;
|
|
338
|
+
|
|
306
339
|
/**
|
|
307
340
|
* Transform markdown content by rewriting links according to rules.
|
|
308
341
|
*
|
|
309
342
|
* This is a pure function that takes content, its parsed links, and transform options,
|
|
310
343
|
* and returns the content with matching links rewritten according to the first matching rule.
|
|
311
344
|
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
345
|
+
* Two passes are performed:
|
|
346
|
+
* 1. **Inline links** `[text](href)` — matched via rules, rendered through templates
|
|
347
|
+
* 2. **Definition lines** `[ref]: url` — matched via rules, rewritten in definition format
|
|
348
|
+
* or removed if orphaned (target not in registry)
|
|
349
|
+
*
|
|
350
|
+
* Links matching no rule are left untouched unless a `defaultTemplate` is provided.
|
|
315
351
|
*
|
|
316
352
|
* @param content - The markdown content to transform
|
|
317
353
|
* @param links - Parsed links from the content (from ResourceMetadata.links)
|
|
@@ -342,26 +378,31 @@ export function transformContent(
|
|
|
342
378
|
links: ResourceLink[],
|
|
343
379
|
options: ContentTransformOptions,
|
|
344
380
|
): string {
|
|
345
|
-
const { linkRewriteRules, resourceRegistry, context } = options;
|
|
381
|
+
const { linkRewriteRules, resourceRegistry, context, sourceFilePath, defaultTemplate } = options;
|
|
346
382
|
|
|
347
|
-
// If there are no rules or no links, return content unchanged
|
|
348
|
-
if (linkRewriteRules.length === 0 || links.length === 0) {
|
|
383
|
+
// If there are no rules, no default template, or no links, return content unchanged
|
|
384
|
+
if ((linkRewriteRules.length === 0 && defaultTemplate === undefined) || links.length === 0) {
|
|
349
385
|
return content;
|
|
350
386
|
}
|
|
351
387
|
|
|
388
|
+
// === Pass 1: Inline links [text](href) ===
|
|
389
|
+
|
|
352
390
|
// Build a lookup map from "[text](href)" to the corresponding ResourceLink.
|
|
353
391
|
// Multiple links can share the same text+href combination; we process them all
|
|
354
392
|
// with the first matching ResourceLink (they are identical in terms of match criteria).
|
|
355
393
|
const linkBySignature = new Map<string, ResourceLink>();
|
|
356
394
|
for (const link of links) {
|
|
395
|
+
if (link.nodeType === 'definition') {
|
|
396
|
+
continue; // Definitions are handled in pass 2
|
|
397
|
+
}
|
|
357
398
|
const signature = `[${link.text}](${link.href})`;
|
|
358
399
|
if (!linkBySignature.has(signature)) {
|
|
359
400
|
linkBySignature.set(signature, link);
|
|
360
401
|
}
|
|
361
402
|
}
|
|
362
403
|
|
|
363
|
-
// Replace markdown links in content
|
|
364
|
-
|
|
404
|
+
// Replace inline markdown links in content
|
|
405
|
+
let result = content.replaceAll(MARKDOWN_LINK_REGEX, (fullMatch, text: string, href: string) => {
|
|
365
406
|
// Find the corresponding ResourceLink
|
|
366
407
|
const signature = `[${text}](${href})`;
|
|
367
408
|
const link = linkBySignature.get(signature);
|
|
@@ -379,8 +420,10 @@ export function transformContent(
|
|
|
379
420
|
// Find the first matching rule
|
|
380
421
|
const rule = findMatchingRule(link, resource, linkRewriteRules);
|
|
381
422
|
|
|
382
|
-
|
|
383
|
-
|
|
423
|
+
// Determine which template to use: matched rule, defaultTemplate, or leave untouched
|
|
424
|
+
const template = rule?.template ?? defaultTemplate;
|
|
425
|
+
if (template === undefined) {
|
|
426
|
+
// No rule matches and no default template - leave untouched
|
|
384
427
|
return fullMatch;
|
|
385
428
|
}
|
|
386
429
|
|
|
@@ -389,7 +432,68 @@ export function transformContent(
|
|
|
389
432
|
const fragment = anchor === undefined ? '' : `#${anchor}`;
|
|
390
433
|
|
|
391
434
|
// Build template context and render
|
|
392
|
-
const templateContext = buildTemplateContext(link, hrefWithoutFragment, fragment, resource, context);
|
|
393
|
-
return renderTemplate(
|
|
435
|
+
const templateContext = buildTemplateContext(link, hrefWithoutFragment, fragment, resource, context, sourceFilePath);
|
|
436
|
+
return renderTemplate(template, templateContext);
|
|
394
437
|
});
|
|
438
|
+
|
|
439
|
+
// === Pass 2: Reference-style definitions [ref]: url ===
|
|
440
|
+
|
|
441
|
+
// Build lookup map for definition links (keyed by "identifier\0href")
|
|
442
|
+
const definitionByKey = new Map<string, ResourceLink>();
|
|
443
|
+
for (const link of links) {
|
|
444
|
+
if (link.nodeType !== 'definition') {
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const key = `${link.text}\0${link.href}`;
|
|
448
|
+
if (!definitionByKey.has(key)) {
|
|
449
|
+
definitionByKey.set(key, link);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (definitionByKey.size > 0) {
|
|
454
|
+
result = result.replaceAll(
|
|
455
|
+
MARKDOWN_DEFINITION_REGEX,
|
|
456
|
+
(fullMatch, ref: string, href: string) => {
|
|
457
|
+
const trimmedHref = href.trim();
|
|
458
|
+
|
|
459
|
+
// Look up the corresponding definition ResourceLink
|
|
460
|
+
const key = `${ref}\0${trimmedHref}`;
|
|
461
|
+
const link = definitionByKey.get(key);
|
|
462
|
+
if (!link) {
|
|
463
|
+
return fullMatch;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Resolve the target resource if available
|
|
467
|
+
const resource = link.resolvedId === undefined || resourceRegistry === undefined
|
|
468
|
+
? undefined
|
|
469
|
+
: resourceRegistry.getResourceById(link.resolvedId);
|
|
470
|
+
|
|
471
|
+
// Find matching rule (same rule set as inline links)
|
|
472
|
+
const rule = findMatchingRule(link, resource, linkRewriteRules);
|
|
473
|
+
const template = rule?.template ?? defaultTemplate;
|
|
474
|
+
|
|
475
|
+
if (template === undefined) {
|
|
476
|
+
return fullMatch;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// If resource is in registry and we have sourceFilePath: rewrite URL in definition format
|
|
480
|
+
if (resource !== undefined && sourceFilePath !== undefined) {
|
|
481
|
+
const [, anchor] = splitHrefAnchor(trimmedHref);
|
|
482
|
+
const fragment = anchor === undefined ? '' : `#${anchor}`;
|
|
483
|
+
const newRelPath = toForwardSlash(
|
|
484
|
+
path.relative(path.dirname(sourceFilePath), resource.filePath),
|
|
485
|
+
);
|
|
486
|
+
return `[${ref}]: ${newRelPath}${fragment}`;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Rule matched but no resource to rewrite to — remove orphaned definition
|
|
490
|
+
return '';
|
|
491
|
+
},
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
// Clean up excessive blank lines from removed definitions
|
|
495
|
+
result = result.replaceAll(/\n{3,}/g, '\n\n');
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
return result;
|
|
395
499
|
}
|
package/src/index.ts
CHANGED
|
@@ -48,6 +48,7 @@ export type { ResourceCollectionInterface } from './resource-collection-interfac
|
|
|
48
48
|
|
|
49
49
|
// Export all type definitions (from schemas)
|
|
50
50
|
export type {
|
|
51
|
+
LinkNodeType,
|
|
51
52
|
LinkType,
|
|
52
53
|
HeadingNode,
|
|
53
54
|
ResourceLink,
|
|
@@ -63,6 +64,7 @@ export type {
|
|
|
63
64
|
|
|
64
65
|
// Export schemas for external use (e.g., JSON Schema generation, runtime validation)
|
|
65
66
|
export {
|
|
67
|
+
LinkNodeTypeSchema,
|
|
66
68
|
LinkTypeSchema,
|
|
67
69
|
HeadingNodeSchema,
|
|
68
70
|
ResourceLinkSchema,
|
package/src/link-parser.ts
CHANGED
|
@@ -111,6 +111,7 @@ function extractLinks(tree: Root): ResourceLink[] {
|
|
|
111
111
|
href: node.url,
|
|
112
112
|
type: classifyLink(node.url),
|
|
113
113
|
line: node.position?.start.line,
|
|
114
|
+
nodeType: 'link',
|
|
114
115
|
};
|
|
115
116
|
links.push(link);
|
|
116
117
|
});
|
|
@@ -126,6 +127,7 @@ function extractLinks(tree: Root): ResourceLink[] {
|
|
|
126
127
|
href,
|
|
127
128
|
type: 'unknown', // Reference links need definition resolution
|
|
128
129
|
line: node.position?.start.line,
|
|
130
|
+
nodeType: 'linkReference',
|
|
129
131
|
};
|
|
130
132
|
links.push(link);
|
|
131
133
|
});
|
|
@@ -138,6 +140,7 @@ function extractLinks(tree: Root): ResourceLink[] {
|
|
|
138
140
|
href: node.url,
|
|
139
141
|
type: classifyLink(node.url),
|
|
140
142
|
line: node.position?.start.line,
|
|
143
|
+
nodeType: 'definition',
|
|
141
144
|
};
|
|
142
145
|
links.push(link);
|
|
143
146
|
});
|
|
@@ -21,6 +21,21 @@ export const LinkTypeSchema = z.enum([
|
|
|
21
21
|
|
|
22
22
|
export type LinkType = z.infer<typeof LinkTypeSchema>;
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* AST node type that produced a link entry.
|
|
26
|
+
*
|
|
27
|
+
* - `link`: Inline link `[text](href)`
|
|
28
|
+
* - `linkReference`: Reference-style usage `[text][ref]`
|
|
29
|
+
* - `definition`: Reference-style definition `[ref]: url`
|
|
30
|
+
*/
|
|
31
|
+
export const LinkNodeTypeSchema = z.enum([
|
|
32
|
+
'link',
|
|
33
|
+
'linkReference',
|
|
34
|
+
'definition',
|
|
35
|
+
]).describe('AST node type that produced this link');
|
|
36
|
+
|
|
37
|
+
export type LinkNodeType = z.infer<typeof LinkNodeTypeSchema>;
|
|
38
|
+
|
|
24
39
|
/**
|
|
25
40
|
* Represents a heading node in the document's table of contents.
|
|
26
41
|
*
|
|
@@ -65,6 +80,7 @@ export const ResourceLinkSchema = z.object({
|
|
|
65
80
|
resolvedPath: z.string().optional().describe('Absolute file path (for local_file links)'),
|
|
66
81
|
anchorTarget: z.string().optional().describe('Target heading slug (for anchor links)'),
|
|
67
82
|
resolvedId: z.string().optional().describe('Resolved resource ID in the collection (for local_file links)'),
|
|
83
|
+
nodeType: LinkNodeTypeSchema.optional().describe('AST node type: link, linkReference, or definition'),
|
|
68
84
|
}).describe('Link found in a markdown resource');
|
|
69
85
|
|
|
70
86
|
export type ResourceLink = z.infer<typeof ResourceLinkSchema>;
|